No linux, como posso determinar quais processos estão usando um dispositivo de bloco?

4

Eu tenho um disco em um servidor que estou migrando para um grupo de volumes LVM. Anteriormente, estava usando o particionamento de disco tradicional do DOS, hdb[1-5] .

Desmontei todos os sistemas de arquivos de hdb , desliguei o swap usando hdb , removi um VG menor no dispositivo e fui para particioná-lo usando o fdisk, excluí as partições existentes e criei 2 partições, mas escrevendo, o linux se recusou a reler a tabela de partições. Tentando novamente usando hdparm -z reports: BLKRRPART failed: Device or resource busy.

Eu verifiquei os seguintes locais para garantir que o dispositivo e suas partições não estão listados em nenhum lugar:

  • / proc / swaps
  • / proc / mdadm
  • saída do comando 'pvs'
  • saída do comando 'mount'
  • / etc / mtab
  • lsof | grep hdb

Mas cat /proc/partitions ainda lista o particionamento e hdparm -z /dev/hdb ainda me deixa ocupado.

Há algo que estou perdendo ou um lugar secreto que eu ainda não conheço para encontrar o que ainda está segurando no meu dispositivo de bloco? e, mais importante, como posso liberar a retenção para recarregar a tabela de partições?

FWIW, neste caso específico, posso simplesmente reinicializar o servidor sem muita preocupação, mas isso já me incomodou antes, e estou curioso para saber se existe uma maneira melhor.

(Editar: adicionou uma formulação mais precisa) (Edit: detalhes re repartitioning)

Atualização: usei partprobe /dev/hdb , e isso mudou as coisas: em / dev / hdb1, / deb / hdb [3-5] agora desapareceram e partprobe está reportando Error: Error informing the kernel about modifications to partition /dev/hdb1 -- Device or resource busy. < - especificamente sobre hdb1 . hdb1 antigamente era um Volume Físico (PV) em um Grupo de Volumes LVM (VG), mas eu removi + pvremoved antes de reparticionar ......

Atualização 2: FWIW, eu ainda não corrigi este problema, felizmente não é urgente. Eu aprendi que partprobe está usando uma chamada de API mais recente e é por isso que parece fazer algo mais cedo. Eu ainda não encontrei uma maneira simples e eficaz para, dado um dispositivo, e é maior / menor números, descobrir quais recursos (kernel ou userspace) estão usando. Alguma idéia?

    
por Jason 04.03.2010 / 20:31

4 respostas

3

Tente usar o fusor

fuser -vam /dev/hdb1
    
por 04.03.2010 / 22:36
1

O exemplo fuser -vam /dev/hdb1 de Eddy estava essencialmente correto, mas faltava alguma completude. No meu caso, me deparei com um problema semelhante ao recuperar arquivos de alguém da última unidade de uma matriz raid1 em que a partição que continha os dados estava no LVM.

Nesse caso, eu tinha iniciado photorec para examinar a unidade, visto que havia um grupo de volumes e, em seguida, fechei o terminal executando photorec . Sem o meu conhecimento, photorec ainda estava segurando /dev/mapper/vg0-lv0 . Então, no futuro, tente usar fuser , mas no conteúdo de /dev/mapper/

fuser -vam /dev/mapper/*

Esta provavelmente ainda não é a melhor resposta, mas lembre-se de tentar checar quaisquer arquivos em / dev / que também possam mapear de alguma forma o dispositivo de bloco que você está tentando usar.

    
por 12.08.2014 / 03:29
0

lsof é o comando que você está procurando. Você normalmente deseja canalizá-lo para grep com o ponto de montagem.

Exemplo lsof | grep var listará todos os processos que possuem arquivos abertos em que o caminho ou o nome do arquivo contenha "var"

    
por 04.03.2010 / 20:44
0

Qual é a saída do comando mount . Não tenho certeza se isso se aplica à sua situação, mas sei que usei montagens de bind em várias ocasiões. Desmontar o sistema de arquivos de origem de uma montagem de ligação não desmonta montagens de ligação. A saída do mount não é muito útil neste caso para você saber o que está acontecendo.

    
por 04.03.2010 / 21:41