延迟卸载根监狱驱动器

延迟卸载根监狱驱动器

我创建了一个包含 rpm 和 yum (centos 7.5) 的根监狱,用于在原始系统上安装一些软件。

工作流程

  • 将 sys、proc、dev 挂载到根监狱
  • 将原系统的root“/”挂载到jail。这很重要,因为我使用根监狱在基本系统上实际安装软件
  • 将原始系统的 sys、proc、dev 挂载在 rootJail 中原始系统的根目录内,例如 mount /proc /rootJail/originalRoot/proc ,这是安装某些软件所需要的
  • 进入root监狱,安装软件,退出root监狱
  • 从根监狱卸载 sys、proc、dev
  • 从根监狱内的原始系统中卸载 sys、proc、dev
  • 从根监狱卸载原始系统根(这是失败的地方)

umount: /rootJail/originalRoot: 目标正忙。 (在某些情况下,有关使用该设备的进程的有用信息可以通过 lsof(8) 或 fusionr(1) 找到)

所以我基本上可以卸载除原始系统本身的根目录之外的所有内容。我需要这样做才能删除强制性的根监狱。

问题是,在根监狱内安装软件后会启动许多进程。这就是为什么它告诉我目标正忙。杀死所有这些进程是不可能的,因为这也会杀死系统。即使安装路径正确,这些进程似乎也绑定到 rootJail 而不是真正的系统。另外,重新启动后一切正常(最坏的情况:删除此处的文件夹)

我已经尝试过进行惰性卸载,这基本上有效。我可以删除 rootJail,它似乎不会损害安装在其中的原始系统

我的问题是:这样做安全吗?或者是否有其他解决方案来卸载该文件夹?

答案1

因此,您似乎希望这些进程无限期地继续运行,即它们是服务进程 - 已在嵌套 chroot 环境中启动。这更表明您是从 shell 生成服务进程,而不是从 systemd 生成服务进程。

一般来说,这是不好的,你会想避免它。

CentOS 7 使用systemd,以 PID 1 运行并管理系统服务。显然主系统的 PID 1 不在你的 chroot 中运行。通常,当您请求启动系统服务进程时,它会从 PID 1 中分叉出来,以提供一个干净的环境(根据相关.service单元文件定制)。(这包括遗留的 sysvinit 脚本。它们被导入到自动生成的.service文件中)。

(为了进一步说明这一点:从技术上讲,可以chroot在套接字中运行绑定挂载以与 systemd 通信,并使用 chroot 内的命令来操作主机系统的服务)。

问题不仅仅是您的方法失去了 systemd 的优势。这意味着您混淆了 systemd 服务(如果该守护进程有一个服务)。例如,服务可能显示为未启动 ( service foo status)。如果您稍后尝试service foo restart... systemd 将不知道有一个守护进程需要停止,它会尝试启动一个第二相反,守护进程的实例。这对于调试来说有点混乱!通常,您会立即收到一个关于无法启动 Web 服务器的错误,因为已经有另一个程序正在侦听 TCP 端口 80 :),但在其他情况下,您可能会得到两个不同的守护进程实例,它们认为它们应该是唯一的一个,造成的错误需要更长时间才能注意到。

相关内容