问题:有什么方法可以将挂载从一个名称空间移动/复制到另一个名称空间吗?
说明:我想挂载创建容器时不存在的目录。
- 我正在创建容器。它获取自己的主机挂载命名空间副本
- 主机创建一些
SourceDirectory
- 在主机内部,我将安装(启用共享选项)绑定
SourceDirectory
到/container_rootfs/tempDirectory
- 在容器内部我想读取/写入文件,
/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
在容器中执行应该没问题。结果将与使用绑定安装相同。