在 Linux(Debian)中可靠地识别磁盘(而不是分区)

在 Linux(Debian)中可靠地识别磁盘(而不是分区)

我想要用这样的脚本来备份磁盘的分区表:

sfdisk --dump /dev/sda > partition_table.dump

  • 我不想使用/dev/sda,因为它可能不可靠。

  • /dev/disk/by-id 似乎也不可靠。

  • /dev/disk/by-uuid并且df仅包括分区(而不是磁盘)。

但是fdisk -l显示“磁盘标识符”UUID。我能以某种方式sda从磁盘标识符中获取磁盘名称()吗?或者还有其他方法可以可靠地识别磁盘?

答案1

无论如何都要用/dev/disk/by-id/您链接到的问题在我看来,这看起来像是一个罕见的硬件故障或类似的问题。

比较

ls -l /dev/disk/by-id/

# 'lsblk' is from 'util-linux' package
lsblk -pdo NAME,VENDOR,MODEL,SERIAL,WWN

但是在我的某些系统上,上述命令显示空白值;您仍然可以尝试:

# the below 'smartctl' command (from 'smartmontools' package) probably needs 'sudo'
for sd in $(lsblk -pdo NAME | tail -n +2); do
  printf "%s\n" "$sd"; smartctl -i "$sd" |
  grep -E "Model:|Number:|WWN"
done

我不太了解世界网络但序列号应该在硬件中硬编码。我的观点是,如果任何序列号因任何原因而发生变化,那么你可能会遇到比备份脚本突然不起作用更大的问题。


注意,无论分区表是什么,序列号都标识一个物理设备(或者如果有的话,研究一下术语“超级软盘”,这个问题)。如果你想识别分区表本身,那么你发现的这些“磁盘标识符”UUID 将是正确的方法(请注意,它们是 GPT 方案中的 128 位 UUID,但 MBR 中的 32 位可选签名,例如这里)。它们只是磁盘上的几个字节,可以更改、克隆、备份。除了浏览可用设备外,我还没有找到任何通过这种类型的标识符快速识别设备节点的方法:

id=8080fdb4-6905-4f34-91fa-61389615d7d3
# the below 'fdisk' command (from 'util-linux' package) probably needs 'sudo'
for sd in $(lsblk -pdo NAME | tail -n +2); do
  fdisk -l "$sd" | grep -qi " ${id}$" && printf "%s\n" "$sd"
done

/dev/disk/by-uuid[...] 仅包括分区(不包括磁盘)。

好吧,它可能甚至不包括所有 UUID,因为这些 UUID 指的是分区内的结构(如文件系统或交换),而不是分区本身(如果您处理超级软盘,它将作为整个磁盘出现在这里)。每个 UUID 都写在其相应分区(或设备,如果是超级软盘)内的某个地方。这些是您在调用时看到的标识符,例如

# 'file' is from 'file' package
file -s /dev/sda2

如果需要分区标识符,它们位于 中/dev/disk/by-partuuid/。它们与

# 'partx' is from 'util-linux' package
partx --show /dev/sda

它们存储在相应的分区表中,而不是任何分区内。您可以通过运行

# 'blkid' (from 'util-linux' package) probably needs 'sudo'
blkid

要识别拥有具有给定 UUID 的分区的设备,请尝试:

id=68e3b991-5c7a-4d18-a120-834ef4effe00
readlink -e "/dev/disk/by-partuuid/$id" | sed 's/[0-9]*$//'

(此处仅删除尾随数字)。如果需要,sed可以轻松调整此解决方案以检索信息。/dev/disk/by-uuid/

相关内容