雖然成功地在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/default/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,還是老老實實投資點錢到可靠的儲存媒介方為上策。
參考及來源: