mv: ไม่สามารถย้าย“ home” ไปที่“ home-old”: อุปกรณ์หรือทรัพยากรไม่ว่าง


10

ฉันต้องการแทนที่/homeด้วย symlink เพื่อ dirs บ้านของฉันติดอยู่กับ 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" 

ลองใช้ตัวเลือกขี้เกียจเหมือนในumount -f -l /home
Valentin Bajrami

พยายามที่จะมองถึงกระบวนการที่น่าสงสัยว่ากินทรัพยากรมากในขณะที่ไม่ได้เป็นที่รู้จักกับคุณด้วยหรือtop พวกเขาพยายามที่จะดูสิ่งที่มันทำตอนนี้ใช้ps straceสถานการณ์นั้นแปลกประหลาด ปรับปรุง: ยังตรวจสอบlsofผลลัพธ์fuserอีกครั้งด้วยหนึ่งในกรณี
ddnomad

1
@ val0x00ff อย่างที่เห็นในเอาต์พุตด้านบน / home ไม่ใช่จุดเมานท์
TheAmigo

1
@ddnomad fuser / home ยังไม่มีเอาต์พุต มันเป็นระบบที่ติดตั้งใหม่ไม่ได้ใช้งานไม่มีกระบวนการยุ่ง
TheAmigo

@TheAmigo ฉันเห็น ฉันคิดว่าคุณได้ลองรีบูตโฮสต์แล้ว คุณอาจลองบูทเข้าสู่เซฟโหมดจากเมนู GRUB และลองใช้ที่นั่น
ddnomad

คำตอบ:


9

mv: ไม่สามารถย้าย "/ home" เป็น "/ home-old": อุปกรณ์หรือทรัพยากรไม่ว่าง

"ใช้" เท่านั้น [*] ฉันสามารถคิดซึ่งถือชื่อของไฟล์จากการเปลี่ยนแปลงเป็นจุดเมานท์

ฉันจะตรวจสอบอะไรอีก

ฉันไม่แน่ใจ แต่อาจเกิดขึ้นได้หากการเมานท์ยังคงมีอยู่ในเนมสเปซอื่น เพราะมันไม่ได้รับ unmount เผยแพร่จากรูทเนมสเปซด้วยเหตุผลบางอย่าง? หรือดูผลลัพธ์ในระบบของฉันบางที systemd services ด้วย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 แม้จะไม่แสดงเป็นจุดเชื่อมต่อ (ใน namespace ปัจจุบัน) - ควรได้รับการแก้ไขใน Linux kernel เวอร์ชัน 3.18+

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


วิธีการค้นหา namespace ของกระบวนการเฉพาะหรือไม่

lsnsอาจมีประโยชน์หากคุณสามารถติดตั้งได้ คำสั่งที่เป็นไปได้เพิ่มเติม:

รายการเมานต์เนมสเปซ:

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

ระบุเนมสเปซรูทเมาท์:

# readlink /proc/1/ns/mnt

ค้นหากระบวนการที่มีเนมสเปซเมานต์ที่กำหนด

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

ตรวจสอบ namespace ของกระบวนการที่กำหนด:

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

[*] EBUSY การเปลี่ยนชื่อล้มเหลวเนื่องจาก oldpath หรือ newpath เป็นไดเรกทอรีที่ใช้งานโดยบางกระบวนการ (อาจเป็นไดเรกทอรีการทำงานปัจจุบันหรือเป็นไดเรกทอรีรากหรือเพราะเปิดสำหรับการอ่าน) หรือใช้งานโดยระบบ (สำหรับ เช่นจุดเมานท์)ในขณะที่ระบบพิจารณาข้อผิดพลาดนี้ (โปรดทราบว่าไม่จำเป็นต้องส่งคืน EBUSY ในกรณีดังกล่าว - ไม่มีอะไรผิดปกติกับการเปลี่ยนชื่อต่อไป - แต่ได้รับอนุญาตให้ส่งคืน EBUSY หากระบบไม่สามารถจัดการกับสถานการณ์เช่นนั้นได้)


/ home ไม่เคยเมานต์ใน namespace ใด ๆ
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ฉันสามารถเปลี่ยนชื่อ / บ้านได้


ฉันต้องทำเพียง "service NetworkManager stop" จากนั้นก็สามารถย้าย / กลับบ้านจากนั้นทำการรีบูตเพื่อให้แน่ใจว่าทุกอย่างเรียบร้อยดี
sdjuan

ขอบคุณมาก. นี่ไม่ชัดเจนเลยและฉันต้องอ่านหลายสิบหน้าที่พูดถึง / home เป็นจุดเมานท์ซึ่งไม่ชัดเจนในคำถาม OP ฉันพบว่าการหยุด NetworkManager ช่วยด้วยในกรณีของฉันใช้ Redhat 7.6
ลาบราดอร์

0

คุณสามารถบูตกับผู้ใช้คนเดียวและทำการเปลี่ยนแปลงใด ๆ ในไดเรกทอรีบ้าน

  1. รีบูตระบบของฉันและการเลือกด้วงที่เกิดซ้ำแก้ไขบรรทัดโดยการกด e
  2. ในlinux16สายถอดออกrhgbและตัวเลือกและใส่ในวางของพวกเขาquiteinit=/bin/bash
  3. กดctrl+xเพื่อเริ่ม นี้จะ promt คุณในคอนโซลทุบตี
  4. ประกอบใหม่/ด้วยตัวเลือกการอ่าน / เขียนโดยการออกmount -o remount,rw /
  5. หลังจากนั้นคุณสามารถแก้ไข/homeไดเรกทอรีของคุณเปลี่ยนชื่อเป็นต้น
  6. หลังจากทำงานเสร็จแล้วจะติดตั้ง selinux อีกครั้งโดยการออก touch /.autorelabel
  7. ในที่สุดก็ดำเนินการexec /sbin/initเพื่อเริ่มต้นการบูตตามปกติ

@sourcejedi: ขอบคุณสำหรับคำตอบของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.