mv: no se puede mover "home" a "home-old": dispositivo o recurso ocupado

10

Quiero reemplazar /homecon un enlace simbólico a mis directorios de inicio montados en nfs.

Solo root está conectado, / home no es un sistema de archivos separado, lsof no muestra bloqueos, selinux es permisivo. ¿Qué me estoy perdiendo?

Estoy conectado directamente como root a través de 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

¿Qué más puedo consultar?

Más información del 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
fuente
Pruebe la opción perezosa de montaje como enumount -f -l /home
Valentin Bajrami
Intente buscar un proceso sospechoso que consuma muchos recursos sin ser conocido por topo con ps. Intentan ver qué está haciendo ahora mismo usando strace. Esa situación es extraña tmm. ACTUALIZACIÓN: también verifique dos veces la lsofsalida con fuseruna por si acaso.
ddnomad
1
@ val0x00ff como puede ver en la salida anterior, / home no es un punto de montaje.
TheAmigo
1
@ddnomad fuser / home tampoco tiene salida. Es un sistema recién instalado que está inactivo, sin procesos ocupados.
TheAmigo
@TheAmigo ya veo. Supongo que ya ha intentado simplemente reiniciar el host. También puede intentar arrancar en modo seguro desde el menú de GRUB e intentarlo allí.
ddnomad

Respuestas:

9

mv: no se puede mover "/ home" a "/ home-old": dispositivo o recurso ocupado

El único "uso" [*] que se me ocurre, que impide que cambie el nombre de un archivo, es un punto de montaje.

¿Qué más puedo consultar?

No estoy seguro, pero quizás esto podría suceder si el montaje todavía existe en otro espacio de nombres de montaje. ¿Porque no se está desmontando propaga desde el espacio de nombres raíz, por alguna razón? ¿O mirando el resultado en mi sistema, quizás con los servicios 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

Tenga en cuenta que este problema, al no poder cambiar el nombre / home a pesar de que no se muestra como un punto de montaje (en el espacio de nombres actual), debe solucionarse en la versión 3.18+ del kernel de Linux.

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


¿Cómo encontrar el espacio de nombres de un proceso en particular?

lsnspodría ser útil si puede instalarlo. Más comandos posibles:

Lista de espacios de nombres de montaje:

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

Identifique el espacio de nombres de montaje raíz:

# readlink /proc/1/ns/mnt

Encuentra procesos con un espacio de nombres de montaje dado

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

Inspeccionar el espacio de nombres de un proceso dado:

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

[*] EBUSY El cambio de nombre falla porque oldpath o newpath es un directorio que está siendo utilizado por algún proceso (tal vez como directorio de trabajo actual, o como directorio raíz, o porque estaba abierto para lectura) o está siendo utilizado por el sistema (para ejemplo como punto de montaje) , mientras que el sistema lo considera un error. (Tenga en cuenta que no es necesario devolver EBUSY en tales casos; de todos modos, no hay nada de malo en cambiar el nombre, pero está permitido devolver EBUSY si el sistema no puede manejar tales situaciones).

sourcejedi
fuente
/ home nunca ha sido una montura en ningún espacio de nombres.
TheAmigo
¿Eso significa que usaste comandos en la línea que sugerí? Debido a que "nunca" es una afirmación muy fuerte, mis comandos no lo demostrarían. Agregué un comando al inicio que sería más simple (y con suerte funcional), y una segunda especulación sobre por qué esto podría suceder en función del resultado en mi sistema.
sourcejedi
Encontré otra máquina "rota" y su comando grep de hecho apunta con el dedo a NetworkManager. Por lo tanto, mi "detener NM, cambiar el nombre, reiniciar NM" funciona, pero su grep de mountinfo es lo que encuentra al culpable.
TheAmigo
(porque /lib/systemd/system/NetworkManager.service usa ProtectHome, al menos en los sistemas que estamos viendo)
sourcejedi
6

Fue NetworkManager.

Correr systemctl stop mysqld httpd postfix ipmievd tuned atd rsyslog smartd crond irqbalance gssproxy polkit chronydno ayudó, pero hizo que la tabla de procesos fuera muy pequeña.

Después systemctl stop NetworkManager, pude cambiar el nombre / home.

TheAmigo
fuente
Solo necesitaba "detener el NetworkManager de servicio" y luego pude moverme / inicio y luego reinicié para asegurarme de que todo estaba bien.
sdjuan
Muchas gracias. Esto no es del todo obvio y tuve que leer docenas de páginas que hablan de / home como punto de montaje, lo que claramente no está en la pregunta de OP. Encontré que detener NetworkManager también ayudó en mi caso, ejecutar Redhat 7.6.
labradort
0

Puede arrancar en un solo usuario y realizar cambios en el directorio de inicio.

  1. Reinicié mi sistema y durante la selección de grub, edite la línea presionando e
  2. En linux16línea eliminado rhgby quiteopciones y poner en su lugar init=/bin/bash.
  3. El presionado ctrl+xpara comenzar. Esto te indicará en la consola bash.
  4. Vuelva /a montar con opciones de lectura / escritura emitiendomount -o remount,rw /
  5. Después de eso, puede editar su /homedirectorio, renombrarlo, etc.
  6. Después del trabajo, vuelva a etiquetar el selinux emitiendo touch /.autorelabel
  7. Finalmente ejecutar exec /sbin/initpara iniciar el arranque de la forma habitual.

@sourcejedi: gracias por tu respuesta.

igiannak
fuente