▼FreeBSD にて ACPI の sleep/suspend を無効化する▼

FreeBSD 6.x, 7.x では acpi(4)が使えていると

でサスペンドモードに入れたりしますが、 ハードウェアによっては正常に復帰できないとか、 サーバー用途で間違って zzz すると現地で電源ボタンを押さないと復帰できないとかが あるので、サスペンドを無効にしたいことがあります。

$Id: fb7-nosusp.html,v 1.4 2008/07/17 01:13:41 kabe Exp $


▽結論

sysctl にて、関連機能を全部殺します。


/etc/sysctl.conf
...

## LOCAL
# defaults:
#hw.acpi.power_button_state: S5
#hw.acpi.sleep_button_state: S1
#hw.acpi.lid_switch_state: NONE
#hw.acpi.standby_state: S1
#hw.acpi.suspend_state: S3

## Disable zzz(8).
## NOTE: Ctl-Alt-SPC/Alt-Break and "acpiconf -s 3" will still freeze the system
hw.acpi.sleep_button_state=NONE
hw.acpi.lid_switch_state=NONE
hw.acpi.standby_state=NONE
hw.acpi.suspend_state=NONE

# default:
# debug.acpi.do_powerstate=1	;# do PCI powerstate manipulation
# debug.acpi.suspend_bounce=0	;# do not dryrun

## disable kernel acpi suspend entirely, including "acpiconf -s 3"
## NOTE: will still shutdown bge0 for several seconds
debug.acpi.do_powerstate=0
debug.acpi.suspend_bounce=1
# resume_beep will audible notify of oscillation during failed wakeup
debug.acpi.resume_beep=1

・zzz(8) (シェルスクリプト) は、
hw.acpi.suspend_state (普通は"S3") が
hw.acpi.supported_sleep_state (読み取り専用、普通は"S1 S3 S4 S5")
に含まれているかチェックし、あれば acpiconf -s 3を 発行します。 このロジックを潰すため、suspend_state などに"NONE" ("S0"も可) に設定します。

動作確認:Ctrl+Alt+Spcを連打すると、サスペンドせずにカーネルメッセージ acpi: suspend request ignored (not ready yet) が出ます。 (本来は2重起動を回避するためのエラー)

・これでも acpiconf -s 3 を間違って?叩くと サスペンドするので、 カーネルのACPI処理で止められるところは止めます。

debug.acpi.do_powerstate=0
PCIバスなどの電源処理を止めます。
debug.acpi.suspend_bounce=1
BIOSへのサスペンド発行を寸止めします。
…なお、これでも サスペンド対応のデバイス類にはサスペンドが発行されてしまう ので、ネットワークが数秒間止まってしまう現象は残ります。

動作確認:acpiconf -s 3 でも電源が切れません。 (数秒間反応がなくなることはあります)

▽ACPI無効化は?

ACPIに問題がある場合は、完全無効化が非常に有効で、 以下の設定でもサスペンド無効に出来ます。


/boot/device.hints
...
hint.acpi.0.disabled="1"
が、SMPやHyperThread機能も無効にされてしまうので、SMPを残したい場合は ACPIは有効のままにしておく必要があります。

▽/usr/sbin/zzz 消せばいいんじゃ?

/usr/sbin/zzz を消すのが簡単なのは事実なので、方法としては当然アリです。

が次回のアップデート時に復活してしまいます。 /etc/sysctl.conf なら必ずmergemasterで検査されるので 多少安心。

▽kbdmap(5)書き換えればいいんじゃない?

いやまあその通りなのですが

Ctrl+Alt+Space などのコンソールキーでのサスペンドは kbdmap(5)susp 機能で起動されます。


jp.106.kbd での機能割付
% kbdcontrol -d | grep susp
  057   ' '    ' '    nul    ' '    ' '    ' '    susp   ' '     O	#スペース
  104   slock  saver  slock  saver  susp   nop    susp   nop     O	#Break
  121   ' '    ' '    nul    ' '    ' '    ' '    susp   ' '     O	#無変換
  123   ' '    ' '    nul    ' '    ' '    ' '    susp   ' '     O	#変換
Alt-Ctrl-{スペース、変換、無変換} なんかは間違って押す可能性が非常に高いので、 嫌がらせにしか思えませんがそーなってます。 もちろん自分でキーマップを書いてsuspを消す方法もあります。

再起動(Ctl+Alt+Del)、DDB起動(Ctl+Alt+Esc)に関してはsysctlの

hw.syscons.kbd_debug: 1
hw.syscons.kbd_reboot: 1
にて有効無効を制御できますが、hw.syscons.kbd_suspend は無いので、 お手軽に無効化出来ません。

hw.syscons.kbd_suspend 追加パッチ で、 お手軽にサスペンド防止できるようになります。


かべ@sra-tohoku.co.jp