有沒有指令可以查看磁碟掛載位置?

有沒有指令可以查看磁碟掛載位置?

是否有一個簡單的命令將磁碟的設備節點作為輸入,並告訴我該磁碟安裝在何處(以及是否安裝)?是否可以單獨獲取掛載點,以便我可以將其傳遞給另一個命令?

我正在使用最小安裝的 Debian Squeeze live 系統(如果需要,我可以安裝額外的軟體包)。

答案1

在 Linux 上,您現在可以使用findmnt以下命令util-linux(自版本 2.18 起):

$ findmnt -S /dev/VG_SC/home
TARGET SOURCE                 FSTYPE OPTIONS
/home  /dev/mapper/VG_SC-home ext4   rw,relatime,errors=remount-ro,data=ordered

lsblk(也來自util-linux,自 2.19 起):

$ lsblk /dev/VG_SC/home
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
VG_SC-home 254:2    0  200G  0 lvm  /home

該工具對於查找特定設備(磁碟或分割區...)下安裝的所有檔案系統也很有用:

$ lsblk  /dev/sda2
NAME                    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda2                      8:2    0  59.5G  0 part
├─linux-debian64 (dm-1) 252:1    0    15G  0 lvm
└─linux-mint (dm-2)     252:2    0    15G  0 lvm  /

僅取得掛載點:

$ findmnt -nr -o target -S /dev/storage/home
/home
$ lsblk -o MOUNTPOINT -nr /dev/storage/home
/home

findmnt如果設備未安裝,上面確實會返回失敗退出狀態,而不是lsblk

所以:

if mountpoint=$(findmnt -nr -o target -S "$device"); then
  printf '"%s" is mounted on "%s"\n' "$device" "$mountpoint"
else
  printf '"%s" does not appear to be directly mounted\n' "$device"
fi

答案2

在Linux下,可以直接從核心中取得掛載點資訊/proc/mounts。該mount程式在 中記錄了類似的資訊/etc/mtab。路徑和選項可能不同,代表傳遞給核心的/etc/mtab內容,而顯示核心內部看到的資料。始終是最新的,而如果在引導腳本未預期的某個時刻為唯讀,則可能不是最新的。格式類似於mount/proc/mounts/proc/mounts/etc/mtab/etc/etc/fstab

在這兩個檔案中,第一個空格分隔的欄位包含裝置路徑,第二個欄位包含安裝點。

awk -v needle="$device_path" '$1==needle {print $2}' /proc/mounts

或者如果你沒有 awk:

grep "^$device_path " /proc/mounts | cut -d ' ' -f 2

在許多極端情況下,您可能無法得到預期的結果。如果設備是透過/dev指定同一設備的不同路徑安裝的,您將不會以這種方式註意到它。在 中/proc/mounts,綁定安裝與原始安裝沒有區別。如果一個掛載點遮蔽了另一個掛載點,則可能存在多個匹配項(這種情況不常見)。

/proc/self或中/proc/$pid,有一個mounts模仿全域檔案的每進程檔案。安裝資訊可能因進程而異,例如由於chroot。還有一個名為 的附加文件,mountinfo它具有不同的格式並包含更多信息,特別是設備的主設備號和次設備號。來自文件

36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
(1)(2)(3)   (4)   (5)      (6)      (7)   (8) (9)   (10)         (11)

(1) mount ID:  unique identifier of the mount (may be reused after umount)
(2) parent ID:  ID of parent (or of self for the top of the mount tree)
(3) major:minor:  value of st_dev for files on filesystem
(4) root:  root of the mount within the filesystem
(5) mount point:  mount point relative to the process's root
(6) mount options:  per mount options
(7) optional fields:  zero or more fields of the form "tag[:value]"
(8) separator:  marks the end of the optional fields
(9) filesystem type:  name of filesystem of the form "type[.subtype]"
(10) mount source:  filesystem specific information or "none"
(11) super options:  per super block options

因此,如果您要按編號查找設備,可以這樣做:

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'

答案3

不帶參數的命令mount將列出所有目前安裝的檔案系統;您可以grep為您想要的磁碟(或,這是從中讀取資訊的grep /etc/mtab檔案):mount

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0

答案4

我不知道有一種乾淨而簡單的方法來檢測是否/dev安裝了設備節點。不過,這就是我能提供的。它處理直接安裝的設備 ( /dev/sda1) 和透過 UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f) 安裝的設備。如果您的裝置名稱包含空格,則會中斷。

deviceIsMounted()
{
    local DEVICE="$1"
    local MOUNT=$(
        (
            echo "$DEVICE"
            find /dev -type l -lname "*${DEVICE/*\/}" -exec readlink -f {} \; -print |
                xargs -n2 |
                awk -v device="$DEVICE" '$1 == device {print $2}'
        ) |
            xargs -n1 -i{} grep -F {} /proc/mounts
    )
    test -n "$MOUNT" && echo "$MOUNT"
}

deviceIsMounted /dev/sda1 && echo yes              # Mountpoint and status
deviceIsMounted /dev/md2 >/dev/null && echo yes    # Just status

該函數將條目從 寫入/proc/mounts標準輸出如果找到,也會退出狀態設為 0。

相關內容