尝试以只读方式挂载时“挂载:/正忙”,以便我可以运行 zerofree

Wav*_*rab 49 ubuntu mount virtualbox

我正在尝试zerofree在 Ubuntu 11.04上运行,以便我可以使用以下方法压缩 VirtualBox vdi 映像:

VBoxManage modifyhd Ubuntu.vdi --compact
Run Code Online (Sandbox Code Playgroud)

为了运行zerofree磁盘映像已被挂载为只读。我正在遵循这些说明,其中说使用它从恢复模式(Drop to root shell prompt)以只读方式重新挂载:

mount -n -o remount,ro -t ext2 /dev/sda1 /
Run Code Online (Sandbox Code Playgroud)

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

mount: / is busy
Run Code Online (Sandbox Code Playgroud)

关于如何做到这一点的任何想法?

跟进:按照 Jari 的回答和这篇文章,通过运行这些命令解决了这个问题。

service rsyslog stop
service network-manager stop
killall dhclient
Run Code Online (Sandbox Code Playgroud)

Jar*_*nen 29

一些进程保持文件打开以供写入。例如,这些可能是写入日志的程序,例如rsyslogd,网络工具,dhclient或其他东西。一一关闭这些并尝试重新安装可能会奏效。

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

  • 在写入模式下打开文件的进程将在 `fuser` 输出的访问标志中使用大写的 `F`。 (3认同)

Gil*_*il' 26

如果没有进程打开文件进行写入,则只能以只读方式重新挂载文件系统。运行lsof /以查看哪些进程在根文件系统上打开了文件。为写入打开的文件将在FD列中指示。你可以过滤这些

lsof / | awk '$4 ~ /[0-9].*w/'
Run Code Online (Sandbox Code Playgroud)

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

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


小智 22

改进彼得的回答:

我无法杀死使用我的挂载点的进程。所以,我这样做了:

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

要“恢复”您的系统:

  • 使用读写选项挂载: $ mount -o remount,rw /dev/sda1
  • /etc/fstab再次编辑,恢复原值

额外:如有必要,请在任何步骤中打开恢复模式

  • 重启
  • 在加载 VM 时按住 shift
  • 高级选项 > 带有恢复模式的内核选项 > Drop to Root Shell Prompt

  • 船长 Obvious 想补充一点:确保在以 ro 模式重新启动之前安装 zerofree (4认同)

小智 8

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

# systemctl stop systemd-journald.socket
# systemctl stop systemd-journald.service
# mount -o ro,remount /
Run Code Online (Sandbox Code Playgroud)


Pet*_*wee 8

有时有太多进程使挂载处于忙碌状态,以只读方式重新启动挂载可能会更容易。

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

/dev/sda1 / ext2 relatime,rw,errors=remount-ro 0 1
Run Code Online (Sandbox Code Playgroud)

变成:

/dev/sda1 / ext2 noatime,ro 0 1
Run Code Online (Sandbox Code Playgroud)

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

完成后,再次重新挂载文件系统读/写 ( mount -o remount,rw /) 并撤消对/etc/fstab.

灵感来自https://wiki.debian.org/ReadonlyRoot#Enable_readonly_root


小智 7

如果在停止所有打开文件的服务和进程后仍无法卸载或重新挂载设备,则可能是交换文件或交换分区使您的设备忙碌。这不会显示fuserlsof。关闭交换:

sudo swapoff -a
Run Code Online (Sandbox Code Playgroud)

您可以预先检查并显示任何交换分区或交换文件的摘要:

swapon -s
Run Code Online (Sandbox Code Playgroud)

或者:

cat /proc/swaps
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl stop dphys-swapfile
Run Code Online (Sandbox Code Playgroud)

或者:

sudo systemctl stop var-swap.swap
Run Code Online (Sandbox Code Playgroud)

就我而言,关闭交换是必要的,除了停止打开文件进行写入的任何服务和进程,以便我可以将我的根分区重新挂载为只读,以便fsck在我的根分区上运行而无需重新启动。这在运行 Raspbian Jessie 的 Raspberry Pi 上是必要的。


F. *_*uri 6

好的,这就是我所做的

首先,我的目标是减少我的/( ROOT) 分区,以便在我的磁盘上添加另一个分区。

  • 一旦所有内容都被清理和备份,从运行会话开始:

    init 1
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    将他们全部杀死是不可能的,或者危险的......(kill 1被禁止......我没有时间玩psdoom :-)

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

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

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

      echo s >/proc/sysrq-trigger
      echo u >/proc/sysrq-trigger
      
      Run Code Online (Sandbox Code Playgroud)
  • 那么现在,我可以

    fsck -fC0 /dev/mapper/MyDisk-ROOT
    
    Run Code Online (Sandbox Code Playgroud)

    ....

...

  • @ᴠɪɴᴄᴇɴᴛ:我使用 `ext2` 的 `fsck` 开关:***`-f` 即使文件系统看起来干净,也强制检查。*** (2认同)