Linux

fstab 中的 UUID + 在這種情況下,我們不能在 fstab 中配置 UUID

  • January 4, 2018

討論 - 我們有 redhat linux 機器,我的問題是關於 /etc/fstab 文件中的 UUID 配置,在這種情況下 UUID 會給作業系統帶來風險

據我了解,如果使用軟體 RAID1,我們不得在 /etc/fstab 中使用 UUID。

**為什麼?**因為 RAID 卷本身和鏡像的第一個元素將看起來具有相同的文件系統 UUID。如果鏡像損壞或由於任何其他原因 md 設備未在引導時啟動,系統將改為掛載任何隨機底層磁碟,從而破壞您的鏡像。

所以我的問題是

哪些 RAID 級別(數字)不能是 fstab 中的 UUID?

有關突襲級別的資訊 - https://en.wikipedia.org/wiki/Standard_RAID_levels

我們將繼續在 ArchLinux 和 mdadm 上進行測試。但首先,這對於基於分區的數組來說並不重要,因為成員分區有自己的 UUID,所以這在理論上只適用於整個磁碟成員。

TL;DR:即使是舊的元數據塊,這也不是一個真正的問題。我不知道這可能是舊軟體中的錯誤。但它不會影響現代 ArchLinux。

#uname -sr
Linux 4.14.7-1-ARCH

#modprobe raid1

#mdadm --create --verbose /dev/md0 --metadata 0.9 --level=mirror --raid-devices=2 /dev/sdb /dev/sdd
mdadm: size set to 102336K
mdadm: array /dev/md0 started.

#cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdd[1] sdb[0]
102336 blocks [2/2] [UU]

unused devices: <none>

#mdadm --detail --scan >> /etc/mdadm.conf

fdisk /dev/md0
lsblk /dev/md0
NAME      MAJ:MIN RM   SIZE  RO TYPE MOUNTPOINT
sdb         8:16   0    100M  0 disk
└─md0       9:0    0    100M  0 raid1
 └─md0p1 259:0    0   98.9M  0 md 
sdd         8:48   0    100M  0 disk
└─md0       9:0    0    100M  0 raid1
 └─md0p1 259:0    0   98.9M  0 md 
md0         8:0    0    100M  0 raid1
└─sda2      8:2    0   98.9M  0 md

mdstat ->

$$ UU $$

#blkid /dev/md0
/dev/md0: PTUUID="d49d8666-e580-8244-8c82-2bc325157e66" PTTYPE="gpt"
#blkid /dev/sdd
/dev/sdd: UUID="b3d82551-0226-6687-8279-b6dd6ad00d98" TYPE="linux_raid_member"
#blkid /dev/sdb
/dev/sdb: UUID="b3d82551-0226-6687-8279-b6dd6ad00d98" TYPE="linux_raid_member"

#mkfs.ext4 /dev/md0p1
mke2fs 1.43.7 (16-Oct-2017)
creating filesystem with 101292 1k blocks and 25376 inodes
Filesystem UUID: 652bcf77-fe47-416e-952c-bbOa76a78407
Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 

#mount /dev/md0p1 /mnt

#lsblk -o NAME,UUID,MOUNTPOINT /dev/sdb /dev/sdd
NAME      UUID                                 MOUNTPOINT
sdb       b3d82551-0226-6687-8279-b6dd6ad00d98
└─md0
 └─md0p1 652bcf77-fe47-416e-952c-bbOa76a78407 /mnt
sdd       b3d82551-0226-6687-8279-b6dd6ad00d98
└─md0
 └─md0p1 652bcf77-fe47-416e-952c-bbOa76a78407 /mnt

到現在為止還挺好。這不僅將成員設備正確辨識為 RAID 設備,而且還有兩個匹配的分區級 UUID。實際上這些作為同一個容器設備的一部分 md0 並列出了同一個掛載點。它沒有列出 sdd 或 sdb 上的任何正常分區容器。請注意,md0 設備本身沒有 UUID。只有它的成員有 UUID 並且它實際上是相同的 UUID。

