디렉토리가 어느 장치에 있는지 확인

디렉토리가 어느 장치에 있는지 확인

만약 내가한다면

# 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)를 어떻게 결정합니까?

답변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)이며 소스 블록 장치가 없다는 점을 명심하십시오. 통계 출력의 장치가 무엇을 반환할지 알 수 없습니다. 단지 그 가치에 대해서만 그렇습니다.

답변4

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

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

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

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

관련 정보