MAC的睡眠模式介绍
因为之前用的是网上流传的土法来禁止生成 sleepimage,尝到了苦头,而且2次!
大家知道 OSX 有几种睡眠模式,其中 hibernatemode 可以是 0 (传统睡眠方式,不生成 sleepimage 文件),3 和 25 (Apple 称之安全睡眠方式,会生成 sleepimage 文件),大家也都知道可以用 sudo pmset -a hibernatemode 0 来禁止那个内存镜像文件。
以前这个命令一直可用,直到 OS X Mountain Lion v10.8.2,大家突然发现这个命令不起作用了,重启电脑或者睡眠一段时间后,那个 sleepimage 又回来了。换句话说,某些型号的 mac,似乎强制使用安全睡眠方式。
然后网上就有各种土法,粗暴之极,诸如建立一个只读的空文件,或者用 sudo ln -s /dev/null /var/vm/sleepimage 把内存镜像引入系统黑洞。这些土法,一般用用大概没什么问题,就算有问题,你大概也不会太在意,譬如程序崩溃,大不了重新启动好了。
我之前就是用 /dev/null 这个方法,然后我2次系统升级都出问题,2个月前 10.9.2 升级到 10.9.3 时,以及昨天 10.9.3 升级到 10.9.4 时,升级安装界面2次都停留在同一个地方,说还有几分钟就好了,然后,然后,就没有然后了,等了一个多小时,状态条动都不动。不得已强行关机。
因为我没弄其他任何所谓的系统调试东西,唯一运行过的 sudo 命令就是这个,所以怀疑是这个土法导致升级出错。
然后就觉得要花点时间弄明白 OSX 的睡眠方式,如果真不能禁止 sleepimage,死也要死得明白。
以下是我的理解,绝对不同于各大中文 Mac 网站抄来抄去的那些东西。欢迎探讨。
OSX 的睡眠参数,可以打 pmset -g 了解一下你的电脑处在什么睡眠模式下:
比较有兴趣的参数:
standbydelay 10800
standby 0
autopoweroffdelay 14400
autopoweroff 0
hibernatemode 0
这几个参数组成了 OSX 的睡眠模式。
当睡眠开始时,合上盖子,或者按电源键,如果你的 hibernatemode 是 0,OSX 是不立即往硬盘上写内存镜像的。
autopoweroff 这是欧盟的节能要求,满足以下条件时:
- 接电源
- 没有外接设备
- 没有网络活动
- 电脑是 MacBook Pro (Mid 2012 and later), MacBook Pro (Retina, Mid 2012 and later), MacBook Air (Mid 2012 and later), iMac (Late 2012 and later), Mac mini (Late 2012 and later)
到了 autopoweroffdelay x 秒后,就开始启动安全睡眠模式,往硬盘上写 sleepimage,然后进入深度睡眠。
standby 满足以下条件时:
- 用电池
- 没有外接设备
- 没有网络活动
- 没有外接显示器
- 电脑是 MacBook Pro (Retina, 13-inch, Late 2012) and later, MacBook Pro (Retina, 15-inch, Early 2013) and later, MacBook Pro (Retina, Mid 2012), MacBook Air (Mid 2010) and later, SSD and Fusion drive versions of Mac mini (Late 2012) and later, SSD and Fusion drive versions of iMac (Late 2012) and later
到了 standbydelay x 秒后,就开始启动安全睡眠模式,往硬盘上写 sleepimage,然后进入深度睡眠。
可见,Apple 的安全睡眠其实是个统称,具体是由2个参数激发的,这2个参数都可以在普通睡眠一段时间后让电脑进入深度睡眠状态,但是作用的条件不相同,基本上一个是接电源时用,一个是用电池时用。
这也说明了为什么有人抱怨为什么在设置了 hibernatemode 0 后,睡眠了一段时间后,那个 sleepimage 文件又出现了,而有人说没有。这取决于他们各自睡眠的时间以及延迟时间的设定,合上又马上打开,那个文件是不会立即生成的。
所以,要完全的,合法的禁止 sleepimage 文件,不但要设置 hibernatemode 0,还要禁止电源和电池情况下的节能设置。
也就是说,你要跑下面的命令才行:
sudo pmset -a hibernatemode 0
sudo pmset -a autopoweroff 0
sudo pmset -a standby 0
sudo rm /var/vm/sleepimage
然后不管你怎么重启,睡眠n久,都不会再生成内存镜像文件了,当然你的电脑就无法再进入深度睡眠模式,Apple 官方说电池待机能力可能会稍稍降低,但我看也未必,普通睡眠状态下电压已经非常小了。
如果不在乎硬盘空间的,或许不用管它,用 0 即可,也就是普通睡眠了几个小时后才往硬盘写内存镜像文件,再进入深度睡眠。
如果你也不在乎经常读写硬盘的,或者懒得折腾任何东西的,也可以用缺省模式,对笔记本来说是 3,也就是睡眠后马上就写内存镜像文件,再在几个小时后进入深度睡眠。
怎么知道电脑进入了深度睡眠?就是唤醒时看到灰屏,和载入进度条。
OSX 的深度睡眠看起来还是不错的,有机会可以跟人卖弄一下,它的深度睡眠,可以待机 1 个月。当然如果真的有人这么做,那这人肯定是缺心眼的了。
—————————
为了方便部分锋友,先科普下Mac的睡眠模式,老鸟请自觉跳过…………
睡眠模式—hibernatemode—也就是Mac在睡眠模式下面的工作方式,目前主要有3种。
hibernatemode 0:睡眠时内存保持供电,其他部件断电,内存数据不写入硬盘。优点是可以快速唤醒、快速睡眠,因为内存保持供电,无论是唤醒还是进入睡眠都是1秒内的事情;节省SSD空间和寿命,因为内存数据不写入硬盘,所以硬盘里不会有内存镜像,也不会缩短SSD寿命。但是如果在睡眠的过程中电池没电的话,Mac会丢失所有内存种的数据,数据安全性不是很高。
hibernatemode 1:睡眠时内存数据写入硬盘,写入完成后电脑所有部件都断电,唤醒时从硬盘读出内存镜像。优点是省电,跟关机的耗电一样,因为所有部件都已经停止工作,也不怕电池没电会丢失内存数据。但是缺点也很明显,进入睡眠和唤醒需要的时间长,对于机械硬盘的Mac尤其明显,通常都要转菊花十几圈。对于SSD的Mac则会占用硬盘空间,因为硬盘上有跟内存同样大小的内存镜像,也会缩短SSD寿命。
hibernatemode 3:0和1的结合,睡眠时内存数据写入硬盘,同时保持内存供电。这个模式也叫Safe Sleep,是Mac的默认睡眠模式。
因为Air的SSD只有256G,而且SSD寿命也有限,每睡眠一次都要往SSD写入8G的数据还是挺吓人的,所以LZ还是建议用SSD的锋友都选择hibernatemode 0(除非你对数据安全性要求特别高)。
更改hibernatemode很简单,打开“终端”,输入: sudo pmset -a hibernatemode 0 |
然后输入密码,注意输入密码的过程中不会显示*。 |
然后到/var/vm去把sleepimage删掉。再随便找一个体积比较小的文档把文件名改成sleepimage,没有后缀名的哦。放到/var/vm里,再按command+i打开简介,勾上“已锁定”。按理说,只要hibernatemode改成0,然后把sleepimage删掉,那么sleepimage就永远都不会出现了。但是不知道为什么,LZ每次删掉后它都会重新出现,所以就想出这么一个招去对付它。 |
LZ遇到的问题可能是因为手动更改hibernatemode后跟系统原有的其他电源设置有冲突,所以无法进入睡眠模式导致耗电巨大 |
也有可能是因为系统睡眠一段时间后自动进入休眠,而休眠也需要写入内存镜像,但是sleepimage又被锁住了,所以就无法休眠,Mac就一直处于工作状态,尝试写入内存镜像,导致睡眠一晚上耗电巨大。 |
我们也可以关掉自动休眠,后面会说到。
这样就把睡眠模式改成0了,同时也释放了内存镜像占用的SSD空间。
如果改了睡眠模式之后你没有遇到跟LZ一样的问题,那么恭喜你,你不用往下看了。
但是如果你很悲剧,RP不好,遇到跟LZ一样的睡眠耗电问题,那么也恭喜你,因为LZ已经找到办法解决了,请继续往下看。
既然是因为手动修改睡眠模式后跟系统的其他电源设置冲突,或者因为sleepimage锁定,造成Mac无法进入睡眠模式,那么我们把互相冲突的设置改成不冲突就行了。
首先,看看系统的电源设置都是些什么
在终端输入:pmset -g custom 这个命令可以显示系统所有的电源设置,如下图
Battery Power就是用电池时的电源设置,AC Power就是外接电源时的电源设置。
这里也可确认下你成功更改hibernatemode没有,后面那个数字就是睡眠模式了。
简单介绍下pmset下面各个参数的含义,不同型号的Mac看到的参数会不一样,LZ这个是2013款13寸高配Air,更详细的介绍请看Apple开发者文档
lidwake: 当屏幕掀开的时候唤醒Mac,1是开启 0是关闭
autopoweroff: 如果Mac处于睡眠状态经过指定的时间后,自动把内存数据写入硬盘,并切断所有部件的电源,进入休眠状态,1是开启 0是关闭。但是LZ发现就算是处于开启状态,这个功能也并没有起作用,你可以不管它,也可以关掉
autopoweroffdelay:启用autopoweroff功能的时间,也就是上面说的那个“指定的时间”,单位是秒
standby:功能跟autopoweroff一样,不过仅在hibernatemode为3的时候起作用,1是开启 0是关闭。不过LZ一直没搞明白autopoweroff跟standby有什么不一样,按理说应该是不一样的
standbydelay:启用standby功能的时间,单位也是秒
ttyskeepawake:远程用户正在活动时防止Mac进入睡眠,1是开启 0是关闭
hibernatemode:睡眠模式
darkwakes:这个就是Power Nap,你可以在系统偏好设置里选择开或关,跟在这里设置是一样的,1是开启 0是关闭
hibernatefile:内存镜像存放的地址,这个也可以更改,不过路径必需是root下的路径
displaysleep:Mac闲置多长时间后进入显示器睡眠,2013款Air的系统偏好设置里已经没有这个选项了,Pro是有的,不过其实你可以通过pmset来修改。单位是分钟,这个时间不能长于sleep下设置的时间
sleep:Mac闲置多长时间后进入睡眠,这个系统偏好设置里也有,单位是分钟
acwake:电源改变时唤醒,也就是插上或者拔掉外置电源时唤醒Mac,1是开启 0是关闭
halfdim:显示器睡眠时使显示器亮度改变为当前亮度的一半,1是开启 0是关闭。如果关闭这个功能的话,显示器睡眠会直接关掉显示器。
lessbright:使用电池时使显示器亮度暗一点,系统偏好设置里也有这个,1是开启 0是关闭
disksleep:Mac闲置多长时间后关闭硬盘。这个系统偏好里也有,只不过换了一个字眼—如果可能,使硬盘进入睡眠—勾上这个的话系统就会自动根据sleep的时间设一个合适的时间。单位是秒,这个时间不能长于sleep下设置的时间
sleepservice:LZ还没搞清楚这个是干嘛的,请知道的锋友解释下。
womp:网络远程唤醒,1是开启 0是关闭
networksleep:这个设置影响Mac在睡眠的过程中如何提供网络共享服务,LZ也不太清楚是什么,最好就不要动。
不同的Mac的pmset项目会不一样,例如MD101就没有darkwakes这一项,这篇帖子里LZ用的是2013款Air为例子。你可以在终端输入pmset -g cap查看当前电源下Mac支持的电源设置项。
上面说了那么多,各位锋友应该也猜到怎么解决Air睡眠耗电、无法唤醒、无法睡眠之类的问题了吧,关键是autopoweroff standby sleep disksleep displaysleep这几项。
首先,时间设置上,应该是sleep>=disksleep>=displaysleep,例如分别设置为15 15 10,否则就可能出问题 |
然后autopoweroff standby建议关闭,或者设置一个比默认更长的时间,让Mac不可能有机会进入自动休眠,就可以防止睡眠经过几个小时就自动进入休眠需要写入sleepimage,但是又因为锁定无法写入,消耗电量。 |
当然,如果你没有动sleepimage,或者需要这项功能的话,你可以不用关闭autopoweroff和standby。 |
这样应该就可以解决Air睡眠遇到的问题了 |
要更改某一项设置的话也很简单,打开终端,按下面的格式输入命令:
sudo pmset -# $ &
其中#号有4个参数,分别是:c b u a,作用是表明这个命令修改的是哪个电源设置下的参数。c代表外接电源、b代表电池、u代表UPS、a代表所有电源。
$就是具体的某一项参数,例如你想修改睡眠模式,那就是hibernatemode;修改睡眠闲置时间,是sleep。
&是参数的值
例如你想修改外接电源是Mac的显示器睡眠闲置时间为10分钟,那就输入:
sudo pmset -c displaysleep 10
想修更改所有电源下的硬盘睡眠闲置时间为15分钟,那就是:
sudo pmset -a disksleep 15
明白了吧,其实上面说了一大堆,到头来是非常简单的事。如果不清楚该设置成什么参数,可以参考图中LZ自己设置的数值。
最后提醒一句,更改系统底层设置有风险,LZ仅在2013款13寸Air顶配和2012款13寸普屏MacBook Pro MD101上测试过以上内容,其他型号的Mac如果按此帖更改电源设置,请做好数据备份,遇到任何问题LZ均不负责,后果自负!!
欢迎转载此贴,如需转载无需告知LZ,但请在转载中注明原帖地址和作者,谢谢!