将繁忙的磁盘重新装入只读模式

Adi*_*aCS 25 linux filesystems mount readonly

我想强制一个磁盘分区为只读模式并保持只读超过 30 分钟。

我尝试过的:

  1. mount -o remount,ro (partition-identifier) (mount-point) -t (filesystem)

    问题:由于某些进程正在使用分区,这会导致设备繁忙错误。我不想杀死使用磁盘的进程。我想模拟磁盘在进程仍在使用时突然变为只读。

  2. 使用魔法 sysrq 键,如下所示

    echo u > /proc/sysrq-trigger
    
    Run Code Online (Sandbox Code Playgroud)

    问题:这将使所有磁盘分区为只读(尽管设备正忙)。但是 20-30 分钟后,机器会自行重新启动。执行此命令后,某些机器会立即重新启动。不确定是什么导致了这次重启。我不希望机器自行重启并且需要将磁盘保持在只读模式超过 30 分钟。

问题:有没有更好的方法可以强制单个磁盘分区为只读并保持该状态半小时,然后将其恢复为读写模式,而不会在此过程中导致任何重新启动?

Gil*_*il' 22

如果进程上有一个可以写入的文件,或者它包含一个已删除但仍打开的文件,则通常无法将文件系统重新挂载为只读。类似地,您不能卸载打开了任何文件的文件系统(或文件的类似用途,例如具有当前目录的进程、正在运行的可执行文件等)。

您可以使用umount -l释放挂载点并阻止打开更多文件,但保持文件系统挂载并保持已打开文件的进程正常运行。

我想不出一种通用的方法来强制将文件系统重新挂载为只读,而不是在它不应该的时候。但是,如果文件系统由块设备支持,您可以使块设备只读,例如

echo 1 >/sys/block/dm-4/ro
echo 1 >/sys/block/sda/sda2/ro
Run Code Online (Sandbox Code Playgroud)

echo u > /proc/sysrq-trigger是强制重新挂载为只读的一种相当极端的方式,因为它会影响所有文件系统。这是在重新启动之前让文件系统处于干净状态的最后方法。

以只读方式重新挂载文件系统不会导致重新启动。无论是什么导致重新启动,都与将分区重新挂载为只读没有直接关系。也许它完全无关,或者这可能会触发应用程序中的错误,导致它旋转并使处理器过热,并且您的处理器有缺陷或超频并最终重新启动。您需要追踪重启的原因。

  • 不幸的是,这不是便携式解决方案。在树莓派上,当我运行 `echo 1 | 时,我得到:“权限被拒绝” 须藤三通/sys/block/mmcblk0/mmcblk0p2/ro` (3认同)

Pio*_*sen 6

使用mount's force 选项(假设您的挂载有一个;GNUmount没有,但 BSD 和 macOS 有):

mount -f -o remount,ro /mount/point
Run Code Online (Sandbox Code Playgroud)

当然,您的里程可能会因实际文件系统、内核版本和情况而异,因此这只是尝试其他较低级别技巧的更高级别选项,例如@Gilles 提到的。

  • [man mount](https://linux.die.net/man/8/mount) 说 `-f` 是 `--fake`。引用:“导致除了实际的系统调用之外的所有事情都要做;如果它不明显,这个''假''挂载文件系统。这个选项与 -v 标志结合使用以确定挂载命令试图做什么做。它还可以用于为之前使用 -n 选项挂载的设备添加条目。 -f 选项检查 /etc/mtab 中的现有记录,如果记录已存在(使用常规非假挂载,此检查由内核完成)。” (17认同)
  • BSD 以及 macOS 挂载的“-f”[确实](https://www.freebsd.org/cgi/man.cgi?mount(8)) 的意思是“强制”。 (5认同)
  • 原来我在考虑 `umount -f`,但我只是尝试重新挂载到 ro,虽然 -f 使命令不返回错误,但文件系统实际上不是只读的。 (2认同)