dannycat 发表于 2004-10-30 21:44:55

[原创]kernel 2.6.9 成功实现休眠(STD)



实验系统一:
  主机: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 控制卡,现在还无法实现休眠:(

BOoRFGOnZ 发表于 2004-10-30 21:49:30

看中....................

dannycat 发表于 2004-10-30 22:03:40

唉,刚刚想试验一下装上 X 后会啥样,人家就来把机器搬走了……

俺自己的跟LP的机器都没有 IDE 硬盘,偏偏 SCSI 在 Linux 下还不能 STD ……
in /var/log/message:
Oct 24 09:36:51 kitty Software Suspend 2.1: Stopping tasks failed.
Oct 24 09:36:51 kitty Tasks that refused to be refrigerated and haven't since exited:
Oct 24 09:36:51 kitty - ahc_dv_0 (#170) signalled but didn't enter refrigerator.
Oct 24 09:36:51 kitty ahc_dv_0      R running   0   170      1         176   169 (L-TLB)
Oct 24 09:36:51 kitty - ahc_dv_1 (#177) signalled but didn't enter refrigerator.
Oct 24 09:36:51 kitty ahc_dv_1      S 0001DA19   0   177      1         340   176 (L-TLB)
Oct 24 09:36:51 kitty c0449c88 0000000a 00000046 0001da19 c120df60 00000001 c012a85f cfd01f6c
Oct 24 09:36:51 kitty c011db33 00000001 c120df60 cfd01f4c cfd01f4c 00000246 00000001 c0449c88
Oct 24 09:36:51 kitty cffc18d0 cfd00000 cffc18c4 00000246 cfd01f8c c011dfe7 cffc18cc 00000003
Oct 24 09:36:51 kitty Call Trace:
Oct 24 09:36:51 kitty [<c012a85f>] run_timer_softirq+0xff/0x1a0
Oct 24 09:36:51 kitty [<c011db33>] scheduler_tick+0x123/0x4c0
Oct 24 09:36:51 kitty [<c0348fa3>] _spin_lock_irqsave+0x3/0x30
Oct 24 09:36:51 kitty [<c03490d5>] _spin_unlock_irqrestore+0x5/0x20
Oct 24 09:36:51 kitty [<c0107cfa>] apic_timer_interrupt+0x1a/0x20
Oct 24 09:36:51 kitty [<c011dfe7>] __wake_up_locked+0x27/0x30
Oct 24 09:36:51 kitty [<c034779b>] __down_interruptible+0x4b/0x120
Oct 24 09:36:51 kitty [<c011ded0>] default_wake_function+0x0/0x20
Oct 24 09:36:51 kitty [<c0347883>] __down_failed_interruptible+0x7/0xc
Oct 24 09:36:51 kitty [<c029c5a4>] .text.lock.aic7xxx_osm+0x2d/0x99
Oct 24 09:36:51 kitty [<c0297e60>] ahc_linux_dv_thread+0x0/0x220
Oct 24 09:36:51 kitty [<c01052d5>] kernel_thread_helper+0x5/0x10
Oct 24 09:36:51 kitty Please include the following information in bug reports:
Oct 24 09:36:51 kitty - SUSPEND core   : 2.1
Oct 24 09:36:51 kitty - Kernel Version : 2.6.9-r1smp.nptl
Oct 24 09:36:51 kitty - Compiler vers. : 3.3
Oct 24 09:36:51 kitty - Modules loaded : rtc usbcore 3c59x sg
Oct 24 09:36:51 kitty - Attempt number : 1
Oct 24 09:36:51 kitty - Parameters   : 17 0 0 2048
Oct 24 09:36:51 kitty - Limits         : 65520 pages RAM. Initial boot: 62436.
Oct 24 09:36:51 kitty - Overall expected compression percentage: 0.
Oct 24 09:36:51 kitty - LZF Compressor enabled.
Oct 24 09:36:51 kitty - Swapwriter active.
Oct 24 09:36:51 kitty Swap available for image: 66266 pages.
Oct 24 09:36:51 kitty - Preemptive kernel.
Oct 24 09:36:51 kitty - SMP kernel.

Windows下倒是可以的。
期待中……

llc 发表于 2004-10-30 22:08:37

我今天尝试了STR,结果发现在文字模式STR非常好,但如果在X界面STR的话,重新开机就死翘,连键盘都死锁

dannycat 发表于 2004-10-30 22:14:04

反正没有笔记本用,台式机偶从来都不敢 STR :mrgreen:

llc 发表于 2004-10-30 22:26:56

我启动了X后,CTRL+ALT+F1回到控制台,STR后重新开机,一切正常,照样可以输入执行命令,但如果CTRL+ALT+F6切换回X画面,立即就死翘翘
看来STR支持还不是很好,否则就爽呆了

dannycat 发表于 2004-10-31 12:01:27

偶成功了,在 X 下休眠,不过不能使用 nvidia 的驱动!
马上修正顶贴:)

llc 发表于 2004-10-31 14:34:59

干脆连STR也试试行不行

kde2000 发表于 2004-10-31 19:57:22

apmsleep +`date +%H:%M`

llc 发表于 2004-11-1 09:51:17

我用acpi的...
APM好像不支持STR吧?

kde2000 发表于 2004-11-1 12:29:48

天晓得,反正在我的slackware 10上打那个命令是可以休眠的,而且在X下也一样好好的。

tonnyxu 发表于 2004-11-1 13:44:50

顶一下,继续关注。不过linux的发展的确是比较缓慢哦,休眠都不支持~

llc 发表于 2004-11-1 15:07:57

天晓得,反正在我的slackware 10上打那个命令是可以休眠的,而且在X下也一样好好的。
我现在怀疑是nvidia驱动的原因,我回去试试换成自带的nv驱动试验一下,如果真的是驱动原因我再找找新版本驱动,我现在用的还是5336版本
页: [1]
查看完整版本: [原创]kernel 2.6.9 成功实现休眠(STD)