2017年5月22日 星期一

窮人的 proxmox (可攜式/行動) 機房

tux 開車載著機房 業餘機房管理員貴哥向系上要了一部較高階的桌機, 在上面安裝 proxmox 虛擬環境, 用它來架設私有雲、 管理幾部 linux 教學伺服器已經兩年了, 感覺超簡單超方便的, 很想分享給中小企業網管們, 還有喜歡電腦自主又想幫學校省錢的老師們。 小格舊版的 「虛擬機新手恩物 proxmox」 那篇蠻受歡迎的; 新版的 4.* 系列有很多改變, 所以決定重寫一篇。 也順便示範: 沒有伺服器和固定 IP 可用的窮人也能把 proxmox 安裝在一個 qcow2 檔或隨身碟裡面, 背著一間機房到處跑、 隨時拿出來練習! 這招拿來教 proxmox 很方便, 不會影響到電腦教室裡原本的 linux 系統。 (<== 真正的原始動機) 但本篇並不只限定於對隨身碟/行動版有興趣的讀者 -- 如果你只是單純想玩 proxmox、 而且手邊有實體伺服器可用, 則可以省略前面的 (第一層) 虛擬環境架設, 直接用 proxmox 光碟啟動伺服器, 並且跳到第二節第4步。

一、 準備

假設你已經 下載 proxmox 4.4 光碟、 花五分鐘玩過 kvm、 觀念上 (不必實作過) 也知道 qcow2 虛擬硬碟格式 跟 zfs 的好處。 因為我們採用 zfs, 所以電腦最好要有 8G 或更多的記憶體。 又假設你已打造好一個 virt-manager 版區網 或是 手工精簡版 qemu-kvm 虛擬區域網路 192.168.29.0/24 (或用其他虛擬技術亦可), 並且用 finnix 或其他開機光碟測試過可上網、 host 可看到 (未來要裝 proxmox 的第一層) 虛擬機的 IP。 本篇要帶你在硬碟上挖一個 qcow2 檔, 在上面安裝一個 proxmox 4.4 機房。 當然, 也可以直接安裝在隨身碟上。 zfs 對隨身碟的傷害應該比傳統的 ext3/ext4 要小一些。 (比較平均分散。)

二、 安裝

  1. (如果未來只打算使用輕量級的 lxc container, 不打算使用完整的 kvm 虛擬機的話, 可省略此步。) 請先查看 CPU 有沒有啟用 巢狀虛擬化: cat /sys/module/kvm_intel/parameters/nested 若看到 Y, 直接跳到下一步; 若看到 N, 則需要重新載入 kvm_intel 模組並啟用巢狀虛擬化: rmmod kvm_intel ; modprobe kvm_intel nested=1 可能是因為 amd 對他們的 CPU 比較有信心吧, 預設就直接啟用, 不會有這個問題。 詳見 archwiki。
  2. 建立虛擬磁碟映像檔: qemu-img create -f qcow2 proxdemo.qcow2 30G 我用 12G 也還可以成功安裝。
  3. 用安裝光碟啟動虛擬機: kvm -m 4096 -monitor stdio -cpu host -cdrom proxmox-ve_4.4-eb2d6f1e-2.iso -boot order=dc -device virtio-net,netdev=net0,mac=52:54:00:12:34:03 -netdev tap,id=net0,ifname=tap03 proxdemo.qcow2 因為要用 zfs, 記憶體最好多給一些。 加上 -cpu host 後續才能玩巢狀虛擬化。
  4. 在選取 Target Harddisk 的那一頁, 點 options, 然後 filesystem 欄位選 zfs (RAID0)。 不必去動 advanced options。
  5. Country 填 Taiwan。
  6. 密碼至少要五個字元。
  7. FQDN 自己隨便取名字; IP 等等數字不必去動它, 用 kvm 分配的值 (10.0.2.15 等等) 就好。
  8. 安裝完成、 reboot 之後又回到安裝光碟開機畫面, 直接暴力關機。
  9. 啟動 proxmox: 如果是實體機就直接開機; 如果是虛擬機就 kvm -m 4096 -monitor stdio -cpu host -device virtio-net,netdev=net0,mac=52:54:00:12:34:03 -netdev tap,id=net0,ifname=tap03 proxdemo.qcow2 也就是比剛剛少了 -cdrom 跟 -boot 那兩段。
  10. 在瀏覽器的網址列上面打 https://192.168.29.3:8006/。 Firefox 或 chromium 都會警告不安全。 這個警告訊息其實並不正確, 應該說 「這個網站採用自己發的安全憑證, 你確定要信任它嗎?」 這是我們自己架的主機, 當然可以信任! 「進階」=>「新增例外網站」=>「確認安全例外」。
  11. 用 root 跟先前設定的密碼登入。
  12. Proxmox 警告說你沒有 valid subscription。 直接按 ok 就好。

