2022/09/30

單板小主機上的Proxmox VE實務:暴力減少eMMC或SD卡的讀寫耗損

雖然成功地在Rock Pi X的eMMC上安裝和使用Proxmox VE,但不止一處在網上看到包括Proxmox的員工和各路大神的帖子,都強烈地不建議在SD/eMMC/USB手指上安裝和使用Proxmox VE,理由主要是PVE會在運作地不停地讀寫系統碟,對於便宜的固態儲存媒介來說,長期大量的讀寫會快速地縮短設計壽命,所以一開始就在安裝程式上避開在mmc類的固態儲存。

為了減少eMMC或SD卡的讀寫耗損,於是了四處收集了一埋參考。

這裡不止適用於Rock Pi X,也適用於所有在把PVE安裝在eMMC或SD卡上的場景。

警告:下面的設定不應該被應用於有重大價值的伺服器上面!這只是筆者強行在便宜硬件上塞進PVE並以更暴力的方式去為其續命的手段。

停用Linux的SWAP功能

Linux的SWAP功能,主要是在RAM內存記憶體不足時,把額外所需的內存空間轉移到硬碟上面,Linux在裝機時會自行把SWAP以一比一的比例在硬碟中分隔,即機上有4GB的RAM內存,裝機時就會在硬碟劃出4GB的SWAP分隔。

在eMMC或SD卡上當SWAP也就是其中一個造成讀寫損耗的潛在因素。

如果只跑一兩個內存所需的VM時,PVE上其實也不需要用上SWAP,所以直接設成零。當然,前題是內存要充足才套用這個設定。

在Shell終端機輸入:

nano /etc/sysctl.conf

在nano編輯器修改swap設定

vm.swappiness = 0

然後再reboot重新啟動即可。

停止log日誌檔的暴走

Proxmox VE的另一個會大量進行系統硬碟讀寫,造成潛在讀寫損耗的疑兇,就是PVE的上系統日誌(system log)。

每一個操作系統都會有日誌讀寫,但PVE的特殊性、同時具有開發人者和企業兩方的需求,使得系統日誌更更更為詳盡和頻繁。

這裡有兩個處理方法──如果想要保持系統日誌,最好就是把儲存系統日誌的目的地從SD或eMMC轉到其他「較適合大量讀寫」的儲存媒介,像傳統硬碟或可靠的SSD;如果覺得「反正也不會看」而不想保留系統日誌的話,就直接暴力地把系統日誌儲到黑洞也可。

系統日誌的服務是rsyslog。

把系統日誌移植轉存到其他分隔和資料夾

假設用來儲存系統日誌的是硬碟【sde】,硬碟分隔為【sde1】 。命令如下:

mount /dev/sde1 /var/log1
cp -a /var/log/* /var/log1/.
systemctl stop rsyslog
rm -rf /var/log/*
umount /var/log1
mount /dev/sde1 /var/log
systemctl start rsyslog

日誌移植手術的次序大致是──把/dev/sde1掛載成/var/log1,把原來在系統預設的日誌資料夾/var/log內容都抄到/var/log1,停止rsyslog服務,幹掉/var/log,卸載/var/log1,再把/dev/sde1重新掛載成/var/log,再重新啟用rsyslog服務。

把系統日誌存到黑洞去

Linux系統上有一個黑洞儲存的存在,即/dev/null,要寫入數據的都不會真的寫入,只是營造了一個「寫入成功」的假象。

另外,由於黑洞不能直接掛載,所以使用Symbolic link符號鏈接的分身代替。

在Shell終於輸入:

systemctl stop rsyslog
rm /var/log/syslog
ln -s /dev/null /var/log/syslog
rm /var/log/pveproxy/access.log
ln -s /dev/null /var/log/pveproxy/access.log
systemctl start rsyslog

從此,log,黑洞再見(?!)。

停用部份PVE服務

除了系統本身的rsyslog外,部份非絕對必要的PVE服務也會產生和讀寫大量數據,有機會造成讀寫耗損。基本上停用這些服務不會影響對PVE的最核心運作,但有個別功能可能不能使用。

系統服務要先了解下面四個中英詞語,很容易混淆,這裡借用了繁體中文Windows的用語:手動操作的──停止(stop),啟動(start);多數在開機時決定的狀態──停用(disable),啟用(enable)。

HA(High Availability)相關服務

  • pve-ha-lrm
  • pve-ha-crm

防火牆日誌生成服務

  • pvefw-logger

非PVE的非必要服務

  • spiceproxy
  • corosync

停用個別指令格式是

systemctl disable corosync

但是,即使是停用了,系統開機時「有需要」也會自動啟動已經被停用的服務,所以得在系統設定層面去屏蔽這些服務:

systemctl mask pve-ha-lrm
systemctl mask pve-ha-crm
systemctl mask pve-firewall
systemctl mask pvefw-logger
systemctl mask spiceproxy
systemctl mask corosync

減少rrdcached寫入

長時間定期收集系統狀態監控數據的rrdcached也是潛在「威脅」,這裡,我們可以設定減少rrdcached寫入。首先編輯設定檔:

Nano /etc/defaults/rrdcached

找出預設被comment掉的WRITE_TIMEOUT,把#號去掉並把數值改成3600,即每小時(3,600秒)才寫入一次。

WRITE_TIMEOUT=3600

再在JOURNAL_PATH前面打碼,打碼後,journaling記錄就會自動停止。

#JOURNAL_PATH=/var/lib/rrdcached/journal/

最後是加入FLUSH_TIMEOUT的設定,在最底的一行加入

FLUSH_TIMEOUT=7200

然後〔Ctrl O〕儲存,〔Ctrl X〕離開。

再修外另一個檔案

/etc/init.d/rrdcached

在這一組

${WRITE_TIMEOUT:+-w ${WRITE_TIMEOUT}} \
${WRITE_JITTER:+-z ${WRITE_JITTER}} \

修改成

${WRITE_TIMEOUT:+-w ${WRITE_TIMEOUT}} \
${FLUSH_TIMEOUT:+-f ${FLUSH_TIMEOUT}} \
${WRITE_JITTER:+-z ${WRITE_JITTER}} \

然後〔Ctrl O〕儲存,〔Ctrl X〕離開。

在兩個設定檔都修改完成後,重啟rrdcached

systemctl restart rrdcached.service

這時就大幅減少了rrdcached的寫入。

停用PVE硬件實時狀態服務pvestatd

停用pvestatd後,PVE將沒有辦法獲得最接近實時的硬件狀態資訊,所以沒有辦法新建VM。停用的命令是

systemctl disable pvestatd

如果要新建VM,需手動啟動pvestatd:

pvestatd start

同理,手動停止命令:

pvestatd stop

PVE上的相關實時的硬件狀態更新服務就會停止。

後話

這樣「應該」可以減少SD卡或eMMC的讀寫損耗,不過如果打算在非家用、非實驗/試玩/折騰的場景下使用PVE,還是老老實實投資點錢到可靠的儲存媒介為上策。

參考及來源: