如果我做
# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt
中的條目/proc/mounts
是
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
這是安裝到的設備/home
,並且不容易從中推斷出$PWD
是/test
。/proc/mounts
鑑於綁定掛載可能指向可能被符號連結、其他綁定掛載等「掩蓋」的目錄/文件,我如何確定一般將顯示哪個設備(即 /dev/sda2) ?
答案1
如果我理解你的問題,你想知道哪個設備用於給定的安裝。為此,您可以使用以下df
命令:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/fedora_greeneggs-root 50G 21G 27G 44% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 14M 3.8G 1% /dev/shm
tmpfs 3.8G 984K 3.8G 1% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
tmpfs 3.8G 3.4M 3.8G 1% /tmp
/dev/sda1 477M 99M 349M 23% /boot
/dev/mapper/fedora_greeneggs-home 402G 184G 198G 49% /home
若要尋找在哪個裝置上找到特定檔案/目錄,請將檔案作為參數提供給df
.使用你的例子:
$ df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 477M 99M 349M 23% /
您也可以使用mount
命令:
$ mount | grep '^/dev'
/dev/mapper/fedora_greeneggs-root on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/fedora_greeneggs-home on /home type ext4 (rw,relatime,seclabel,data=ordered)
為每個設備安裝的目錄是上面輸出中的第三個參數。所以對於設備來說/dev/sda1
就是/boot
.其他設備正在使用 LVM(邏輯磁碟區管理),需要進一步查詢以了解 LVM 正在使用哪個實際設備。
答案2
在 Linux 上,我們findmnt
專門util-linux
為此設計了
findmnt -n -o SOURCE --target /path/to/FILE
其他解決方案的優點是,如果路徑被符號連結或重複的綁定安裝遮蓋,它仍然有效。
答案3
我所知道的最準確的方法是使用 lstat() 系統呼叫的輸出。具體來說,是 st_dev 欄位。有一個命令列實用程式 stat(1) 可用來查看此資訊。例如,我的筆記型電腦上「stat /etc/issue」的輸出:
File: ‘/etc/issue’
Size: 65 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1610916043 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
請注意第三行,第一個字段,“Device”。這裡列出了 801h。該值可分為兩個位元組:8 和 1。因此,下一步是弄清楚主要 8、次要 1 是什麼設備。
我發現諮詢 /proc/partitions 是最快的。就我而言,/proc/partitions 的內容如下:
major minor #blocks name
8 16 234431064 sdb
8 17 33554432 sdb1
8 18 200875608 sdb2
8 0 500107608 sda
8 1 500106584 sda1
從該輸出可以清楚看出,主要 8、次要 1 是 sda1。我們可以使用 ls -l /dev/sda1 來確認這一點
brw-rw---- 1 root disk 8, 1 May 8 05:33 /dev/sda1
請注意日期戳記之前的 8、1。
重要的是要理解/記住,像 /dev/sda1 這樣的裝置檔案的名稱只是一個標籤。主設備號和次設備號是設備文件中最重要的值。如果您感到好奇,請查看用於建立裝置檔案的 mknod(1) 實用程式。我可以使用以下語法建立一個名為 aardvark 的新 /dev 條目,其主要版本為 8,次要版本為 18:
mknod /dev/aardvark b 8 18
然後,我可以輕鬆安裝它:
mount /dev/aardvark /mnt
並且,如果我們查看 mount 命令的輸出或 /proc/mounts 的內容,我們會看到:
/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)
df -h 顯示:
/dev/aardvark 192G 154G 38G 81% /mnt
....無論如何,所有這一切的目的是為了說明識別區塊設備的重要細節是主設備號碼和次設備號碼 - 而不是設備檔案標籤 - 並且使用 lstat() 系統呼叫是識別區塊設備的最佳方法查詢這些值。
作為最後一條評論,我只是重讀了您的問題以確保我正在回答它,並且我意識到您在問綁定安裝的 /proc/mounts 中會顯示什麼源設備標籤。這將與綁定掛載的檔案系統掛載點來源的原始 mount(2) 呼叫中使用的來源裝置標籤相同。也許一個例子會有所幫助:
我有 /dev/sdb2 和 /dev/aardvark (與上面相同)。它們都是主要版本 8,次要版本 18。我執行以下操作:
mkdir /mnt1 /mnt2 /foo
mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2
請注意,我在 /mnt1 中建立了目錄 somedir。但由於 /mnt1 和 /mnt2 安裝了相同的檔案系統,因此也可以透過 /mnt2 存取 somedir。
mkdir /mnt1/somedir
mkdir /foo/left /foo/right
mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right
現在,如果我們檢查 /proc/mounts,我們會看到:
/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0
/foo/... 綁定掛載上的來源設備標籤與檔案系統 mount(2) 呼叫中最初提供的值相同。請記住,我的範例中的 /dev/aardvark 和 /dev/sdb2 是同一裝置。
我意識到我剛剛打了一本小說,前半部分根本沒有真正回答你的問題,但刪除它似乎太浪費了。也許它會幫助別人。
祝你好運。
PS 請記住,某些檔案系統是基於網路的(如 NFS 或 CIFS),或是虛擬的(如 procfs 或 sysfs),並且沒有來源區塊設備。我不知道統計輸出中的設備會回傳什麼,只是因為它的價值。
答案4
du
可以使用開關呼叫該指令-x
來忽略其他已安裝檔案系統的內容。
此-k
開關以 KB 為單位顯示目錄大小。
顯示大小 >~ 1MB 的目錄。
du -xk / | awk ' $1 > 1000000 { print } '