折騰systemd-nspawn運行centos7


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就搞定了。以后有時間繼續探索。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM