Preciso confirmar que nenhuma parte de um disco está montada antes de sobrescrever o disco inteiro . O problema aqui é que parece que você tem que saber os nomes de quaisquer sistemas de arquivos no disco antes de verificá-los individualmente, e isso pode ser difícil em geral.
Por exemplo, o sistema no qual estou escrevendo isso tem um SSD e parted -l
mostra esse disco como /dev/nvme0n1
, tamanho 500G. /dev/block
mostra:
lrwxrwxrwx 1 root root 10 Nov 18 12:37 259:0 -> ../nvme0n1
lrwxrwxrwx 1 root root 12 Nov 18 12:37 259:1 -> ../nvme0n1p1
lrwxrwxrwx 1 root root 12 Nov 18 12:37 259:2 -> ../nvme0n1p2
O número menor 0 é então o 'disco inteiro', enquanto 1 é a partição de boot e 2 é a partição de swap. Este SSD é configurado para LVM, mas os dispositivos LVM têm /dev/mapper
nomes completamente diferentes.
A palavra nvme0n1
não aparece em lugar nenhum quando você verifica sistemas de arquivos montados ( mount
, findmnt nvme0n1
, /proc/mounts
, /etc/mtab
). A palavra nvme0n1p1
aparece , mas apenas porque é uma partição de inicialização montada ( /boot/efi
). Em geral, o disco que estou olhando pode não ter uma partição de inicialização, então procurar por nvme0n1
como prefixo pode não ser útil (e mesmo se eu encontrasse uma palavra com o prefixo correto, tenho garantia de que ela está na mesma unidade?)
Existe alguma maneira genérica de descobrir se um disco está 'em uso'? Neste caso em particular, posso analisar a lsblk
saída para encontrar os /dev/mapper
nomes em nvme0n1
, mas isso não parece ser uma boa solução a longo prazo.
Sim, o prefixo indica literalmente qual é a unidade:
nvme0n1
é o namespace 1 do dispositivo NVMe 0, e todosnvme0n1p##
os dispositivos de partição são nomeados dessa forma porque estão nessa unidade específica.Não é ruim, pois lsblk tem código para determinar tanto montagens diretas de partições, quanto relacionamentos device-mapper – e até mesmo relacionamentos mdraid, que são uma coisa separada do device-mapper. Não acho que possa haver uma solução verdadeiramente genérica sem recorrer a ferramentas como lsblk que sabem como reunir essas informações de vários lugares diferentes.
Em vez de analisar sua saída regular, execute
lsblk --json
e analise isso, encontrando seu disco e descendo em seu.children
atributo recursivamente, até encontrar um com um.mountpoints
.Mas mesmo o lsblk não sabe sobre sistemas de arquivos multidispositivos Btrfs, por exemplo (mostrando um ponto de montagem apenas em um dos dispositivos), e sabe ainda menos sobre o ZFS.
Verifique
/etc/mtab
, uma lista gerada pelo kernel de tudo o que está montadoman mtab
.Leia
man lsof
, especialmente a entrada inteira começando come fazer algo como
para cada sistema de arquivos montado.
Além disso, por precaução, verifique com
swapon
oucat /etc/swaps
, outro arquivo gerado pelo kernel.