파티션이 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개의 서로 다른 파일 시스템이 에 마운트되어 있습니다 /
.
rootfs
initramfs에 의해 생성된 파일 시스템입니다. 부트로더가 커널을 로드할 때 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/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=를 찾아 위치를 얻을 수 있어야 합니다.