mv: не может переместить «дом» в «дом старый»: устройство или ресурс занят

10

Я хочу заменить /homeсимволической ссылкой на мои домашние каталоги, смонтированные на NFS.

Только root авторизован, / home не является отдельной файловой системой, lsof не показывает блокировок, selinux разрешает. Что мне не хватает?

Я вошел в систему как root через 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

Что еще я могу проверить?

Больше информации о системе:

[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
источник
Попробуйте ленивый вариант, как вumount -f -l /home
Valentin
Попробуйте найти подозрительный процесс, который потребляет много ресурсов, но при этом вас не знают с topили ps. Они пытаются посмотреть, что он делает сейчас, используя strace. Та ситуация странная тммм. ОБНОВЛЕНИЕ: также дважды проверьте lsofвывод с fuserодним на всякий случай.
dnnomad
1
@ val0x00ff, как вы можете видеть в выводе выше, / home не является точкой монтирования.
TheAmigo
1
@ddnomad fuser / home также не имеет выходных данных. Это недавно установленная система, бездействующая, без загруженных процессов.
TheAmigo
@TheAmigo, я вижу. Я полагаю, вы уже пытались просто перезагрузить хост. Вы также можете попробовать загрузиться в безопасном режиме из меню GRUB и попробовать его там.
dnnomad

Ответы:

9

mv: невозможно переместить "/ home" в "/ home-old": устройство или ресурс заняты

Единственное «использование» [*], о котором я могу подумать, которое удерживает имя файла от изменения, - это точка монтирования.

Что еще я могу проверить?

Я не уверен, но, возможно, это могло произойти, если монтирование все еще существует в другом пространстве имен монтирования. Потому что по каким-то причинам это не распространяется unmounts из корневого пространства имен? Или, глядя на результат в моей системе, может быть, с системными службами 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

Обратите внимание, что эта проблема - невозможно переименовать / home, несмотря на то, что она не отображается в качестве точки монтирования (в текущем пространстве имен) - должна быть исправлена ​​в ядре Linux версии 3.18+.

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


как узнать пространство имен конкретного процесса?

lsnsможет быть полезно, если вы можете установить его. Больше возможных команд:

Список пространств имен монтирования:

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

Определите пространство имен корневого монтирования:

# readlink /proc/1/ns/mnt

Найти процессы с заданным пространством имен монтирования

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

Проверьте пространство имен данного процесса:

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

[*] EBUSY Переименование завершается неудачно, потому что oldpath или newpath - это каталог, который используется каким-либо процессом (возможно, в качестве текущего рабочего каталога, или в качестве корневого каталога, или потому что он был открыт для чтения) или используется системой (для например, как точка монтирования) , в то время как система считает это ошибкой. (Обратите внимание, что в таких случаях не требуется возвращать EBUSY - в любом случае нет ничего плохого в том, чтобы переименовывать, - но разрешено возвращать EBUSY, если система не может иначе обработать такие ситуации.)

sourcejedi
источник
/ home никогда не был монтировкой в ​​любом пространстве имен.
TheAmigo
Означает ли это, что вы использовали команды в соответствии с предложениями, которые я предложил? Поскольку «никогда» не является очень сильным утверждением, мои команды не продемонстрировали бы это. В начале я добавил команду, которая была бы более простой (и, надеюсь, функциональной :), и второе предположение о том, почему это может произойти, основываясь на результате в моей системе.
Sourcejedi
Я нашел другую «сломанную» машину, и ваша команда grep действительно указывает пальцем на NetworkManager. Так что мой «Остановить NM, переименовать, перезапустить NM» работает, но ваш grep из mountinfo - это то, что находит виновника.
TheAmigo
(потому что /lib/systemd/system/NetworkManager.service использует ProtectHome, по крайней мере, в тех системах, на которые мы смотрим)
sourcejedi
6

Это был NetworkManager.

Запуск systemctl stop mysqld httpd postfix ipmievd tuned atd rsyslog smartd crond irqbalance gssproxy polkit chronydне помог, но сделал таблицу процессов очень маленькой.

После systemctl stop NetworkManagerя смог переименовать / домой.

TheAmigo
источник
Мне нужно было сделать только «остановка службы NetworkManager», затем я смог переместиться / домой и перезагрузиться, чтобы убедиться, что все в порядке.
sdjuan
Большое спасибо. Это совсем не очевидно, и мне пришлось читать десятки страниц, рассказывающих о / home, как о точке монтирования, чего явно нет в вопросе OP. Я обнаружил, что остановка NetworkManager также помогла в моем случае, запуск Redhat 7.6.
Лабрадорт
0

Вы можете загружаться от одного пользователя и вносить любые изменения в домашний каталог.

  1. Перезагрузите мою систему и во время выбора grub отредактируйте строку, нажав e
  2. В linux16строке удалены rhgb& quiteпараметры и положить в свои места init=/bin/bash.
  3. Нажата ctrl+xдля начала. Это подскажет вам на консоли bash.
  4. Перемонтировать /с опциями чтения / записи, выдавmount -o remount,rw /
  5. После этого вы можете редактировать /homeкаталог, переименовывать его и т. Д.
  6. После того, как работа сделана, переименуйте Селинукс, выдав touch /.autorelabel
  7. Наконец, выполните, exec /sbin/initчтобы начать загрузку как обычно.

@sourcejedi: спасибо за ваш ответ.

igiannak
источник