#echo "UUID=652bcf77-fe47-416e-952c-bbOa76a78407 /mnt ext4 rw,relatime,data=ordered 0 2" >> /etc/fstab
umount /mnt
mount /mnt
cd /mnt
fallocate -l 50MiB data

mdstat ->

$$ UU $$ 注意到我們詢問了 raid 成員的文件系統 UUID,現在讓我們嘗試在不執行 mdadm 的情況下執行系統。

#cd
#umount /mnt
#mdadm --stop /dev/md0
mdadm: stopped /dev/md0
#lsblk /dev/sdb /dev/sdd
NAME MAJ:MIN RM  SIZE  RO TYPE MOUNTPOINT
sdb    8:16   0  100M  0 disk
sdd    8:48   0  100M  0 disk

現在系統認為這些是正確的原始磁碟,因為它們沒有分區表,因此不是容器。但是,如果我們詢問它們是什​​麼:

#blkid /dev/sdd
/dev/sdd: UUID="b3d82551-0226-6687-8279-b6dd6ad00d98" TYPE="linux_raid_member"

它仍然是一個 linux_raid_member,如果我們嘗試掛載它:

#mount /dev/sdd /mnt
mount /mnt: unknown filesystem type "linux raid member"

怎麼樣:

#mount /mnt
mount: /mnt can't find UUID=652bcf77-fe47-416e-952c-bbOa76a78407

這是有道理的,因為 sdd 不是容器,因此沒有被探測的文件系統。但是,如果我執行:

#mdadm --assemble --scan && mount /mnt
mdadm: /dev/md0 has been started with 2 drives.

如果我再次停止它並刪除 mdadm.conf:

#umount /mnt && mdadm --stop /dev/md0
#modprobe -r raid1
#rm /etc/mdadm.conf
#modprobe raid1
#mdadm --assemble --scan
mdadm: /dev/md/0 has been started with 2 drives.

請注意,我對 md0 設備名稱的配置不再生效,它會自動在 /dev/md/0 中創建。現在讓我們重新啟動,看看 systemd/Linux 對 fstab 做了什麼。

#mdadm --stop /dev/md/0
mdadm: stopped /dev/md/0
#systemctl reboot


#dmesg | grep md0
[  14.550231] md/raidl:md0: active with 2 out of 2 mirrors
[  14.550261] md0: detected capacity change from 0 to 104792064
[  14.836905]  md0: p1
[  16.909057] EXT4-fs (md0p1): mounted filesystem with ordered data mode. Opts: data=ordered

#lsblk /dev/md0
NAME      MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md0       9:0     0  100M 0  raidl 
└─md0p1 259:0     0 98.9M 0  md    /mnt

再次使用 raid=noautodetect 核心參數,因為這也將模擬不會自動檢測所有 raid 和所有超級塊/元數據版本等的 Linux 版本。但它仍然掛載 raid,因為我在 fstab 中要求它並且它強制載入 mod raid1 . 因此,讓我們再次嘗試使用 modprobe.blacklist=raid1 將其列入黑名單:

在此處輸入圖像描述

好的,怎麼回事?:

在此處輸入圖像描述

所以linux知道它是一個raid類型的設備,即使它沒有raid支持。嘗試掛載它時,它會正確檢測到它的 raid 設備,並且在使用 fstab 時,儘管它位於文件系統超級塊中,但它卻找不到 UUID。

然後再次!fstab 或 mdadm 中沒有資訊。

#mount /dev/sdd /mnt
mount: /mnt: unknown filesystem type "linux_raid_member".

我認為這不僅僅是因為 Linux 的探測很聰明。除了使用 fdisk warm 之類的工具之外,分區表區域中還有額外的資訊。您將不得不非常努力地在其中一個成員磁碟的文件系統 UUID 上犯這個錯誤。

引用自:https://unix.stackexchange.com/questions/414619