ThinkPad X13の充電ポート劣化にArch Linuxで抗う(Arch Linux使いへの道21)
ThinkPad X13の鬼門-充電用USB-Cポートの劣化問題
私のThinkPad X13Gen1AMDは中古で安ーく購入したのですが、使い出して少し経ったあたりから、充電用のUSB-Cポートの接触不良が起こるようになりました。それは、電源を挿しながらArch Linuxを使い続けているときに、突然ThinkPadの電源が落ちることが何度があって自覚するに至りました。ふた昔前のPCであればそれだけでハードディスクが死んでいたと思うと冷や汗ものです。
症状を調べてみると、USBコネクタ部分に少しだけ上向きにテンションがかかると接触が切れてしまうようであり、通常使用時の見分けもなかなかつかない、接触不良の初期段階と思われる症状でした。
Drコパに相談してみると、このUSB-Cポートは充電ケーブルの自身の重みで上向きテンションがかかると接触不良になることから、L字型のケーブル挿しっぱなしでテープなどで動きを固定することが提案されましたが、それだとスタバdeCUIの持ち運びが大変だし、もう一つの解決策として示された修理は万円単位の追加投資を必要とするので、そもそも中古でもっと新しいの買った方が良いって話になってしまいます。
また、このThinkPadには充電可能なUSB-Cコネクタがもう一つあり、そっちを電源接続専用にすればよいという提案もありましたが、音質向上のため、USB-C接続のDAC(FIIO KA11)を使っているので私の場合はそれは無理でした。
問題は通電が切れてしまうことに気付かないこと
中古PCなので内蔵バッテリーの容量も多くを望めないことから、電源ケーブル接続で使うものの、GUI環境ならば多分、給電が交流電源から内臓バッテリーに切り替わった際にポップアップなどが出るのでしょうが、CUI環境ではそれは無理。この問題の当面の解決策として私が考えたのは、CUI環境でも交流電源から内蔵バッテリーに給電が切り替わったことを知らせるようにすればいいじゃないということでした。
早速Drコパにそれができないか?と尋ねたところ、「できらぁ!」と力強い答えが!ThinkPad X13 Gen1のUSB‑Cにおいては、電源の状態変化がイベントとして内部処理されるので、その信号をキャッチして、CUI環境に流すようにするそうです。
Linuxのデバイス管理システムに新ルールを追加
やり方は、Linuxの常駐システム(Daemon・デーモン)の一つである、udevというデバイス管理システムに、「交流電源の接続が切れたときに特定のプログラムを起動させる」というルールを設けることだそうです。この特定のプログラムは簡単にいうと、CUI環境のttyの画面に「電源が外れたよ」というメッセージを表示させるというもの。実際にはシェルスクリプトを作ります。
その新ルールをudevに追加するには、まずは内部処理される充電用のUSB-Cコネクタの装置番号(DEVPATH)を特定する必要があります。ThinkPad x13 Gen1にはUSBコネクタが全部で4つ(A2つ、C2つ)あり、どれなのかを名指しする必要があるということです。
充電用ポートの名前を特定せよ!
「名前を特定する」・・・ミサミサに死神の力を使ってもらえば!というわけにはいきませんので、キチンと張り込みをします!
具体的にはudevの挙動を監視しそのログを吐き出すコマンド「udevadm」を実行します。
sudo udevadm monitor --environment --udevこのコマンドを実行中に充電用USB-Cポートにケーブルを挿してそれを抜くというアクションをしたところ、次のようなログが表示されました。(見やすいように改行を入れてます)
(power_supply)
ACTION=change
DEVPATH=デバイスのパス名
SUBSYSTEM=power_supply
DEVTYPE=power_supply
POWER_SUPPLY_NAME=AC
POWER_SUPPLY_TYPE=Mains
POWER_SUPPLY_ONLINE=0この「デバイスのパス名」部分に結構長ったらしい深い階層のフォルダ名みたいなものが表示され、それこそがまさにお目当てのUSB-Cコネクタの名前になります。最後の行、「POWER_SUPPLY_ONLINE=」がゼロだと接続が途切れ、1だと接続されたという状態を意味するそうです。
udevに新ルールを書き込む
udevの新ルールを「/etc/udev/rules.d/99-usbc-alert.rules」として作成します。ファイル名にある「99」はudevルールの最後に読み込ませるという優先順位を意味しています。カスタムルールは最後尾に並ばせるが鉄則のようであり、このファイル名のものをテキストエディタで次のとおり打ち込めば、新ルールは完成です。
SUBSYSTEM=="power_supply", \
DEVPATH=="デバイスのパス名(/deviceからフルパスで)", \
ATTR{online}=="0", \
RUN+="/usr/local/bin/left_usbc_alert.sh"3行目が意味しているのは、「POWER_SUPPLY_ONLINE=0となったとき」であり、その場合、4行目で「『/usr/local/bin/left_usbc_alert.sh』というシェルスクリプトを走らせろ」という意味になります。
電源接続が切れたときに走るシェルスクリプト
上記のudevルールが適用されたときに動くシェルスクリプト「/usr/local/bin/left_usbc_alert.sh」は次の内容にします。
#!/bin/sh
echo "Left USB-C disconnected — check port angle" | wallechoはその後ろのテキストを表示するという命令で、これを「|」の先にある「wall」に適用するというのがこのシェルスクリプトの意味です。「wall」は壁・・・ではなく「write to all(terminals)」の略で、要はすべての画面に””で囲んだテキストを表示せよという命令になります。
電源問題に対する抜本的解決策ではないですが、当面はこの表示が出たらUSB-Cの接続を是正すればよいという運用が可能になりました!
