當輸出中沒有直接引用分割區時,我們如何識別檔案系統安裝在 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= 來取得該位置。