mv: tidak dapat memindahkan "home" ke "home-old": Perangkat atau sumber daya sibuk

10

Saya ingin mengganti /homedengan symlink ke dir home-mount nfs saya.

Hanya root yang login, / home bukan sistem file yang terpisah, lsof tidak menunjukkan kunci, selinux permisif. Apa yang saya lewatkan?

Saya masuk secara langsung sebagai root melalui 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

Apa lagi yang bisa saya periksa?

Info sistem lebih lanjut:

[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
sumber
Coba opsi umount malas seperti diumount -f -l /home
Valentin Bajrami
Coba cari proses mencurigakan yang menghabiskan banyak sumber daya tanpa diketahui oleh Anda topatau ps. Mereka mencoba untuk menonton apa yang sedang dilakukan menggunakan sekarang strace. Situasi itu aneh tmm. UPDATE: periksa juga lsofoutput dengan fusersatu berjaga-jaga.
ddnomad
1
@ val0x00ff seperti yang Anda lihat pada output di atas, / home bukan titik mount.
TheAmigo
1
@ddnomad fuser / home juga tidak memiliki output. Ini adalah sistem yang baru saja diinstal, duduk diam, tidak ada proses yang sibuk.
TheAmigo
@ Amigo saya mengerti. Saya kira Anda sudah mencoba me-reboot host. Anda mungkin juga mencoba untuk boot ke mode aman dari menu GRUB dan mencobanya di sana.
ddnomad

Jawaban:

9

mv: tidak dapat memindahkan "/ home" ke "/ home-old": Perangkat atau sumber daya sibuk

Satu-satunya "penggunaan" [*] yang dapat saya pikirkan, yang menyimpan nama file dari perubahan, adalah titik mount.

Apa lagi yang bisa saya periksa?

Saya tidak yakin, tapi mungkin ini bisa terjadi jika mount masih ada di mount namespace lain. Karena itu tidak mendapatkan unmount yang diperbanyak dari root namespace, untuk beberapa alasan? Atau melihat hasil pada sistem saya, mungkin layanan systemd dengan 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

Perhatikan masalah ini - tidak dapat mengubah nama / rumah meskipun tidak muncul sebagai titik mount (dalam namespace saat ini) - harus diperbaiki dalam kernel Linux versi 3.18+.

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


bagaimana cara mengetahui namespace dari proses tertentu?

lsnsmungkin berguna jika Anda dapat menginstalnya. Lebih banyak perintah yang mungkin:

Daftar mount namespaces:

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

Identifikasi root mount namespace:

# readlink /proc/1/ns/mnt

Temukan proses dengan mount namespace yang diberikan

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

Periksa namespace dari proses yang diberikan:

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

[*] EBUSY Ganti nama gagal karena oldpath atau newpath adalah direktori yang digunakan oleh beberapa proses (mungkin sebagai direktori kerja saat ini, atau sebagai direktori root, atau karena itu terbuka untuk dibaca) atau sedang digunakan oleh sistem (untuk contohnya sebagai mount point) , sementara sistem menganggap ini sebagai kesalahan. (Perhatikan bahwa tidak ada keharusan untuk mengembalikan EBUSY dalam kasus seperti itu — toh tidak ada yang salah dengan melakukan penggantian nama) - tetapi diperbolehkan untuk mengembalikan EBUSY jika sistem tidak dapat menangani situasi seperti itu.)

sourcejedi
sumber
/ home tidak pernah menjadi mount di namespace apa pun.
TheAmigo
Apakah itu berarti Anda menggunakan perintah yang saya sarankan? Karena "tidak pernah" adalah pernyataan yang sangat kuat, perintah saya tidak akan menunjukkan hal itu. Saya telah menambahkan sebuah perintah di awal yang akan lebih sederhana (dan semoga fungsional :), dan spekulasi kedua tentang mengapa ini mungkin terjadi berdasarkan hasil pada sistem saya.
sourcejedi
Saya menemukan mesin "rusak" lainnya dan perintah grep Anda memang menunjukkan jari di NetworkManager. Jadi "stop NM, rename, restart NM" saya berhasil, tetapi Anda memahami mountinfo adalah apa yang menemukan pelakunya.
TheAmigo
(karena /lib/systemd/system/NetworkManager.service menggunakan ProtectHome, setidaknya pada sistem yang sedang kita lihat)
sourcejedi
6

Itu NetworkManager.

Berlari systemctl stop mysqld httpd postfix ipmievd tuned atd rsyslog smartd crond irqbalance gssproxy polkit chronydtidak membantu, tetapi membuat tabel proses menjadi sangat kecil.

Setelah itu systemctl stop NetworkManager, saya bisa mengganti nama / rumah.

TheAmigo
sumber
Saya hanya perlu melakukan "layanan NetworkManager berhenti" dan kemudian dapat pindah / rumah kemudian melakukan reboot untuk memastikan semuanya baik-baik saja.
sdjuan
Terima kasih banyak. Ini sama sekali tidak jelas dan saya harus membaca lusinan halaman yang berbicara tentang / home sebagai mount point, yang jelas tidak ada dalam pertanyaan OP. Saya menemukan bahwa menghentikan NetworkManager juga membantu dalam kasus saya, menjalankan Redhat 7.6.
labradort
0

Anda dapat boot pada satu pengguna dan membuat perubahan pada direktori home.

  1. Reboot sistem saya dan pilih seleksi grub mengedit baris dengan menekan e
  2. Di linux16baris dihapus rhgb& quitepilihan dan dimasukkan ke dalam mereka ditempatkan init=/bin/bash.
  3. Ditekan ctrl+xuntuk memulai. Ini akan membuat Anda tertarik pada bash console.
  4. Remount /dengan opsi baca / tulis dengan menerbitkanmount -o remount,rw /
  5. Setelah itu Anda dapat mengedit /homedirektori, ganti nama, dll.
  6. Setelah bekerja selesai relabel selinux dengan mengeluarkan touch /.autorelabel
  7. Akhirnya jalankan exec /sbin/inituntuk memulai boot seperti biasa.

@sourcejedi: terima kasih atas jawaban Anda.

igiannak
sumber