透過掛載點識別分區

透過掛載點識別分區

當輸出中沒有直接引用分割區時,我們如何識別檔案系統安裝在 Linux 中的哪個分割區上df

例如,我們系統的fdisk輸出是:

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2550    20478976   83  Linux
/dev/sda2            2550       60736   467378176   83  Linux
/dev/sda3           60736       60801      523264   82  Linux swap / Solaris

的輸出df是:

Filesystem      Size  Used Avail Use% Mounted on
rootfs           20G  881M   18G   5% /
/dev/root        20G  881M   18G   5% /
devtmpfs        989M  216K  989M   1% /dev
/dev/sda2       443G  199M  420G   1% /home
tmpfs           990M     0  990M   0% /dev/shm
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named
/dev/root        20G  881M   18G   5% /var/named/chroot/var/named
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.conf
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.rfc1912.zones
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/rndc.key
/dev/root        20G  881M   18G   5% /var/named/chroot/usr/lib64/bind
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.iscdlv.key
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.root.key

從該列表中唯一明顯的分區是/dev/sda2;對於其他分區,我們無法看到它們駐留在哪個分區(我們希望透過 bash 腳本來做到這一點)。

例如,我們知道 已/dev/root安裝,/dev/sda1因為它們都具有相同的 20GB 大小,但我們如何從腳本中識別這一點?

輸出來自ls -l /dev/root /dev/sda1

[root@server etc]# ls -l /dev/root /dev/sda1
ls: cannot access /dev/root: No such file or directory
brw-rw---- 1 root disk 8, 1 May  7 14:16 /dev/sda1

答案1

此輸出具有誤導性。
實際上,您在 處安裝了 2 個不同的檔案系統/

rootfs是由 initramfs 所建立的檔案系統。當引導程式載入核心時,它能夠載入 initramfs,該 initramfs 會解壓縮到 tmpfs 檔案系統中。無法卸載該檔案系統。當 initramfs 完成它的工作時,它只是將真正的根檔案系統安裝在其上。

之所以df顯示為 20GB,是因為它無法存取 tmpfs 檔案系統。當df顯示檔案系統時,它首先從 取得目前安裝的清單/etc/mtab。這給了它 2 個使用 的安裝座/。然後它statfs()在每個安裝點上進行系統呼叫。但由於目前根檔案系統位於 tmpfs initramfs 之上,因此它最終會兩次統計目前根檔案系統。

另外/dev/root其實是一個符號連結。要使用 shell 腳本找出它真正指向的位置,您可以使用readlink -f /dev/root.


更新:好的,所以在這種情況下readlink -f /dev/root不起作用,因為/dev/root不再存在。因為 initramfs 是掛載你真正的根檔案系統的,/dev/root所以它本來就存在於那裡。但由於 initramfs 被埋葬了,/dev/root所以不再存在了。

在這種情況下,事情變得更加困難。
您可以做的是使用stat取得安裝點的設備號,然後進行搜尋/dev

例如,在我的系統上會產生:

$ stat --format '%D' /
fd00

$ stat --format '%02t%02T' /dev/mapper/sys-root
fd00

$ for device in $(blkid -o device); do 
>   [ "$(stat --format '%04D' /)" = "$(stat --format '%02t%02T' "$device")" ] && \
>     echo "$device" && \
>     break
> done
/dev/mapper/sys-root

基本上,它的作用是用來stat取得設備的主要和次要編號/。然後,我們遍歷所有已知的區塊設備,尋找具有相同主要設備和次要設備的區塊設備。它不太漂亮,但基本上該/dev條目有一個不同的名稱,所以我們必須搜尋它。

這可以更有效地完成,但我想保持程式碼簡單

答案2

/dev/root 是真實裝置的符號連結。您應該能夠透過 ls /dev/root、reallink 或在 /proc/cmdline 中尋找 root= 來取得該位置。

相關內容