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

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

출력에 파티션에 대한 직접적인 참조가 없는 경우 Linux에서 파일 시스템이 마운트된 파티션을 어떻게 식별합니까 df?

예를 들어, 우리 시스템의 출력은 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 스크립트를 통해 이 작업을 수행하기를 바랍니다).

예를 들어, 크기가 모두 20GB로 동일하기 때문에 /dev/root설치 되었다는 것을 알 수 있지만 /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로 표시되는 이유는 dftmpfs 파일 시스템에 액세스할 수 없기 때문입니다. 파일 시스템을 표시할 때 df먼저 현재 마운트된 시스템 목록을 얻습니다 /etc/mtab. 이렇게 하면 사용할 수 있는 2개의 마운트가 제공됩니다 /. 그런 다음 statfs()각 마운트 지점에서 시스템 호출을 수행합니다. 그러나 현재 루트 파일 시스템은 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=를 검색하여 위치를 얻을 수 있습니다.

관련 정보