磁盘的信息解析
对于SD磁盘,它的生成过程会有相当信息打印,了解相关信息可以对该磁盘有简单的认识。一般会有如下打印信息:
[ 135.532868] scsi 1:0:0:0: Direct-Access ATA HGST HUS724040AL A8B0 PQ: 0 ANSI: 5
[ 135.541219] sd 1:0:0:0: [sda] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
[ 135.541446] scsi 1:0:1:0: Direct-Access ATA HGST HUS724040AL A8B0 PQ: 0 ANSI: 5
[ 135.557030] sd 1:0:0:0: [sda] Write Protect is off
[ 135.557220] sd 1:0:1:0: [sdb] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
[ 135.557238] sd 1:0:1:0: [sdb] Write Protect is off
[ 135.557240] sd 1:0:1:0: [sdb] Mode Sense: 00 3a 00 00
[ 135.557272] sd 1:0:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
1. 盘符sdx的生成
对于SD磁盘,盘符的命名类似于sdx,但具体如何命名其实遵循一定的规则,它分两步进行, 首先向系统申请唯一的ID,然后通过ID映射生成文件名。代码实现在文件drivers/scsi/sd.c中的sd_probe函数中。
获取IDA号
在SD系统中定义IDA(static DEFINE_IDA(sd_index_ida)),通过IDA生成规则生成系统中唯一的ID号index:
ida_pre_get(&sd_index_ida, GFP_KERNEL);
ida_get_new(&sd_index_ida, &index)
通过ID号生成盘符
通过上面的IDA获取唯一的ID号后,就可以通过这个ID号index生成盘符,ID号生成盘符的函数如下:
sd_format_disk_name("sd", index, gd->disk_name, DISK_NAME_LEN);
生成盘符规则:第一个盘从sda开始,第二个盘为sdb,依次类推… 当第27个盘时为sdaa, 第28个为sdab,依次类推…可以将其看作二十六进制数,当超过二十六时,就增加一位来表示:sda … sdz sdaa … sdzz sdaaa …。
2. scsi m: n: x: y/sd m: n: x: y
scsi m: n: x: y/sd m: n: x: y唯一表示一个SD磁盘在系统拓扑位置
[ 135.557030] sd 1:0:0:0: [sda]
[ 135.557220] sd 1:0:1:0: [sdb]
上面表示盘sda和sdb都在控制器1下(D05只引出SAS控制器1), 相同通道下设备ID分别为0和1。
3. 磁盘容量
在扫盘过程中控制器会向磁盘发送SCSI命令获取容量,实现函数为sd_read_capactiy。
7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
上面表示该盘的块大小为512个字节,有7814037168个块。至少后面4.00 TB/3.64 TiB分别为厂家标称容量和操作系统认为容量。比如厂家标示容量4TB=4000GB=4000,000MB=4000,000,000KB=4000,000,000,000B,而对操作系统来说,按1024来计算的,所以厂家标称容量换成操作系统认为容量为4000,000,000,000/1024/1024/1024/1024=3.64。
4. 其它特性
在扫盘过程中还会读取磁盘其它特性,比如写保护,读写CACHE使能,DPO和FUA是否支持。
Write Protect is off
表示磁盘的写保护关闭
Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
表示写CACHE使能,读CACHE关闭,不支持DPO和FUA。
Direct-Access ATA HGST HUS724040AL A8B0 PQ: 0 ANSI: 5
表示SATA磁盘,以及厂家相关信息。