디스크가 마운트 된 위치를 확인하는 명령이 있습니까?


28

디스크의 장치 노드를 입력으로 사용하여 디스크가 마운트 된 위치 (및 여부)를 알려주는 간단한 명령이 있습니까? 마운트 지점을 자체적으로 가져 와서 다른 명령에 전달할 수 있습니까?

최소 설치로 데비안 스퀴즈 라이브 시스템을 작업 중입니다 (필요한 경우 추가 패키지를 설치할 수 있음).

답변:


13

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

"같은 장치를 지정하는 / dev의 다른 경로를 통해 장치를 마운트 한 경우 이러한 방식으로 장치가 표시되지 않습니다." — 실제로는 udisks그렇습니다. symlink (/ dev / disk / by-label / ...)가 있습니다. 그러나를 사용하여 장치 노드로 해결할 수 있습니다 readlink -f. /proc/mounts아이디어가 마음에 듭니다 /etc/mtab.
detly

@detly 또는 사용할 수 있습니다 mountinfo. stat장치 번호를 얻기 위해 전화 하십시오 (업데이트 된 답변 참조, 이전에 명령을 포함하는 것을 잊었습니다).
Gilles 'SO- 악한 중지'

해당 명령에 -d " "옵션 이 필요할 수 있습니다 . cutgrep
Craig McQueen


26

Linux에서는 이제 버전 2.18부터 다음 findmnt명령을 사용할 수 있습니다 util-linux.

$ 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-linux2.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

새로운 것을 배우는 것이 항상 좋습니다
roaima

6

mount인수없이 명령은 현재 마운트 된 모든 파일 시스템을 나열합니다; grep원하는 디스크 (또는 정보를 읽는 grep /etc/mtab파일)에 대해 다음과 같이 할 수 있습니다 mount.

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

그래도 외부 텍스트가 많이 있습니다. 마운트 지점을 다른 명령으로 전달할 수 있어야합니다. (죄송 합니다만, Q에서 명확히했습니다.)
detly

아, grep ${NODE} /etc/mtab | cut -d ' ' -f 2그래
detly

grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"훨씬 덜 취약 하지만 ...
detly

2

예. 일부 사용 예 에서는 동일한 마운트 포인트 아래 /에 있지 않은 흥미로운 마운트 포인트 표시 / 관심없는 유형 필터링 또는 디렉토리 목록 표시를 볼 수 있지만 아래에 간단한 요약도 있습니다. 당신에 대해 요구하는 명령입니다 findmnt (하지만 lsblk힘도 제공) :

lsblk -f /dev/sda[12]

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

보시 /dev/sda1다시피에 탑재되어 /esp있습니다. 다른 곳에도 장착되어 있는지 궁금합니다.

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

아하. 내가 참조. 하위 폴더도 --bind부팅시 마운트됩니다. 승인...

sudo umount /boot /esp
findmnt /dev/sda1

아무것도. 도대체?

echo "$?"

1

오 .. 잘 됐네요. 흠 ...

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.

네, 정말 좋습니다.

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

/dev/sda2[/arch_root] /

이제 sda1이 속한 곳에 다시 넣고 다시 시도하십시오 ...

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

그러나이 마법의 명령을 어디서 찾았습니까?

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

보다 강력하고 사용자 정의 가능한 출력을 얻으 려면 특히 스크립트에서 findmnt(8)을 사용 하십시오. 탑재 지점 이름의 제어 문자는로 바뀝니다 ?.


1

장치 노드 /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/mountsstdout에 기록하고 종료 상태도 0으로 설정합니다. 그렇지 않으면 종료 상태는 1입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.