출력에 파티션에 대한 직접적인 참조가 없는 경우 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개의 서로 다른 파일 시스템이 설치되어 있습니다 /
.
rootfs
initramfs에 의해 생성된 파일 시스템입니다. 부트로더가 커널을 로드할 때 tmpfs 파일 시스템으로 추출된 initramfs를 로드할 수 있습니다. 파일 시스템을 마운트 해제할 수 없습니다. initramfs가 작업을 완료하면 그 위에 실제 루트 파일 시스템을 마운트하기만 하면 됩니다.
20GB로 표시되는 이유는 df
tmpfs 파일 시스템에 액세스할 수 없기 때문입니다. 파일 시스템을 표시할 때 df
먼저 현재 마운트된 시스템 목록을 얻습니다 /etc/mtab
. 이렇게 하면 사용할 수 있는 2개의 마운트가 제공됩니다 /
. 그런 다음 statfs()
각 마운트 지점에서 시스템 호출을 수행합니다. 그러나 현재 루트 파일 시스템은 tmpfs initramfs 위에 있으므로 결국 현재 루트 파일 시스템을 두 번 계산하게 됩니다.
게다가 /dev/root
실제로는 심볼릭 링크입니다. 쉘 스크립트를 사용하여 실제로 가리키는 위치를 찾으려면 readlink -f /dev/root
.
업데이트: 좋습니다. 이 경우에는 더 이상 존재하지 않기 readlink -f /dev/root
때문에 작동하지 않습니다 . /dev/root
initramfs는 실제 루트 파일 시스템을 마운트하기 때문에 /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=를 검색하여 위치를 얻을 수 있습니다.