一、背景

负责虚拟化的同事问了一个问题:业务部分有需求,希望在不重启OS的情况下,在虚机系统下识别新增的硬盘。在KVM环境下,我之前有记录过《KVM虚拟机动态增加网卡和硬盘》,但在vmware虚拟化和阿里云(私有云)环境下,通过硬件配置新增后,在主机OS里通过fdisk -l 是看不到新增的盘的,不过在/proc/scsi/scsi 文件中一般可以读取到该文件。如何正常识别呢?接下来记录下方法。

二、识别新盘

查看当前盘信息:

 1[root@361way ~]# fdisk -l
 2Disk /dev/sda: 107.4 GB, 107374182400 bytes
 3255 heads, 63 sectors/track, 13054 cylinders
 4Units = cylinders of 16065 * 512 = 8225280 bytes
 5Sector size (logical/physical): 512 bytes / 512 bytes
 6I/O size (minimum/optimal): 512 bytes / 512 bytes
 7Disk identifier: 0x00057e3c
 8   Device Boot      Start         End      Blocks   Id  System
 9/dev/sda1   *           1          26      204800   83  Linux
10Partition 1 does not end on cylinder boundary.
11/dev/sda2              26        1332    10485760   83  Linux
12/dev/sda3            1332        2376     8388608   82  Linux swap / Solaris
13/dev/sda4            2376       13055    85777408    5  Extended
14/dev/sda5            2376       13055    85776384   83  Linux
15[root@361way ~]# cat /proc/scsi/scsi
16Attached devices:
17Host: scsi1 Channel: 00 Id: 00 Lun: 00
18  Vendor: NECVMWar Model: VMware IDE CDR10 Rev: 1.00
19  Type:   CD-ROM                           ANSI  SCSI revision: 05
20Host: scsi2 Channel: 00 Id: 00 Lun: 00
21  Vendor: VMware   Model: Virtual disk     Rev: 1.0
22  Type:   Direct-Access                    ANSI  SCSI revision: 02

发现,只有一块盘(另一个为CD-ROM)。此时通过虚拟化管理平台新增一块盘:

add-single-device
add-single-device

此时再在系统下查看下:

 1#查看当前的设备信息
 2[root@361way ~]# fdisk -l|grep Disk
 3Disk /dev/sda: 107.4 GB, 107374182400 bytes
 4Disk identifier: 0x00057e3c
 5[root@361way ~]# cat /proc/scsi/scsi |grep Channel
 6Host: scsi1 Channel: 00 Id: 00 Lun: 00
 7Host: scsi2 Channel: 00 Id: 00 Lun: 00
 8#增加设备号到scsi虚文件
 9[root@361way ~]# echo 'scsi add-single-device 2 0 1 0' > /proc/scsi/scsi
10#重新查看磁盘信息
11[root@361way ~]# fdisk -l|grep Disk|grep dev
12Disk /dev/sda: 107.4 GB, 107374182400 bytes
13Disk /dev/sdb: 2147 MB, 2147483648 bytes
14[root@361way ~]# cat /proc/scsi/scsi |grep Channel
15Host: scsi1 Channel: 00 Id: 00 Lun: 00
16Host: scsi2 Channel: 00 Id: 00 Lun: 00
17Host: scsi2 Channel: 00 Id: 01 Lun: 00

我们接下来再来看下上面的命令,具体的解释:

1echo "scsi add-single-device x y z u" > /proc/scsi/scsi
2
3其中:
4x是硬盘所在SCSI控制器号(一般机器就一个SCSI控制器,所以就是0);
5y是硬盘所在SCSI通道的编号(一般单通道的就是0,多通道的要看是哪个通道了);
6z是硬盘的SCSI ID号(可以通过具体插入的硬盘插槽来判断,一般是在前一个号码+1);
7u是硬盘的lun号(默认情况都是0)

三、移除磁盘

同理,如果通过虚拟化平台移除硬盘后,在系统下看到未生效的,也可以通过如下命令进行移除:

1echo "scsi remove-single-device x y z u" >/proc/scsi/scsi

另外也有提到可以通过重新扫盘,识别新盘或移除旧盘,命令如下:

1echo '- - -' > /sys/class/scsi_host/host0/scan

注意:三个横线之间有空格