確定目錄位於哪個裝置上

確定目錄位於哪個裝置上

如果我做

# 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 } '

相關內容