Listar todas as formas em que um dispositivo de bloco está em uso

4

Eu quero ter certeza de que um disco rígido removível (USB, mas isso não importa) é seguro para remover. Digamos que essa unidade seja sdb .

Obviamente, preciso ter certeza de que não há nenhum sistema de arquivos montado nessa unidade. grep /dev/sdb /proc/mounts vai me dizer.

Mas essa não é toda a história. Por exemplo, se houver um volume físico LVM em sdb , precisarei desativar todos os grupos de volumes que contenham um volume físico localizado em sdb ( lvchange -an my_volume_group/my_logical_volume then vgchange -an my_volume_group ). Se houver um volume RAID, talvez precise desativá-lo ( mdadm -S ) ou talvez queira marcar o componente como com falha ( mdadm -f ).

Existe uma maneira de listar todas as formas em que um disco está em uso? Para meu caso de uso, preciso ter certeza de que essa lista é exaustiva, para que eu possa desconectar o dispositivo se a lista estiver vazia.

    
por Gilles 20.09.2013 / 18:54

2 respostas

4

Se você conseguir abrir um dispositivo de bloco O_EXCL , ele não está sendo usado pelo kernel ( O_EXCL recebe um bloqueio de dispositivo nesse caso específico). O lsof (/ proc scanning) deve encontrar quaisquer outros usuários (as VMs podem ter o dispositivo aberto e freqüentemente não conseguem abrir exclusivamente).

    
por 20.09.2013 / 18:58
3

+1 para a resposta de Gabriel - O_EXCL é exatamente a solução que usei neste cenário. Aqui está a função Perl que escrevi para verificar se um dispositivo está em uso:

use Fcntl;
use Errno;

sub device_in_use($)
{
  my $device = shift;
  # open with O_EXCL returns EBUSY if a device is in use
  # http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html
  return $!{EBUSY} if (!sysopen my $fh, $device, O_EXCL);
  close $fh;
  return 0;
}

Tenha em atenção que não tem tratamento de erros adequado - espera que o dispositivo exista e que tenha permissões de raiz.

    
por 20.09.2013 / 19:05