業餘機房管理員貴哥向系上要了一部較高階的桌機, 在上面安裝 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 要小一些。 (比較平均分散。)
二、 安裝
- (如果未來只打算使用輕量級的 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。 - 建立虛擬磁碟映像檔:
qemu-img create -f qcow2 proxdemo.qcow2 30G
我用 12G 也還可以成功安裝。 - 用安裝光碟啟動虛擬機:
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 後續才能玩巢狀虛擬化。 - 在選取 Target Harddisk 的那一頁, 點 options, 然後 filesystem 欄位選 zfs (RAID0)。 不必去動 advanced options。
- Country 填 Taiwan。
- 密碼至少要五個字元。
- FQDN 自己隨便取名字; IP 等等數字不必去動它, 用 kvm 分配的值 (10.0.2.15 等等) 就好。
- 安裝完成、 reboot 之後又回到安裝光碟開機畫面, 直接暴力關機。
- 啟動 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 那兩段。 - 在瀏覽器的網址列上面打
https://192.168.29.3:8006/
。 Firefox 或 chromium 都會警告不安全。 這個警告訊息其實並不正確, 應該說 「這個網站採用自己發的安全憑證, 你確定要信任它嗎?」 這是我們自己架的主機, 當然可以信任! 「進階」=>「新增例外網站」=>「確認安全例外」。 - 用 root 跟先前設定的密碼登入。
- Proxmox 警告說你沒有 valid subscription。 直接按 ok 就好。
三、 建立系統快照
zfs 有一個超級超級好用的功能: 系統快照。
- 用 ssh 從 host 登入 proxmox 主機:
ssh root@192.168.29.3
- 備份一個特殊的目錄:
tar czf /etc/pve.tgz /etc/pve
- 查看目前有哪些 zfs 的 data sets:
zfs list -t all
注意到 proxmox 預設將最上層的 data set 叫做 rpool。 - 建立整個 zfs 系統的快照,
遞迴地包含 rpool 底下的每個 data set。 快照命名為 0-fresh。
zfs snapshot -r rpool@0-fresh
不用半秒鐘就建好了! - 再次列出 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 管不到。
四、 重要基本設定
- 沒有訂購企業級服務的人, 請把這個檔案
/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
詳見 這一頁。 - 更新套件清單:
apt-get update
- 設定 密不透水的 ssh 服務 跟 proxmox 的 fail2ban 保護規則。 (謎之音: 潰客都攻到區網來了... 那我的 host 也淪陷了嗎?)
五、 取得 container 模板
要建立 lxc container 之前, 系統裡必須先準備好模板 (template, 例如 debian 8 的模板、 ubuntu 16.04 的模板、 fedora 24 的模板、 ... 等等。)
- 更新模板清單:
pveam update
- 列出可下載的模板:
pveam available
- 列出已下載、 立即可用的模板:
pveam list local
(目前是空的) - 下載 ubuntu 16.04 的模板:
pveam download local ubuntu-16.04-standard_16.04-1_amd64.tar.gz
下載回來的模板放在 /var/lib/vz/template/cache/ 裡面。 - ... (多下載一兩個模板)
- 再次列出已下載的模板:
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
。
十、 雜記 & 結語
- 如果網路沒有設定好的話, console 頁面啟動機器時, 可能會跳掉不見。
- 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 做什麼? 遇到什麼困難? 請留言討論吧!
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。