//官方安装使用方法http://www.howtogeek.com/69753/how-to-cut-your-linux-pcs-boot-time-in-half-with-e4rat/
//使用bootchart工具生成开机启动图帮助分析
e4rat是一个加速Linux启动时间的专门工具,来减少ext4的访问次数,存在于linux内核2.6.31版本以上的,也就是说目前方德的所有系统都可以用。需要同时停用功能类似的服务ureadahead(ububtu-minimal,readahead-fedora依赖于它),以免冲突。
内核环境要求: Enable auditing support //我们现在的系统默认都支持。-> General setup
[*] Auditing support
[*] Enable system-call auditing support
起作用情况:经证实,e4rat对一般用户——直接进入X图形界面——特别有效(也就是说对应用程序效果显著),但对于服务器用户——启动到命令行——效果不怎么明显。对除原生ext4外的其他文件系统没用,此外,此工具对SSD用户也没用,因为SSD基本没有读取延迟,Ureadahead 可能会有效.e4rat还有可能损坏固态硬盘的数据(已验证)。因为e4rat原理是设置一段时间并搜集该时间段内的磁盘信息并重排, 也可用于其他耗时过程,比如数据库、服务器等。
原理简述:对于一般的机械硬盘来讲,将需要顺序载入的文件在硬盘上按照顺序存储可以大大减少寻道时间和旋转延迟,e4rat 利用 2.6.31 内核的引入的 EXT4_IOC_MOVE_EXT 在线碎片整理功能(XFS \ext4 只有这两种文件系统支持在线碎片整理),来完成并行化载入。顺序读取和高缓存命中的结合使用将可以将系统启动时间缩短至原先的三分之一。
系统架构:
e4rat-collect - 收集文件,在特定时间(默认120s,可调整)内收集文件信息
e4rat-realloc - 文件再分配,在磁盘上整理文件
e4rat-preload - 预读取文件
shell控制过程:参见man
配置:
1.如果使用的不是 /sbin/init 的初始化程序的话(比如 upstart 和 systemd),请配置 /etc/e4rat.conf;
2.设置 init=/sbin/e4rat-collect 初始化进程,收集系统启动情况,写入到 /var/lib/e4rat/startup.log 文件中(仅需一次);
3.依据 /var/lib/e4rat/startup.log 中的内容,在 single 用户模式下重新排序文件位置 e4rat-realloc /var/lib/e4rat/startup.log;
4.将 init=/sbin/e4rat-preload 永久性的加入 GRUB 的内核引导行中。
实际工作过程:
1、在/etc/rc.local里添加代码判断grub cmdline中e4rat状态,如果我e4rat是第一次运行(显示“init=e4rat-collect”字眼[可通过做盘脚本设置]),则收集设定时间内的系统行为信息并重排,并将grub cmdline中改为 init=e4rat-preload.
2、下次开机,在/etc/rc.local中判断grub cmdline中应为 init=e4rat-preload,如果是,对记录的行为在物理盘上顺序执行注:前两个行为只需一次,,所以做iso盘的时候把这个过程放到grub下了,不然要重启很多次才生效,现在装系统后的第二次启动就生效了。
SSD硬盘登录系统后立即重启高概率出现系统卡死情况在安装脚本中检查磁盘类型,如果是hdd则安装cdos-e4rat包,如果是ssd则不安装。ubiquity-2.14.8/d-i/source/grub-installer/grub-installer
+#yinglong 2016.7.27,install e4rat while hdd && not ssd |
+#disktype |
+#0 ssd |
+#1 hdd |
+disk_name_splide="$(echo "$bootdev" | sed 's,/dev/\([a-z]\+\).*,\1,')" |
+disk_type=`cat /sys/block/${disk_name_splide}/queue/rotational` |
+if [ $disk_type -eq 1 ]; then |
+ echo "Disk /dev/${disk_name_splide} is hdd, install e4rat." |
+ chroot /target /bin/bash -c "dpkg -i /usr/local/e4rat/cdos-e4rat_1.0.0.1nfs1_i386.deb" |
+elif [ $disk_type -eq 0 ]; then |
+ echo "Disk /dev/${disk_name_splide} is ssd, do not install e4rat." |
+else |
+ echo "Disk /dev/${disk_name_splide} is unknown, do not install e4rat." |
+fi |