Trixie 移行の総仕上げ ― Linger設定と XDG_RUNTIME_DIR の「容量不足・サスペンド」を解決する

みなさん、こんにちは。

前回、Raspberry Pi OS Trixie でオーディオ環境を安定させるために、PulseAudio を常駐させる方法をご紹介しました。

その中で触れた 「Linger(居残り)」設定 ですが、実はこれ、設定しただけでは解決しない「もう一つの大きな罠」がありました。

「Linger を有効にしたのに、プログラムがディレクトリを見失う」
「ディレクトリはあるのに、録音処理がやっぱり止まる……」

実は、Lingerはプロセスを居残りさせるための強力な武器ですが、万能ではありません。前回は軽く触れることしかしなかったのですが、今回は、サービスの安定稼働を左右する XDG_RUNTIME_DIR の仕様と、それを超えた先にある 「デバイスのサスペンド問題」 の解決策を詳しく解説します。

 


 

基礎知識 – XDG_RUNTIME_DIR とは何か?

 

まず、私たちがよく目にする /run/user/1000(ユーザーID 1000の場合)といったパスの正体を知っておきましょう。これは XDG_RUNTIME_DIR と呼ばれる、ユーザーごとの一時的な作業領域(tmpfs)です。

通常、このディレクトリは pam_systemd というモジュールが、ユーザーの 「ログインセッション」 を検知した瞬間に初めて作成します。

  • ログイン時: SSHやGUIで入ると PAM 経由で作成される。
  • ログアウト時: セッションが終了すると、中身ごと削除される。

つまり、ヘッドレス(自動起動)環境では、OSが起動してもこのディレクトリは存在せず、サービスが「保存先が見つからない」とエラーを吐いて止まってしまうのです。

 


 

Linger設定でディレクトリを「自動作成」させる

 

この問題を解決するのが、前回も登場した Linger(居残り)設定 です。

# ユーザー名を指定して実行
sudo loginctl enable-linger <ユーザー名>

このコマンドを実行することで、ログインしなくてもシステム起動時にそのユーザーのサービスマネージャー(systemd –user)が立ち上がり、同時に XDG_RUNTIME_DIR(/run/user/xxxx)が自動的に作成・保持 されるようになります。

これで「ディレクトリがない」という問題はクリアされます。しかし、ここからがヘッドレス環境における本当の戦いです。

 


 

罠 – Linger でディレクトリを作っても「録音」は止まる?

 

「ディレクトリは確かにある。PulseAudioも動いている。なのに録音がハングアップする……」

実は、Lingerはあくまで「ソフトウェア(ディレクトリとプロセス)」を居残りさせるものであり、物理的な 「オーディオデバイスの省電力ロジック」 までは制御してくれないのです。

サスペンド問題の正体

Debianのサウンドサーバーの標準である PipeWire(およびその互換レイヤー、PulseAudioも含む)は、しばらく入力がないデバイスを SUSPENDED(サスペンド) 状態にします。デスクトップ環境ではマイクを音量調節アプリが握ってサスペンドを回避できたかもしれませんが、ヘッドレス環境では簡単にサスペンドしてしまいます。

その結果、Linger で PulseAudio を常駐させても、肝心のデバイスが眠ったままだと、PyAudio などのライブラリは「データが流れてくるのを待ち続けて」そのままフリーズしてしまいます。Linger でディレクトリを確保しただけでは、デバイスの深い眠りまでは叩き起こせないのです。

 


 

解決策 – PulseAudio で「探し」、ALSA で「叩く」

 

ここで辿り着いたのが、前回ご紹介した 「管理(特定)は PulseAudio、実務(録音)は ALSA」 というハイブリッド方式です。

なぜ ALSA なのか?

ALSA (arecord) はサウンドサーバーよりも低いレイヤーで動作します。

  • PulseAudio: デバイスの状態を管理し、必要に応じてサスペンドさせる。
  • ALSA: サウンドサーバーの状態に関係なく、カーネル経由で直接ハードウェアにアクセスする。

つまり、PulseAudio が「このデバイスはお休み中」と主張していても、ALSA で直接叩きに行けば、サスペンド状態を無視して強制的にデータを吸い出せる わけです。

実装では、pactl を使ってデフォルトソースに紐づく ALSA カード番号を特定し、その番号を使って arecord を実行します。これにより、「デバイス管理の柔軟性」と「録音の絶対的な安定性」を両立させることができました。

 


 

XDG_RUNTIME_DIR の「容量不足」にも注意!

 

最後に、運用を続ける中で遭遇する「No space left on device」エラーについても触れておきます。

XDG_RUNTIME_DIR は RAM を消費する tmpfs であり、デフォルトでは 「物理メモリの 10%」 という上限が設定されています。

  • RAM 4GB モデル: 約 400MB が上限
  • RAM 1GB モデル: 約 100MB が上限

高音質な録音データをここに溜め込むと、10% の壁はすぐにやってきます。もし足りない場合は、設定ファイルを編集して上限を拡張しましょう。

上限の拡張手順

  1. 設定ファイルを開く: sudo vi /etc/systemd/logind.conf
  2. RuntimeDirectorySize= の項目を探し、値を設定する(例:20% や 500M): RuntimeDirectorySize=20%
  3. 反映させる: sudo systemctl restart systemd-logind

 


 

ヘッドレス環境でサウンドサーバーを安定稼動させる

 

ヘッドレス環境のサウンドサーバーでバックグラウンド処理を完璧にするための3箇条です。

  1. Linger を有効にする: 起動時にディレクトリとプロセスを確保。
  2. ALSA で録音する: サウンドサーバーのサスペンド問題をバイパスして確実にデータを取る。
  3. 容量制限を意識する: 10% の壁を必要に応じて logind.conf で広げる。

OSの仕様変更は時に厄介ですが、仕組みを理解して適切に構成すれば、これまで以上に堅牢なシステムを構築できます。

 

本日も最後までお読みいただきありがとうございました。

それでは、よい Raspberry Pi ライフを!

カテゴリ: Raspberry Pi

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール