前边,我已经尝试过在 Arch Linux 下安装 Funtoo。在 Arch 中安装 Arch 就更简单了。为了测试,我还通过 Aufs 来将我的 Arch Linux 在 LXC 里复制一份。至于安装个 Debian 或者 Ubuntu LXC,由于有在任何 Linux 下都可以跑的 deboostrap,安装起来也十分容易。
现在难题来了:在 LXC 里安装一个 openSUSE。LXC 自带了个 openSUSE 模板,但是它需要 zypper 等。虽然说 AUR 里就有 zypper 和 libzypp(还都是 git 版本的,下载很耗时的),不过还是不怎么够呢。经过尝试,我发现需要以下包来运行这个模板:
- Arch 里有的:augeas
- Arch 里没的:libsolv-tools build rpm libzypp zypper
有的就直接安装啦。没有的,可以从它的软件源下载。x86_64 架构的在这里,那个 build 是 noarch 的,在这边。
把它们全部下回来,拿 7z 解压能够得到 cpio 档。然后建立个目录并 cd 过去,使用以下命令解开:
$ mkdir t $ cd t $ for f in ../*.cpio; do cpio -id < $f; done
这样就把它们解压到目录t
里边的。我没有把它们解压到/
,因为我不想弄乱我的系统,即使能够清理也是相当麻烦的,而且一不小心还可能删错文件。
所以,又该 Aufs 上场啦。当然在此之前还有件事:openSUSE 没有进行/usr
合并。所以要手动去把bin
、usr/sbin
、sbin
等目录下的文件移动到usr/bin
下,然后删掉那些目录;把usr/lib64
下的文件移动到usr/lib
下,并删掉usr/lib64
。
然后就可以将这个目录和我的 Arch Linux 合体啦:
$ mkdir root $ sudo mount -t aufs -o br:$PWD/root=rw:$PWD/t=ro:/=ro aufs root
但是!这样子的话,新装好的 openSUSE LXC 会在这个root
目录里呢。所以要把外边真实的 LXC 目录给 bind mount 过来。我使用了自定义的 LXC 路径,所以是这样子的:
$ sudo mkdir -p root/ldata/media/temp/lxc $ sudo mount --bind /ldata/media/temp/lxc root/ldata/media/temp/lxc
然后编辑一下 openSUSE 的模板,搜索「http」把软件源的链接全部改到中国的镜像:
$ sudo vim root/usr/share/lxc/templates/lxc-opensuse
我使用的是中科大的源镜像。
一切就绪,开始安装~
$ sudo chroot root /usr/bin/lxc-create --lxcpath=/ldata/media/temp/lxc -n opensuse -t opensuse
耐心等待哦。最终安装完成根文件系统的大小是 333MiB。
安装完毕之后卸载刚刚挂载的那些东西:
$ sudo umount -R root
然后编辑一下自动生成的 LXC 配置文件,比如属改改网络什么的。以下是我改过的配置文件:
# Template used to create this container: /usr/share/lxc/templates/lxc-opensuse # Parameters passed to the template: # For additional config options, please look at lxc.container.conf(5) lxc.rootfs = /ldata/media/temp/lxc/opensuse/rootfs lxc.utsname = opensuse lxc.autodev=1 lxc.tty = 4 lxc.pts = 1024 lxc.mount.entry = run run tmpfs rw 0 0 lxc.mount.entry = tmp tmp tmpfs rw 0 0 lxc.mount.auto = proc sys lxc.cap.drop = sys_module mac_admin mac_override mknod sys_time lxc.kmsg = 0 # When using LXC with apparmor, uncomment the next line to run unconfined: #lxc.aa_profile = unconfined #networking lxc.network.type = veth lxc.network.link = br0 lxc.network.flags = up lxc.network.ipv4 = 192.168.57.6 lxc.network.name = eth0 lxc.cgroup.devices.deny = a # /dev/null and zero lxc.cgroup.devices.allow = c 1:3 rwm lxc.cgroup.devices.allow = c 1:5 rwm # consoles lxc.cgroup.devices.allow = c 5:1 rwm lxc.cgroup.devices.allow = c 5:0 rwm lxc.cgroup.devices.allow = c 4:0 rwm lxc.cgroup.devices.allow = c 4:1 rwm # /dev/{,u}random lxc.cgroup.devices.allow = c 1:9 rwm lxc.cgroup.devices.allow = c 1:8 rwm lxc.cgroup.devices.allow = c 136:* rwm lxc.cgroup.devices.allow = c 5:2 rwm # rtc lxc.cgroup.devices.allow = c 254:0 rm
当然别忘记修改 root 密码啦:
$ sudo chroot /ldata/media/temp/lxc/opensuse/rootfs /bin/passwd
不过默认会有两个 getty 进程跑在 console 上边。要稍微修改一下。顺手把多余的 tty 上的也关掉好了:
$ sudo rm /ldata/media/temp/lxc/opensuse/rootfs/etc/systemd/system/getty.target.wants/getty@tty* $ sudo mv /ldata/media/temp/lxc/opensuse/rootfs/etc/systemd/system/console-{shell,getty}.service
然后就可以启动啦:
$ sudo lxc-start -n opensuse --lxcpath=/ldata/media/temp/lxc
会默认启动 sshd,所以直接 ssh 连过去就可以用啦=w=
PS: 这个模板默认安装的是 openSUSE 12.3。记得自己改改或者装好后升级一下。