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 listpct start 100pct enter 100 [從 host 直接進入 container, 超好用]、 pct shutdown 100, 這樣就完全不需要再用瀏覽器開 console, 甚至很少需要用瀏覽器介面管理了。 至於管理完整 VM 的指令, 請見 man qm; 當然, 它就沒有 "enter" 那麼好用的指令可用。 耀達電腦的 Jason Cheng 有多年的 PVE (Proxmox Virtual Environment) 管理經驗, 而且在資策會開課, 想要多學一點的讀者, 可以到 他的 PVE 簡報 撈搜尋關鍵詞。 其他更多心得分享, 就另文再談囉。 本文遺漏了什麼重要的基本常識嗎? 您想拿 proxmox 做什麼? 遇到什麼困難? 請留言討論吧!

沒有留言:

張貼留言

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