🤖

Plamo Linux の elogind 対応

2021/02/11に公開

Plamo Linux 7.x では、世の中一般的に使われている systemd を使わず、昔ながらの sysvinit を使用しています。

これまではログインユーザーのセッション管理は ConsoleKit2 を使っていました。しかし、最近では参考にしている BLFS でも、ここは systemd から一部(logind)を抜き出した elogind が使われており、そろそろ Plamo でも elogind に移行しようと考えて、結構長い間対応作業を進めていました。

以下は既存ユーザーが elogind 関連のパッケージを更新した場合に必要な作業や確認箇所を書いたモノで、新規インストールし、ユーザーも新規に作成する場合は不要です。新規インストールはするけど $HOME は使い回す場合は一応目を通してください。

更新履歴

  • 2021-02-14: cgroupfs_mount パッケージの記述を追加

更新パッケージ

elogind 対応で更新が必要なパッケージは次のとおりです。ただし、すべてが必要かというとそうでもなく、関連パッケージとして更新したものもありますし、更新が不要なパッケージもあるかもしれません。これは、対応を行った人(筆者です :-p)自身がこのあたりを充分に理解しておらず、elogind 対応を行うために最低限更新が必要なパッケージはどれか?というのを把握していないという事情もあります(コラ)。

  • accountsservice
  • dbus
  • elogind
  • etc
  • glib
  • gsettings_desktop_schemas
  • gvfs
  • lightdm
  • lightdm_gtk_greeter
  • linux_pam
  • mate_session_manager
  • polkit
  • polkit_gnome
  • pulseaudio
  • udisks2
  • upower
  • xinit
  • xorg_server
  • xscreensaver
  • cgroupfs_mount

更新後の作業

次の作業が必要です。

~/.xinitrc の書き換え

runlevel 3 で startx コマンドを使っている場合~/.xinitrc の書き換えが必要です。~/.xinitrc 内には、

LAUNCH="ck-launch-session dbus-launch --exit-with-session"

という行があります。ck-launch-session は ConsoleKit2 に含まれるコマンドですので、次のように書き換えてください(該当コマンドの削除)。

LAUNCH="dbus-launch --exit-with-session"

runlevel 5 で使っている場合、特に書き換えは不要です。

確認

上記の「更新後の作業」以外は特に何かすることはありませんが、念のため、次のようなところを確認すると良いでしょう。

pam設定ファイルの確認

elogind の doinst.sh でパッケージインストール時に /etc/pam.d/system-session の書き換えを行っています。

これは、従来 ConsoleKit2 用に次のような行がありました。

session optional        pam_ck_connector.so nox11

これを、elogind パッケージインストール時に elogind 用に次のように書き換えています。

session optional        pam_elogind.so

このように書き換わっているかを確認してください。

設定がすべて正しく行われ、正しくデスクトップ環境が起動していれば、xfce4 や mate などのデスクトップ環境を起動した後、一般ユーザーからも特権が必要な処理の一部が可能なはずです。例えばシャットダウンや再起動ボタンが有効になっていたりするでしょう。

動作確認

きちんとセッション管理がなされているかどうか?については次のように確認します。

まずはセッションリストを表示します

$ loginctl list-sessions
SESSION  UID USER  SEAT  TTY
     c2 1000 karma seat0    

1 sessions listed.

表示されたセッション(例ではc2)の情報を表示します

$ loginctl show-session c2
Id=c2
User=1000
Name=plamo
Timestamp=Fri 2021-02-12 21:52:39 JST
TimestampMonotonic=27528342
VTNr=7
Seat=seat0
Display=:0
Remote=no
Service=lightdm
Desktop=xfce
Leader=1903
Audit=4294967295
Type=x11
Class=user
Active=yes
State=active
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
LockedHint=no

ここで Active=yes となっているところがポイントです。これで、このセッションが有効であることが確認できます。

確認後の作業

動作確認が済んだら、念のため次の作業を行ってください。

ConsoleKit2 パッケージの削除

ConsoleKit2 パッケージを削除してください。削除しなくても使われないだけなので削除は必須ではないかもしれませんが、トラブルの芽をつんでおくためにも、削除しておいたほうが良いでしょう。

# removepkg ConsoleKit2

補足

startx コマンドについて

runlevel 3 で startx コマンドで X を起動している場合、一応必要なオプションを指定した状態となるように startx コマンドにパッチを当てています。

ただし、これはオリジナルには取り込まれていないパッチで、もしかしたら問題があるかもしれません。

正しくは、

$ startx -- vt${XDG_VTNR} -keeptty

と実行するようです(おそらく)。(他に指定しているオプションがあればそれも指定してください)

手元のテスト環境では $XDG_VTNR は定義された状態ですが、もし未定義の場合は tty コマンドで表示される /dev/tty1 の末尾の数字を指定すれば良いようです。

この辺り理解していないので間違っている場合はご指摘ください。次の URL あたりで関連する話題が載っていますのでご参考にどうぞ。

cgroupfs_mount パッケージ

Plamo 7.x に含まれる lxc パッケージを使って LXC コンテナを起動するために、cgroupfs_mount パッケージを 16_virtualization カテゴリに含めていました。

このパッケージは、昔の Ubuntu/Debian 方面で cgroup を使うために使われていたシェルスクリプトです。このスクリプトは github 上でメンテナンスしています。

これを Plamo で使うために筆者が細かい調整を加えたものを cgroupfs_mount パッケージとして作成しています。

これまでは、cgroup は LXC/LXD で使う程度で、他にcgroup が必要なパッケージはなかったと思うので、cgroupfs のマウントはLXC/LXD 関係の処理の直前で行っていましたし、アンマウントはシャットダウン、再起動の場合、真っ先に行っていました(S98とかで起動、K02とかで停止)。

今回、加わった elogind は systemd の一部を抜き出したものですので、積極的にプロセス管理に cgroup を使います。

elogind が cgroup を使うので、elogind 関連のプログラムが cgroupfs をマウントする前に cgroupfs_mount パッケージで cgroup v1 をマウントするようにしました(S28)。このようにしないと、elogind が cgroup v2 を/sys/fs/cgroup にマウントし、その後 /sys/fs/cgroup に cgroup v1 をマウントする動きになり、/sys/fs/cgroup 以下がぐちゃぐちゃになります(ぐちゃぐちゃで気持ちわるいだけで動きますけど)。

さらに elogind がマウントする /sys/fs/cgroup/elogind というマウントポイントについては cgroupfs_mount パッケージではアンマウントしないように cgroupfs-umount コマンドを調整しています。

(上記の対応が適切なのか?正解なのか?はわかりません。引き続き不具合報告お待ちしております)

まとめ

特に elogind 対応を行ったからといって、パッと見た目が変わるわけではありませんが、今後はこの環境を元に Desktop 環境やその他のパッケージを更新していく予定ですので、今後の更新パッケージのインストールのためにも対応をお願いいたします。

不具合を発見した場合、報告をお願いいたします。

Discussion