Intel 82371AB/EBというマザーボードなら電源ボタンを押すと、shutdownしてくれるというページを見つけましたのでさっそくやってみました。
http://www.netfort.gr.jp/~matsu/i82371/
ソースを取ってきて、コンパイルしてモジュールを組み込もうとすると
#insmod ./piix4acpi.o
./piix4acpi.o: unresolved symbol request_region
./piix4acpi.o: unresolved symbol misc_deregister
./piix4acpi.o: unresolved symbol release_region
./piix4acpi.o: unresolved symbol boot_cpu_data
./piix4acpi.o: unresolved symbol pcibios_present
./piix4acpi.o: unresolved symbol pcibios_read_config_dword
./piix4acpi.o: unresolved symbol pcibios_write_config_byte
./piix4acpi.o: unresolved symbol misc_register
./piix4acpi.o: unresolved symbol __verify_write
./piix4acpi.o: unresolved symbol pci_find_device
./piix4acpi.o: unresolved symbol printk
などとエラーが出てうまくいきませんでした。
いろいろ調べてみると、カーネルのLoadable module supportでSet version information on all module symbolsがyになっている場合に、モジュールを作成するとこうなるようです。
解決法としては
1,カーネルをSet version information on all module symbolsをnにしてカーネルを再構築する。
2,piix4acpiのソースについている2.2.11用のパッチを使ってカーネルに直接組み込む。
などが考えられます。的場氏は2番目の方法を行いました。以下に手順を示します。
的場氏の環境は2.2.16なのでそのままではパッチは使えませんので、パッチファイルの linux-2.2.11-origの部分をlinux-2.2.16に置き換えます。パッチファイルの名前も変えておきます。/usr/src以下にカーネルソースlinux-2.2.16があるとすると
#cd /usr/src
#patch -p0 < piix4acpi-linux-2.2.16.diff
次にカーネルを再構築します。General setupにPIIX4 ACPI Power Button Check supportの項目がありますのでyにします。あとは通常の手順を行い、新しいカーネルで立ち上げます。dmesgで確認して
acpi: Power Management IO space found at ...
と出ていれば成功です。
あとはデバイスファイルを作成し、
#mknod /dev/piix4acpi c 10 160
サンプルプログラムのchkpwをコンパイルしてパスのとおっているディレクトリに置き、/etc/rc.d/rc.localなどに
chkpw "shutdown -h now" &
と書いてやるとOKです。
1の方法で行う場合は、カーネルの再構築を行う際に、Set version information on all module symbolsをnにします。そしてpiix4acpiをコンパイルして、insmodなどでモジュールを組み込むと上手くいくはずです。この場合は/etc/rc.d/rc.localに
insmod piix4acpi
と書いておかなくてはいけません。
的場氏はテストをせずにぶっつけ本番で電源ボタンをぶち切ったそうです。ヒヤヒヤしましたが、上手くshutdownしてくれたとのこと。
現在はkernel-2.4用も出ています。今回はカーネルパッチは含まれていないようです。