mv: não é possível mover “casa” para “casa antiga”: dispositivo ou recurso ocupado

10

Quero substituir /homepor um link simbólico para meus diretórios domésticos montados em NFS.

Somente o root está logado, / home não é um sistema de arquivos separado, lsof não mostra bloqueios, o selinux é permissivo. o que estou perdendo?

Estou logado diretamente como root via ssh:

[root@usil01-sql01 /]# uname -a
Linux usil01-sql01 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[root@usil01-sql01 /]# w
 15:30:33 up  1:41,  1 user,  load average: 0.00, 0.02, 0.22
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/2    10.50.11.114     15:13    1.00s  0.19s  0.01s w

[root@usil01-sql01 /]# lsof | grep /home

[root@usil01-sql01 /]# lsof +D /home

[root@usil01-sql01 /]# df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        63G  4.1G   56G   7% /

[root@usil01-sql01 /]# mount | grep -w /
/dev/sda2 on / type ext4 (rw,relatime,seclabel,data=ordered)

[root@usil01-sql01 /]# ls -lFd /home
drwxr-xr-x. 3 root root 4096 Mar  7 13:36 /home/

[root@usil01-sql01 /]# getenforce
Permissive

[root@usil01-sql01 /]# mv /home /home-old
mv: cannot move "/home" to "/home-old": Device or resource busy

O que mais posso verificar?

Mais informações do sistema:

[root@usil01-sql01 /]# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 836.6G  0 disk 
|-sda1   8:1    0 768.6G  0 part /storage
|-sda2   8:2    0    64G  0 part /
`-sda3   8:3    0     4G  0 part [SWAP]
sr0     11:0    1  1024M  0 rom  

[root@usil01-sql01 /]# blkid
/dev/sda2: UUID="5ba6a429-4c65-4023-82b4-3673bfcf6a88" TYPE="ext4" 
/dev/sda3: UUID="b5eb680f-8789-43b2-9f7e-c52570b0eb73" TYPE="swap" 
/dev/sda1: UUID="cb22d57d-4a5b-4963-a990-890abe0c56dc" TYPE="ext4" 
TheAmigo
fonte
Experimente a opção umount preguiçoso como emumount -f -l /home
Valentin Bajrami
Tente procurar um processo suspeito que consome muitos recursos sem ser conhecido por você com topou ps. Eles tentam ver o que estão fazendo agora usando strace. Essa situação é estranha tmm. UPDATE: verifique também a lsofsaída com fuserapenas uma por precaução.
precisa saber é o seguinte
1
@ val0x00ff como você pode ver na saída acima, / home não é um ponto de montagem.
TheAmigo
1
@ddnomad fusor / home também não possui saída. É um sistema recém-instalado parado, sem processos ocupados.
TheAmigo
@TheAmigo eu vejo. Presumo que você já tentou simplesmente reiniciar o host. Você também pode tentar inicializar no modo de segurança no menu GRUB e tentar lá.
precisa saber é o seguinte

Respostas:

9

mv: não é possível mover "/ home" para "/ home-old": dispositivo ou recurso ocupado

O único "uso" [*] em que consigo pensar, que impede a alteração do nome de um arquivo, é um ponto de montagem.

O que mais posso verificar?

Não tenho certeza, mas talvez isso possa acontecer se a montagem ainda existir em outro espaço para nome da montagem. Porque não está sendo desmontado propagado do namespace raiz, por algum motivo? Ou olhando o resultado no meu sistema, talvez com serviços systemd ProtectHome?

$ grep -h home /proc/*/task/*/mountinfo | sort -u
121 89 0:22 /systemd/inaccessible/dir /home ro,nosuid,nodev shared:142 master:24 - tmpfs tmpfs rw,seclabel,mode=755
275 243 253:2 / /home ro,relatime shared:218 master:33 - ext4 /dev/mapper/alan_dell_2016-home rw,seclabel,data=ordered
321 288 253:2 / /home rw,relatime shared:262 master:33 - ext4 /dev/mapper/alan_dell_2016-home rw,seclabel,data=ordered
84 64 253:2 / /home rw,relatime shared:33 - ext4 /dev/mapper/alan_dell_2016-home rw,seclabel,data=ordered
85 46 253:2 / /home rw,relatime master:33 - ext4 /dev/mapper/alan_dell_2016-home rw,seclabel,data=ordered

Observe que esse problema - incapaz de renomear / home, apesar de não aparecer como um ponto de montagem (no espaço para nome atual) - deve ser corrigido no kernel Linux versão 3.18+.

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?h=linux-3.18.y&id=8ed936b5671bfb33d89bc60bdcc7cf0470ba52fe


como descobrir o espaço para nome de um processo específico?

lsnspode ser útil se você puder instalá-lo. Mais comandos possíveis:

Listar namespaces de montagem:

# readlink /proc/*/task/*/ns/mnt | sort -u

Identifique o espaço para nome da montagem raiz:

# readlink /proc/1/ns/mnt

Localizar processos com um determinado namespace de montagem

# readlink /proc/*/task/*/ns/mnt | grep 4026531840

Inspecione o espaço para nome de um determinado processo:

# cat /proc/1/task/1/mountinfo

[*] EBUSY A renomeação falha porque oldpath ou newpath é um diretório que está sendo usado por algum processo (talvez como diretório de trabalho atual ou como diretório raiz ou porque estava aberto para leitura) ou está sendo usado pelo sistema (por exemplo como ponto de montagem) , enquanto o sistema considera isso um erro. (Observe que não há necessidade de retornar EBUSY nesses casos - não há nada errado em renomear mesmo assim - mas é permitido retornar EBUSY se o sistema não conseguir lidar com essas situações.)

sourcejedi
fonte
/ home nunca foi uma montagem em nenhum espaço para nome.
TheAmigo
Isso significa que você usou comandos ao longo das linhas que sugeri? Como "nunca" é uma afirmação muito forte, meus comandos não demonstrariam isso. Eu adicionei um comando no início que seria mais simples (e espero que funcional :), e uma segunda especulação sobre por que isso pode acontecer com base no resultado do meu sistema.
sourcejedi
Encontrei outra máquina "quebrada" e seu comando grep de fato aponta o dedo para o NetworkManager. Portanto, meu "pare o NM, renomeie, reinicie o NM" funciona, mas seu grep de mountinfo é o que encontra o culpado.
TheAmigo
(porque /lib/systemd/system/NetworkManager.service usa ProtectHome, pelo menos, sobre os sistemas que nós estamos olhando)
sourcejedi
6

Foi o NetworkManager.

A execução systemctl stop mysqld httpd postfix ipmievd tuned atd rsyslog smartd crond irqbalance gssproxy polkit chronydnão ajudou, mas tornou a tabela de processos muito pequena.

Depois systemctl stop NetworkManager, pude renomear / home.

TheAmigo
fonte
Eu precisava fazer apenas a "manutenção do NetworkManager para parar" e, em seguida, fui capaz de mudar / voltar para casa, depois reinicializei para garantir que tudo estava bem.
Sdjuan
Muito obrigado. Isso não é nada óbvio e eu tive que ler dezenas de páginas falando sobre / home como um ponto de montagem, o que claramente não está na questão do OP. Descobri que parar o NetworkManager também ajudou no meu caso, executando o Redhat 7.6.
labradort
0

Você pode inicializar em um único usuário e fazer alterações no diretório inicial.

  1. Reiniciei meu sistema e, durante a seleção do grub, edite a linha pressionando e
  2. Na linux16linha removida rhgbe quiteopções e coloque em seu lugar init=/bin/bash.
  3. O pressionado ctrl+xpara começar. Isso solicitará o console do bash.
  4. Remonte /com as opções de leitura / gravação emitindomount -o remount,rw /
  5. Depois disso, você pode editar seu /homediretório, renomeá-lo etc.
  6. Após o trabalho, re-rotule o selinux emitindo touch /.autorelabel
  7. Por fim, execute exec /sbin/initpara iniciar a inicialização normalmente.

@sourcejedi: obrigado por sua resposta.

igiannak
fonte