尝试以只读方式挂载时出现“ mount:/ is busy”,以便我可以运行zerofree


36

我试图zerofree在Ubuntu 11.04 上运行,以便可以使用以下命令压缩VirtualBox vdi映像:

VBoxManage modifyhd Ubuntu.vdi --compact

为了运行zerofree,磁盘映像已被安装为只读。我正在按照这些说明进行操作这些说明说要使用此方法将其从恢复模式重新安装为只读状态(“ Drop to root shell”提示符):

mount -n -o remount,ro -t ext2 /dev/sda1 /

但是当我这样做时,我得到了错误:

mount: / is busy

有关如何执行此操作的任何想法?

后续:继杰瑞的答案,这篇文章通过运行这些命令可以解决问题。

service rsyslog stop
service network-manager stop
killall dhclient

4
zerofree的手册页建议运行telinit 1,这为我解决了问题。
Alex Ryan

Answers:


23

一些过程使文件保持打开状态以供写入。例如,这些程序可以是写日志之类的程序,例如rsyslogd,联网工具之类dhclient。将它们一一关闭,然后尝试重新安装可能会起作用。

您可以使用该程序查找使用某些文件的进程fuser。例如,fuser -v -m /将返回一个进程列表。但是,我不确定这是否是使文件系统繁忙的原因之一。


2
以写模式打开文件的进程将Ffuser输出中的访问标志中使用大写字母。
Jan Hudec

21

如果没有打开可写文件的进程,则只能以只读方式重新挂载文件系统。运行lsof /以查看哪些进程在根文件系统上打开了文件。待打开的文件将在该FD列中显示。您可以使用

lsof / | awk '$4 ~ /[0-9].*w/'

要自动过滤进程ID,请解析以下输出lsof -F pa

lsof -F pa /home | awk '/^p/ {pid = substr($0, 2)} /^a.*w/ {print pid}'

1
尝试过此解决方案后,仍然很忙,可能因为这种方式无法显示某些资源。停止一些正在运行的服务后,可以将fs重新挂载为只读。
廖三

我关闭了所有已打开文件以供读取,写入或全部打开的进程(u),但仍显示为忙。
Hubro

12

改善彼得的答案:

我无法杀死使用安装点的进程。因此,我这样做:

  • 编辑/etc/fstab为下次启动时以只读方式启动。例如:/dev/sda1 / ext2 ro 0 1
  • 重新启动并打开外壳程序(例如,主机密钥+ F2)
  • 零零运行

要“恢复”您的系统:

  • 使用读写选项安装: $ mount -o remount,rw /dev/sda1
  • /etc/fstab重新编辑,恢复原始值

附加:如果需要,可以在任何步骤中打开恢复模式

  • 重启
  • VM加载时按住Shift键
  • 高级选项>具有恢复模式的内核选项>放到根Shell提示符下

2
Obvious船长想补充一点:确保在ro模式下重启之前安装zerofree
Xosofox

使用“丢弃到根Shell提示符”和zerofree:文件系统挂载的rw。但是我在其他虚拟机上没有问题
Pawel Cioch

仅当/dev/sda1 / ext2 ro 0 1条目位于列表顶部时,这才对我有用。当我第一次将其作为最后一个条目时,我仍然遇到挂载点繁忙错误。
afilina

6

有时有太多进程使挂载繁忙,以挂载只读方式重新引导可能会更容易。

在中更改根文件系统的条目/etc/fstab,例如:

/dev/sda1 / ext2 relatime,rw,errors=remount-ro 0 1

变成:

/dev/sda1 / ext2 noatime,ro 0 1

重新引导时,文件系统将以只读方式挂载,因此您可以zerofree在其上运行。

完成后,再次以读/写方式重新挂载文件系统(mount -o remount,rw /),然后撤消对的更改/etc/fstab

https://wiki.debian.org/ReadonlyRoot#Enable_readonly_root的启发


大!仅供参考,我只用了这个/dev/sda1 / ext2 ro 0 1,就可以以只读模式启动。
Topera

5

如果停止所有带有打开文件的服务和进程后仍无法卸载或重新安装设备,则可能存在交换文件或交换分区,使设备忙碌。fuser或不会显示lsof。通过以下方式关闭交换:

sudo swapoff -a

您可以事先检查并使用以下命令显示任何交换分区或交换文件的摘要:

swapon -s

要么:

cat /proc/swaps

作为使用该命令的替代方法sudo swapoff -a,您还可以通过停止服务或systemd单元来禁用交换。例如:

sudo systemctl stop dphys-swapfile

要么:

sudo systemctl stop var-swap.swap

就我而言,除了停止任何可打开文件写入的服务和进程外,还必须关闭交换,以便我可以将根分区重新安装为只读状态,以便fsck在根分区上运行而无需重新引导。这在运行Raspbian Jessie的Raspberry Pi上是必需的。


4

如果使用systemd,则通过停止systemd-journald来停止磁盘写入。

