E4rat
e4rat,「Ext4 - Reducing Access Times」(減少ext4訪問次數)之略,是一款優化ext4文件系統、加速系統啟動的工具。該項目由 Andreas Rid 和 Gundolf Kiefer 發起。e4rat工具系列包含e4rat-collect、e4rat-realloc、e4rat-preload。
目前最新版本是0.21。
機制[編輯 | 編輯原始碼]
如果你用bootchart監視開機過程,會發現CPU和磁碟均未全速運轉。e4rat將改變這一狀況,使系統啟動時CPU和磁碟全速運轉,從而加速啟動過程。此優化包括三步:
- e4rat-collect - 收集文件,在特定時間(默認120s,可調整)內收集文件信息
- e4rat-realloc - 文件再分配,在磁碟上整理文件
- e4rat-preload - 預讀取文件
對誰有效?[編輯 | 編輯原始碼]
經證實,e4rat對一般用戶——直接進入X圖形界面——特別有效,但對於伺服器用戶——啟動到命令行——效果不怎麼明顯。此外,此工具對SSD(固態磁碟)用戶也沒用,因為SSD基本沒有讀取延遲。Ureadahead 可能會有效。
為保險起見,請及時備份數據。
安裝[編輯 | 編輯原始碼]
配置[編輯 | 編輯原始碼]
現在進入正題。
e4rat-collect[編輯 | 編輯原始碼]
首先,e4rat需要收集開機時預讀的文件列表。添加如下內容到/boot/grub/menu.lst
(grub)啟動項的linux
行末尾,或/boot/grub/grub.cfg
(grub2)啟動項的kernel
行:
kernel /vmlinuz0linux root=/dev/disk/by-label/ARCH init=/sbin/e4rat-collect ro 5
)
由於該過程只需進行一次,所以我建議直接在grub命令行修改即可,而不必修改啟動菜單文件。
啟動後,e4rat-collect默認會監視系統120秒。所以請在兩分鐘內打開經常使用的程序,e4rat-collect會記錄下來(譯者註:我不建議預讀太多東西,這樣反而會拖慢開機速度)。可以在/etc/e4rat.conf
中修改默認的120秒收集時間(timeout 120
這一行,去掉注釋)。或者手動停止e4rat-collect:
e4rat-collect -k
或者:
pkill e4rat-collect
收集完成後,應該會出現這個文件:/var/lib/e4rat/startup.log
最後,不要忘記從/boot/grub/grub.cfg
或/boot/grub/menu.lst
中移除最開始添加的內容。
e4rat-realloc[編輯 | 編輯原始碼]
接著上一步進行文件再分配(通俗說就是磁碟整理)。先切換啟動級別1:
sudo init 1
輸入root密碼,執行:
e4rat-realloc /var/lib/e4rat/startup.log
根據startup.log
中文件的多少,或長或短要等一段時間。
e4rat-preload[編輯 | 編輯原始碼]
永久性地,添加如下內容到/boot/grub/grub.cfg
(grub)啟動項的linux
行末尾,或/boot/grub/menu.lst
(grub2)啟動項的kernel
行:
init=/sbin/e4rat-preload
/etc/default/grub
- GRUB_CMDLINE_LINUX="..."
另一選擇:e4rat-preload-lite[編輯 | 編輯原始碼]
論壇用戶jlindgren提供了一個優化版本的preload程序,也許能幫你節約幾秒的開機時間:
優化之處在於:
- 啟動
/sbin/init
前,只預讀前100個文件(inode和文件內容),啟動/sbin/init
後再並行地預讀其他文件。
從AUR中安裝該工具(譯者注,不要卸載e4rat,該包只提供preload):e4rat-preload-liteAUR[損壞的連結:package not found]
添加(或替換)如下內容到/boot/grub/grub.cfg
(grub)啟動項的linux
行末尾,或/boot/grub/menu.lst
(grub2)啟動項的kernel
行:
init=/usr/sbin/e4rat-preload-lite
重啟即可。
其他 init 程序搭配 e4rat[編輯 | 編輯原始碼]
e4rat-collect默認會使用/sbin/init
替換自己。如果使用其他init程序(比如 /bin/systemd
),修改/etc/e4rat.conf
中的init
參數,並去掉前面的分號(注釋)即可。
啟動流程圖[編輯 | 編輯原始碼]
通過bootchart繪製使用e4rat前後的啟動流程圖,可以直觀地看到巨大的優化。
bootchart 0.9-9[編輯 | 編輯原始碼]
添加如下內容到grub.cfg
或menu.lst
的啟動菜單項即可:
init=/sbin/bootchartd bootchart_init=/sbin/e4rat-preload
該版本bootchart會在登錄管理器啟動後停止監視。
bootchart2[編輯 | 編輯原始碼]
添加如下內容到grub.cfg
或menu.lst
的啟動菜單項:
init=/sbin/bootchartd
然後,手動修改/sbin/bootchartd
的init="/sbin/init"
這一行為init="/sbin/e4rat-preload
。(譯者註:雖然程序說明上說,應該通過添加啟動參數設置init,但我試了,不行。)
/etc/bootchartd.conf
的EXIT_PROC
中可以設置哪些程序啟動後停止監視:
EXIT_PROC="kdm_greet xterm konsole gnome-terminal metacity mutter compiz ldm icewm-session enlightenment"
留空的話,需要手動停止監視。
疑難解答[編輯 | 編輯原始碼]
如果出現問題,請參考以下內容。
startup.log 未創建[編輯 | 編輯原始碼]
- 在
/etc/rc.conf
注釋掉auditd
。 - 檢查下列命令的輸出:
dmesg | grep e4rat
- 在
/etc/e4rat.conf
設置loglevel
為31
獲取詳細調試信息。
e4rat 錯誤地報告文件系統為 ext2[編輯 | 編輯原始碼]
- 添加如下內容到
/boot/grub/grub.cfg
啟動項的linux
行末尾,或/boot/grub/menu.lst
啟動項的kernel
行末尾:
rootfstype=ext4
無法讀取 startup.log[編輯 | 編輯原始碼]
- 這說明你的
/var
和根目錄不在同一分區,因而開機時為掛載。可以修改startup.log
文件位置(比如{ic|/etc/startup.log}}),方法是修改/etc/e4rat.conf
:
startup_log_file /etc/e4rat/startup.log
減少啟動時的信息輸出[編輯 | 編輯原始碼]
在 /etc/e4rat.conf
中將 loglevel
減小到 1。