這篇文章適合有技術基礎的閱讀。
對搞技術的人來說,Nas 是個理想的玩具,既然是程序員用的 Nas ,自然要專業一點,不能像小白一樣買臺威聯通或者群暉往哪裡一放就行,如果這樣,就沒有必要繼續往下讀了。
就像有人喜歡買成品車,有人喜歡自己改裝車;有人喜歡傻瓜相機,有人喜歡機械相機。如果你喜歡 DIY,想讓自己家裡的硬件發揮更大用途,讓自己的 nas 系統更專業些,那麼請繼續。
有人說,生命的意義在於奉獻;還有人說,生命的意義在於付出;然而對於 Nas 玩家來說,生命的意義只有兩個字 -- “折騰”。
有人問:“Nas 還能玩出一朵花來?”,答案是:“當然能”,折騰 Nas 第一步就是上虛擬化環境,有這個基礎,後面才能更好的搞其他東西。所以今天我們先把 Nas 虛擬化這個綱領性的問題給說清楚說透徹。
Nas 系統為什麼要虛擬化?
首先是讓一臺物理機可以安裝多個不同的隔離的操作系統,Nas 很多都是魔改 Linux,一機多用的話,除了可以自由的安裝其他主流 Linux 發行版外,你還能裝臺 Windows 來跑迅雷。
其次,而對於程序員,往往還需要另外一個乾淨的標準 Linux 發行版作為一個開發/折騰的環境,比如 Ubuntu / Debian / Centos 這些,虛擬化後,你可以自由的折騰你的發行版,通過虛擬機隔離後,你亂折騰自己的開發環境也不會把 Nas 弄掛,把自己的數據弄飛。
最後,資源分配更加靈活,系統/磁盤級別的備份遷移和恢復也可以很方便的實現。
Nas 需要承擔 HTPC 的角色麼?
我說了一千遍了,HTPC 是一個偽需求,比如你家裡有臺電視還有一臺投影儀,你是把 HTPC 接到哪裡呢?還是配置兩臺 HTPC 各連一臺,然後一個電影存兩份?所以說這些方式都是扯淡的,Nas 就做好 “數據服務”這件事情就好了,就該安安靜靜的呆在路由器旁邊,用網線直連,提供最好網速。
至於各種電視,投影儀,外接一個兩百元的“盒子”或者 HDMI 電視棒即可,都可以通過無限播放局域網的視頻。Nas 上各啟動一些 Samba ,Plex ,Kodi,Emby 之類的,提供不錯的檢索分類服務,手機和 iPad 上也有各種 App 來直接串流。
所以 Nas 管好數據就行了,家裡那麼多塊屏幕,採用局域網串流的形式比 HTPC 靠譜的多。
方案 A:Nas 直接安裝在物理機上,再在 Nas 裡裝虛擬機
這是最簡單通俗的方法,優點是貼近硬件,Nas 直接面向硬件,能夠提供更好的數據性能。你買一臺成品威聯通或者群暉來,他們都自帶虛擬化環境,可以往裡面安裝各種虛擬系統。這是最簡單直觀的方案了。
那麼該方案有什麼不足麼?當然有, Nas 安裝到物理機上後,想在 Nas 系統上面繼續安裝一套完美的虛擬化環境,幾乎是不可能的。Nas 系統定製化太深,你如果想在上面深度折騰虛擬機,會有很多限制。
再者 Nas 系統一般內核版本都是鎖定版本的,我那臺威聯通,至今還是 Linux 4.2 的系統,跑個 KVM 虛擬化環境也用不到最新的內核,享受不了最新的虛擬化技術。
最後你沒有辦法自由的嘗試各種 Nas 系統,比如你如果物理機上面安裝一個 FreeNas ,它是 FreeBSD 系統,功能是強了,但是虛擬化就比較麻煩了,FreeBSD 下面沒有啥好的虛擬化系統。因此,我們需要方案 B。
方案 B:物理機直接變成 Hypervisor
這個方案是最乾淨的方案,先在物理機上把虛擬化系統搭建紮實,再在虛擬系統裡安裝你想嘗試的各種 Nas 系統,即使 Nas 被你弄掛了,也可以用各種快照,恢復技術來拯救你的系統和數據,再者 Nas 系統裡面各種權限設置,備份任務,各種服務和 App 搭建一次確實不容易,虛擬化以後,今後物理機升級也可以方便的遷移,同時硬件資源的分配也會更加靈活。
至於你在虛擬系統裡安裝什麼 Nas,問題都不大,不管是基於 Linux 的黑群暉,開源的 OpenMediaVault,HP 合作的 ClearOS 還是基於 FreeBSD 的 FreeNas,你在虛擬機裡面折騰都安全的多,不會把其他系統弄掛。
使用何種虛擬化方案?
最簡單的方式把一臺物理機變成一臺 Hypervisor 當然是安裝 Windows,在上面弄個 HyperV,Vmware 再弄點隨即啟動什麼的,或者弄點 vShpere。這樣也可以,至少你沒有用 VirtualBox 這些業餘方案,但是 VmWare 系列限制也很多,非開源軟件,免費版有 vCPU 數量限制,同時 VmWare 不支持類似 virtio 或者 vGPU 之類的事情。
更專業點的做法,當然是上 KVM 系統,該系統同 Vmware 之類的比較我不想多說了,就講一點,今天不管阿里雲,騰訊雲還是境外 Linode / Aws 全部都跑在 KVM 為基礎的系統上,它的應用規模比 VmWare/vShpere 廣泛很多,能過夠更好的同 Linux Guest OS 結合。
對於 KVM 系統,最弱智的玩法是 Ubuntu 桌面下面安裝個 Virt Manager,然後像 VmWare 一樣用,最專業的玩法當然是基於 OpenStack 和自己開發。對於個人用戶,前者太過簡陋,後者又太過複雜。所以對於個人用戶我推薦 Proxmox VE。
使用虛擬化系統不會損耗性能麼?
KVM 系統對性能的損耗只有 1%-2%,這是官方數據,也符合我常年使用的經驗。你看 AWS 上面用 KVM 跑著那麼多高性能服務,有啥問題呢?
虛擬機都是基於 Intel VT-x 技術的,物理機 Hypervisor 其實運行在 vmx 的根模式下面,而虛擬機的每個 vCPU 則運行於非根模式中,每個 vCPU 通過一個獨立的 VMCS 寄存器來描述,相當於沙盒環境,物理機通過一條 VMLAUNCH/VMRESUME 從根模式切換到虛擬機的非根模式,執行 vCPU 裡面的指令,當需要發生 I/O 或者中斷/異常時,又會退出回 Hypervisor 的根模式下。
所以各種 CPU 密集的運算,都是 vmx 的 vCPU 沙盒裡跑的,相當於物理 CPU 執行正常指令只是環境變了一下而已,基本沒啥損耗,這部分 KVM 的 vmx vCPU 調度是直接實現在內核裡面的,性能做的不錯。唯一就是 I/O 時需退出 vmx 跑回物理機處理,這是在所難免的事情,KVM 的好處是提供了 virtio,如果 GuestOS 支持 virtio(比如都是 linux 系統,或者 Windows 安裝 virtio 驅動),這個操作可以繞過很多不必要的硬件模擬,在物理機上更高效直接的實現。
Raid / ZFS 跑在物理機上還是虛擬機裡?
如果你是硬件 Raid,那麼沒得選,肯定是跑在物理機上面的,但是個人用戶,一塊入門 raid 卡基本要兩千元,你是土豪當我沒說。從成本角度考慮,軟件 raid 現在已經很成熟了,威聯通和群暉這些都是 linux 軟件 raid ,一個 mdadm 程序做一些封裝而已,一用用了好幾年,也沒見消費者反饋什麼問題。
在物理機上直接跑 Raid/ZFS 最簡單直接,虛擬機裡的 Nas 系統需要硬盤了,就在物理機的 Raid/ZFS 分區裡創建幾個 qcow2 的磁盤映像文件,比如 200G 一個,創建好了扔給虛擬機系統就行,qcow2 擴容也方便。
如果你使用 Proxmox VE 系統,它直接支持 ZFS,你可以組建你的 zpool,然後在 Proxmox VE 的網頁上就可以直接管理它,在上面新建虛擬機存儲鏡像。如果你用其他虛擬化方案的化,可以用 mdadm 或者自己安裝 zfs。
對於個人使用,沒必要所有存儲設備都上 Raid,你有四塊硬盤的話,可以用兩塊上 raid1 存重要數據,另外兩塊上 raid0 存非重要數據,物理機上最好弄一塊單獨的 ssd 裝物理機操作系統,剩餘空間還可以給虛擬機裝操作系統,四塊單獨的硬盤就全部用來存儲數據。
這個方案唯一問題就是一堆 qcow2 的文件,始終隔著一層,有些影響性能,同時不太好做一些關於 raid 的系統性實驗,你要在物理機裡折騰 raid,弄出問題來,下面一堆虛擬機都可能跪了。所以如果你想把 raid / zfs 從物理機隔離出來,放到虛擬機裡直接接管,追求極致性能的話,你需要用到存儲設備透傳。
虛擬系統裡做 Raid 需要注意哪些問題 ?
如果選擇虛擬機做 Raid 請注意緩存模式選擇 writethrough 或者 none,不要用其他模式,這樣可以保證虛擬機裡面想寫磁盤時,外面物理機會真的立馬讓它寫盤,而不是物理機再緩存一次,物理機再緩存一次的風險就是,虛擬機裡面的 zfs/mdraid 以為自己寫到了磁盤裡了,但是其實並沒有,只是寫到了物理機的緩存裡,此時一掉電或者故障,數據就掛掉了。
除了虛擬機裡在 qcow2 磁盤鏡像上創建 Raid 外,性能更好的當然是用 KVM 的存儲設備透傳,將幾塊物理硬盤設備直接傳遞給虛擬機裡面的 Nas 系統來管理,這樣能獲得最好的性能。在 libvirt 裡,配置你的虛擬機 xml 文件,加入:
<code><disk> <source> <target>/<disk>/<code>
即可把物理機的物理硬盤/物理分區,直接透傳給虛擬機的 hdc 設備。如果你用 Proxmox VE 的話,可以參考下文,將一塊西數 4T 的硬盤透傳給虛擬機的 FreeNAS 系統:
The Proxmox VE KVM-based All-in-One with FreeNAS
就是直接網頁上點點鼠標就完成設置了,十分方便。
如何透傳其他設備?PCI 透傳有什麼用?
上面說了存儲設備透傳,其實 Nas 系統中 USB 設備也是很重要的一個環節,你經常要插一塊移動硬盤/U盤到 Nas 上,做點備份什麼的。此時虛擬機中的 Nas 系統就需要用到 KVM 的 USB 透傳同能了,操作起來和上面的存儲設備一樣簡單:
現在物理機中查看 USB 設備:
<code>$ /sbin/lsusbBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 005 Device 012: ID 0a5c:2110 Broadcom Corp. Bluetooth ControllerBus 005 Device 003: ID 0483:2016 SGS Thomson Microelectronics Fingerprint ReaderBus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hubBus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub/<code>
然後配置 libvirt 的虛擬機 XML:
<code><domain> <name>windowsxp/<name> … <devices> … <hostdev> <source> <vendor> <product> /<source> /<hostdev> /<devices>/<domain>/<code>
把設備號配置進去,比如你可以把你物理機前面板的兩個 USB 口透傳給你的 Nas 用,以後這兩個口插入設備的話 Nas 就能響應。Proxmox VE 裡面設置的話也類似,見它 wiki:
USB Devices in Virtual Machines
大部分時候透傳存儲設備和 USB 基本已經滿足需求了,KVM 支持任意 PCI 設備透傳給虛擬機,具體可以自行搜索 “KVM PCI passthrough",可以徹底滿足你的各種硬件需求。
除了透傳 PCI 設備,KVM 還支持透傳 GPU 給虛擬機,可以用來跑一些 GPU 加速的轉碼服務,或者在虛擬機裡面跑一個 CUDA 顯卡挖礦之類的程序,有興趣可以搜索相關文檔。
物理機和虛擬機如何共享文件夾?
不管是 KVM 還是 VmWare,都支持將物理機上的某個文件夾共享給若干臺虛擬機來訪問,只不過 VmWare 的化,還需要在 GuestOS 裡面安裝 vmware 的驅動程序套件,用 KVM 的話,如果 GuestOS 是 Linux 的話,根本不需要額外的驅動程序。
物理機下面先配置下 XML:
<code> <filesystem> <source> <target> /<filesystem>/<code>
然後物理機準備一下共享目錄:
<code>sudo mkdir /home/data/kvm/kfssudo chown libvirt-qemu:libvirt-qemu /home/data/kvm/kfs/<code>
注意上面共享目錄的權限需要和你虛擬機運行權限相同,qemu.conf 裡有這個配置,你還可以在物理機 ps aux 看看虛擬機進程所屬的用戶和組。接下來虛擬機中編輯 /etc/modules 文件,添加下面幾行:
<code>loopvirtio9p9pnet9pnet_virtio/<code>
虛擬機內加載內核模塊:
<code>sudo service kmod start/<code>
然後測試 mount:
<code>sudo mkdir /mnt/kfssudo mount -t 9p -o trans=virtio kfs /mnt/kfs/<code>
這樣,虛擬機中的 /mnt/kfs 就映射到了物理機的 /home/data/kvm/kfs 路徑下。
測試成功的話,設置 /etc/fstab:
<code>kfs /mnt/kfs 9p trans=virtio 0 0/<code>
修改完後,mount -a 測試,測試通過重啟虛擬機即可。當然實在懶得折騰可以在物理機上啟動一個 nfs 服務,然後虛擬機裡面 mount 物理機的 nfs 文件夾,實測性能也不錯。
容器服務放在物理機上還是虛擬機上?
如今不少 Nas 服務都是以 Docker 的形式提供出來,我的建議是不管 Docker 還是 LXC ,都放到虛擬機裡面去管理(雖然 Proxmox VE 支持在物理機上管理 LXC),如果 Nas 系統本身是 Linux 的話,可以直接放在 Nas 那臺系統裡面啟動,這樣可以直接跑在 Nas 的各種存儲設備上。
有的 Nas 系統支持 web 管理頁面上直接管理 Docker 容器,不支持的話,自己動手,現在 docker compose 已經很方便了,一堆 docker-compose 文件放在 github 上,要用的時候克隆下來,順序 up -d 就啟動好了,各種 Volume 也可以通過 Nas 的備份系統定時備份。
結 尾
上面是幾條我覺得需要注意的地方,既然程序員玩 Nas,咱們起步就得專業點。
閱讀更多 大胃水手 的文章