WPP
LM22 にハイバネーション設定

この年末でノート PC が壊れてしまい タワー型の PC をメインで使うことになりました。随分前から使っているのですが、サスペンド/ハイバネートが効かないのが気にはなっていました。

ハイバネートできなくても使うこと自体にはなんら支障はありませんが、普段ノートを使い電源切らない運用しかしていないのでビミョーに不便です。やっぱり中断前の作業状態にすぐ復帰できるの地味ながらとても便利です。

でネットを調べるといろいろな手順がヒットしますがまとめると概ねこんな感じになるらしい。

  1. スワップファイルかスワップパーティションを作成する
  2. GRUB にスワップを使うことを知らせる (/etc/defaults/grub の更新)
  3. update-grub で設定を反映し、テスト

スワップファイルを作成

ネット上ではスワップファイルを使うケースが多いが若干設定箇所が異なるので注意が必要です。

この PC はすでにスワップファイル使っているのでスワップパーティションの作成はしません。

この辺は適当に。

スワップファイルのある場所の UUID とオフセットを確認する。自分の例ではスワップファイルは /swapfile というパス名で作成していますので適宜あわせてください。

; uuid の確認
$ sudo findmnt / -o UUID
e62d2aa4-2253-4f99-bb9b-28cc9bd0c888

; 別の方法
$ ls -l /dev/disk/by-uuid
rwxrwxrwx - root 29 Dec 14:46 181B-6932 -> ../../sda2
lrwxrwxrwx - root 29 Dec 14:46 be4c8276-05df-4175-9e40-55a460df91db -> ../../sdb
lrwxrwxrwx - root 29 Dec 14:46 e62d2aa4-2253-4f99-bb9b-28cc9bd0c888 -> ../../sda3


; オフセットの確認
~$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 34359738368 (8388608 blocks of 4096 bytes)
 ext:     logical_offset:             physical_offset:  length:   expected: flags:
   0:            0..   32767:   78086144..  78118911:  32768:            
   1:    32768..   65535:     4161536..   4194303:   32768:   78118912:
   2:    65536..   98303:     8355840..   8388607:   32768:    4194304:
..... ずっと続く

; この例だと 78086144.. が該当します。

設定ファイルを更新する

カーネルにレジュームを使うことと、スワップファイルの位置を知らせる。

設定ファイルの場所はいくつかあるらしいが /etc/default/grub を変更することにした。GRUB_CMDLINE_LINUX_DEFAULT= に resume=UUID=e62d2aa4-2253-4f99-bb9b-28cc9bd0c888 resume_offset=78086144 を追記する。

sudo vi /etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="quiet splashi apm=off acpi=force resume=UUID=e62d2aa4-2253-4f99-bb9b-28cc9bd0c888  resume_offset=78086144"
...
:wq

設定を反映する

最近 GRUB の設定をいじることはあまりなくなってすっかり忘れていましたが、gurb を更新します。よくわかっていませんが、このコマンドの過程で initramfs も更新される? のかなと思います。

$ sudo update-grub

再起動して、テストする。

$ systemctl hibernate

うまく行くと SSD への少し長いアクセスのあと電源が切れます。もちろん電源を再投入すると元の作業状態でデスクトップが再開されます。

もしかすると BIOS/UEFI で ACPI を有効にする設定が必要かもしれません。

2024-12-30 追記

終了ダイアログにハイバーネートを追加

systemctl hibernate が動いているのですっかり OK かと思っていたが、終了ダイアログにハイバーネートボタンがないことに気づいた。

ターミナルから入力すればいいのだが、これはこれで微妙に面倒くさい。「交流電燈舎第弐工房日誌」さんの記事の通りに、/etc/polkit-1/localauthority にフォルダとファイルを作成してみる。

こんな感じで /etc/polkit-1/localauthority/50-local.d/50-hibernate.pkla ファイルを作成した。(pkla はピーケーエルエーです。)
ファイル名は数字から始まり、かつ .pkla で終われば適当な感じでOKだと思う。

