mapeador de dispositivo: falha na remoção do ioctl no luks-xxxx: dispositivo ou recurso ocupado

28

Enquanto eu estava fora do meu computador, minha unidade USB criptografada foi desmontada acidentalmente de alguma forma (embora ainda estivesse fisicamente conectada na época). Não consegui me recuperar (ainda não tentei reiniciar). Agora desconectei completamente o dispositivo, mas ainda fico "Dispositivo ou recurso ocupado" quando tento remover a entrada dangling no / dev / mapper. Posso reconectar e montar a unidade sem uma reinicialização?

Aqui está o que eu tentei (nome longo alterado para "xxxxx") ...

$ sudo dmsetup ls
luks-xxxxx (252:1)
luks-yyyyy (252:0)

$ sudo umount /dev/mapper/luks-xxxxx
umount: /dev/mapper/luks-xxxxx: not mounted

$ sudo fuser --kill /dev/mapper/luks-xxxxx
$ echo $?
1

$ sudo dmsetup info -c luks-xxxxx
Name       Maj Min Stat Open Targ Event  UUID
luks-xxxxx 252   1 L--w    1    1      0 CRYPT-LUKS1-xxxxx-luks-xxxxx

$ sudo dmsetup remove luks-xxxxx
device-mapper: remove ioctl on luks-xxxx failed: Device or resource busy
Command failed

Depois de reconectar o dispositivo ...

$ sudo cryptsetup luksOpen "/dev/sde1" "luks-xxxxx"
Device luks-xxxxx already exists.

[EDIT] Solucionei o problema, desta vez, fechando um editor de texto da GUI que não tinha arquivos abertos, mas havia sido iniciado a partir de uma pasta no dispositivo em questão. Portanto, a pergunta se torna mais específica: como você pode identificar qual aplicativo está mantendo o dispositivo aberto?

Lembre-se de que lsofisso não parece apresentar uma solução fácil porque, uma vez que o dispositivo é desconectado, os nomes associados fornecidos por lsofnão incluem mais o nome do dispositivo desconectado.

nobar
fonte
Correndo para o mesmo problema, mas no CentOS. Encontrei este link: krenel.org/... mas eu não mostram o dispositivo montado
Lars Nordin
Parece notavelmente semelhante a este relatório de bug fechado como corrigido : bugs.debian.org/cgi-bin/bugreport.cgi?bug=574126
nobar 9/16
Palavra de aviso: A montagem com o sudo, como mostrado aqui, pode impedir a ejeção normalmente usando o gerenciador de arquivos no espaço do usuário.
Nobar

Respostas:

27

Depois de dois anos de luta com isso, acho que finalmente consegui entender completamente!

dmsetup ls fornece os dados necessários:

$ sudo dmsetup ls
luks-xxxxx (252:1)

então

sudo lsof |grep 252,1

Parece que sudopode ser crítico aqui - pelo menos em alguns casos.


Isso deve fornecer as informações necessárias para fechar todos os arquivos abertos no dispositivo - incluindo nomes de arquivos abertos e IDs de processo para os aplicativos ofensivos. Você pode simplesmente acessar esses aplicativos e fechá-los, mas uma abordagem de força bruta pode ser algo como:

kill -9 (process ID)

Depois de fechar todos os arquivos, algumas das ferramentas de linha de comando mostradas na pergunta podem ser necessárias para fechar a montagem existente antes que ela possa ser reaberta normalmente.

nobar
fonte
4
Observe a ligeira tradução necessária: (252:1)torna - se 252,1.
Nobar
12

Tente parar o grupo LVM antes de parar o código:

lvchange -a n [LVM_Group_name]

então

cryptsetup -v luksClose [LUKS_name]

Amostra:

lvchange -a n My_vg_crypt
cryptsetup -v luksClose My_Crypt
Anonimo
fonte
1
Use a resposta do @ nobar primeiro (mas tente killantes kill -9). No entanto, a solução do @ nobar não foi suficiente para mim - parece que o próprio kernel tinha o dispositivo aberto por causa dos mapeamentos de dispositivos LVM - que esta resposta resolveu.
Tom Hale
+1 No meu caso, a resposta aceita grepnão encontrou nenhuma correspondência, mas funcionou.
user000001 18/01
4

da próxima vez tente um preguiçoso

umount -l /<folder>

Isso funciona para mim na maioria das vezes, especialmente útil com unidades NFS desligadas.

s1mmel
fonte
Eu tentei isso, mas não ajudou no problema em questão. Suponho que você não possa realmente usar LUKS sobre NFS, e que essa foi apenas uma sugestão instantânea.
No9
este era exatamente o meu problema, esqueci que precisava desmontar o armazenamento mapeado primeiro: D
holms
2

Aqui está como eu consigo resolver esse problema no Linux Mint 17.3 (~ Ubuntu Trusty):

  1. remova o dispositivo do mapeador de dispositivos

    $ sudo dmsetup remove luks-xxyyzz
    
  2. mapeie de volta

    $ sudo cryptsetup open /dev/sdc1 luks-xxyyzz
    Enter passphrase for /dev/sdc1:
    

Agora os dispositivos estão acessíveis.

Édouard Lopez
fonte
2
Esta postagem pode ser útil para alguém, mas, como observado na pergunta, às vezes dmsetup removerelata "Falha no comando".
Nobar
0

Eu estava em uma situação semelhante, mas não consegui resolver o problema removendo o luks-xxxxdispositivo. Em vez disso, tive que remover ubuntu--vg-root.

Minha situação era:

  • Eu removi o dispositivo acidentalmente antes de ser bloqueado.
  • Tentativa de bloquear ou remover o dispositivo luks após o fato falhar com uma mensagem de erro ocupada .
  • O desbloqueio do mesmo dispositivo falhou porque um dispositivo com o mesmo nome já existia.
  • lsof não mostrou nenhum identificador aberto para o dispositivo.

O que ajudou foi desconectar o dispositivo físico e remover o ubuntu--vg-rootdispositivo com o seguinte comando:

sudo dmsetup remove ubuntu--vg-root

Nesse ponto, eu era capaz de ativar e descriptografar o dispositivo externo novamente com minha configuração usual:

udisksctl unlock -b /dev/sda3
sudo lvchange --activate y ubuntu-vg/root
justfortherec
fonte