마운트 지점으로 파티션 식별

마운트 지점으로 파티션 식별

파티션이 df출력에서 ​​직접 참조되지 않는 경우 Linux에서 파일 시스템이 마운트된 파티션을 어떻게 식별할 수 있습니까?

예를 들어, 우리 시스템의 fdisk출력은 다음과 같습니다:

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2550    20478976   83  Linux
/dev/sda2            2550       60736   467378176   83  Linux
/dev/sda3           60736       60801      523264   82  Linux swap / Solaris

그리고 출력은 다음과 df같습니다:

Filesystem      Size  Used Avail Use% Mounted on
rootfs           20G  881M   18G   5% /
/dev/root        20G  881M   18G   5% /
devtmpfs        989M  216K  989M   1% /dev
/dev/sda2       443G  199M  420G   1% /home
tmpfs           990M     0  990M   0% /dev/shm
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named
/dev/root        20G  881M   18G   5% /var/named/chroot/var/named
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.conf
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.rfc1912.zones
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/rndc.key
/dev/root        20G  881M   18G   5% /var/named/chroot/usr/lib64/bind
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.iscdlv.key
/dev/root        20G  881M   18G   5% /var/named/chroot/etc/named.root.key

해당 목록에서 유일하게 확실한 파티션은 입니다 /dev/sda2. 다른 것들은 어느 파티션에 있는지 볼 수 없습니다(bash 스크립트를 통해 이 작업을 수행하려고 합니다).

/dev/root예를 들어, 둘 다 동일한 20GB 크기를 가지고 있기 때문에 마운트되어 있다는 것을 알고 있지만 /dev/sda1스크립트에서 이를 어떻게 식별할 수 있습니까?

출력 ls -l /dev/root /dev/sda1:

[root@server etc]# ls -l /dev/root /dev/sda1
ls: cannot access /dev/root: No such file or directory
brw-rw---- 1 root disk 8, 1 May  7 14:16 /dev/sda1

답변1

그 출력은 오해의 소지가 있습니다.
실제로 2개의 서로 다른 파일 시스템이 에 마운트되어 있습니다 /.

rootfsinitramfs에 의해 생성된 파일 시스템입니다. 부트로더가 커널을 로드할 때 tmpfs 파일 시스템에 압축이 풀린 initramfs를 로드하는 기능이 있습니다. 이 파일 시스템은 마운트 해제할 수 없습니다. initramfs가 작업을 완료하면 그 위에 실제 루트 파일 시스템을 마운트하기만 하면 됩니다.

20GB로 표시되는 이유는 df해당 tmpfs 파일 시스템에 접근할 수 없기 때문입니다. 파일 시스템을 표시 하려면 df먼저 /etc/mtab. 이렇게 하면 2개의 마운트가 제공됩니다 /. 그런 다음 statfs()각 마운트 지점에서 syscall을 만듭니다 . 그러나 현재 루트 파일 시스템은 tmpfs initramfs 위에 위치하므로 현재 루트 파일 시스템을 두 번 지정하게 됩니다.

또한 /dev/root실제로는 심볼릭 링크입니다. 쉘 스크립트를 사용하여 실제로 가리키는 위치를 찾으려면 readlink -f /dev/root.


업데이트: 좋습니다. 이 경우에는 더 이상 존재하지 않으므로 readlink -f /dev/root작동하지 않습니다 . /dev/rootinitramfs는 실제 루트 파일 시스템을 마운트한 것이기 때문에 /dev/root거기에 존재했을 것입니다. 그러나 initramfs는 묻혀 있으므로 /dev/root더 이상 존재하지 않습니다.

이 경우 훨씬 더 어려워집니다.
당신이 할 수 있는 일은 를 사용하여 stat마운트 지점에 대한 장치 번호를 얻은 다음 /dev이를 검색하는 것입니다.

예를 들어 내 시스템에서는 다음과 같은 결과가 나타납니다.

$ stat --format '%D' /
fd00

$ stat --format '%02t%02T' /dev/mapper/sys-root
fd00

$ for device in $(blkid -o device); do 
>   [ "$(stat --format '%04D' /)" = "$(stat --format '%02t%02T' "$device")" ] && \
>     echo "$device" && \
>     break
> done
/dev/mapper/sys-root

기본적으로 이것이 수행하는 작업 stat/. 그런 다음 알려진 모든 블록 장치를 반복하여 메이저 및 마이너 장치가 동일한 장치를 찾습니다. 예쁘지는 않지만 기본적으로 /dev항목의 이름이 다르기 때문에 검색해야 합니다.

이 작업을 더 효율적으로 수행할 수 있지만 코드를 단순하게 유지하고 싶었습니다.

답변2

/dev/root는 실제 장치에 대한 심볼릭 링크입니다. ls /dev/root, reallink를 사용하거나 /proc/cmdline에서 root=를 찾아 위치를 얻을 수 있어야 합니다.

관련 정보