首页 > 技术文章 > 折腾systemd-nspawn运行centos7

godcrying1202 2020-12-07 14:40 原文

Archlinux创建Debian/Ubuntu的systemd-nspawn容器是很简单的,因为有debootstrap软件。某天我突然想装个centos7玩玩,搜了半天没发现有什么类似于debootstrap的软件。然而,我找到了基于centos的chroot的创建教程,感觉可以试一试。

Chroot创建过程

新建一个chroot的目录,例如:

mkdir -p /path/to/chroot

初始化rpm数据库:

mkdir -p /path/to/chroot/var/lib/rpm
rpm --rebuilddb --root=/path/to/chroot

下载CentOS的发行包,使用rpm命令安装:

wget http://mirror.centos.org/centos/<版本号>/os/x86_64/Packages/centos-release-<对应版本>.rpm
rpm -i --root=/path/to/chroot --nodeps centos-release-<对应版本>.rpm

使用YUM工具安装CentOS发行版的其余包:

yum --installroot=/path/to/chroot install -y rpm-build yum

最后,整个过程结束以后,chroot环境便搭建完成。


动手实践

Archlinux上安装yum工具有点困难,AUR上的yum安装总是出错。偶然间发现debian系统源里自带yum包,便想了个曲线救国的办法:

  1. 使用debootstrap创建debian系统容器
    直接pacman -S debootstrap,然后debootstrap --arch=amd64 <debian版本代号> 目标目录 <软件源地址>,我用的是清华的源。

  2. 将centos的目录通过--bind挂载到debian容器中。
    通过命令systemd-nspawn -bD debian9/ --bind=/absolute/path/centos,挂载centos的目录。

  3. 在debian容器中安装yum:
    通过apt安装yum,别忘了在/etc/yum.repos.d中配置yum源。我使用的是还是清华的源。注意把关于gpg的选项注释掉。

  4. 按照上面的步骤安装centos的chroot环境
    注意使用root权限。

安装时会不时报以下错误:

Failed to get D-Bus connection: Operation not permitted

不知道什么问题。百度了一下好像docker安装centos7也会出现。因为没有研究过docker,暂时忽略该错误。


之后

大功告成了吗?实际上并没有那么简单。使用systemd-nspawn -D进去,空空如也,连$PS1都没有,好多基本命令也没装,比如passwd。密码都没法改,那还怎么玩?继续搞吧!

  • 更改yum源(刚才是debian中的源,现在修改的容器中的)
  • 安装passwd和vim以及常用的软件,修改root密码,把/etc/skel/中的东西复制到root目录下。
  • systemd-nspawn -bD centos7

终于启动了!然而你尝试登录就会发现,不管怎么尝试,root密码都提示是错的!真头疼。。Ctrl+]三下退出,然后去掉-b选项再次进入centos7,执行journalctl会发现类似于这种的错误:

...
pam_securetty(login:auth): access denied: tty 'pts/0' is not secure !
...

系统把root用户给deny掉了,原因是使用的终端不安全!解决的方法就是在/etc/securetty中添加一行pts/0。再次尝试启动,这次终于可以进到系统里面了。。然而启动时会遇到这个错误:

...
[FAILED] Failed to start Login Service.
See 'systemctl status systemd-logind.service' for details.
...

查看journalctl里面还有dbus的问题:

...
Failed to connect to system bus: No such file or directory
Failed to initialize D-Bus connection: No such file or directory
...

搜了半天,找到原因是/var/run没有链接到/run目录,链接目录以后,login service 和 dbus 的错误也都消失了。

另外,启动容器时开头会出现display-manager.service的错误,这是因为没有安装桌面环境的问题,只要将默认启动级别更换systemctl set-default multi-user.target即可解决。还有一个错误是:Failed to install release agent, ignoring: No such file or directory,Google了一下好像跟systemd版本有关系,不影响系统运行。Centos真麻烦,感觉Debian系统还是省事,一个debootstrap就搞定了。以后有时间继续探索。

推荐阅读