[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

再起動するもダイアログの内容は変わらなかった。

いろいろ調べてみるとどうも polkit (policy kit) というのでハイバーネート権限があるかどうかで挙動が変わるらしい。早速確認すると、sudo なしだと no で policy kit 的にはハイバーネートできないってことになっているらしい。

$ busctl call org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager CanHibernate 
s "no"
$ sudo busctl call org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager CanHibernate 
s "yes"

参考リンクの Linux Mint Forums の記述を参考に .rules ファイルを作成する。

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.hibernate" ||
        action.id == "org.freedesktop.login1.hibernate-multiple-sessions" ||
        action.id == "org.freedesktop.upower.hibernate" ||
        action.id == "org.freedesktop.login1.handle-hibernate-key" ||
        action.id == "org.freedesktop.login1.hibernate-ignore-inhibit")
    {
        return polkit.Result.YES;
    }
});

本来なら subject に実行ユーザーの情報が入ってくるので、一定の権限のユーザーだけ許可するように処理を書くべきなようです。今回は subject を捨てて闇雲に許可しているのでセキュリティ的には問題ありそうですが、よくわからないので良しとします。

ファイルを保存して再起動すると、.pkla ファイルが反映され、終了ダイアログと設定 “Power Management” でハイバーネートの設定が表示されるようになりました。

Windows ならインスーラが認識できなければほぼ実現できないことがやれるようになるのは Linux のいいところでもあり、だからこそ煩わしいところでもある。昔よりはずっと良くなったがまだまだ覚えなければいけないことはたくさんある。

参考

電源管理/サスペンドとハイバネート – ArchWiki
このページは ArchiWiki の中では比較的わかりにくいです。

ハイバネーション, レジューム, サスペンド, LinuxMint – 交流電燈舎第弐工房日誌
このページはわかりやすかった

Linux Mint 21.2 でハイバネートできるようにする(rEFInd を使っている場合) – 🍣すしでもどうですか
rEFInd は GRUB2 のようなブートローダらしい、なのでブートローダ関連のファイル修正は GRUB2 とは異なる

How to enable Hibernate Mode on Linux Mint | FOSS Linux

[SOLVED] Mint 22 enable hibernation in power and shutdown menu – Linux Mint Forums

Pi 5 温度の取得とシェルの小ネタ

よく忘れるのでメモ。

前回記事で、Pi5 PoE+ HAT のことを書きましたが、こいつにはファンがついていて温度設定でコントロールできるようになっています。

設定方法は、WaveShare の wiki でみればいいのですが、(多分これ Raspberry 公式と同じ内容なはずです。) ふと温度の確認方法はどうだっけと思い検索しました。

; 
$ vcgencmd measure_temp
#temp=40.1'C

; 普通に cat すると 1000 倍の値が取れる
$ echo  cat /sys/class/thermal/thermal_zone0/temp
47950

;  単純に 1 / 1000 にすると切り捨てられる
$ echo $(($(cat /sys/class/thermal/thermal_zone0/temp) / 1000))
47

; こうすると、小数点以下が生きる
$ cat /sys/class/thermal/thermal_zone0/temp |awk '{print $1 /1000}'
47.95

参考

RaspberryPi(Raspbian)のCPUの温度をcatを使わないで取得してみた #Bash – Qiita

Pi5 に PoE+ HAT で NVME 起動するように設定する

先日から始まった ROS2 関連のエントリになります。

とりあえず ROS2 を Raspberry Pi で動かしているのですが、Pi 4 が 1 台だけだと心もとないので Pi 5 用の POE+ ハットを購入して動かすことにしました。

買ったのは WaveShare の PoE M.2 HAT+ という商品です。日本だと 4,000 から 5,000 円くらいで入手できると思います。自分は WaveShare 公式から買いました。

そんなことはどうでもいいのですが、この HAT には M.2 NVME ソケットがついていて SSD を接続するとそこから Pi 5 を起動できるようになります。というのも ROS2 のモジュールを作る際、ビルドが早い環境があったほうが何かと都合がいいので SSD 起動を試します。

基本、参考セクションの公式のページ通りにやれば何も問題は起きないはずです。が、自分の場合はなぜか pcie デバイスとして認識しない事態になりました。

というのもこの HAT のケーブル向きがあるんです !

写真は最終的に成功したときの様子です。

Pi5 + WaveShare PoE M.2 HAT+ 接続全体

接続がうまく行っているときは右上の赤枠の通り、電源 LED が点灯し、緑のアクセスランプが適宜点灯(要するに点滅)します。

で前述のケーブルの向きですが、こうなります。

PoE M.2 HAT+ ではケーブル向きを上の写真のように三角の位置を揃える必要があるってことです。

これ普通に公式 Wiki 見ていればきづくはずですが、フラットケーブルの端子面は気にしていたのですが、見落としてました。

一般的に片面にしか端子がないフラットケーブルはひっくり返すと通電しません。(コネクタ側も片面しか端子がないので、当たり前です。)

さらに、この HAT の場合には、三角マークの部分で左右非対称になっているようで三角の位置を合わせないとダメでした。つまりこのケーブルは、Pi 5 に挿す側と HAT に挿す側が予め決まっており、裏表も正しく挿す必要がありました。

同様の事態になる人は少ないと思いますが、自戒の意味を込めて晒します。

あとは、まあ公式通りです。

/boot/firmware./config.txt に dtparam の行を追加します。

$ sudo vi /boot/firmware/config.txt
[all]
dtparam=pciex1
dtparam=pciex1_gen=3
:wq

動画かなにかで [cm4] セクションに書いている例もありましが、なんとなく気持ち悪いので [all] セクションに書きました。正直無名セクションや、pi0 系のセクション以外ならで良いとおもいますが。。。

再起動して lspci で SM2263 が表示されれば OKです。

次に rpi-eeprom-config –edit でブートオーダーを変更します。

$ sudo rpi-eeprom-config -edit
BOOT_ORDER=0xf416

あとは、”SD Card Copier” でコピーするなり、”Raspberry Pi Imager” で SSD にOSを書き込めば起動します。

参考

PoE M.2 HAT+ – Waveshare Wiki

Raspberry Pi 5をNVMe SSD起動でデスクトップPC化

dock 風ラウンチャ Plank を使う

以前から使っていて、再セットアップ時に名前を思い出せなかったので記事にします。完全に備忘録ですね。

いわゆる MacOS のドック風のしたからせり出してくるラウンチャ

同様のアプリは Cairo-dock のほうがメジャーらしいのですがプラグインがたくさんあるけど、きっと使わないだろうと思い Plank にしました。

$ sudo apt install plank
; 設定するには
$ plank --preferences

設定画面には、ラウンチャーを表示してアプリとアプリの間の起動しない下地の部分で右クリックすれば行けるのですがこれがなかなか難しいのでコマンドもメモ。

Icon Zoom: を設定してやると Mac みたいにビューンとアイコンが大きくなる動作をします。まあ、まんまです。

コマンドの存在を忘れるとそもそも思い出すのも面倒なのでどっちのほうが簡単かは悩ましいところ。

参考

Ubuntuで使用できるMacのドックのようなPlankの使い方 | virtualiment

apt install で ポストインストール時の configure でエラー

さて、先日から ROS2 をいじっているのですが ROS2 用のビルド環境を Podman に構築中に上のエラーに遭遇しました。そのときは libc-bin パッケージのポストインストールで失敗していました。

環境

  • Ubuntu 22.04.5 (arm64)
  • Podman 4.9.3

たまたま、 Podman + arm ubuntu で起きているだけで、現象そのものはどの debian 系 OS でも起きると思います。がこの組み合わせだと必ず起きるのかもしれないです。

対策

どこで失敗しているかはこのコマンドで確認できます。

$ sudo dpkg --audit

