我尝试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
答案1
某些进程使文件保持打开状态以供写入。例如,这些可以是写入日志的程序,例如rsyslogd
网络工具dhclient
或其他东西。将它们一一关闭并尝试重新安装可能会起作用。
您可以使用该程序查找使用某些文件的进程fuser
。例如,fuser -v -m /
将返回进程列表。但是,我不确定它是否是导致文件系统繁忙的其中之一。
答案2
改进彼得的回答:
我无法终止使用我的安装点的进程。所以,我这样做了:
- 编辑
/etc/fstab
为在下次启动时以只读方式启动。前任:/dev/sda1 / ext2 ro 0 1
- 重新启动并打开 shell(例如,主机键 + F2)
- 零运行
要“恢复”您的系统:
- 使用读写选项挂载:
$ mount -o remount,rw /dev/sda1
- 再次编辑
/etc/fstab
,恢复原来的值
额外:如果需要打开恢复模式在任何步骤中:
- 重启
- VM 加载时按住 Shift
- 高级选项 > 带恢复模式的内核选项 > 删除到根 Shell 提示
答案3
如果没有进程打开文件进行写入,则只能以只读方式重新挂载文件系统。运行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}'
答案4
有时,有太多进程使挂载保持繁忙,因此以只读挂载方式重新启动可能会更容易。
更改 中根文件系统的条目/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