在 LXC 中运行基于 systemd 的容器

在 LXC 中运行基于 systemd 的容器

我目前正在尝试在 Ubuntu 12.04 主机上使用 LXC 运行 Arch Linux 容器。Arch Linux 最近迁移到了systemd,据很多地方称,它在作为 LXC 客户机运行时存在一些问题。但是,这些来源中的许多都已经过时了,而且我看到其他各种来源都表明可以使用诸如lxc.autodev或 之类的东西来运行基于 systemd 的客户机devtmpfs

因此,我试图找出以下内容:

  1. 是否可以在 LXC 容器内运行基于 systemd 的客户机(截至 2013 年 2 月)?
  2. 有人有可以与“mkarchroot”一起使用的示例模板/配置文件来运行吗?

目前使用 LXC 版本 0.7.5,但如果有必要,升级应该不是问题。

答案1

回答我自己的问题。lxc-archlinux 模板可在https://github.com/dotcloud/lxc/blob/master/templates/lxc-archlinux.in但不包括向 systemd 的迁移(截至 2013 年 2 月 15 日)。

archlinux 中有可用的 rootfs 部分(例如http://www.gtlib.gatech.edu/pub/archlinux/iso/2013.02.01/arch/i686/root-image.fs.sfs对于 i686,还有一个 64 位版本)

我还没有运行 lxc 客户机,但是我从 ubuntu 12.04 x64 内部获得了一个功能齐全的 i686 chroot。1/下载并解压根映像,并将其挂载到某处。

2/ 以 root 身份(sudo)cp -ar 将根文件系统复制到您的位置并 chroot 到该位置

3/ 编辑 /etc/pacman.conf 并更新 arch 行(默认情况下是自动的,从 uname 中提取 arch,但 ubuntu 和 arch 不使用相同的名称)

4/ 挂载 /proc /dev/random 和 /dev/urandom (pacman 和 pacman-key 需要)

如果没有正确设置包签名,我无法运行 pacman

5/ pacman-key --init (这里需要一个良好的熵源)

6/ pacman-key --populate archlinux

7/ 可选:pacman-key --refresh-keys(需要有效的互联网连接)

8/ 编辑 /etc/pacman.d/mirrorlist 以激活与您相关的镜像。

9/ 吃豆人-Syy

准备更新或安装新软件包。

缺少的是容器启动。我对 systemd 不太熟悉,但如果我理解正确的话,这主要是启动 dbus 和 systemd 的问题。

答案2

我刚刚偶然发现了你的问题。我在 Arch 下运行了 systemd 容器。我写了一些关于建筑维基解释如何让它工作。你确实需​​要lxc.autodev并且还需要屏蔽一些不应该在容器内运行的服务。

我做了一个基本的 mkarchroot,然后做了一些改变(chroot 到新的 archroot):

ln -s /dev/null /etc/systemd/system/systemd-udevd.service
ln -s /dev/null /etc/systemd/system/systemd-udevd-control.socket
ln -s /dev/null /etc/systemd/system/systemd-udevd-kernel.socket
ln -s /dev/null /etc/systemd/system/proc-sys-fs-binfmt_misc.automount

在你的容器配置中你需要

lxc.autodev = 1

而且,如果您需要创建任何设备节点(您可能会),您还需要

lxc.hook.autodev = /path/to/script

加上脚本文件

#!/bin/bash
# LXC Autodev hook.
cd ${LXC_ROOTFS_MOUNT}/dev
mknod .....

/path/to/scriptHOST 文件系统上的一个位置 — — 例如/etc/lxc/mycontainer-autodev-hook

答案3

根据 Gentoo wiki,有一个可部分使用的 arch 模板(请参阅http://wiki.gentoo.org/wiki/LXC#Arch_Linux有关详细信息)。模板可能比切换到 systemd 的时间更早。修复/解决方法包括使用 arch 的包管理器 pacman。这对于 gentoo 来说是可以的,我曾经设法让它在 Ubuntu 上运行,但编译是一件苦差事。

12.04 提供的 lxc 包中可能不存在该模板

如果你重新编译 pacman (和它的支持库),那么使用 archbootstrap 可能效果会一样好 (https://wiki.archlinux.org/index.php/Archbootstrap) 受到 debootstrap 的极大启发,可以基于 debian 模板构建自己的模板。

答案4

我们正在 CentOS 7 上成功部署基于 systemd 的 LXC 容器。我们遇到的困难主要源于标准 Linux 升级,例如 /run 是 tmpfs 且 /var/run => /run(并且一些软件包要求它们与使用两者的内部工具相同),并且 systemd 自动进行设置,而不受我们可以找到和覆盖的任何单元的控制。

我们正在从其他流程管理方法(monit、手工制作的守护进程、通过 cron 定期检查)进行转换,因为无论出于什么原因我们都必须接触这些服务。

相关内容