linux - 我如何知道 Linux 中的下一个设备映射器?

标签 linux ansible sysadmin

我正在尝试编写一个 ansible playbook 来自动扫描新磁盘并将其放入现有 VG 中,然后对其进行扩展。

不幸的是,我无法弄清楚 Linux 如何知道下一个设备映射器(例如/dev/sdc),从而创建一个完美的 ansible 剧本来为我执行此任务。

在线扫描新磁盘:

echo 0 0 0 | tee /sys/class/scsi_host/host*/scan

有人对此有任何想法吗?

谢谢。

最佳答案

您正在使用令人困惑的术语。 Device mapper 是 LVM 使用的框架,有时可能会使用 device mapper 作为使用 device mapper 的应用程序创建的设备的名称。它们通常可以在/dev/mapper 中找到。

/dev/sdc(以及其他 /dev/sd[a-z][a-z]?)只是 block 设备。 LVM 可以使用它们来创建 PV(物理卷),但它们不是“设备映射器”。

现在回答:

Linux 对新设备使用“字母表中的下一个可用”。不幸的是,内核和用户的“下一个可用”可能是另一回事。如果设备已被拔下(或死掉,或通过重置重新扫描)并且底层设备被标记为仍在使用,Linux 将使用“下一个字母”,因此重新插入的 /dev/sdc 可能显示为 /dev/sdd,或者,如果 /dev/sdd 忙,/dev/sde,下到 /dev/sdja(我不确定它在哪里结束,但是没有 /dev/sdzz AFAIK 这样的东西)。

如果你想识别你的设备,你可以使用 udev 提供的符号链接(symbolic link)。它们存在于 /dev/disk 中,反射(reflect)了识别设备的不同方式: - by-id - 使用设备 ID(通常是名称和供应商) - by-partuuid - 通过磁盘上现有分区的 UUID - by-uuid - 通过为每个驱动器生成唯一的 UUID - by-path - 通过它的逻辑位置。

我觉得最后一个是最好的:如果你把你的设备插入同一个插槽,它将在 /dev/disk/by-path 中有相同的名称,不管供应商、i​​d、现有文件系统和其他 block 设备的状态。

这里有一些您可能会在那里找到的名称示例:

  • pci-0000:00:1f.2-ata-3 - ATA 磁盘 #3 连接到 PCI 上的特定 Controller 。
  • pci-0000:08:00.0-sas-0x50030480013afa6c-lun-0 - WWN 0x50030480013afa6c 的 SAS 驱动器连接到特定的 PCI Controller 。
  • pci-0000:01:00.0-scsi-0:2:1:0 - 连接到特定 PCI Controller 的“奇怪”scsi 设备 #2。在我的例子中,它是 LSI 的硬件 RAID。

如果你真的想处理新设备而不考虑它们的名称,请查看 Udev 脚本,它允许对新设备使用react。处理 udev 可能很棘手,这里是 Ceph 项目中此类脚本的示例:它们通过 udev 规则自动处理具有特定分区 ID 的所有磁盘:https://github.com/ceph/ceph/tree/master/udev

关于linux - 我如何知道 Linux 中的下一个设备映射器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43216830/

相关文章:

distributed - 协调多个服务器之间的任务

c - 延迟写入错误

linux - 如何从我的 Windows 机器上运行安装在 Linux 机器上的 OpenGL 应用程序?

c - 从信号处理程序中获取保存的指令指针地址

linux - 将文件中的行变成行

ansible - 在 Ansible playbook 中指定角色的版本

ansible - 我如何通过 Ansible 在气隙系统上安装 snap 包

linux - Linux (CentsOS 5) 的 Aptana 安装问题

linux - 如果所有条件成功,如何在 bash 中返回 true ?

python-2.7 - 尝试使用 kerberos winrm 连接到 Windows winRM