我在 VM 上有一台 Linux 服务器,由于第三方提供商的配置错误,重启确实会像关机一样工作。我无权访问 VM 配置。
安装系统的人弄乱了存储,并且不负责任地为每个目录(/var
, /home
,/usr
等)安装了一个点,导致他们很容易被一些人饿死,而另一些人则为空。
为了解决这个问题,我正在重新组织挂载点,我能够通过执行操作来管理其中的大部分,mount --bind / /mnt
然后rsync
重新启动使用它们的进程umount
。
问题是systemd init 进程本身使用的/var
and 。/usr
会systemd-remount-fs
行吗?我怎么能做到这一点?一个简单的fstab
编辑然后rsync
就足够了吗?它会重新启动所有服务吗?
我知道对于我的情况,哪些点确实需要单独的分区,而且根本不是这种/var
情况/usr
。
前提是我不能使用umount -l
,因为我必须在重新安装分区后销毁分区,并且我想避免kexec
因为不知道它是否会对这个配置错误的 VM 产生相同的错误影响,即无法再次启动它.
我计划有一个压缩btrfs
分区 for /var/log
and 另一个btrfs
or xfs
for /var/lib/docker
,一旦它们几乎是静态的,就将所有其他分区与所需的最小空间放在一起。将来我可能会将它们squashfs
与 root one 放在一起并安装 aoverlayfs
以便于检测错误配置。我希望能够在不重新启动的情况下完成所有这些操作,但我不知道我是否能够做到。
警告:这些操作非常危险,我对此不做任何保证,建议您了解每一步并自行承担风险,否则您可能会破坏您的系统,我不承担任何责任因使用而造成的任何损害。
我已经在我的工作站上的本地虚拟机上克隆了所有服务器磁盘,以便在不影响我的原始服务器的情况下尝试这些命令,如果您不确定是否可以这样做。经过广泛的研究和几次实验,我终于找到了解决方案。
一些系统在 initrd 上使用 systemd,在挂载目标 root 后,它会像使用 chroot 一样切换 systemd 环境,所有服务都关闭,然后在新环境中重新启动。
我们可以利用此功能再次更改根目录,在其他磁盘上的克隆环境中这样做会释放系统在旧环境中持有的锁,因此您可以安全地卸载这些点 - 实际上它甚至不会安装。但是这个克隆的环境应该保证正确的配置重新启动网络并提供 ssh 访问。如果没有,请认为自己注定要失败。
重要的是你有一个单独的分区,一旦你 chroot 到另一个分区内的目录而不是设备本身,系统仍然可以保存父分区的设备,对于这个用例,我们应该考虑它不会阻止任何.
如果您有未分配的可用空间,或者您能够缩小一些分区以便为克隆环境留出空间,建议您这样做。但是,如果您没有可用的存储空间,如果您有足够的内存,您可以创建一个虚拟内存挂载点。一旦连接在此过程中丢失,不建议使用网络分区。
虚拟内存挂载点可以通过 完成
tmpfs
,但它会导致您将此内存锁定在较旧的环境中,这样您就无法在没有reboot
or的情况下释放它,除了创建内存设备外kexec
,更好的方法是使用zram
它压缩数据,所以如果你写入5G
数据,它实际上会比内存使用少得多,但你仍然需要足够的内存。例如,如果
7G
足够,您可以按以下方式创建它:在此处为克隆环境配置所需的分区后,它将如何工作:
fstab
建议在执行切换之前备份您的:如果您打算更改某些设备是
swap
内存的分区,建议先禁用它:然后,执行 chroot:
请注意,它不需要绑定
proc
,dev
正如您在执行 chroot 时通常所做的那样,systemd 会为您完成。您可能会失去连接,如果您等待一段时间仍然无法连接,请原谅,您已经浪费了。虽然如果你很幸运并且现在能够连接,你可以执行你想要的分区表更改。
调整设备路径和 uuid (
blkid
) 以匹配新设备非常重要:完成更改后,您可以执行相同的策略来切换回真正的根设备,一旦完成,不要忘记为新环境安装引导加载程序,以便在关机的情况下再次弥补:
切换回物理设备后,如果您正在使用,则
zram
可以通过以下方式释放内存:请记住,这样做需要您自担风险。