关于Mac的Safe Sleep和Hibernate

据说Apple早在2005年10月发布Mac OS X 10.4.3的时候就已经加入了safe sleep这个功能,但是GUI界面上却至今始终对用户透明,用户在不装任何3rd party tools的情况下永远只能看到sleep而没有hiberate之类的选项。

但是此sleep又并非完全等同于我们平时常说的”suspend to RAM”(2005.10之前可能相同),它背后其实也做了”suspend to disk”,也就是PC上的hibernate的工作,实为明修栈道,暗渡陈仓。

这样做的好处也成了后来Apple命名此技术的offical name —— “safe sleep”,因为它解决了单纯”suspend to RAM”下电源耗完或故障导致的RAM信息丢失问题:其会在电源不足的情况下自动切换到”suspend to disk”,着实”smart and safe”。

但有趣的是,苹果似乎从来没有高调宣布过这项当时可能不新不revolutionary但确实对用户而言很实用的功能,for some “unknown” reason。

在大多数的情况下,用户可能并不会察觉这背后的不同,事实上我觉得Apple要不是考虑到了切换到”suspend to disk”后restore回来用户会等很久的user experience问题,而加入了这个progress bar, 很少真的会有用户察觉。

到了10.5,safe sleep似乎终于有了offcial的解释,但是总感觉好像简单了点,不知道你和我是否感觉一样,低调么也不带这样的…

系统早就有这个capability,但4年多后的今天普通用户却还是要很麻烦的来使用,Apple提供了一个命令行工具pmset来帮助用户进行power management,其中很多选项在”System Preferences… -> Energy Saver”里面都能找到对应,但是却偏偏没有关于hibernate mode的。

相应的信息如果不联网的话需要在命令行下用man pmset查看,可以看到pmset可以设置autorestart等10多个参数,与hibernate有关的有两个参数分别叫hibernatemode和hibernatefile,你会有趣的发现只有这两个参数后面跟了句”Please use caution.”,这是不是让你联想到了什么?

========================== 历史,背景以及浮想联翩的分界线 ==========================

下面我们来看看究竟怎么在Mac上hibernate,底下是man pmset里关于hibernatemode参数设置的描述:

hibernatemode takes a bitfield argument defining SafeSleep behavior.
Passing 0 disables SafeSleep altogether, forcing the computer into a reg-
ular sleep.

0001 (bit 0) enables hibernation; causes OS X to write memory state to
hibernation image at sleep time. On wake (without bit 1 set) OS X will
resume from the hibernation image. Bit 0 set (without bit 1 set) causes
OS X to write memory state and immediately hibernate at sleep time.

0010 (bit 1), in conjunction with bit 0, causes OS X to maintain system
state in memory and leave system power on until battery level drops below
a near empty threshold (This enables quicker wakeup from memory while
battery power is available). Upon nearly emptying the battery, OS X shuts
off all system power and hibernates; on wake the system will resume from
hibernation image, not from memory.

hibernatemode is set to 3 (binary 0011) by default on supported porta-
bles.

hibernatemode is set to 0 (binary 0000) by default on supported desktops.

Please note that hibernatefile may only point to a file located on the
root volume.

可以看到portables默认的模式就是所谓的safe sleep(hibernatemode = 3)。

修改之前先查看一下当前系统使用的hibernate相关参数设置,我没有修改过(事实上之前都不知道怎么修改),应该就是默认的配置:

$ pmset -g | grep hibernate
 hibernatefile  /var/vm/sleepimage
 hibernatemode  3
$ ls -lh /var/vm/sleepimage
-rw------T  1 root  wheel   2.0G Feb 23 10:09 /var/vm/sleepimage

设置系统使用hibernate模式(hibernatemode = 0001)进行sleep:

$ sudo pmset -a hibernatemode 1

这时如果再按普通方式sleep的时候mac就会hibernate了,想要切换回safe sleep只要把hibernatemode修改回来就行了:

$ sudo pmset -a hibernatemode 3

如果不喜欢命令行操作,可以使用第三方工具,实现机制应该是一样的,我所知道的有smartsleepdeep sleep这两个,不过我都还没有测试过。

历史上的今天:

Related posts:

Got something to say? Go for it!

使用新浪微博登陆