mv:无法将“ home”移到“ home-old”:设备或资源繁忙


10

我想替换/home为我的NFS安装的家用目录的符号链接。

仅root用户登录,/ home不是单独的文件系统,lsof显示没有锁,selinux是允许的。我想念什么?

我通过ssh以root身份直接登录:

[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选项,如umount -f -l /home
Valentin Bajrami

尝试查找可疑进程,该进程会消耗大量资源,而您却无法通过top或来了解ps。他们尝试使用来观察它的当前状态strace。这种情况太奇怪了。更新:还要仔细检查lsof输出,fuser以防万一。
ddnomad

1
在上面的输出中可以看到@ val0x00ff,/ home不是挂载点。
TheAmigo'3

1
@ddnomad热熔器/ home也没有输出。这是一个新安装的系统,处于空闲状态,没有繁忙的进程。
TheAmigo'3

@TheAmigo我明白了。我想您已经尝试过重新引导主机。您也可以尝试从GRUB菜单引导到安全模式,然后在此处尝试。
ddnomad

Answers:


9

mv:无法将“ / home”移动到“ / home-old”:设备或资源繁忙

我可以想到的唯一“使用” [*]是挂载点,它可以防止文件名更改。

我还能检查什么?

我不确定,但是如果挂载仍然存在于另一个挂载名称空间中,则可能会发生这种情况。因为某种原因,它没有从根名称空间传播卸载,所以?还是在我的系统上查看结果,也许是系统服务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。)


/ home从未在任何名称空间中挂载。
TheAmigo

这是否意味着您按照我的建议使用了命令?因为“从不”是一个非常强的断言,所以我的命令不会证明这一点。我在开始时添加了一个命令,该命令会更简单(并且希望可以起作用:),并根据我系统上的结果再次猜测为什么会发生这种情况。
sourcejedi

我发现了另一台“损坏的”计算机,您的grep命令确实将手指指向了NetworkManager。因此,我的“停止NM,重命名,重新启动NM”有效,但是mountinfo的grep才是罪魁祸首。
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,我可以重命名/ home。


我只需要做“服务NetworkManager停止”,然后能够移动/ home,然后重新启动以确保一切正常。
sdjuan

非常感谢你。这一点一点都不明显,我不得不阅读数十页的内容,它们将/ home作为安装点,这显然不在OP问题中。我发现停止NetworkManager在运行Redhat 7.6方面也有帮助。
labradort19年

0

您可以以单用户身份启动,也可以在主目录上进行任何更改。

  1. 重新启动系统并在选择grub的过程中,按来编辑该行 e
  2. linux16行中删除rhgbquite选择,并把它们放置init=/bin/bash
  3. 按下ctrl+x开始。这将在bash控制台上提示您。
  4. /通过发出带有读/写选项的重新安装mount -o remount,rw /
  5. 之后,您可以编辑/home目录,将其重命名,等等。
  6. 工作完成后,通过发出以下命令重新标记selinux touch /.autorelabel
  7. 最后执行exec /sbin/init以正常启动启动。

@sourcejedi:谢谢您的回答。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.