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包,便想了個曲線救國的辦法:
-
使用debootstrap創建debian系統容器
直接pacman -S debootstrap
,然后debootstrap --arch=amd64 <debian版本代號> 目標目錄 <軟件源地址>
,我用的是清華的源。 -
將centos的目錄通過
--bind
掛載到debian容器中。
通過命令systemd-nspawn -bD debian9/ --bind=/absolute/path/centos
,掛載centos的目錄。 -
在debian容器中安裝yum:
通過apt
安裝yum
,別忘了在/etc/yum.repos.d
中配置yum源。我使用的是還是清華的源。注意把關於gpg
的選項注釋掉。 -
按照上面的步驟安裝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就搞定了。以后有時間繼續探索。