E4rat (简体中文)

From ArchWiki
Jump to: navigation, search
翻译状态: 本文是英文页面 E4rat翻译,最后翻译时间:2012-07-11,点击这里可以查看翻译后英文页面的改动。

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 可能会有效。

Note: e4rat 官方手册 声称 ureadahead 与 e4rat 冲突,在 Ubuntu 中确实这样,但是 Arch 中并无冲突,但有 ureadahead 的情况下,速度提升效果有限。

为保险起见,请及时备份数据。

安装

安装位于官方软件仓库e4ratAUR.

配置

现在进入正题。

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中文件的多少,或长或短要等一段时间。

Note: 使用纯 systemd 的用户不需要修改 runlevels,用 root 登陆后执行 e4rat-collect 即可。

e4rat-preload

永久性地,添加如下内容到/boot/grub/grub.cfg(grub)启动项的linux行末尾,或/boot/grub/menu.lst(grub2)启动项的kernel行:

init=/sbin/e4rat-preload
Note: 如果你正在使用grub2,内核参数最好添加到/etc/default/grub - GRUB_CMDLINE_LINUX="..."

另一选择:e4rat-preload-lite

论坛用户jlindgren提供了一个优化版本的preload程序,也许能帮你节约几秒的开机时间:

优化之处在于:

  • 启动/sbin/init前,只预读前100个文件(inode和文件内容),启动/sbin/init后再并行地预读其他文件。

AUR中安装该工具(译者注,不要卸载e4rat,该包只提供preload):e4rat-preload-liteAUR[broken link: archived in aur-mirror]

添加(或替换)如下内容到/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.cfgmenu.lst的启动菜单项即可:

init=/sbin/bootchartd bootchart_init=/sbin/e4rat-preload

该版本bootchart会在登陆管理器启动后停止监视。

bootchart2

添加如下内容到grub.cfgmenu.lst的启动菜单项:

init=/sbin/bootchartd

然后,手动修改/sbin/bootchartdinit="/sbin/init"这一行为init="/sbin/e4rat-preload。(译者注:虽然程序说明上说,应该通过添加启动参数设置init,但我试了,不行。)

/etc/bootchartd.confEXIT_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设置loglevel31获取详细调试信息。

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。