来自光纤通道舱的热插拔驱动器报告错误的大小

首先,我们甚至不确定这是一个udev问题,但我们需要在某个地方开始询问…我们有一台日立光纤通道SAN服务器,为几台运行ubuntu server 12.04 amd64的机器提供服务。

为了映射的目的,我们使用udev生成的/ dev / disk / by-id标识符

... /dev/disk/by-id/scsi-1HITACHI_750505270125 /dev/disk/by-id/scsi-1HITACHI_750505270125-part1 /dev/disk/by-id/scsi-1HITACHI_750505270126 /dev/disk/by-id/scsi-1HITACHI_750505270126-part1 ... 

最后4位数(0125,0126,0127 …)表示在Hitachi上创build的LUN,因此我们知道我们正在访问哪个物理卷。

我们发现了一个奇怪的问题,我们在LUN 125上有一个1.1T的卷,我们把它拆分成机舱侧的小块。 重新分配一个新的驱动器到服务器后,似乎卷大小被caching(请参阅1150.5 GB的大小)…

 root@server1:~# fdisk -l /dev/disk/by-id/scsi-1HITACHI_750505270125 Disk /dev/disk/by-id/scsi-1HITACHI_750505270125: 1150.5 GB, 1150514364416 bytes 255 heads, 63 sectors/track, 139875 cylinders, total 2247098368 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/disk/by-id/scsi-1HITACHI_750505270125-part1 63 1048575999 524287968+ 83 Linux 

奇怪的是,我们有相同的卷连接到不同的机器。 他们不活跃,但仍然可见。 我们看到了相同的行为,但在重新启动后,驱动器看起来应该如此(请参阅536.9 GB大小):

 root@server2:~# fdisk -l /dev/disk/by-id/scsi-1HITACHI_750505270125 Disk /dev/disk/by-id/scsi-1HITACHI_750505270125: 536.9 GB, 536870912000 bytes 255 heads, 63 sectors/track, 65270 cylinders, total 1048576000 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/disk/by-id/scsi-1HITACHI_750505270125-part1 63 1048575999 524287968+ 83 Linux 

有趣的是,我们将驱动器分区到第二个服务器(server2)上,第二个服务器的大小合适,而在第一个服务器(server1)上我们可以看到该分区,即使实际的驱动器大小仍然是旧的。 我们甚至格式化它,并将其挂载到server2上,写了一个txt文件,卸载它,重新挂载到server1上,当然,我们可以看到并访问txt文件。

看起来像某处caching卷大小的方式?

以防万一,分离和重新连接驱动器后,我们重新扫描LUN并运行udevadm trigger来刷新udev树…

我们不太喜欢使用具有这种差异的驱动器,如果我们需要重新启动以使系统显示真实大小,我们将失去热插拔的所有优点…任何想法如何发生,是否安全使用这些卷没有重新启动?

作为一个侧面的问题,当我们从光纤舱分离驱动器,我们运行udevadm trigger ,看起来像udev只是增加了新的驱动器(设备),但它不会删除设备已经不存在了……是应该的办法?

由于涉及多个层次,所以有几个命令可以起作用。

用于更新/重新扫描

FC
为了简单地扫描公交线路:

 echo "1" > /sys/class/fc_host/hostXYZ/issue_lip echo "- - -" > /sys/class/scsi_host/hostXYZ/scan 

如果你提前知道公车/目标/伦,你可以说:

 echo "btl" > /sys/class/scsi_host/hostXYZ/scan 

你用巴士目标和lun号代替btl

一个SCSI特定的命令来更新磁盘的缩小/增大的大小是

 echo 1 > /sys/block/sdX/device/rescan 

您需要知道相应的驱动器规范名称,例如sda。


删除/删除磁盘

(显然你需要replacesda和0:0:0)

从该磁盘卸载所有的东西

SCSI层删除

 echo 1 > /sys/class/block/sda/device/delete 

FC层移除

 echo 1 > /sys/class/fc_transport/target0\:0\:0/device/0\:0\:0\:0/delete 

现在,您可以安全地将其从SAN中删除。