mv: nie można przenieść „home” do „home-old”: Urządzenie lub zasób zajęte

10

Chcę zastąpić /homedowiązaniem symbolicznym do moich domowych katalogów montowanych przez NFS.

Logowany jest tylko root, / home nie jest oddzielnym systemem plików, lsof nie pokazuje żadnych blokad, selinux jest dozwolony. czego mi brakuje?

Jestem zalogowany bezpośrednio jako root przez 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

Co jeszcze mogę sprawdzić?

Więcej informacji o systemie:

[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
źródło
Wypróbuj opcję leniwego umount jak wumount -f -l /home
Valentin Bajrami
Spróbuj poszukać podejrzanego procesu, który zużywa dużo zasobów, ale nie jest ci znany z toplub ps. Próbują obserwować, co robi teraz, używając strace. Ta sytuacja jest dziwna. AKTUALIZACJA: sprawdź także lsofdane wyjściowe z fuserjednym na wszelki wypadek.
ddnomad
1
@ val0x00ff, jak widać na powyższym wyjściu, / home nie jest punktem montowania.
TheAmigo,
1
@ddnomad fuser / home również nie ma danych wyjściowych. Jest to świeżo zainstalowany system bezczynny, bez zajętych procesów.
TheAmigo,
@TheAmigo Rozumiem. Zakładam, że już próbowałeś po prostu ponownie uruchomić hosta. Możesz także spróbować uruchomić komputer w trybie awaryjnym z menu GRUB i tam spróbować.
ddnomad

Odpowiedzi:

9

mv: nie można przenieść „/ home” do „/ home-old”: Urządzenie lub zasób zajęte

Jedynym „use” [*], jaki mogę wymyślić, który powstrzymuje nazwę pliku przed zmianą, jest punkt montowania.

Co jeszcze mogę sprawdzić?

Nie jestem pewien, ale może się tak zdarzyć, jeśli mount nadal istnieje w innej przestrzeni nazw mount. Ponieważ z jakiegoś powodu nie jest propagowane odmontowywanie z głównej przestrzeni nazw? Lub patrząc na wynik w moim systemie, może usługi systemowe z 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

Zauważ, że ten problem - niemożność zmiany nazwy / home pomimo tego, że nie jest wyświetlany jako punkt montowania (w bieżącej przestrzeni nazw) - powinien zostać naprawiony w jądrze Linuksa w wersji 3.18+.

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


jak znaleźć przestrzeń nazw dla konkretnego procesu?

lsnsmoże być przydatny, jeśli możesz go zainstalować. Więcej możliwych poleceń:

Przestrzenie nazw montowania listy:

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

Zidentyfikuj przestrzeń nazw montowania roota:

# readlink /proc/1/ns/mnt

Znajdź procesy o podanej przestrzeni nazw montowania

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

Sprawdź przestrzeń nazw danego procesu:

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

[*] EBUSY Zmiana nazwy kończy się niepowodzeniem, ponieważ oldpath lub newpath to katalog, który jest używany przez jakiś proces (być może jako bieżący katalog roboczy lub jako katalog główny lub ponieważ był otwarty do odczytu) lub jest używany przez system (dla przykład jako punkt montowania) , podczas gdy system uważa to za błąd. (Należy pamiętać, że w takich przypadkach nie ma wymogu zwracania EBUSY - zresztą i tak zmiana nazwy nie jest niczym złym - ale można zwrócić EBUSY, jeśli system inaczej nie poradzi sobie z takimi sytuacjami.)

sourcejedi
źródło
/ home nigdy nie był montowany w żadnej przestrzeni nazw.
TheAmigo
Czy to oznacza, że ​​używałeś poleceń zgodnie z liniami, które zasugerowałem? Ponieważ „nigdy” jest bardzo mocnym stwierdzeniem, moje polecenia tego nie wykazały. Na początku dodałem polecenie, które byłoby prostsze (i mam nadzieję, że będzie funkcjonalne :), oraz drugą spekulację na temat tego, dlaczego tak się dzieje w oparciu o wyniki w moim systemie.
sourcejedi
Znalazłem inną „zepsutą” maszynę, a twoje polecenie grep rzeczywiście wskazuje palcem na NetworkManager. Więc moje "zatrzymaj NM, zmień nazwę, uruchom ponownie NM" działa, ale twój grep mountinfo jest tym, co znajduje winowajcę.
TheAmigo
(ponieważ /lib/systemd/system/NetworkManager.service używa ProtectHome, przynajmniej w systemach, na które patrzymy)
sourcejedi
6

To był NetworkManager.

Uruchamianie systemctl stop mysqld httpd postfix ipmievd tuned atd rsyslog smartd crond irqbalance gssproxy polkit chronydnie pomogło, ale sprawiło, że tabela procesów była bardzo mała.

Potem systemctl stop NetworkManagermogłem zmienić nazwę / home.

TheAmigo
źródło
Musiałem zrobić tylko „zatrzymanie usługi NetworkManager”, a następnie mogłem przenieść / home, a następnie ponownie uruchomić komputer, aby upewnić się, że wszystko jest w porządku.
sdjuan
Dziękuję Ci bardzo. To wcale nie jest oczywiste i musiałem przeczytać dziesiątki stron mówiących o / home jako punkcie montowania, co oczywiście nie jest kwestią OP. Zauważyłem, że zatrzymanie NetworkManager również pomogło w moim przypadku, uruchamiając Redhat 7.6.
labradort
0

Możesz uruchomić jednego użytkownika i wprowadzić zmiany w katalogu domowym.

  1. Zrestartowałem mój system i podczas wyboru gruba edytuj linię naciskając e
  2. W linux16kolejce usunięte rhgbi quiteopcje i umieść je na swoim miejscu init=/bin/bash.
  3. Naciśnij, ctrl+xaby rozpocząć. Zapewni to promocję na konsoli bash.
  4. Zamontuj ponownie /z opcjami odczytu / zapisu, wydającmount -o remount,rw /
  5. Następnie możesz edytować swój /homekatalog, zmienić jego nazwę itp.
  6. Po zakończeniu pracy ponownie oznakuj selinux, wydając touch /.autorelabel
  7. Na koniec uruchom, exec /sbin/initaby uruchomić rozruch w normalny sposób.

@sourcejedi: dziękuję za odpowiedź.

igiannak
źródło