0 安裝畫面 1 同意授權 2 硬碟設定 3 國家/時區/語言 4 管理員密碼/信箱
5 網路設定 6 下載及安裝套件 7 安裝成功 8 火狐警告不安全 9 登入畫面

三、 建立系統快照

zfs 有一個超級超級好用的功能: 系統快照。

  1. 用 ssh 從 host 登入 proxmox 主機: ssh root@192.168.29.3
  2. 備份一個特殊的目錄: tar czf /etc/pve.tgz /etc/pve
  3. 查看目前有哪些 zfs 的 data sets: zfs list -t all 注意到 proxmox 預設將最上層的 data set 叫做 rpool。
  4. 建立整個 zfs 系統的快照, 遞迴地包含 rpool 底下的每個 data set。 快照命名為 0-fresh。 zfs snapshot -r rpool@0-fresh 不用半秒鐘就建好了!
  5. 再次列出 data sets 的清單: zfs list -t all

以後如果有必要, 可以用 zfs rollback rpool@0-fresh ; tar -xzC / -f /etc/pve.tgz 把系統還原到今天現在的狀態。 三秒內立馬恢復青春時青澀的模樣! 以後每當要下一些可怕的指令之前, 或是要安裝一堆額外套件/可能把系統變得很雜亂之前, 只要記得先建立 snapshot 就再也不怕發生令人悔恨的蠢事了。 (我還會先把 guests 都關掉; 不過其實好像也沒必要。) 請搜尋 「zfs 快照」 自學囉!

註: 為什麼需要手動備份 /etc/pve? 用 df 查看, 會發現它是另一個獨立的檔案系統。 根據 官網說明 為了要讓多個 nodes 之間的設定同步, 這個目錄採用的是特殊的 pmxcfs 檔案系統, 所以 zfs 管不到。

四、 重要基本設定

  1. 沒有訂購企業級服務的人, 請把這個檔案 /etc/apt/sources.list.d/pve-enterprise.list 改名為 pve-enterprise.disabled (或任何附檔名皆可, 反正只要不是 .list 就好) 或把裡面唯一那句註解掉。 然後在 /etc/apt/sources.list 裡面補一句: deb http://download.proxmox.com/debian jessie pve-no-subscription 詳見 這一頁。
  2. 更新套件清單: apt-get update
  3. 設定 密不透水的 ssh 服務 跟 proxmox 的 fail2ban 保護規則。 (謎之音: 潰客都攻到區網來了... 那我的 host 也淪陷了嗎?)

五、 取得 container 模板

要建立 lxc container 之前, 系統裡必須先準備好模板 (template, 例如 debian 8 的模板、 ubuntu 16.04 的模板、 fedora 24 的模板、 ... 等等。)

  1. 更新模板清單: pveam update
  2. 列出可下載的模板: pveam available
  3. 列出已下載、 立即可用的模板: pveam list local (目前是空的)
  4. 下載 ubuntu 16.04 的模板: pveam download local ubuntu-16.04-standard_16.04-1_amd64.tar.gz 下載回來的模板放在 /var/lib/vz/template/cache/ 裡面。
  5. ... (多下載一兩個模板)
  6. 再次列出已下載的模板: pveam list local

至此, 你已經可以從瀏覽器介面建立輕量級虛擬機 (Create CT), 也就是 lxc container。

六、 為 VM 取得 iso 檔及注意事項

如果你想安裝的作業系統沒有出現在 pveam available 的清單裡面, 就只好改用安裝光碟建立效率較低的完整虛擬機。 cd 到你的 iso 檔倉庫, 然後: scp *.iso root@192.168.29.3:/var/lib/vz/template/iso/

至此, 你已經可以從瀏覽器介面建立完整虛擬機 (Create VM), 也就是 kvm 虛擬機。 建立 kvm 虛擬機時, 在 「Harddisk」 那一步的 「Storage」 選項, 有 local 跟 local-zfs 兩個選項。 要選 local-zfs 才能享受 zfs 的快照。 詳見 這個問答 及 32 bit linux 不支援 zfs 但還是可以享用 snapshot 快照。

七、 虛擬機的網路設定

如果你希望虛擬機跟 proxdemo 伺服器落在同一個網段, 那麼網卡設定的地方 (network => bridge) 就選預設的 vmbr0, 很簡單。

