%20%E4%B8%AD%E5%8F%AF%E9%9D%A0%E5%9C%B0%E8%AD%98%E5%88%A5%E7%A3%81%E7%A2%9F%EF%BC%88%E4%B8%8D%E6%98%AF%E5%88%86%E5%89%B2%E5%8D%80%EF%BC%89.png)
我想在這樣的腳本中備份磁碟的分割區表:
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
我不太了解WWN但序號應該硬編碼在硬體中。我的觀點是,如果任何序號因某種原因而變化,那麼您可能會遇到比突然不起作用的備份腳本更大的問題。
請注意,序號標識一個實體設備,無論其分區表是什麼(或者如果有的話,請研究術語“超級軟碟”並這個問題)。如果您想識別分割表本身,那麼您發現的這些「磁碟識別碼」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 都會寫入其對應分區(或設備,如果是超級軟碟)內的某個位置。這些是您在呼叫時看到的標識符,例如
# '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/
如果您需要,可以輕鬆調整此解決方案以檢索資訊。