おかしなDSDTを直そう

以下はUbuntuの英語フォーラムTutorial of the Weekの翻訳です。原文「HOWTO Fix A Buggy DSDT File」はユーザー67GTAによって執筆されています。英語フォーラムにおける投稿はCreative Commons Attribution 3.0です。この文章自体はCreative Commons Attribution Share Alike 3.0とします。

このガイドではDebian系のOSで、DSDTファイルの直してよくあるACPI関連の問題を解決する方法を説明します。Mint 6及びUbuntu 8.10から自分のラップトップの温度測定がうまくいかず、キーを押しながら出ないとマシンがちゃんと起動しなくなりました。私の場合は、DSDTファイルが原因でした。ACPI/DSDTについてより詳しい情報はこちらにあります。このガイドはそのポストに触発された作られました。しかし、Debian系のOSでは多少違う操作が必要になります。ここではMint・Ubuntuでどうやったらいいかを説明します。

注意:OSが壊れる可能性があります。もしDSDTを直した後で何もエラーが出なくてもOSが起動できなくなる可能性があります。ハードウェアが壊れることはありません。

チュートリアルを始める前にまずBIOSをアップデートしましょう。DSDT関連バグを手動で直すのは最後の手段です。

まずIntelのDSDTコンパイラーを導入します。端末を開いて次のコマンドを実行します。

sudo apt-get install iasl

現在のDSDTファイルをホームフォルダに保存します。

sudo cat /proc/acpi/dsdt > dsdt.dat

iaslを使ってDSDTファイルをディスアセンブルしましょう。

iasl -d dsdt.dat

dsdt.dslというファイルができるはずです。これが今から編集するファイルです。編集を終えたらこのファイルから新しいDSDTを作成します。ではiaslでdsdt.dslを再コンパイルしてエラー・警告・最適化などがでないか見てみます。<yourusername>はあなたのユーザー名に変えてください。

iasl -tc /home/<yourusername>/dsdt.dsl

リコンパイルの様子が出力されます。エラーを見つけたら好きなエディタでdsdt.dslを直します。エディタの設定で行番号を表示しましょう。エラー出力の行番号からエラーを探し出せます。以下はよくあるエラーの例です。dsdt.dsl 349とは349行目にエラーがあるという意味です。その行まで進みエディタで直して保存します。

dsdt.dsl   349:     Method (\_WAK, 1, NotSerialized)
Warning  1079 -                 ^ Reserved method must return a value (_WAK)

編集を行う度に保存してリコンパイルしましょう。

iasl -tc /home/<yourusername>/dsdt.dsl

これで修正したファイルをコンパイルできます。出力をみて状況が改善しているのを確認しましょう。以下のリンクにはよくあるエラーと直し方が載っています。

運がよければあなたのマシン・モデル用の修正済ファイルがこちらで見つかるかもしれません。見つかれば最後の二つのコマンドは必要なくなります。

dsdt.dslファイルを修正できたらdsdt.amlファイルがホームフォルダに作られているはずです。これがこのチュートリアルで作成しようとしているファイルです。

注意:ここまではまだシステムへ何の変更も加えていません。作成されたファイルを削除すれば元通りになります。これからカスタムDSDTを起動に使うようなり、元に戻すことはできなくなります(復元方法は後述されています)。

それではdsdt.amlファイルの名前を変更して/etc/initramfs-toolsフォルダーに移しましょう。

sudo cp dsdt.aml /etc/initramfs-tools/DSDT.aml

起動時にDSDTを上書きするようにinitrdイメージが更新します。

sudo update-initramfs -u -k kernel-version

kernel versionは自分が利用しているカーネルのバージョンに変更する必要があります。カーネルのバージョンは以下のコマンドで確かめてください。

uname -r

では再起動してみます。うまくいっているかdmesgの出力をチェックしましょう。端末で以下のコマンドを実行します。

dmesg > /home/yourusername/Desktop/dmesg

デスクトップのテキストファイルにdmesgの出力が書き出されます。以下のような内容なはずです。

[    0.020495] ACPI: Checking initramfs for custom DSDT
[    0.353464] ACPI: Found DSDT in DSDT.aml.
[    0.353470] ACPI: Override [DSDT-   MCP67], this is unsafe: tainting kernel
[    0.353478] ACPI: Table DSDT replaced by host OS
[    0.353482] ACPI: DSDT 00000000, 7CB3 (r1 NVIDIA    MCP67  6040000 INTL 20061109)
[    0.353487] ACPI: DSDT override uses original SSDTs unless "acpi_no_auto_ssdt"

dmesgの出力と/proc/acpiが実行前後で変わっているか確認しましょう。特に/proc/acpi/fanや/proc/acpi/thermal_zoneの中身があるかどうか(もし以前はなかったのであれば)見てみましょう。この過程で発見したことに起動時にOSを指定することがあります。これについては先に挙げたリンク先を参照してください。次の行をブートオプションに加えるだけでOSがハードウェアを違うように見るようになります。

acpi_osi="Linux"

この方法はVistaがプレインストールされたHPのラップトップで特に有効なようです。その方法はこちらに書いてあります。DSDTのコードは大変読み辛く私自身を全てを理解しているわけではありません。私のHPのデスクトップはエラーはありませんが、警告は四つ残っています。全て問題なくどうしているのでそのままにしてあります。ラップトップの方は完璧になっています。ちなみにHP dv6815nrなので同じモデルを持っていれば私のDSDTファイルを使えます。DSDTファイルはコンピュータ毎に異なります。全く同じハードウェア出ない限り他のマシンのDSDTを使ってはいけません。

カスタムDSDTを削除するには以下のコマンドを実行してください。

sudo rm /etc/initramfs-tools/DSDT.aml

その後initイメージ更新します。

sudo update-initramfs -u -k kernel-version

再起動すれば元の状態に戻ります。

この方法は開発中のカーネルには使えません。DSDTを変更できるようにするパッチは安定版カーネルにしか含まれないためです。

更新:カーネル開発者はDSDTの変更を可能にするパッチをKarmic 9.10以降使わないと決めたようです。この方法が機能するのはJaunty 9.04までとなります。DSDTエラーにつていはバグ報告をするようにしましょう。