tp_smapi
tp_smapi は ThinkPad ノートパソコンのハードウェアから情報を取得したりコマンドを送信したりするカーネルモジュールのセットです。tp_smapi の情報は /sys/devices/platform/smapi ファイルシステムに存在します。/proc ファイルシステムと同じように、ファイルから情報を読み書きしたりハードウェアにコマンドを送信することが可能です。サポートされている ThinkPad ノートパソコンを使っている場合は、tp_smapi をインストールすることが強く推奨されます。
目次
サポートされているノートパソコン
まず、あなたのノートパソコンがサポートされているかどうか確認してください。Thinkwiki に サポートされている Thinkpad の完全なリスト が載っています。あなたの TP が stop_threshold をサポートしておらず start_threshold しかサポートしていない場合は #部分的にサポートされているノートパソコンの対処方法 を見て下さい。
Ivy Bridge プロセッサあるいはそれよりも新しいプロセッサ (型番が *30, *40, *50 のモデル) が搭載された最新の Thinkpad にインストールしても、tp_smapi は動作しません。tpacpi-bat か tpacpi-bat-gitAUR を使って下さい。
インストール
最近 community リポジトリに移動された tp_smapi パッケージをインストールしてください。カスタムカーネルの linux-ck を使っている場合は AUR からインストールできる tp_smapi-ckAUR が存在します。
パッケージによって3つの新しいカーネルモジュールが追加されます:
| カーネルモジュール | |
| 名前 | 説明 |
| tp_smapi |
ThinkPad SMAPI サポート |
| hdaps |
IBM Hard Drive Active Protection System (HDAPS) ドライバー |
| thinkpad_ec |
ThinkPad の組み込みコントローラハードウェアへのアクセス (tp_smapi と hdaps のどちらも依存) |
再起動後、tp_smapi とその依存モジュールは自動的にロードされ、/sys/devices/platform/smapi 下の sysfs インターフェイスが使えるようになります。
機能
以下は tp_smapi を使って行えることの一部です。自由に追加してください。
バッテリーの充電の制御
長時間にわたってノートパソコンのバッテリーを満充電の状態にしておくことは良いことではありません 。長時間バッテリーを使わなければならない状況ではないかぎり、できるだけバッテリーは 40-80% ほど残っている状態にしておくべきです。
一般的な方法
tp_smapi を使うことで充電を開始したり停止する閾値を制御することができます。以下のコマンドを実行して適当な値を設定してください:
echo 40 > /sys/devices/platform/smapi/BAT0/start_charge_thresh echo 80 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh
上記の場合、バッテリーが 40% 以下になると充電が開始され、80% を超えるとそれ以上充電しなくなります。このように設定することでバッテリーの寿命を伸ばすことができます。
バッテリーを一度抜いて、再挿入したりすると、設定した閾値はデフォルトの値にリセットされることがあります。リセットを回避するには、値を設定するスクリプトを作成して、起動時やバッテリーが接続されたときにスクリプトを実行させるようにしてください。より詳しい手順は以下のとおりです。
スクリプト /usr/sbin/set_battery_thresholds を作成:
#!/bin/sh
# set the battery charging thresholds to extend battery lifespan
echo ${2:-40} > /sys/devices/platform/smapi/BAT${1:-0}/start_charge_thresh
echo ${3:-80} > /sys/devices/platform/smapi/BAT${1:-0}/stop_charge_thresh
上記のスクリプトを使ってバッテリーの閾値を設定するのはとても簡単で、(set_bat_thresh がスクリプトの名前だとして) 以下のコマンドを入力するだけです:
set_battery_thresholds 0 96 100
引数を付けないで実行すると、BAT0 の閾値が 40% と 80% に設定されます。
スクリプトに実行可能属性を付与してください:
# chmod 744 /usr/sbin/set_battery_thresholds
起動時に systemd でスクリプトを実行します (initscripts の rc.local を使うのはもう非推奨になりました)。まず /etc/systemd/system/tp_smapi_set_battery_thresholds.service を作成:
[Unit] Description=Set Battery Charge Thresholds by tp_smapi [Service] Type=oneshot ExecStart=/usr/sbin/set_battery_thresholds RemainAfterExit=yes [Install] WantedBy=multi-user.target
そして systemd で有効化:
# systemctl enable tp_smapi_set_battery_thresholds.service
バッテリーが接続されたときもスクリプトを実行させるには、acpid をインストール・設定している必要があります。/etc/acpi/handler.sh を編集してください:
#... other ACPI stuff
battery)
case "$2" in
BAT0)
case "$4" in
00000000)
;;
00000001)
/usr/sbin/set_battery_thresholds
;;
#... more ACPI stuff
設定が反映されているかどうか確認
設定が反映されたかどうか確認するには、以下の出力を確認します:
cat /sys/devices/platform/smapi/BAT0/start_charge_thresh cat /sys/devices/platform/smapi/BAT0/stop_charge_thresh
ハードディスクを落下から保護
tp_smapi にはノートパソコンの加速度計を読み取って、ハードドライブにダメージを与える落下などの動きを検出できるドライバーが含まれています。この機能に関する情報は HDAPS のページを見て下さい。
部分的にサポートされているノートパソコンの対処方法
部分的にしかサポートされていないノートパソコンでも、バッテリーの制御ができることがあります。まず実際にサポートされている機能を確認してください:
cat /sys/devices/platform/smapi/BAT0/start_charge_thresh cat /sys/devices/platform/smapi/BAT0/stop_charge_thresh
start-charge_thresh はサポートされているのに stop_charge_thresh はサポートされていない場合でも、コンピュータに充電を止めさせる方法が2つあります。
方法 1
- 上述のようにスクリプト
/usr/sbin/set_battery_thresholdsを作成 - オリジナルの
/etc/acpi/handler.shを/etc/acpi/handler.sh.startにコピー - 上述のように
/etc/acpi/handler.shを編集して/etc/acpi/handler.sh.stopにコピー
以下のスクリプトをコピーして、実行可能属性を付与し、自由に値を調整して、cron などで数分ごとに root で実行するようにしてください。
#!/bin/bash
CURRENTCHARGE=$(acpitool -b | cut -d, -f2 | cut -d. -f1 | cut -b2-)
if [ $CURRENTCHARGE -gt 80 ]; then
cp /etc/acpi/handler.sh.stop /etc/acpi/handler.sh
echo 99 > /sys/devices/platform/smapi/BAT0/start_charge_thresh
exit 0
fi
if [ $CURRENTCHARGE -lt 60 ]; then
cp /etc/acpi/handler.sh.start /etc/acpi/handler.sh
echo 99 > /sys/devices/platform/smapi/BAT0/start_charge_thresh
echo 0 > /sys/devices/platform/smapi/BAT0/start_charge_thresh
exit 0
fi
exit 0
方法 2
バッテリーの充電の閾値を制御するには、AUR から Perl スクリプトの tpacpi-bat または tpacpi-bat-gitAUR をインストールします。
次を実行して acpi_call カーネルモジュールをロードしてください:
# modprobe acpi_call
もしくは /etc/rc.config の MODULES にカーネルモジュールを追加します。
手動で閾値を設定するには以下を実行:
tpacpi-bat -v -s startThreshold 0 40 tpacpi-bat -v -s stopThreshold 0 80
上記の例で指定している 40 や 80 はバッテリーの最大容量からのパーセンテージです。必要に応じて調整してください。また、上記の行を /etc/rc.local に追加することで起動時に実行させることができます。上記の値は永続的なはずですが、バッテリーを抜いたときに値がリセットされることがあります。
3番目のオプション、カーネル
カーネル 4.17 には、ThinkPad のバッテリ充電のしきい値を直接調整するオプションが追加されました。
echo 60 > /sys/class/power_supply/BAT0/charge_stop_threshold echo 40 > /sys/class/power_supply/BAT0/charge_start_threshold
値を表示しようとすると、最後のセットのみが表示され、128が追加されます。
これは既知の問題ですが、バッテリの動作からわかるように、実際は別の値が設定されています。
他の興味深いパラメータは /sys/class/power_supply/BAT 0/ にあります。