Intel Rapid Start 是 Intel 公司研发的一种帮助笔记本电脑节省电源和快速恢复的技术,与传统的睡眠(Sleep)和休眠(Hibernate)有一定的区别,相较而言,与混合睡眠(Hybrid Sleep)倒是有一些相似的地方。Intel 说,这技术首先要主板支持,其次要有 SSD,***要有 Windows。但其实 SSD 和 Windows 都不是必须的。昨天,我就在 HDD + Linux 的组合里成功地使用了 Intel Rapid Start。
一、Intel Rapid Start 原理
其实 Intel Rapid Start 的原理很简单,就是让计算机在传统的睡眠(Sleep)的基础上有机会进入更深层的睡眠(Deep Sleep),用户可以通过 BIOS 设置一个超时,比如一分钟、十分钟、半个小时等(也可以设置「立即」),当计算机进入睡眠状态之后,计时开始,如果用户在计时到达之前唤醒了计算机,那就啥也没发生,如果预定时间达到,则计算机会被浅唤醒(wake up briefly),将内存中的数据写入硬盘(官方文档指 SSD)中的一个特定分区,然后彻底断电。在这之后,用户只能通过按电源键的方式开机,主板固件会把特定分区中的内容读回内存,然后计算机就可以继续使用了。
总结一下,Intel Rapid Start 技术(IRST)的前半段与普通的睡眠是一样的,而后半段则与休眠(Hibernate)类似,但是休眠是由操作系统完成的,而 IRST 则是由主板固件(BIOS 或 UEFI)去完成这一操作,也就是说,在加电自检(POST)之后,直接就是从硬盘中读取内容的过程了,根本没有引导器(Boot loader)和操作系统的加载过程,因此比操作系统级别的休眠要快不少,再加上 SSD 的应用,就更加快了,这就是 Intel 所宣称的「六秒恢复」。按照我的理解,就是恢复速度和睡眠一样快,但是耗电和休眠一样低(零耗电)。
Intel 的官方文档提到该技术需要 SSD + Windows,可是我没看出其中的必要性:SSD 是为了加速,如果用 HDD 代替的话除了慢点也没啥问题,而 Windows 呢?令人兴奋的是,2013年6月的时候,Linux 开发者 Matthew Garrett 就提交了一个内核补丁,实现了 Linux 内核对此的支持。该补丁已在 Linux 3.11 中得到了应用,而截至我写这篇文章时,***的 Linux 内核版本已经是 3.12.6 了,显然可以使用。
二、调整分区
我的计算机是 ThinkPad X240s,该型号内部有一个 SATA 和两个 NGFF 接口,后者是 Intel 推的新接口,可以用来接蓝牙、3G 等模块,也可以用来接 NGFF 接口的 SSD。最理想的配置应该是 SATA 接口用来接 HDD 而 NGFF 用来接 SSD,这样的版本是已经配置好 Intel Rapid Start 的。我的这个版本 SATA 接口上接了一块 500GB 7200 转的机械硬盘,一个 NGFF 接了 WiFi + 蓝牙,另一个 NGFF 是空的。也就是说,没有 SSD,自然默认也没得用 Intel Rapid Start。但除了淘宝一块小而贵的 NGFF SSD 之外没有别的方法了吗?当然不是。仔细阅读 Intel Rapid Start 的用户手册就会发现,它提到主板固件是通过分区标识符来找寻 IRST 分区的,对于 GPT,是 D3BFE2DE-3DAF-11DF-BA-40-E3A556D89593,对于 MBR 则是 0x84。
调整前我的分区结构是这样的:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465,8G 0 disk ├─sda1 8:1 0 2M 0 part ├─sda2 8:2 0 200M 0 part /boot ├─sda3 8:3 0 50G 0 part │ └─crypt-sda3 254:0 0 50G 0 crypt / └──sda4 8:4 0 415,6G 0 part └─crypt-sda4 254:1 0 415,6G 0 crypt /home
整块硬盘 465 GiB 使用 GPT 分为四个区,开头 2 MiB 用来存放 GRUB,之后 200 MiB 是 /boot,然后是 50 GiB 和 /,***剩下的 415.6 GiB 用作 /home。其中 sda3 和 sda4 都是 LUKS 容器。我的目的是要把 sda4 调整为 400 GiB,然后把剩下的 15.6 GiB 划为 sda5,作为 IRST 分区。
由于 sda4 是 GPT + LUKS + ext4 三层嵌套结构,所以需要一层一层地缩小它们,然后再一层一层地撑大它们到合适的位置。
# 把 /home 卸载 umount /home # 调整文件系统前必须要先检查文件系统 e2fsck -f /dev/mapper/crypt-sda4 # 缩小文件系统至 398 GiB resize2fs -p /dev/mapper/crypt-sda4 398G # 缩小 LUKS 容器至 399 GiB # 换算成 512 KiB 的区块是 399 * 1024 * 1024 * 2 = 836763648 cryptsetup resize crypt-sda4 836763648 # 将 sda4 分区调整为 400 GiB # 并用剩余的空间建立 sda5 # 建立的时候分区标识符输入 8400 gdisk /dev/sda # 重启计算机使内核使用新的分区表 reboot # 再次卸载 /home umount /home # 放大 LUKS 容器撑满 sda4 cryptsetup resize crypt-sda4 # 检查文件系统 e2fsck -f /dev/mapper/crypt-sda4 # 放大文件系统至撑满 LUKS 容器 resize2fs -p /dev/mapper/crypt-sda4 # 挂载测试 mount /dev/mapper/crypt-sda4 /home
调整完成后,就是这样的效果了:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465,8G 0 disk ├─sda1 8:1 0 2M 0 part ├─sda2 8:2 0 200M 0 part /boot ├─sda3 8:3 0 50G 0 part │ └─crypt-sda3 254:0 0 50G 0 crypt / ├─sda4 8:4 0 400G 0 part │ └─crypt-sda4 254:1 0 400G 0 crypt /home └─sda5 8:5 0 15,6G 0 part Number Start (sector) End (sector) Size Code Name 1 2048 6143 2.0 MiB EF02 BIOS boot partition 2 6144 415743 200.0 MiB 8300 Linux filesystem 3 415744 105273343 50.0 GiB 8300 LUKS partition 4 105273344 944134143 400.0 GiB 8300 LUKS partition 5 944134144 976773134 15.6 GiB 8400 Intel Rapid Start
三、设置主板固件(BIOS/UEFI)
这一步视不同的制造商自有不同,但主旨就是找到 BIOS/UEFI 中有关 Intel Rapid Start 的设置,将之开启。在完成以上步骤之前,这一选项是不可开启的状态,会提示没有找到合适的存储设备,但是在完成了上述步骤之后,固件就会根据 GUID 找到 IRST 分区,从而允许开启这一功能。至于多久后启用,就是个人爱好了,我选择的是「立即」,也就是相当于用 IRST 代替了睡眠(Sleep)功能。
四、测试
为了测试效果明显,可以先用 dd_rescue 把 sda5 清空一下:dd_rescue /dev/zero /dev/sda5。可以用诸如 head -c 1G /dev/sda5 之类的命令检验一下。
准备完成之后开始测试:echo -n mem > /sys/power/state 将系统挂起至内存(S3,睡眠)→系统顺利睡眠→系统被短暂唤醒并将内存中的内容写入 IRST 分区,此时如果仔细听可以听到机械硬盘写入的声音→写入完成,系统断电停机。
断电停机之后,用户只能通过按电源键把计算机唤醒。按下电源键后可观察到 BIOS/UEFI 上显示类似 Resuming from deep sleep ... 字样,说明这一恢复过程是由固件完成的,与操作系统无关。恢复完成后,直接回复到进入睡眠之前的样子。此时使用 head /dev/sda5 可观察到大量输出,说明 sda5 的确被写入了。
至此 IRST 部署成功。
五、扩展阅读