# systemctl stop systemd-journald.socket
# systemctl stop systemd-journald.service
# mount -o ro,remount /

1
对我来说,两个单元都立即重新启动。
rld。

在“高级选项>具有恢复模式的内核选项>放到根Shell提示符下”为我工作
Pawel Cioch

3

好,我已经做了

首先,我的目标是要降低我的/ROOT为了增加我的磁盘上的另一个)分区。

  • 从运行会话中清除并备份所有内容后:

    init 1
    

    我的桌面消失了,我现在在Linux控制台上 ...

    ...
    Give root password for maintenance or press CTRL+D to continue
    TheRootPassword_SomethingLike1234
    
  • 现在,尝试挂载/只读模式:

    mount -o remount,ro /
    mount: / is busy
    
  • 好的,从现在开始,我处于理论上的单用户模式,但是ps ax显示了很多其他过程!!

    杀死它们根本不是真的可能,或者很危险...(kill 1被禁止...我没有时间玩psdoom :-)

    我唯一能做的就是一个System Request,为此,我知道两种方法:(请参阅Documentation/sysrq.txt内核文档中的文件):

    1. 首先使用magic SysRq key键盘内核陷阱:

      • 按住 AltGr,然后保持然后按下,
      • 击中PrtScn一次,但不释放AltGr
      • 击中s一次,这将发送Emergency sync内核请求,
      • 点击u,这将发送Umount all请求,这将以只读方式重新安装所有已安装的文件系统,
      • 然后释放 AltGr
    2. 或通过命令行:

      echo s >/proc/sysrq-trigger
      echo u >/proc/sysrq-trigger
      
  • 那我现在可以

    fsck -fC0 /dev/mapper/MyDisk-ROOT
    

    ....

...


注意:好的,如果我fsck成功完成,我已经启动了Live USB,以便能够运行resize2fs...该功能尚未实现...
F. Hauri,

fsck不知道-f; 零未引用的块会做什么?
ᴠɪɴᴄᴇɴᴛ

1
@ᴠɪɴᴄᴇɴᴛ:I'ts ext2fsck开关:-f 强制检查,即使文件系统似乎是干净的。
F. Hauri

1

对于任何其他想要快速粘贴到您的终端的人...

(在执行以下命令之前,请确保已完成其他步骤,如telinit 1。)

发现这个

fuser -mv /dev/sda1 > /tmp/sda1.pids
kill `cat /tmp/sda1.pids`

命令可能会终止您的会话,但是在您回来后,即可重新安装分区。


1

将vdi文件作为其他非系统卷附加到另一个VirtualBox。在那里,您可以根据需要(重新)安装它并执行Zerofree。

假设您要压缩VM1(虚拟机1)的VDI磁盘。然后,您需要第二个VM2。那是, :

  • 确保VM1和VM2均未运行;
  • 从VirtualBox Manager:

    • 选择VM2,
    • “设置” - > “存储” - > “添加硬盘”: “选择它作为附加磁盘”

    • 选择要压缩的VM1的vdi文件。提示:确保刚添加到VM2的硬盘在引导顺序中排在第二个之后,仅次于VM2。

    • 启动VM2:现在,您可以(重新)将VM1的卷挂载为VM2的附加磁盘,因为VM2中没有进程在使用它。提示:首先,使用Linux的folebrowser打开该卷,它会自动安装该卷。然后,使用mount -l来查看_Device_命令中的sudo mount -o remount,ro _Device_。就我而言,这是/ dev / sdb1。所以命令是(1)sudo mount -o ro,remount /dev/sdb1然后是(2)sudo zerofree /dev/sdb1

除了VM2之外,还应该能够从其中启动磁盘并安装像.iso映像这样的磁盘,并实现与我尚未尝试过的相同的命令。


0

我假设您尝试运行 mount在VM中命令。无论如何,您的根分区可能与论坛帖子的作者不同。

尝试:

mount -o ro,remount /

哪个不取决于fs或mount选项。如果这不起作用,您也可以尝试使用grep " / " /proc/mounts或确定根fs cat /proc/cmdline。如果您的根文件系统是例如/ dev / mapper / system-rootfs,则可以使用:

mount -o ro,remount /dev/mapper/system-rootfs /

0

我遇到了这个问题,这使我无法将计算机置于只读模式。解决问题花了我比承认更长的时间……我相信我的问题是我离开了Apache-Zeppelin,却忘记了它。确保您对其他托管类型的服务没有做同样的事情。为了解决该问题,我曾经fuser -kill /终止了所有可能导致该问题的进程,这使我回到了ro模式。


0

对我来说,解决方案是重新引导操作系统,然后从GRUB的引导菜单中选择“恢复模式”。在“恢复模式”下,正在运行的进程较少,并且重新安装只读状态很好。

如果系统在根文件系统(而不是交换分区)上具有交换文件,则还必须使用暂时关闭交换文件swapoff -a

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.