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。