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-release
及 rpm -qa
或更多
yum 指令 確認一下版本吧! 也用 yum install lynx
跟
lynx 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 時的除錯... 吧?
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。