通常なら apt install -f で不完全なパッケージのインストールをやり直せるはずですが今回はだめでした。

しかたなく、libc-bin のポストインストール設定を削除することにします。

.postinit、.postrm、.prerm があるはずなのでそれらを削除する。(なければないで良い)

$ cd /var/lib/dpkg/info
$ sudo rm libc-bin.postinit libc-binpostrm libc-bin.prerm
$ sudo dpkg --configure libc-bin

闇雲に削除してしまって、問題が起きそうだが、それはその時で。

Podman に arm(ラズパイ)の ROS2 環境を作っているので、ちゃんと動いたらそれも記事にしよう。

参考

dpkgやapt-get関連でエラーが出た時の対処法 #Linux – Qiita

Ubuntu 22.04 で Unable update “Snap Store”: といわれアップデートできない

先週から ROS2 をラズパイ 4 で動かし始めています、ROS2 の対応 OS が Ubuntu 22.04 なので RaspberryOS を諦めて素直に U22 にしています。

同じ Debian 系とはいえ普段使っている Linux Mint とも RaspberryOS ともビミョーに異なり、困らないもののストレスフルな毎日です。

表題ですが Snap Store (Ubuntu Software) で Snap Store のアップデートがあるので更新しようとしてもエラーメッセージ「Unable update “Snap Store”: snap … 」とでてアップデートできません。試しに再起動を試みましたが現象変わらず。

以下のコマンドで回避できました。

$ killall snap-store
$ sudo snap refresh snap-store

Ubuntu は多分 Gnome でつかっているんだけどやっぱり遅くてあまり好きになれない。ROS2 動かす GUI はいらないのだけど、カメラのデータを扱いたいのでぱっと確認しやすい GUI ありのがいいのよね。

参考

How to close the Snap Store to allow Snapd to update it – Project Discussion / Snap Store – Ubuntu Community Hub

Raspberry Pi4 bookworm で NoMachine を動かす

ROS2 を ラズパイに入れようと思い久しぶりに pi4 を起動した。NoMachine をインストールしたが動かないのでトラブルシューティングした話。Linux の vnc セッテイングがどうも理解できなくてあまり好きじゃないので NoMachine を好んで使っている。NoMachine ならインストールだけで基本OK。

参考のスレッドによると、Wayland だと NoMachine が正常に動作しないらしい。

回避手順

ssh か 一旦 vnc をオンにして cui で sudo raspi-config を実行する。

6. Advanced Options に進む

A6. Wayland に進む

W1 X11 を選択する

参考

NoMachine Forum – Raspberry Pi 5 not working with NoMachine

mac アドレスをローカルで検索するスクリプトを Claude に書いてもらう

時々 mac アドレスから機器のベンダーを調べたいときがあります、例えば DHCP で割り当てられたアドレスがどの機器なのかを知りたいときなんかです。そんなときはいつもベンダールックアップできる Web サイトを使用していたのですが、ターミナルからできたら便利かもしれないと思い Claude に聞いてみました。

先に結果から載せますが、こういう関数を定義すれば OK でした。

mac_lookup() {
    for mac in "$@"; do
        vendor_code=$(echo "$mac" | tr ':' '-' | cut -d'-' -f1,2,3)
        echo "MAC: $mac"
        grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
        echo
    done
}

これを ~/.bashrc に追記するなり、別ファイルにして source xxx としてもいいです。

oui.txt は LM22 (多分 Ubuntu 系も同じパス) なので他の Linux では少し異なるかもしれない。

使い方は、 mac_lookup xx:xx:xx:yy:yy:yy みたいな感じでコマンド叩けばいい。区切り文字は : か – のいずれかで必須です。中で grep しているだけなので全桁なくても動きます。
想定しているのは、上位6桁ですが、それ以外の一部分を検索することはないだろう。

Claude とのセッション

ほぼコードは書いていなくて数分で完成まで至ったのはちょっと感動。

以下は Claude とのセッションの様子。

