将安装从 LXC 暴露给主机

将安装从 LXC 暴露给主机

我正在使用专有的 POSIX 客户端来挂载网络目录。供应商提供的软件包很糟糕(例如,安装后会这样吗ln -sf /usr/bin/fusermount?!),所以我试图将它们隔离在 LXC 容器中。我已经让容器启动并运行,并且安装工作正常。

现在我需要使容器中的安装在主机上可用。

我知道我可以使用 sshfs 从主机进入容器来做到这一点,但这似乎过于复杂。如果我能够在不使用 ssh 的情况下使该安装可用,那就太棒了。

有什么建议么?

答案1

考虑使用名称空间有时可能涉及做其他坐骑而且一旦进入挂载命名空间,所有命令都不再是主机的命令,挂载命名空间并不像其他人那么容易处理。相反,可以通过以下方式提供直接访问/proc:

  • /proc/[pid]/root
    UNIX 和 Linux 支持文件系统的每进程根的概念,由 chroot(2) 系统调用设置。该文件是一个符号链接,指向进程的根目录,其行为方式与 exe 和 fd/* 相同。但请注意该文件不仅仅是一个符号链接。它提供与进程本身相同的文件系统视图(包括命名空间和每进程挂载集)。

接下来是挂载命名空间示例。

因此,必须查看属于该容器的进程(更准确地说是其挂载命名空间组件)。对于一个名为容器,LXC 将为容器(更准确地说是其 pid 命名空间)的 init (pid 1) 进程视图(在托管命名空间中)提供lxc-info -H -p -n container.

PID1=$(lxc-info -H -p -n container)
CONTAINERMOUNT=/proc/$PID1/root

只要容器正在运行,这个目录就可以用来访问挂载命名空间。例如,要备份没有动态部分的容器:

cd $CONTAINERMOUNT
tar -cf /root/backup.tar --exclude='./dev/*' --exclude='./proc/*' --exclude='./run/*' --exclude='./sys/*' .

一些测试后的三点评论:

  • 尝试绑定挂载此目录将不起作用
  • 在访问文件(例如上面的备份)之前,人们可能希望没有任何活动并停止容器。之后cd "$CONTAINERMOUNT",挂载命名空间资源并没有真正被保留:当容器消失时(即使有kill -KILL $PID1),挂载命名空间仍然会消失。
  • 什么工作,是从专用的安装nsfs 伪文件系统终止容器之前的挂载命名空间引用(使用lxc-stop -k -n containerkill -KILL $PID1避免在容器关闭时正常卸载)。

    cd $CONTAINERMOUNT
    mkdir /root/ns
    touch /root/ns/mnt
    mount --bind /proc/$PID1/ns/mnt /root/ns/mnt
    lxc-stop -k -n container
    

    容器的挂载命名空间仍然存在,直到umount /root/ns/mnt.人们可以离开目录并再次访问挂载命名空间,nsenter --mount=/root/ns/mnt ...但命令将来自容器。如果 asleep可以从中运行,那么这将起作用:

    nsenter --mount=/root/ns/mnt sleep 10 & sleep 1; cd /proc/$!/root
    

相关内容