每當我們裝好一個新的Linux系統,安裝向導總會幫我們默認啟動一批後台服務程序。這些程序在後台默默地完成各式各樣的任務。比如電源管理,計劃任務,系統審核等等。
可是我們的電腦硬件千差萬別,安裝Linux的目的也千差萬別。這些後台程序往往並不適合我們的要求。其實大多數都是多余的。我們無論做為一個專業的系統管理員也好,還熱愛自己機機的用戶也好,總是無法容忍那一大堆無用的進程在跑著:占用內存,占用CPU時間,看著眼花頭暈。
本文以CentOS和Fedora為例,詳解如何優化這些服務。
1. 後台進程是如何啟動的?
簡單說說:Linux有多種啟動級別。可通過查看/etc/inittab中的這一行
id:3:initdefault:
來得知自己的Linux的啟動級別。
級別3不啟動X window及其相關的服務。適合做為服務器。
級別3的後台服務啟動程序都放在/etc/rc3.d/下。S開頭的腳本表示開機時啟動,K開頭表示關機時停止。
常用的級別還有5。以此類推。
實際上,這些腳本只是一些鏈接,鏈到/etc/init.d/下的相應腳本。
2. 每個服務都是干什麼的?
可以查看這些腳本的頭幾行,一般都有一個簡短的說明。比如S26acpid
# Description: Listen and dispatch ACPI events from the kernel
偵聽和分發內核中的ACPI事件。
下面說說如何優化這些進程:
1. ntp
我選ntp做為第一個例子。因為ntp是個挺重要的服務,但又不必作為進程在後台一直運行。
ntp是Linux下的時間服務程序。類似Windows下的時間設置中的一項:與Internet時間同步。有了ntp,我們再也不必經常去校正電腦中的時間,只要電腦連上Internet,ntp自動為我們校正時間。
相對於Windows, Linux下的ntp還有更多的功能,它可以把當前電腦也做為一個時間服務器,向其他電腦提供時間服務。不過這對於個人用戶來說沒啥用處。
那麼我們的想法是:不要啟動這個服務,但是每周校正一次時間就可以了。
做法很簡單:
在/etc/cron.weekly/下增加一個腳本ntpdate, 腳本內容為
#!/bin/sh
#adjust clock weekly.
#exec /usr/sbin/ntpdate pool.ntp.org
exec /usr/sbin/ntpd -q
exit 0
腳本說明:這個腳本列出兩個ntp命令,都可以用來校正時間。任意用其中的一個就可以了。根據ntp的文檔說明,ntpdate的方式會在將來棄用,轉為ntpd -q的方式。我試了一下,在較老的Linux下,如Mandriva 2006, ntpd -q的方式不行。
然後把腳本變成可執行的
# chmod u+x ntpdate
重啟crond
# /etc/init.d/crond restart
停止和刪除ntp服務
# /etc/init.d/ntpd stop
再看一下/etc/rc3.d或/etc/rc5.d下面有沒有S開頭的ntpd腳本。有的話就刪掉。這個做法看似比較暴力。“溫柔”一點的做法是運行setup或system-config-services,在圖形界面裡做。
最後注意一點,ntp用到udp端口123作為其通訊端口。防火牆放開這個端口後,ntp才能工作。
2. 其它cronjob的優化
默認啟動的cronjob根據啟動的時間,分別放在
cron.hourly
cron.daily
cron.weekly
cron.monthly
其中有些cronjob用不著做得太頻繁。雖然這些任務都是在凌晨4點左右運行的,但是也浪費呀,浪費硬盤,浪費電力...
下面一一列出:
makewhatis.cron 這個任務是生成或更新whatis數據庫。在操作系統沒有經常安裝卸載軟件的情況下,用不著每天都做一次。
mlocate.cron 這個任務是生成或更新locate數據庫。道理同上。
rpm 這個任務是列出系統安裝的rpm包,寫到一個文件裡。道理同上。
prelink 這個任務是把操作系統裡的應用程序和動態庫“預鏈接”,加快啟動這些應用的速度。用不著每天都做,一周一次就可以了。
可以再建一個cron.manual目錄,把不想定時運行的任務移到這個目錄下。想起來運行的時候,手工運行一下即可。
下面是本人機器上的例子:
[root@home etc]# ls cron*
cron.deny crontab
cron.d:
cron.daily:
00webalizer 0anacron 0logwatch certwatch cups logrotate
cron.hourly:
mcelog.cron
cron.manual:
makewhatis.cron mlocate.cron rpm
cron.monthly:
0anacron
cron.weekly:
0anacron 99-raid-check ntpdate prelink