디렉토리가있는 장치 확인


49

만약 내가한다면

# 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)가 표시 될지 어떻게 알 수 있습니까?

답변:


49

귀하의 질문을 이해하면 주어진 마운트에 어떤 장치가 사용되었는지 알고 싶습니다. 이를 위해 다음 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 (Logical Volume Management)을 사용하고 있으며 LVM에서 어떤 실제 장치가 사용되고 있는지 알기 위해 추가로 쿼리해야합니다.


경우 $PWD(I 장착하고있는 무슨이다)이 심볼릭 링크, 바인드 마운트 등의 시리즈에 묻혀 나는 재귀 적으로 마운트 지점에 대한 경로를 조사해야합니다.
StrongBad

바인드 마운트를 사용하면 /proc/mounts적어도 내 마음에 마운트 된 "사물" 에 나타나는 내용에도 불구하고 디렉토리 / 파일 장치가 아닙니다.
StrongBad

@StrongBad-무엇을 readlink -f /mnt보여줍니까?
slm

2
심볼릭 링크에 의해 가려 질 때 마운트 지점 / 장치를 결정해야하는 경우 @StrongBad를 질문에 넣어야합니다. 정답을 얻는 것이 훨씬 쉬워집니다.
Patrick

readlink -f /mnt제공/mnt
StrongBad

29

리눅스에 우리는 한 findmnt에서 util-linux정확히이 만들어

findmnt -n -o SOURCE --target /path/to/FILE

다른 솔루션의 장점은 경로가 심볼릭 링크 또는 중복 바인드 마운트로 가려져도 여전히 작동한다는 것입니다.


이것은 나를 위해 작동하지 않습니다. 시스템의 모든 마운트 소스를 보여줍니다. util-linux 2.23.2에서 findmnt
bwduncan

@ bwduncan 나를 위해 2.23.2에서 작동합니다. 아마도 버그? 최신 버전 2.29.2를 사용해 볼 수 있습니까?
rudimeier

우분투의 2.29는 트릭을 수행합니다. 버그가 아니라 더 많은 기능 :)
bwduncan

1
감사! 그것이 바로 시스템 스크립트에 필요한 것입니다.
vog

11

내가 알고있는 가장 정확한 방법은 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)

세 번째 줄인 첫 번째 필드 인 "장치"에 주목하십시오. 여기에 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) 유틸리티를 확인하십시오. 다음 구문으로 메이저 8, 마이너 18을 사용하여 aardvark라는 새로운 / dev 항목을 만들 수 있습니다.

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에는 동일한 파일 시스템이 마운트되어 있기 때문에 / dirnt를 통해 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는 동일한 장치입니다.

나는 방금 소설을 타이핑하고 상반기가 실제로 귀하의 질문에 전혀 대답하지는 않는다는 것을 알고 있지만 그것을 삭제하는 것은 낭비처럼 보입니다. 아마도 다른 사람을 도울 것입니다.

행운을 빕니다.

추신 일부 파일 시스템은 NFS 또는 CIFS와 같은 네트워크 기반이거나 가상 또는 procfs 또는 sysfs와 같으며 소스 블록 장치가 없습니다. stat 출력에서 ​​장치로 무엇이 반환 될지 알 수 없으며 가치가 있습니다.


1
첫 번째 부분은 마지막 부분을 이해하는 데 도움이됩니다.
StrongBad

이 답변은 tmpfs 경로에는 작동하지 않습니다. / proc / partitions에서 st_dev minor, major를 찾을 수 없습니다.
mbello

@mbello 대답의 끝에서 언급 했듯이이 방법은 tmpfs 마운트와 같은 백업 장치가없는 파일 시스템에서는 작동하지 않으며 작동하지 않습니다.
5

2

다음과 같은 일반적인 마운트 지점이 제공됩니다.

$ df --output=target
Mounted on
/
/dev
/run
/sys/fs/cgroup
/run/lock
/run/shm
/run/user

stat --format %m <path> 권한 부여 오류를 명확하게 감지하려면 종료 코드를 확인해야하지만 마운트 테이블 접근 방식이 여기에서 승리합니다).

$ stat --format %m /
/
$ stat --format %m /tmp
/
$ stat --format %m /proc
/proc
$ stat --format %m /run
/run
$ stat --format %m /run/mount
/run
$ stat --format %m /run/user
/run/user
$ stat --format %m /run/user/1000/dconf
/run/user
$ stat --format %m /run/user/1000/gvfs
/run/user/1000/gvfs

Symlink는 평소와 같이 약간의주의를 기울입니다.

$ ls -lh ~/.gvfs
/home/cwillu/.gvfs -> /run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/

물론 스크립팅 할 때 따옴표를 사용해야합니다. 공백이있는 마운트 지점 경로를 고려하십시오.

$ mkdir /tmp/Something\ Like\ This\!
$ sudo mount none /tmp/Something\ Like\ This\! -t tmpfs
$ stat --format %m /tmp/Something\ Like\ This\!
/tmp/Something Like This!
$ touch /tmp/Something\ Like\ This\!/pretend-I\'m-big
$ ls /tmp/Something\ Like\ This\!
pretend-I'm-big

당신 얼마나 큽 니까?

$ du $(stat --format %m /tmp/Something\ Like\ This\!/)
du: cannot access /tmp/Something: No such file or directory
du: cannot access Like: No such file or directory
du: cannot access This!: No such file or directory

$ du "$(stat --format %m /tmp/Something\ Like\ This\!/)"
0   /tmp/Something Like This!

내 배포판의 탭 완성도이 권리를 얻지 못하므로 캐리지 리턴과 줄 바꿈 및 공백이있는이 예제 마운트 포인트를 와일드 카드로 표시합니다.

$ stat --format %m /tmp/Something*
/tmp/Something   
Like   This!

$ a="$(stat --format %m /tmp/Something*)"
    # the above assignment is actually the one place you don't need quotes, 
    # but `export a=...` or similar _would_ need them, so we'll just put them in;
    # they don't change the behaviour in this form of assignment.

$ stat "$a"
  File: ‘/tmp/Something   \r\n\rLike   This!’
  Size: 40          Blocks: 0          IO Block: 4096   directory
Device: 7bh/123d    Inode: 1279171     Links: 2
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-09-30 11:43:17.933467344 -0600
Modify: 2016-09-30 11:43:17.933467344 -0600
Change: 2016-09-30 11:43:17.933467344 -0600
 Birth: -

1
<kbd> 마크 업은 전체 명령이 아닌 단일 키에 사용됩니다. 겸손한 견해로는 이런 식으로 더 나아 보이지 않습니다.
Tomasz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.