Q: linux のターミナルで mac アドレスからベンダー情報をルックアップすることができるコマンドはある?

Claude: はい、macchanger というツールを使うことができます:

sudo apt install macchanger
macchanger -l | grep "開始の3バイト"

または、ieee-oui-lookup-list パッケージを使う方法もあります:

sudo apt install ieee-oui-lookup-list
grep "MACアドレスの最初の6文字" /usr/share/ieee-oui/oui.txt

例えば、MACアドレスが 00:11:22:33:44:55 の場合:

grep "00:11:22" /usr/share/ieee-oui/oui.txt

これらのツールはインストールが必要ですが、実際に試してみましょうか?

Q: ubuntu をつかっているのだけど、ieee-oui-lookup-list じゃなくて ieee-data じゃない?

Claude: ご指摘ありがとうございます。その通りです!

Ubuntuでは ieee-data パッケージを使います:

sudo apt install ieee-data
grep "MACアドレスの最初の6文字" /usr/share/ieee-data/oui.txt

例えば:

grep "00:11:22" /usr/share/ieee-data/oui.txt

私の以前の回答は間違っていました。正確な情報を共有できなかったことをお詫びします。

Q: : は – に変えないとだめじゃない?

Claude: はい、その通りです!申し訳ありません。

ieee-dataのデータベースでは、MACアドレスのフォーマットはハイフン(-)を使用します:

grep "00-11-22" /usr/share/ieee-data/oui.txt

コロン(:)からハイフン(-)に変換する必要があります。trコマンドを使って変換することもできます:

echo "00:11:22" | tr ':' '-' | xargs -I{} grep {} /usr/share/ieee-data/oui.txt

ご指摘ありがとうございます。より正確な情報をお伝えできました。

Q: もう少し改良してほしい。改良点は、フルレングスの mac アドレスを入力したらoui.txt をルックアップするようにして欲しい。

  • dc:a6:32:72:ef:e9 のようなマックアドレスを入力する
  • : を除いたベンダー部の上位6桁をルックアップする
  • アルファベットは大文字、小文字の両方を許容する
  • : の替わりに – が入力されることもある。

Claude: そうですね、それら全ての要件を満たすスクリプトを作成しましょう:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスを受け取り、
    # 最初の6文字(ベンダーコード)を抽出して大文字に変換
    vendor_code=$(echo "$1" | tr ':' '-' | tr '[:lower:]' '[:upper:]' | cut -d'-' -f1,2,3 | tr -d ':' | tr -d '-')
    
    # 2文字ずつハイフンで区切って検索
    formatted_code=$(echo $vendor_code | sed 's/./&/2;s/./&/5' | tr ' ' '-')
    
    grep -i "$formatted_code" /usr/share/ieee-data/oui.txt
}

# 使用例
mac_lookup "dc:a6:32:72:ef:e9"
# または
mac_lookup "DC-A6-32-72-EF-E9"

このスクリプトは:

  • コロン(:)またはハイフン(-)で区切られたMACアドレスを受け付け
  • 大文字小文字を問わず
  • 最初の6文字(OUI部分)を抽出
  • 適切なフォーマット(XX-XX-XX)に変換してルックアップ

これを.bashrcや.zshrcに追加して使うことができます。試してみましょうか?

いい感じだけど、不要な処理があるので指摘してみる。

Q: grep -i しているので tr で大文字変換は不要なんじゃない?

Claude: そうですね!ご指摘ありがとうございます。grep -iで大文字小文字を区別しない検索をしているので、tr ‘[:lower:]’ ‘[:upper:]’は不要です。
シンプルになったバージョンを作りましょう:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスから
    # 最初の6文字(ベンダーコード)を抽出
    vendor_code=$(echo "$1" | tr ':' '-' | cut -d'-' -f1,2,3 | tr -d '-')
    
    # 2文字ずつハイフンで区切って検索
    formatted_code=$(echo $vendor_code | sed 's/./&/2;s/./&/5' | tr ' ' '-')
    
    grep -i "$formatted_code" /usr/share/ieee-data/oui.txt
}

