我想要用这样的脚本来备份磁盘的分区表:
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/