我可以将挂载移动到其他挂载命名空间吗

我可以将挂载移动到其他挂载命名空间吗

问题:有什么方法可以将挂载从一个名称空间移动/复制到另一个名称空间吗?

说明:我想挂载创建容器时不存在的目录。

  1. 我正在创建容器。它获取自己的主机挂载命名空间副本
  2. 主机创建一些SourceDirectory
  3. 在主机内部,我将安装(启用共享选项)绑定SourceDirectory/container_rootfs/tempDirectory
  4. 在容器内部我想读取/写入文件,/tempDirectory以便它到达SourceDirectory

步骤 4. 不起作用,因为在步骤 3 中,共享绑定挂载仅针对当前主机挂载命名空间共享,并且容器命名空间之前已“拆分”。我/tempDirectory觉得我根本不会做第三步。

如果目录存在并且已挂载创建容器(因此操作顺序来自上面的编号列表 2 > 3 > 1 > 4)然后一切正常,因为现在容器已复制挂载命名空间我的附加绑定安装已创建。保存到/tempDirectory会被转移到SourceDirectory.

所以我的问题是 - 是否有任何方法可以将安装从一个命名空间(我的主机安装命名空间)移动/复制到另一个命名空间(容器安装命名空间)?

如果这是相关的(我不这么认为),我将 crun 用于容器。

答案1

我不知道有什么方法可以追溯复制或移动现有的坐骑,但是......

您可以mount --bind直接在容器的命名空间中执行命令恩斯特尔

您必须识别容器中运行的进程的 pid(进程 ID)。你可以使用容器中的任何进程,只要你能找到它。

  • 我会提请您注意--pid-file运行中的选项
  • 如果失败,您可能需要使用ps -ef搜索容器中运行的进程。请记住,容器可能位于 pid 命名空间中,并为容器内的主机提供不同的 pid。您需要主机看到的 pid。

假设您的容器化进程有 pid,4321您应该能够使用以下命令挂载:

nsenter -mt 4321 mount --bind SourceDirectory /container_rootfs/

为了进行实验,nsenter我建议您首先使用交互式命令行进行尝试。如果您的容器化进程的 pid 使用4321

nsenter -mt 4321 /bin/bash

请记住,挂载命名空间和chroot。您的容器化进程将被放入其自己的挂载命名空间中,但也将被 chroot。根据执行此操作的方式,nsenter可能会也可能不会导致 chroot。


如果您SourceDirectory在容器启动后进行了挂载,如果它根本没有挂载在容器的命名空间中,那么可能可以按照您之前的方式挂载它......

从我读到的允许挂载两次分区,因此如果您已经mount /dev/sda4在主机上执行,那么通常mount /dev/sda4在容器中执行应该没问题。结果将与使用绑定安装相同。

相关内容