我目前正在尝试在Ubuntu 12.04主机上使用LXC运行Arch Linux容器。 Arch Linux最近已经迁移到了systemd ,根据各种地方,作为LXC guest有一些问题。 但是,这些来源中有许多已经过时了,而且我也看到其他各种来源表明可以使用像lxc.autodev或devtmpfs这样的lxc.autodev来运行基于systemd的访客。
因此,我试图找出以下几点:
目前使用LXC 0.7.5版本,但如果这是必要的升级不应该是一个问题。
回答自己。 lxc-archlinux模板位于https://github.com/dotcloud/lxc/blob/master/templates/lxc-archlinux.in,但不包括从systemd迁移(截至2013年2月15日)。
有可用的rootfs部分archlinux(例如http://www.gtlib.gatech.edu/pub/archlinux/iso/2013.02.01/arch/i686/root-image.fs.sfs i686还有一个64位版)
我没有运行一个lxc客户端,但是我从ubuntu 12.04 x64中获得了一个function强大的i686 chroot。 1 /下载并解压缩根映像,将其挂载到某个地方。
2 /作为根(sudo)cp – 根文件系统到您的位置和chroot到它
3 /编辑/etc/pacman.conf并更新拱形线(默认情况下,它是自动的,从uname中拉出arch,但是ubuntu和arch不使用相同的名称)
4 / mount / proc / dev / random和/ dev / urandom(这是pacman和pacman-key需要的)
如果没有正确设置包签名,我无法运行pacman
5 / pacman-key –init(这里需要一个很好的熵源)
6 / pacman-key – 填充archlinux
7 /可选:pacman-key –refresh-keys(需要一个可用的互联网连接)
8 /编辑/etc/pacman.d/mirrorlist以激活与您相关的镜像。
9 / pacman -Syy
准备更新或安装新的软件包。
什么(很糟糕)是容器启动。 我没有在systemd上加快速度,但如果我理解正确,这主要是启动dbus和systemd的问题。
我只是沾上你的问题。 我在Arch下运行systemd容器。 我在Arch Wiki上写了一些说明,解释如何使它工作。 你确实需要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
在你的容器configuration你需要
lxc.autodev = 1
而且,如果你需要创build任何设备节点(你可能会),你也需要
lxc.hook.autodev = /path/to/script
加上脚本文件
#!/bin/bash # LXC Autodev hook. cd ${LXC_ROOTFS_MOUNT}/dev mknod .....
/path/to/script是HOST文件系统上的一个位置,例如/etc/lxc/mycontainer-autodev-hook 。
根据Gentoo wiki,有一个部分function的arch模板(详情请参阅http://wiki.gentoo.org/wiki/LXC#Arch_Linux )。 该模板可能比systemd的开关旧。 修复/解决方法包括使用arch的包pipe理器pacman。 这对于gentoo来说是可以的,我曾经pipe理过一次它在Ubuntu上工作,但编译是一件苦差事。
该模板可能不在12.04提供的lxc包中
如果你重新编译pacman(及其支持库),那么你可能会使用archbootstrap( https://wiki.archlinux.org/index.php/Archbootstrap ),这是从debootstrap的灵感启发,酝酿自己的模板在debian上。