2020年2月13日 星期四

ubuntu 18.04 上的陽春 lxc 3.0 筆記

Linux 上的虛擬技術 技術一直在演變。 以 container 類的技術來說, 最早的主流是 OpenVZ; 後來是 lxc。 Docker 原先也是架構在 lxc 之上, 後來才改用他們自己的底層。 lxc 從 1.0 到 2.0 到 3.0, 每一次大改版都改了很多東西, 以致許多舊版教學文失效。 後來出現了 lxd, 可以想成是 lxc 的新介面, 或是套餐加值選項 -- 所以 lxd 無法單獨存在, 底下一定要有陽春單點主餐 lxc。 (大推 觀念文 ) 於是大家都轉而使用 lxd 口味的 lxc。 這兩天想學陽春版 lxc, 發現 lxc 3.0 相關的中英文文件還真的有點難找。 趕快簡單筆記一下。 [2/21 lxd 教學文 也寫好囉!]

首先大致按照 lxc 官網文件 ubuntu 的 lxc 文件 做。 在 lubuntu 18.04 底下, sudo apt install lxc lxc-utils 安裝兩個套件。 再來編輯 /etc/lxc/lxc-usernet 在最後面加上一句: ckhung veth lxcbr0 99 (把我的 ckhung 改成你的用戶名稱), 這樣子, 將來以普通人 (非 root) 的身份所建立的 unprivileged containers 才有網路可以用。

系統應該已幫你設定好兩個檔案, 先確認一下: grep -h $USER /etc/subuid /etc/subgid 應該出現類似這樣:

ckhung:100000:65536
ckhung:100000:65536

在自家目錄建立設定檔:

mkdir -p ~/.config/lxc
cp /etc/lxc/default.conf ~/.config/lxc/default.conf
grep -h $USER /etc/subuid /etc/subgid >> ~/.config/lxc/default.conf

然後就可以開始玩了:

lxc-ls    # 目前沒有任何 container
ls -l /usr/share/lxc/templates/ # 查看可用的樣板
lxc-create -t busybox -n ct01 # 採用 busybox 樣板建立一個名為 ct01 的 container
lxc-ls    # 現在有一個 container 了
lxc-start -n ct01 -d  # ct01 開機
lxc-attach -n ct01  # 進入 ct01
# 在裡面逛一下, 最後按 ^d 離開
lxc-stop -n ct01  # ct01 關機

在 lxc-start 那一步, 我卡了一下。 用 lxc-start -n ct01 -F 可以查看較明確的錯誤訊息, 從而得知 需要對 ~/.local/share/ (及它所有的上層目錄們) 開放權限setfacl -m u:100000:x ~ ~/.local ~/.local/share/

我們怎能滿足於無聊的 busybox 呢? 下一步是尋找其他更有趣的 templates。 可是 /usr/share/lxc/templates/ 就少少四個而已。 Ubuntu 有一個 lxc-templates 套件, 會在 /usr/share/lxc/templates/ 底下放很多樣板。 但裝起來試用才發現這僅適用於 privileged containers。

回頭改試 「download」 這個樣板。 經過一翻曲折才學到: 建議改用較穩定的 KEYSERVER, 並且用 lxc-download 指令列出可下載樣板清單:

export DOWNLOAD_KEYSERVER=keyserver.ubuntu.com
/usr/share/lxc/templates/lxc-download -h
/usr/share/lxc/templates/lxc-download -l > ~/lxc-templates.txt
lxc-create -t download -n ct02 -- -d fedora -r 30 -a amd64

這就建立了一個 fedora 30 版的 container! (請不要用 fedora 31! 下面談 X11 會解釋。) 上面的 「--」 之後的選項是給 download 這個 「樣板」 (其實是一個 shell script) 看的; 可以填哪些值? 請見前一個指令所建立的清單 ~/lxc-templates.txt 。

啟動 (start)、 連線 (attach), 進裡面用 cat /etc/os-releaserpm -qa 或更多 yum 指令 確認一下版本吧! 也用 yum install lynxlynx https://www.eff.org 測試一下網路。 如果網路通的話, 從 host 的 lxc-ls -f 可以看到每一部 container 的 ip (10.0.3.*)。 在 busybox 裡, 用 udhcpc eth0 啟動 dhcp client。 我的電腦開開關關、 測試不同版本 guests 的過程當中, 不知何時開始 (或是因為 fedora?) containers 的網路就不見了; 手動執行 dhclient eth0 就又恢復了。

接下來可以在 guest 裡面建一個普通用戶的帳號、 設定密碼、 安裝 openssh-server 套件、 systemctl start sshd , 讓 host 可以用 ssh 連線、 用 scp 傳檔案。 (裝了這些套件之後, 出現 bash: __vte_prompt_command: command not found 這樣的惱人訊息, 但命令列其實還可以用。 那是因為欠缺 /etc/profile.d/vte.sh 這個檔案。 從 host 複製過來, 下次登入就正常了。) 事實上若只是要跟 host 交換檔案, 並不需要啟用 sshd, 只要從 host 裡面變身 root, 就可以到 ~/.local/share/lxc/ct02/rootfs/ 裡面存取 ct02 這個 guest 的檔案。 (偷吃步)

如果要在 container 裡面跑圖形軟體呢? 例如請在 guest 裡面安裝輕巧的 feh 看圖軟體、 並且傳一張圖檔進去。 然後從 host 裡面用 ssh -X ... 啟用 X11 forwarding 機制登入後, 即可下 feh 圖檔名, 視窗會跑到 host 裡面來! 理論上啦。 我在另一部 ubuntu bionic amd64 版的 container 裡面測試立馬成功。 不過在 fedora 31 版的 container 裡面測試卻失敗, 用 ssh -vvv -X ... 除錯, 最後還是卡在類似 這個有問無答 的奇怪錯誤訊息。 感覺像是兩頭 ssh 版本不相容的問題。 改用 fedora 30 , 並且根據 ssh -v 的錯誤訊息在 container 裡面補安裝 xorg-x11-xauth 套件, 就成功顯示圖片了。

雖然現在已經不流行 lxc 單點, 了解一下可能還是有助於未來學 lxd 時的除錯... 吧?

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。