디렉터리가 어떤 장치에 있는지 확인

디렉터리가 어떤 장치에 있는지 확인

만약 내가한다면

# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt

의 항목은 다음 /proc/mounts과 같습니다

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

이는 /home에 장착되어 쉽게 추론할 수 없는 장치입니다 . 바인드 마운트가 심볼릭 링크, 기타 바인드 마운트 등에 의해 잠재적으로 "가려지는" 디렉터리/파일에 대한 것일 수 있다는 점을 고려하여 일반적으로 어떤 장치(즉, /dev/sda2)가 표시될 것인지 어떻게 결정할 수 있습니까 ?$PWD/test/proc/mounts

답변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) 유틸리티를 확인하세요. 다음 구문을 사용하여 메이저 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에는 동일한 파일 시스템이 마운트되어 있으므로 /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와 같은 가상이며 소스 블록 장치가 없다는 점을 명심하십시오. stat 출력에서 ​​장치로 무엇이 반환될지는 알 수 없습니다. 단지 그 가치에 대해서만 그렇습니다.

답변4

마운트된 다른 파일 시스템의 콘텐츠를 무시하는 스위치를 사용하여 명령 du을 호출할 수 있습니다 .-x

스위치 -k는 디렉터리 크기를 KB 단위로 표시합니다.

크기가 1MB 이상인 디렉토리를 표시합니다.

du -xk / | awk ' $1 > 1000000 { print } '

관련 정보