將pfsense與server整併

去年,原本就有構想要買個N100的多網孔小主機,來替換原本使用的3865U多網孔小主機,後來一直延續到了今年都沒購買。4月時因為老婆要購買淘寶,有燃起我想買N100的慾望,但隨著查詢資料後,發現會有些N100小問題,雖應該都不嚴重,但感覺上除了性能增強外,就沒原本用的3865U讓我安心。因四月底美國學伴要來家裡住幾天,趁假日大整理機櫃時,突然想到,何不把router跟小server整併呢?網路部也一堆人如此做嗎?且經過計算,原本的router+server耗電量約3X瓦,且效能較差,整併升級後應該效益只會更好才是。

既然有了想法,我就開始上網狂找資料,除了晚體設定上有沒有什麼問題外,也在思考硬體要如何配置。查了資料+上網詢問後,還是硬著頭皮上去DDR5,雖然相同價格下,DDR4可以買到64G,DDR5只有32G,但考量到目前32G夠用之外,也覺得先上到未來趨勢的產品後,等待降價後再依需求補足即可。至於CPU部分,著實在I5-12400/I3-14100/I5-14500間游移不定,最後綜合考量下,購買了I5-14500。

下單後等待了幾天,主要零件總算都到齊了,就剩下軟體測試了,因為至次鐵了心要把主幹升級到10G光纖,並把區網架構直接改成用vlan處理,因為需要支援IOMMU & SR-IOV,為此還購買了X710-DA2,並把既有的Family server中的I350-T2拔下來使用。預計架構就是I350-T2建立雙WAN,X710-DA2為LAN,兩個都PCIE直通。

proxmox要使用pcie直通,設定上也不是難事。
首先,硬體一定要支援,基本上目前新的硬體應該都有支援了,但在購買前,我還是都會去確認主機板的BIOS能不能設定VT-d/SR-IOV/IOMMU等。
接下來,就是安裝完proxmox後的設定了,我是參考篇文章來完成:1. https://www.servethehome.com/how-to-pass-through-pcie-nics-with-proxmox-ve-on-intel-and-amd/ 2. https://forum.proxmox.com/threads/enabling-sr-iov-for-intel-nic-x550-t2-on-proxmox-6.56677/

Step 1. 確認是使用GRUB還是systemd:
efibootmgr -v,若有看到File(\EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI),則表示是使用systemd。

Step 2a. 若是使用GRUB:
pico /etc/default/grub
for Intel:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
for AMD:GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
update-grub

Step 2b. 若是使用systemd:
pico /etc/kernel/cmdline
for Intel:quiet intel_iommu=on iommu=pt
for AMD:quiet amd_iommu=on iommu=pt
proxmox-boot-tool refresh

Step 3. 加入Modules
pico /etc/modules
增加下面幾行
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

儲存後就重開機。

Step 4. 確認執行狀況
dmesg | grep -e DMAR -e IOMMU
確認有沒有出現IOMMU enabled,有的話表示行成功了。

Step 5. VM設定
完成後,在建立VM後,在Hardware地方,應該就可以add直通的pcie到VM中。

好,但若有不只一台VM需要這網卡,那該怎麼辦?因為網卡實體只有一個,當被某台VM搶走之後,別的VM就無法使用,這時候就得請出SR-IOV來幫忙了,這也是為何我要找尋有支援SR-IOV網卡的原因了。好,那就接下來設定吧。

Step 6. 設定VFs
在/etc/systemd/system/下建立檔案,以sriovnic.service來舉例
pico /etc/systemd/system/sriovnic.service
在檔案內輸入以下內容,其中N為你想建立的VF數量,
[Unit]
Description=Script to enable SR-IOV on boot
[Service]
Type=oneshot
#Starting SR-IOV
ExecStart=/usr/bin/bash -c 'echo N > /sys/class/net/enp1xxx/device/sriov_numvfs'
ExecStart=/usr/bin/bash -c 'echo N > /sys/class/net/enp2xxx/device/sriov_numvfs'
[Install]
WantedBy=multi-user.target


存檔後執行systemctl enable sriovnic.service

Step 7. 在啟動時將 PF 設定為 UP
要使用 VF,實際上需要先開啟 PF(物理功能)。為了讓它們在啟動時自動打開,我們可以在 GUI 中進行設定。前往Node –> System –> Network,,雙擊您的網卡並選取自動啟動框。或者,可以透過在 /etc/network/interfaces 中新增一行「auto <您的網路卡名稱>」來設定。
阻止 PVE 加載 VF
當我們計劃將 VF 分配給時,我們可以阻止 PVE 加載它以避免任何衝突。首先,我們需要知道正在載入什麼VF驅動程式。
輸入:lspci -nnk | grep -A4 Eth
尋找Kernel driver in use:行並查看正在載入的內容。然後我們可以將此模組列入黑名單。
編輯 /etc/modprobe.d/pve-blacklist.conf 並在底部加入以下內容
<您的VF模組>blacklist<您的VF模組>
然後執行
update-initramfs -u -k all
重新啟動PVE主機。

Step 8. 固定MAC
路由器虛擬機器在重新啟動後無法初始化,有可能是MAC浮動導致,因此,可以將MAC固定。於sriovnic.service檔案更改編輯如下。
[Unit]
Description=Script to enable SR-IOV on boot
Requires=network.target
After=network.target
Before=pve-firewall.service
[Service]
Type=oneshot
#Starting SR-IOV
ExecStart=/usr/bin/bash -c 'echo 2 > /sys/class/net/enp1xxx/device/sriov_numvfs'
ExecStart=/usr/bin/bash -c 'echo 2 > /sys/class/net/enp2xxx/device/sriov_numvfs'
#Setting static MAC for VFs
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp1xxx vf 0 mac XX:XX:XX:XX:XX:XX'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp1xxx vf 1 mac XX:XX:XX:XX:XX:XX'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2xxx vf 0 mac XX:XX:XX:XX:XX:XX'
ExecStart=/usr/bin/bash -c '/usr/bin/ip link set enp2xxx vf 1 mac XX:XX:XX:XX:XX:XX'
#Detach VFs from host
ExecStart=/usr/bin/bash -c 'echo 0000:01:00.3 > /sys/bus/pci/devices/0000\:01\:00.3/driver/unbind'
ExecStart=/usr/bin/bash -c 'echo 0000:01:00.4 > /sys/bus/pci/devices/0000\:01\:00.4/driver/unbind'
ExecStart=/usr/bin/bash -c 'echo 0000:01:00.5 > /sys/bus/pci/devices/0000\:01\:00.5/driver/unbind'
ExecStart=/usr/bin/bash -c 'echo 0000:01:00.6 > /sys/bus/pci/devices/0000\:01\:00.6/driver/unbind'
[Install]
WantedBy=multi-user.target

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料