(原发于北邮 bbs/bupt.org linux 版面和本人blog)
感冒了,头晕,热,睡不着,起来灌水
前两天偶然注意到了这个: uswsusp 这是利用了 2.6.17-rc2 以来的 kernel 新特性所开发的 userland 的挂起系统的工具。
拜 2.6 的 initramfs 机制所赐,很多原来在 user space 不敢想的事情都可以在 user space 完成了,这也是内核减负的一个不错的出路,毕竟如 bootsplash 这样的东东都在内核里对内核的代码质量也是个威胁,呵呵。
首先一个问题是为什么要在 user space 做挂起系统这样的事情,kernel 的挂起机制不论是挂起到内存还是挂起到硬盘都工作非常良好,更有 swsusp2,还可以支持在挂起的时候对 snapshot 进行压缩等处理。这个问题有这么几个答案:
- 内核的挂起到硬盘机制不够灵活,而借助于 userland 的程序,可以对数据进行各种压缩和加密等操作,而不会增加过多内核代码,维持了内核的简洁。功能过多导致的代码量和代码成熟度问题可能也是阻挡 swsusp 进入 mainline kernel 的一个原因
- 内核的挂起到硬盘和挂起到内存是彼此独立的,而借助内核接口和 userland 程序,这两者可以拥有统一的操作方式 --- 同时把系统镜像保存在内存和硬盘之中,如此,一般情况下可以直接恢复内存镜像,速度很快,而当内存镜像无法使用的时候,比如意外掉电,也可以从硬盘镜像恢复系统,无须担心。当然,这一切同样不会给内核增加负担。
- 和其他程序结合,还可以利用 initramfs 采用 splash 等界面,让系统挂起和恢复更漂亮一点。
关于具体机制,uswsusp 利用了系统提供的一个设备文件,通过操作文件,可以 freeze 系统中的进程、读取/恢复内存的镜像、挂起等,具体请参考内核文档 Documentation/power/userland-suspend.txt
具体的 userland 工具目前可用的是 http://suspend.sourceforge.net 提供的 uswsusp,命令有 s2disk, s2ram, s2both,分别对应于挂起到硬盘、内存和上面说的两个都挂
这个工具需要 initramfs 支持,需要 2.6.17-rc2 以上内核
和 splashy 工具配合,可以提供 bootsplash
uswsusp 和 splashy 都在 debian 软件仓库里可以直接获取