在Linux操作系统下能够实现待机和休眠功能么?

在Linux操作系统下能够实现待机和休眠功能么?

用过redhat和knoppix live cd linux,都没有待机和休眠功能,是不是现在的linux发行版本都不能够实现待机和休眠的功能呢?      
dannycat

实验系统一:
  主机:C4 1.7GHz,Abit BD7II(Intel 845D),ST40G IDE,nVidia TNT 2 Ultra

实验系统二:
  主机:P4 2.8CGHz(超线程),ONDA P5E-X(Intel 865PE),ST80G SATA,nVidia Geforce 4 MX440

系统均为:Gentoo 2004.2,gentoo-dev-sources-2.6.9-r1,使用 NPTL。
  gcc version 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)
注意 swap 分区大小最好大于内存总数,我一般设为内存的两倍:)

从 http://softwaresuspend.berlios.de/download.html 下载 software-suspend-2.1-for-2.6.9.tar.bz2,解压缩到 /tmp/software-suspend-2.1-for-2.6.9/ 下。
代码:
$ cd /usr/src/linux
$ /tmp/software-suspend-2.1-for-2.6.9/apply
Applying 201-ati-agp ...
Applying 202-ne2k ...
Applying 204-frame-buffer-class-support ...
.
.
.
Applying 830-blockwriter ...
Applying 831-swapwriter ...
Applying 832-checksumming ...
All happy!

$ make menuconfig

设置好其他选项,最好把 USB 等 hotplug 的支持选项设为<M> 模块,原因见下。
进入 Power management options (ACPI, APM) --->
里面多了一项:Software Suspend 2 --->
进入,
代码:
│ │       <*> Software Suspend 2                         │ │
│ │       --- Image Storage (you need at least one writer)         │ │
│ │       <*>   Swap Writer                             │ │
│ │       --- Page Transformers                           │ │
│ │       <*>   LZF image compression     <--推荐压缩模式       │ │
│ │       < >   GZIP image Compression                     │ │
│ │       --- User Interface Options                       │ │
│ │       <*>   Text mode console support                   │ │
│ │       --- General Options                           │ │
│ │       [ ]   Relaxed /proc/software_suspend permissions       │ │
│ │       ()   Default resume device name                   │ │
│ │       [ ]   Allow Keep Image Mode                     │ │
│ │       --- Debugging                               │ │
│ │       [ ]   Compile in debugging output                 │ │
│ │       < >   Compile checksum module                     │ │

“Text mode console support”可以显示一个休眠进度指示条的文本模式的“splash”,可选。
保存,编译
代码:
$ make
$ su
# make modules_install
# cp arch/i386/boot/bzImage /boot/kernel-2.6.9-gentoo-r1.nptl


修改启动命令行,加入参数“resume2=swap:/dev/hdax”(hdax是swap分区),我的是GRUB:
代码:
# vi /boot/grub/menu.lst
timeout 6
default 0

title Gentoo GNU/Linux (2.6.9-gentoo-r1.nptl)
    root (hd0,0)
    kernel /kernel-2.6.9-gentoo-r1.nptl root=/dev/hda2 resume2=swap:/dev/hda4 video=vesafb:mtrr,1024x768-16 vga=0x317

在实验系统二中是
代码:
    kernel /kernel-2.6.9-gentoo-r1smp.nptl root=/dev/sda2 resume2=swap:/dev/sda3 video=vesafb:mtrr,1024x768-16 vga=0x317


保存,重新启动系统……

登录,切换到 root 用户,试一下:
代码:
# sync && echo > /proc/software_suspend/activate
#
为安全起见,在休眠之前先执行 sync 同步一下硬盘:)


呵呵呵,硬盘灯一阵红红,键盘上的指示灯闪亮三次,然后,一切归于平静了~~

再开机,稍作等待…… 出现提示符
代码:
# sync && echo > /proc/software_suspend/activate
#

跟休眠前一模一样!(启用了 Text mode console support 的话会清屏)大功告成!

下载页上还有一个 hibernate,是一组命令行下运行的脚本,可以更好更安全地帮你做一些休眠之前的准备工作。极力推荐!
下载 hibernate-script-0.99.tar.gz ,
代码:
# tar -zxvf hibernate-script-0.99.tar.gz
# cd hibernate-script-0.99
# ./install.sh
Installing hibernate script to /usr/local/sbin/hibernate ...
Installing configuration files to /etc/hibernate ...
Installing scriptlets to /usr/local/share/hibernate/scriptlets.d ...
Installing man pages to /usr/local/man ...
Setting permissions on installed files ...
Installed.

Edit /etc/hibernate/hibernate.conf to taste, and see hibernate -h for help.


有必要的话编辑 /etc/hibernate/hibernate.conf,以 root 用户执行 /usr/local/sbin/hibernate 即可进入休眠了哦:) 更多的参数见 hibernate -h,感觉比较有用的是 UnloadModules 和 LoadModules auto 两个选项,可以在休眠之前 unload USB 等 hotplug 相关模块,唤醒后再加载,可以省却很多麻烦。

我的实验系统一没有装 X。

实验系统二,在启用 X 的时候,开始出了点问题…… 反复尝试、总结如下:
在 X 下休眠,无论是在 X 终端中还是<Ctrl>+<Alt>_<Fn>切换到控制台后使用命令行:
* 使用 echo > /proc/software_suspend/activate 的方式,会直接挂掉;使用 /usr/local/sbin/hibernate 脚本成功休眠;
* 使用 nvidia 的驱动,唤醒后会挂掉;使用 Xorg 自带的 nv 驱动成功;
* 最好 su 切换到 root 后执行 /usr/local/sbin/hibernate, 直接 sudo 的话唤醒后有时会不正常。

需要修改 /etc/hibernate/hibernate.conf 的情况:
* 如果你像我一样喜欢用 postfix,需要修改/etc/hibernate/hibernate.conf,加上 RestartServices postfix,否则唤醒后 postfix 会不正常;
* 使用 hotplug 设备的,需要加上 UnloadBlacklistedModules yes 和 LoadModules auto 两个选项。/etc/hibernate/blacklisted-modules 里面列出了与 software_suspend 不能很好配合的模块(第一个就是 nvidia);
* 如果使用 nvidia 驱动,需要加上 LeaveXBeforeSuspend yes 和 nVidiaHack yes 两个选项,以便在休眠前退出 X (没办法的办法?)。

software_suspend 支持 SMP 机器的休眠,支持 SATA,如我的实验系统二。


我自己的机器使用的是 Adaptec AIC-7899A U160/m SCSI 控制卡,现在还无法实现休眠:(      
能够实现待机也是不错的,笔记本下待机不用担心停电,还有电池能够备用……待机功能不知道linux可以实现么?