如果你希望把虛擬機們關到更內層的區網, 那麼請先把 brctl show 的結果存起來, 等一下可能會用得到。 先到 /etc/network/interfaces 裡面 (原有的 auto vmbr0 那一段之後) 加上一段:

auto vmbr72
iface vmbr72 inet static
        address  192.168.72.1
        netmask  255.255.255.0
        bridge_ports none
        bridge_stp off
        bridge_fd 0
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up iptables -t nat -A POSTROUTING -s '192.168.72.0/24' -o vmbr0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '192.168.72.0/24' -o vmbr0 -j MASQUERADE

注意: 在 proxdemo host 裡面, 這張新的網卡的名稱必須長得類似上面的 vmbr72 (一定要以 vmbr 開頭)。 iptables 那兩句裡面的重點是 -o vmbr0 : 要指定由 vmbr0 (它底下管了 proxdemo host 的實體網卡 eth0) 來幫區網做 NAT。根據 這個問答, 改過 /etc/network/interfaces 之後, 要下 service networking restart 才會生效。 但是重啟網路之後, 內網有可能會斷掉。 這是因為 bridge 沒有把 interface 加回來。 請用 brctl show 檢查, 用 brctl addif vmbr72 tap100i0 之類的指令, 手工把它加回來。 (剛剛你有先用 brctl show 備份正確的網路設定以供現在參考對吧?) 最後, 建立虛擬機時, 網路就選這個 vmbr72。

又, 強烈建議安裝 Single Packet Authorization, 既可全面防禦 ssh 又可順便幫區網內的虛擬機做 port forwarding。

八、 從命令列上備份/還原/複製 lxc container

假設你已建立好一部 lxc container 代號 201。 除了從網頁介面備份還原之外, 也可以從命令列上備份/還原/複製:

vzdump 201
pct restore 451 /var/lib/vz/dump/vzdump-lxc-201-2017_02_23-10_27_36.tar.gz -storage local-zfs -hostname sonmi451

第一句會把 201 備份起來, 第二句則是從它的備份產生出一部新的虛擬機代號 451, 主機名稱 songmi451。 但為了避免兩部機器一模一樣, 還需要參考 備份/搬家/還原/大量複製虛擬機 第三節 (含) 之後的說明, 其中的 vzctl 指令通通改成 pct 指令。

九、 安全防護

ssh 一定要保護好。 請見 設定密不透水的 ssh 服務, 特別大推其中的 連鑰匙孔都藏起來的 ssh 完全防禦: SPA。

位於 port 8006 的網頁管理介面是由 pveproxy 這個服務在管理的, 可以用 systemctl status pveproxy 查詢它的狀態, 用 tail -f /var/log/syslog 查詢錯誤記錄 -- 請在網頁介面故意打錯帳密試試看。 遺憾的是, 官方不願意支援 「搬到其他的 port 去」 (不符成本效益)。 熟 iptables 的朋友可以 用 iptables 轉 port。 或是 用 nginx 擋在這個服務前面。 另有一個較簡單的防護措施: 設定只允許從某些 IP 登入網頁管理介面, 例如在 /etc/default/pveproxy 裡面設定:

ALLOW_FROM="123.45.67.0/24,98.76.54.0/24"
DENY_FROM="all"
POLICY="allow"

然後 systemctl restart pveproxy 。

十、 雜記 & 結語

  1. 如果網路沒有設定好的話, console 頁面啟動機器時, 可能會跳掉不見。
  2. finnix 不認得 scsi 硬碟。 請用 sata 或 ide。

接下來呢? Pulipuli Chen 有 一系列的 proxmox 教學文; 不過他是 proxmox 教學文的先驅, 所以用的是較舊的版本 (3.*)。 我會建議新手用網頁介面建立虛擬機, 然後改用文字介面管理。 可以從 man pct 開始自學。 我最常用的指令是 pct list、 pct start 100、 pct enter 100 [從 host 直接進入 container, 超好用]、 pct shutdown 100, 這樣就完全不需要再用瀏覽器開 console, 甚至很少需要用瀏覽器介面管理了。 至於管理完整 VM 的指令, 請見 man qm; 當然, 它就沒有 "enter" 那麼好用的指令可用。 耀達電腦的 Jason Cheng 有多年的 PVE (Proxmox Virtual Environment) 管理經驗, 而且在資策會開課, 想要多學一點的讀者, 可以到 他的 PVE 簡報 撈搜尋關鍵詞。 其他更多心得分享, 就另文再談囉。 本文遺漏了什麼重要的基本常識嗎? 您想拿 proxmox 做什麼? 遇到什麼困難? 請留言討論吧!

沒有留言:

張貼留言

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