Có một lệnh để xem nơi một đĩa được gắn kết?


28

Có một lệnh đơn giản lấy nút thiết bị của đĩa làm đầu vào và cho tôi biết đĩa đó được gắn ở đâu (và liệu) không? Có thể tự lấy điểm gắn kết, vì vậy tôi có thể chuyển nó sang lệnh khác không?

Tôi đang làm việc trên hệ thống trực tiếp Debian Squeeze với cài đặt tối thiểu (tôi có thể cài đặt các gói bổ sung nếu cần).

Câu trả lời:


13

Trong Linux, bạn có thể lấy thông tin điểm gắn kết trực tiếp từ kernel trong /proc/mounts. Các mountchương trình ghi lại các thông tin tương tự tại /etc/mtab. Các đường dẫn và tùy chọn có thể khác nhau, như /etc/mtabthể hiện những gì mountđược truyền cho kernel trong khi /proc/mountshiển thị dữ liệu như được thấy bên trong kernel. /proc/mountsluôn được cập nhật trong khi /etc/mtabcó thể không phải là nếu /etcchỉ đọc ở một số thời điểm mà các kịch bản khởi động không mong đợi. Các định dạng tương tự như /etc/fstab.

Trong cả hai tệp, trường được phân tách bằng khoảng trắng đầu tiên chứa đường dẫn thiết bị và trường thứ hai chứa điểm gắn kết.

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

hoặc nếu bạn không có awk:

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

Có một số trường hợp cạnh mà bạn có thể không nhận được những gì bạn mong đợi. Nếu thiết bị được gắn thông qua một đường dẫn khác trong /devđó chỉ định cùng một thiết bị, bạn sẽ không nhận thấy nó theo cách này. Trong /proc/mounts, gắn kết gắn kết không thể phân biệt với bản gốc. Có thể có nhiều hơn một trận đấu nếu một điểm gắn kết bóng khác (điều này là bất thường).

Trong /proc/selfhoặc /proc/$pid, có một mountstệp trên mỗi quy trình bắt chước tệp toàn cầu. Thông tin gắn kết có thể khác nhau giữa các quy trình, ví dụ như do chroot. Có một tệp bổ sung được gọi là mountinfocó định dạng khác nhau và bao gồm nhiều thông tin hơn, đặc biệt là các số chính và số phụ của thiết bị. Từ tài liệu :

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

Vì vậy, nếu bạn đang tìm kiếm một thiết bị theo số, bạn có thể làm như thế này:

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

"Nếu thiết bị được gắn thông qua một đường dẫn khác trong / dev chỉ định cùng một thiết bị, bạn sẽ không nhận thấy nó theo cách này." - Đó thực sự là trường hợp: Tôi có udiskssymlink (in / dev / đĩa / by-nhãn / ...). Nhưng tôi có thể giải quyết một nút thiết bị bằng cách sử dụng readlink -f. Tôi thích /proc/mountsý tưởng này, tôi nghĩ rằng nó có thể đáng tin cậy hơn một chút /etc/mtab.
gièm pha

@detly Hoặc bạn có thể sử dụng mountinfo. Gọi statđể lấy số thiết bị (xem câu trả lời cập nhật của tôi, tôi quên bao gồm lệnh trước đó).
Gilles 'SO- ngừng trở thành ác quỷ'

Bạn có thể cần -d " "tùy chọn cho lệnh cutđó grep.
Craig McQueen


26

