Identifica a partição pelo ponto de montagem

3

Como podemos identificar em qual partição um sistema de arquivos é montado no Linux quando a partição não é diretamente referenciada em df output?

Por exemplo, a saída fdisk do nosso sistema é:

   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

E a saída de 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

A partir dessa lista, a única partição óbvia é /dev/sda2 ; para os outros, não podemos ver em qual partição eles residem (queremos fazer isso por meio de um script bash).

Por exemplo, sabemos que /dev/root está montado em /dev/sda1 , pois ambos têm o mesmo tamanho de 20 GB, mas como podemos identificar isso de um script?

Saída de 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
    
por Chris 12.05.2014 / 16:05

2 respostas

1

Esse resultado é enganoso.
Você realmente tem 2 sistemas de arquivos diferentes montados em / .

rootfs é o sistema de arquivos criado por um initramfs. Quando o bootloader carrega o kernel, ele tem a capacidade de carregar um initramfs que é descompactado em um sistema de arquivos tmpfs. Este sistema de arquivos não pode ser desmontado. Quando o initramfs é executado, ele simplesmente monta o sistema de arquivos raiz real sobre ele.

A razão pela qual df mostra como 20gb é porque ele não pode chegar ao sistema de arquivos tmpfs. Quando df vai mostrar os sistemas de arquivos, primeiro obtém uma lista de montagens atuais de /etc/mtab . Isso dá 2 montagens usando / . Em seguida, faz um statfs() syscall em cada ponto de montagem. Mas, como o sistema de arquivos raiz atual fica no topo do tmpfs initramfs, ele acaba gravando o sistema de arquivos raiz atual duas vezes.

Além disso, /dev/root é, na verdade, um link simbólico. Para descobrir onde realmente aponta usando um script de shell, você pode usar readlink -f /dev/root .

Atualização: Ok, então, neste caso, readlink -f /dev/root não funciona, pois /dev/root não existe mais. Como o initramfs é o que montou seu sistema de arquivos raiz real, /dev/root teria existido lá. Mas como o initramfs está enterrado, /dev/root não está mais lá.

Neste caso, torna-se muito mais difícil.
O que você pode fazer é usar stat para obter o número do dispositivo para o ponto de montagem e, em seguida, pesquisar /dev para isso.

Por exemplo, no meu sistema, isso gera:

$ 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

Basicamente, o que isso faz é usar stat para obter o maior e menor número de / do dispositivo. Em seguida, percorremos todos os dispositivos de blocos conhecidos procurando um com o mesmo dispositivo maior e menor. Não é bonito, mas basicamente a entrada /dev tem um nome diferente e, portanto, precisamos procurá-lo.

Isto poderia ser feito de forma mais eficiente, mas eu queria manter o código simples

    
por 12.05.2014 / 16:17
0

/ dev / root é um link simbólico para o dispositivo real. Você deve ser capaz de obter o local com ls / dev / root, realink ou procurando root = in / proc / cmdline.

    
por 12.05.2014 / 16:18

Tags