より簡潔で効率的になりました。

Q: cut -d の後の tr -d ‘-‘ も不要だと思う

Claude: そうですね!さらにシンプルにできます:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスから
    # 最初の6文字(ベンダーコード)を抽出
    vendor_code=$(echo "$1" | tr ':' '-' | cut -d'-' -f1,2,3)
    
    grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
}

cut -d’-‘ -f1,2,3で既にXX-XX-XXの形式で取得できているので、フォーマットの変換も不要でした。無駄な処理を省いてよりシンプルになりました。

Q: 更に改良して、複数のマックアドレスを一度に入力できない?

Claude: はい、複数のMACアドレスを処理できるように改良しましょう:

mac_lookup() {
    for mac in "$@"; do
        vendor_code=$(echo "$mac" | tr ':' '-' | cut -d'-' -f1,2,3)
        echo "MAC: $mac"
        grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
        echo
    done
}

使い方:

mac_lookup "dc:a6:32:72:ef:e9" "00:11:22:33:44:55" "aa:bb:cc:dd:ee:ff"

この改良版では:

  • 複数のMACアドレスをスペース区切りで入力可能
  • 各MACアドレスに対して元のアドレスを表示してから結果を表示
  • 見やすいように各結果の間に空行を挿入

いかがでしょうか?

こんなふうに、大雑把な指示でもわりといい感じでスクリプトを完成させられたのは便利だった。

どうでもいいけど、Claude の実行結果をワードプレスにコピペするの結構だるかった。何かいい方法ないだろうか?

LM22 タッチパッドの無効時間を調整

久々のエントリです。

以前も書いたかもしれませんが Thinkpad で Linux Mint 22 を動かしています。概ね快適なのですが 22 にアップグレードしてからどうも文字を入力している最中にカーソルが飛んでしまうことが多い気がしていました。

カーソルが飛んだついでに範囲指定されてしまい上書き入力されることが度々あり地味にイライラさせされています。

そんなのは Touchpad の設定で入力中は無効にすればいいじゃんと思いますが、このように設定済みですが、あまり効果はないみたいです。

System Settings – Mouse and Touchpad

しばらくは我慢していたのですが、耐えられなくなり少し探ってみます。Claude で聞いてみると ~/.config/autostart に設定ファイルがあるかもってことで見てみるとありました。

‘disable touchpad while typing.desktop’ ってファイルがそれっぽいです。中身はこんな感じです。

[Desktop Entry]
   2   │ Type=Application
   3   │ Exec=syndaemon -i .5 -K -t -R -d
   4   │ X-GNOME-Autostart-enabled=true
   5   │ NoDisplay=false
   6   │ Hidden=false
   7   │ Name[en_US]=disable touch while typing
   8   │ Comment[en_US]=must be disable 'Touchpad while input'
   9   │ X-GNOME-Autostart-Delay=0

Exec で syndaemon を起動しています。その引数がパラメータなのですが、インターバル(タイムアウト)を意味する -i の値を GUI では変えられなさそうです。

それぞれのパラーメータの意味は、

-i 無効化する秒数を設定(少数指定できるっぽい)
-K タイピング中は無効にする
-t タップのみ無効にする(カーソル移動は可能)
-R テンキー入力中は除外(無効にしない)
-D デーモンとして実効

っていう感じらしいです。 .5 が短すぎるかもしれないのと、-t が邪魔してそうなので一旦

$ pskill syndaemon
$ syndaemon -i 1.2 -K -R -d

としてみると良さげな感じ。

永続化するために ‘disable touchpad while typing.desktop’ の syndaemon のところを下のように書き換えた。

syndaemon -i 1.2 -K -R -d

autostart を反映させるには、一旦ログオフしてから再度ログインする必要がある。

こういう微調整の方法が残されているのが Linux のいいところではあるが一方でいちいち面倒なのも確か。ともあれこれでいい感じになかもしれない。