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