Trên Linux, bây giờ bạn có thể sử dụng findmntlệnh từ util-linux(kể từ phiên bản 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

Hoặc lsblk(cũng từ util-linux, kể từ 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

Cái đó cũng hữu ích để tìm tất cả hệ thống tệp được gắn trong một thiết bị cụ thể (đĩa hoặc phân vùng ...):

$ 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  /

Để chỉ lấy điểm gắn kết:

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

Ở trên findmntkhông trở lại với trạng thái thoát thất bại nếu thiết bị không được gắn kết, không lsblk.

Vì thế:

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

Thật tốt khi học được điều gì đó mới
roaima 21/07/2015

6

Các mountlệnh với không có đối số sẽ liệt kê tất cả các hệ thống tập tin hiện gắn kết; bạn có thể grepcho đĩa bạn muốn (hoặc grep /etc/mtab, đó là tệp mountđọc thông tin từ):

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

Điều đó có rất nhiều văn bản bên ngoài mặc dù. Tôi cần để có thể vượt qua điểm gắn kết với các lệnh khác. (Xin lỗi, tôi đã làm rõ điều đó trong Q.)
gièm pha

À, grep ${NODE} /etc/mtab | cut -d ' ' -f 2nên làm đi.
gièm pha

Mặc dù grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"ít mong manh hơn ...
ghê tởm

2

Vâng. Bạn có thể thấy Chỉ hiển thị các Điểm thú vị / Lọc các loại không thú vị hoặc Các thư mục liệt kê trong /đó không thuộc cùng một Mountpoint cho một số cách sử dụng ví dụ, nhưng cũng có một tóm tắt ngắn gọn bên dưới. Lệnh bạn đang hỏi là findmnt (mặc dù lsblkcũng có thể phục vụ) :

lsblk -f /dev/sda[12]

NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sda1 vfat   ESP   F0B7-5DAE                            /esp
sda2 btrfs  sys   94749918-bde1-46e6-b77c-b66e0368ecdb /    

Bây giờ, như bạn có thể thấy, /dev/sda1được gắn vào /esp. Tôi tự hỏi nếu nó được gắn ở nơi khác là tốt?

findmnt /dev/sda1

TARGET SOURCE                    FSTYPE OPTIONS
/esp   /dev/sda1                 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
/boot  /dev/sda1[/EFI/arch_root] vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro

Aha. Tôi hiểu rồi. Một thư mục con cũng --bindđược gắn trên boot. Được...

sudo umount /boot /esp
findmnt /dev/sda1

Không có gì. Cái quái gì thế?

echo "$?"

1

Ohhh ... Chà, thật tuyệt. Ừm ...

for d in 1 2
do    findmnt "/dev/sda$d" >/dev/null
      printf  "/dev/sda$d%.$((6>>!$?))s%s\n"\
              " isn't" " currently mounted."
done

/dev/sda1 isn't currently mounted.
/dev/sda2 is currently mounted.

Ồ, vâng, điều đó thực sự tốt đẹp.

for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda2[/arch_root] /

Bây giờ, hãy đặt sda1 trở lại nơi nó thuộc về và thử lại ...

sudo mount -a
for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda1                 /esp
/dev/sda1[/EFI/arch_root] /boot
/dev/sda2[/arch_root] /

Nhưng tôi đã tìm thấy lệnh ma thuật này ở đâu?

man mount | sed -e:n -e'/findmnt/!d;N;/\n$/q;bn'

Để sử dụng đầu ra mạnh mẽ hơn và có thể tùy chỉnh findmnt(8) , đặc biệt là trong các tập lệnh của bạn. Lưu ý rằng các ký tự điều khiển trong tên mountpoint được thay thế bằng ?.


1

Tôi không biết một cách đơn giản và đơn giản để phát hiện xem một nút thiết bị /devcó được gắn hay không. Đây là những gì tôi có thể cung cấp, mặc dù. Nó xử lý các thiết bị được gắn trực tiếp ( /dev/sda1) và các thiết bị được gắn bởi UUID ( /dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f). Nó bị hỏng nếu tên thiết bị của bạn chứa khoảng trắng.

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

Hàm ghi mục nhập từ /proc/mountsvào thiết bị xuất chuẩn nếu được tìm thấy, đồng thời đặt trạng thái thoát thành 0. Nếu không, trạng thái thoát là 1.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.