
Ubuntu日本語フォーラム

ログインしていません。
標記のとおり、12.04.02 のカーネルを 3.5.0-39 から 3.5.0-40 に apt-get dist-upgrade でアップグレードしたら電池がカーネルに認識されなくなってしまいました。
マシンは NEC Lavie-Z です。
reboot して 3.5.0-39 を起動すると電池は認識されます。
3.5.0-40 は AC アダプター無しでも OS は立ち上がり、電池が認識されない点を除きアプリケーションはつかえますが、電池残量が把握できず困っております。
uname -a と ls -l /sys/class/power_suppoly の実行結果は以下のとおりです。
3.5.0-39: バッテリーが認識される:
Linux LVZ 3.5.0-39-generic #60~precise1-Ubuntu SMP Wed Aug 14 15:38:41 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
lrwxrwxrwx 1 root root 0 13-09-07 22:59:55 ADP1 -> ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/ADP1
lrwxrwxrwx 1 root root 0 13-09-07 22:59:55 BAT1 -> ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT
3.5.0-40: バッテリーが認識されない:
Linux LVZ 3.5.0-40-generic #62~precise1-Ubuntu SMP Fri Aug 23 17:38:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
lrwxrwxrwx 1 root root 0 13-09-07 19:26:07 ADP1 -> ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/ADP1
関係あるかどうか分かりませんが、3.5.0-40 でも 3.5.0-39 でも dmesg には
[ 1.057213] pnp: PnP ACPI: found 15 devices
[ 1.057214] ACPI: ACPI bus type pnp unregistered
[ 1.126016] ACPI: AC Adapter [ADP1] (on-line)
[ 1.126431] ACPI: Lid Switch [LID0]
[ 1.126482] ACPI: Power Button [PWRB]
[ 1.126522] ACPI: Power Button [PWRF]
[ 1.126609] ACPI: Fan [FAN0] (off)
[ 1.126640] ACPI: Fan [FAN1] (off)
[ 1.126668] ACPI: Fan [FAN2] (off)
[ 1.126694] ACPI: Fan [FAN3] (off)
[ 1.126721] ACPI: Fan [FAN4] (off)
[ 1.126783] ACPI: Requesting acpi_cpufreq
[ 1.133000] ACPI: Thermal Zone [TZ00] (28 C)
[ 1.133190] ACPI: Thermal Zone [TZ01] (30 C)
[ 1.133708] ACPI: Thermal Zone [THRM] (50 C)
[ 1.133726] ACPI: Battery Slot [BAT1] (battery present)
[ 2.133351] ACPI Warning: For \_SB_.PCI0.LPCB.EC__.BAT1._BIX: Return Package is too small - found 19 elements, expected 20 (20120320/nspredef-679)
[ 2.133362] ACPI: Battery Slot [BAT1] (battery present)
と、記録されています。
カーネルに電池を認識させるようにするにはどうすればよいでしょうか?
よろしくお願いします。
オフライン
$ apt-get changelog linux-image-3.5.0-40-generic
で履歴を確認すると、以下のパッチが入っています。
linux (3.5.0-40.61) quantal; urgency=low
:
* ACPI / battery: Fix parsing _BIX return value
- LP: #1214956
:
https://bugs.launchpad.net/ubuntu/+sour … ug/1214956
https://bugzilla.kernel.org/show_bug.cgi?id=60519
http://git.kernel.org/cgit/linux/kernel … d95b52d6ad
掲示されたdmesgの出力に以下があるのが気になります。
ACPI Warning: For \_SB_.PCI0.LPCB.EC__.BAT1._BIX: Return Package is too small - found 19 elements, expected 20 (20120320/nspredef-679)
ACPI関連のカーネルオプション等で以前の設定に戻せるのか解りません。
ACPIで認識できていない様なので無駄かもしれませんがシステム設定から電源を開き、"メニューバーにバッテリーの状態を表示"を確認してみる。
又は、試しに12.04へ提供されているlts-raring(カーネル3.8)を試してみる。
機種が違うので何とも言えませんが、私のノートPCではubuntu 12.04.3(標準のカーネル3.8)を使用していますが、バッテリー関連の不具合は起きていません。
katsu07 さん、非常に有用な情報、ありがとうございました。
どうやら Lavie-Z に固有の問題のようですね。早速カーネルソースをダウンロードして該当部分を見てみました。ACPI の事はほとんど理解していないのですが、問題の部分だけを 3.5.0-39 の状態に戻したカーネルを試しに作ってみることにしました。が、ubuntu の config をそのまま使ったらファイルシステムが溢れてしまったので、今日は断念しました。
結果は後日報告させていただきます。
教えていただいた https://bugzilla.kernel.org/show_bug.cgi?id=60519 を読む限りでは、Lavie の BIOS に問題があるか、kernel が Lavie の ACPI 情報を正しく認識していないことが疑われますが、急場がしのげるようになるだけでも助かります。
システム設定から電源を開き、"メニューバーにバッテリーの状態を表示"を確認してみる。
バッテリーがある時は常に表示するようにしましたが、結果は表示されませんでした。dbus 経由で UPower に問い合わせを送っても電池は認識されませんでした。
オフライン
3.5.0-40 のソースからビルドしたカーネルはバッテリーを認識しませんでした。
次に bug#1214956 の修正を元に(つまり、bug のある状態に)戻したらバッテリーが認識されるようになりました。
しかし、ACPI の規定によればこの bug は修正された状態が正しいわけで、正しい状態にしたらバッテリーが認識されなくなったというのは理不尽です。にわか勉強で確信はありませんが iasl -d で問題の PC の DSDT を調べたら
オフライン
すいません、誤操作で途中で投稿されてしまいました。
Name (BIX0, Package (0x13)
{
One,
以下パラメーターが18個
}
となっていてバージョン番号(現在は0)が抜けている事が分かりました。従って 3.5.0-39 の状態ではカーネルと DSDT の両方に同じ bug があってそれらがある意味打ち消しあっていたのでバッテリーが認識され状態が取得できていたが、3.5.0-40 でカーネルの bug が修正されたため DSDT の bug のせいでバッテリーが認識されなくなった、というのが実態のようです。
参考にした資料:カーネルソースの Documentation/acpi/method-customizing.txt
http://forums.gentoo.org/viewtopic.php?t=122145
2.4/2.6 系の kernel を対象としていますが基本的な考え方を理解する上で分かりやすかったです。
Ubuntu 12.04 に適用する上で合わなくなっているところ:
・dmesg に残るメッセージは異なる
・DSDT の取得は /sys/firmware/acpi/tables/DSDT
・DSDT を静的に kernel に組み込むには CONFIG_ACPI_CUSTOM_DSDT, CONFIG_ACPI_CUSTOM_DSDT_FILE で。
・DSDT を動的に kernel に組み込ませられるようにするには CONFIG_ACPI_CUSTOM_METHOD を設定
・iasl は既にパッケージがあるので synaptic 等でインストール可能
このPCの DSDT は他にもいろいろと問題があって iasl -d の結果をそのまま iasl -tc しても構文エラーがでてしまいます。問題が DSDT 側にあるのでこの先の ubuntu kernel でもバッテリーは認識できないと予想します。対策としては修正した DSDT を kernel に組み込むのが抜本的かつ理にかなっていると思います。しかし、ubuntu kernel は(少なくとも 3.5.0-40 では) CONFIG_ACPI_CUSTOM_METHOD を no にして作られています。正しい DSDT を静的であれ動的であれ組み込むにはどのみち kernel を自分で build することになります。それならば DSDT がどうのとかに関わらず bug #1214956 の部分だけを元に戻す方が理不尽には見えても早い(かつ、ACPI, DSDT の知識がなくとも対処できる)ように思います。
何はともあれ、バッテリーは正しく認識できるようになりました。どうもありがとうございました。
オフライン
私もNEC lavie zをやや違う環境(lubuntu 12.10)で使っておりますが,全く同じ問題
(NEC lavie zでカーネルを 3.5.0-39 から 3.5.0-40 にアップグレードしたら,電池が認識されなくなった)
で困っております.現在はしょうがなく3.5.0-39で使っております.
当方あまりシステムに詳しくないので,対処方法(bugのある状態に戻す)を
もう少し詳しく記述して頂ければ大変助かります.宜しくお願いします.
オフライン
kernelの再構成の手順はネットを検索すれば山のようにヒットすると思います。カーネルの作り方はいろいろなやり方があるので、情報がありすぎて、最初のうちは私もかなり戸惑いました。以下に私の取った手順を generic kernel に当てはめて書きますが、#3 にも書いたとおりファイルシステムが溢れたので非標準的な手順かもしれません。
カーネル再構成自体に関しては私よりも詳しい方がたくさんいらっしゃるはずなので、こうした方が良いといった点がありましたらコメントしていただければと思います。
大まかな作業工程は以下のようになります。
(0) 準備
(1) カーネルソースをダウンロードする
(2) ソースの展開
(3) ソースの修正
(4) カーネルの configure
(5) カーネルパッケージの作成
(6) インストール
(7) テスト
(0) 準備:
カーネルパッケージを作成するためのディスクの空き容量:12.04の場合、多少余裕を見て10GB程度
/boot パーティッションの空き:50MB程度
/lib/module があるパーティーッションの空き:200MB程度
必要なパッケージ:ubuntu と lubuntu では含まれるパッケージが異なりますし、過去に自分でインストールしたパッケージもはっきりしないので、他にも必要になるかもしれません。
binutils-dev kernel-package kernel-wedge qt3-dev-tools libqt3-mt-dev fakeroot
万一に備えて、古いカーネルを立ち上げる手段を調べておく(grub2 で windows 8 とのデュアルブートなら boot 時にメニューが出るので単に古いバージョンを選択するだけですが、その他の場合(windows8 を削除した、virtual box を使っている etc.)は私には分かりません。)
以下、カーネルパッケージを作成するディレクトリを $build と表す事にします。このディレクトリーが含まれるファイルシステムは実行可でマウントされていることが必要です。(本体SSDのファイルシステムなら既定で実行可になっているはずです。外付けUSBドライブとかSDカードの場合は注意が必要です。)
(1)カーネルソースをダウンロードする
まず、最新のカーネルにアップデートしてそのカーネルで reboot します。
cat /proc/version_signature
を実行してバージョン情報を得ます.
Ubuntu 3.5.0-41.64~precise1-generic 3.5.7.21
のような結果がでるはずです。http://packages.ubuntu.com/ でパッケージを選択し(上の場合は precise-update)カーネルというリンクを開きます。
linux-image-カーネルバージョン-generic
というリンク(上の場合は linux-image-3.5.0-41-generic) を開きます。右の方にソースのリンクがあるので上の場合なら linux-lts-quantal_3.5.0-41.64~precise1.tar.gz をダウンロードします。(100MB 以上あります。)その際、version_signature(この場合 3.5.0-41.64~precise1)が /proc/version_signature と一致している事を確認してください.
(2) ソースの展開
cd $build tar -xzvf ダウンロードしたファイル名
3.5.0-41の場合は ubuntu-precise というディレクトリができますのでそこに cd します。(このディレクトリ名はバージョンに依って変わります。tar のメッセージや ls を実行した結果から分かります。)
cd ubuntu-precise
(3) ソースの修正:
cd drivers/acpi cp battery.c battery.c-dist
でバックアップをとってからエディターを使って battery.c の
120行め付近:struct acpi_battery { の 6 行下の int revision; という行
354行め付近: static struct acpi_offsets extended_info_offsets[] = { の次の
{offsetof(struct acpi_battery, revision), 0},
という行を削除するかコメントアウトしてください。この作業は慎重を要する所なので修正したら
diff -u battery.c-dist battery.c
等で必ず変更内容を確認してください。3.5.0-41 で問題の2行を単に削除した場合の結果は
--- battery.c-dist 2013-09-13 00:34:17.000000000 +0900
+++ battery.c 2013-09-28 15:00:59.000000000 +0900
@@ -117,7 +117,6 @@
struct acpi_device *device;
struct notifier_block pm_nb;
unsigned long update_time;
- int revision;
int rate_now;
int capacity_now;
int voltage_now;
@@ -351,7 +350,6 @@
};
static struct acpi_offsets extended_info_offsets[] = {
- {offsetof(struct acpi_battery, revision), 0},
{offsetof(struct acpi_battery, power_unit), 0},
{offsetof(struct acpi_battery, design_capacity), 0},
{offsetof(struct acpi_battery, full_charge_capacity), 0},
と(修正時刻以外は)なるはずです。
(4) カーネルの configure :ここでは generic kernel の構成ファイルをそのまま使う場合の作業を書きます。
cd ../.. cp /boot/config-`uname -r` .config make xconfig
kernel configuration を何も変更しない場合でも必ず実行してください。ここでもし、
HOSTCC scripts/basic/fixdep
/bin/sh: 1: scripts/basic/fixdep: Permission denied
というエラーでmake が終了してしまった場合は $build を含むファイルシステムを実行可能で再マウントしてください.
正常ならカーネルオプションを設定するウィンドーが立ち上がりますのでフロッピーディスクの絵があるボタンを一応クリックして(何も変えていなければセーブされないはずですが)そのあと File -> Quit(あるいはウインドーフレームの終了ボタンの類:lubuntu でどうなっているかは私には分かりませんがあるはずです。)で終了させます。
(5) カーネルパッケージの作成
fakeroot make-kpkg --initrd --append-to-version=-fixbix41 --revision=1.0.bix kernel-image kernel-headers
を実行します。--append-to-version と --revision の値は今後バージョンアップされたカーネルと区別で切るような名前なら適当でよいのですが、append-to-version の値は - で始まっていて、ベースにしたカーネルのバージョンが分かるyように、--revision はこのバージョンで何回目に作ったかが分かるような内容にしておくことをお勧めします.
USB3.0メモリー(といっても各種ありますが目安として)にgeneric の構成で buildすると2,3時間かかったと思います。(私は既に config から不要なものを落としてしまったので1時間ちょっとです。)内蔵 SSD ならもっと速いと思います。エラーで終了した場合には必ず原因を突き止めて正常に終了するようにします。正常に終了したら
cd .. ls -1
とする(この時点でカレントディレクトリは $build の筈です)と
linux-headers-3.5.7.21-fixbix41_1.0.bix_amd64.deb
linux-image-3.5.7.21-fixbix41_1.0.bix_amd64.deb
ubuntu-precise
のようになるはずです。
(6) インストール
sudo dpkg -i linux-image-3.5.7.21-fixbix41_1.0.bix_amd64.deb sudo dpkg -i linux-headers-3.5.7.21-fixbix41_1.0.bix_amd64.deb
インストール後 ls /boot を実行すると作成したカーネルを確認できます。
(7) reboot して動作確認。
kernel configuration を変更していない場合はエラーが無ければ動くはずです。
uname -a ls /sys/class/power_supply
を実行してカーネルのバージョンが自分で作ったものになっているか、BAT1 が表示されるかを確かめます。
が、何らかの不都合が発生した場合、なんとか reboot して(magic SysRq は LaVie では Fn+Alt+SysRq です。これも効かず万策尽きた場合電源ボタンの長押しで電源を切らないといけないかもしれません。)動いていた古いカーネルで立ち上げます。
この作業は ubuntu カーネルのバージョンアップの度に行う必要があります。そうすると古いカーネルがどんどんたまっていきますが、もう使わなくなったカーネルは
sudo apt-get remove linux-headers-3.5.7.21-fixbix41 linux-image-3.5.7.21-fixbix41
などで削除できます。インストール時とは違ってファイル名ではなく、パッケージ名を指定します。
オフライン
uzomaru さん、こんにちわ。どの程度の background を仮定してよいか分からなかったのでとりあえず書いてみました。分からないところ、実際にやってみて行き詰まった所がありましたら、またお問い合わせください。
オフライン
taka.zoo.nさん
ここまで親切に説明してもらって失敗するわけには行かないと
プレッシャーを感じながら,昨晩ステップ(5)を済ませました.
今朝debファイルが出来ているのを確認して,残りのステップを
実行,再起動しました.無事BAT1が表示されました.
本当にありがとうございました.
オフライン