2012年1月21日星期六

解決avast! Linux Home Edition的Invalid argument警告

雖然在Linux上受病毒影響的機會極微,但很多時中了病毒的朋友也會向我求救。雖然Linux上跑的防毒程式不多,但因為Linux可說是「逄Windows毒不侵」的優勢,也會幫朋友一把,替人家掃掃USB上的毒。avast也有推出Linux的家用版掃毒程式avast! Linux Home Edition。很多朋友安裝後會先更新一下,這是正確做法。更新後avast卻出現「An error occured in avast! engine: Invalid argument」的警告,究竟是甚麼argument錯誤呢?




其實原因是avast的病毒定義檔使用Linux的SHM(Shared Memory),基於安全理由等等因素,shm的記憶空間是有預設上限的。而avast的病毒定義檔在更新後卻佔上大約50MB左右的容量,一般Linux系統也不會有這麼大的shm上限,所以shm記憶空間不足以載入avast的病毒定義檔。你可以執行以下指令比較shm上限值和avast的病毒定義檔大小。



查看系統shm上限
cat /proc/sys/kernel/shmmax

查看avast病毒定義檔大小
du -h ~/.avast/400.vps





以我的Arch Linux為例,shm上限是33554432 Bytes,除以1024x1024後即32MB。而我的avast病毒定義檔在更新後的大小是49MB,明顯比shm大很多。

解決方法可以將系統的shmmax,即shm上限設大。但這個方法並非必要,亦不知道avast的病毒定義檔哪一天會再脹大,無法肯定多少MB才夠他用。亦不知道哪天avast會把這個問題解決。所以我們可以用一個暫時的方法將shmmax設大一點,這個方法所設的shmmax在系統重開後會被還原。

執行以下指令可以暫時將shmmax加大,但需用root權限才可以執行,所以請先以su指令轉換成root,又或在指令前加上sudo。


sysctl -w kernel.shmmax=52428800



52428800 Bytes即50MB,足以存放avast現時49MB的定義檔。



現在運行avast! Linux Home Edition沒問題了。




方求方便,我直接寫了個shellscript執行avast!。

#!/bin/bash
#boost shmmax to 50MB
#then start avast!

sudo sysctl -w kernel.shmmax=52428800
nohup avastgui > /dev/null &


但這裡假設系統已有sudo指令,若沒有sudo的系統的話,請以su代替。

參考資料︰
Linux Shared Memory的解釋(英語)︰http://en.wikipedia.org/wiki/Shared_memory
Linux Shared Memory的解釋及實際使用(英語)︰http://www.cyberciti.biz/tips/what-is-devshm-and-its-practical-usage.html

1 則留言: