Plamo Linux の elogind 対応
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 あたりで関連する話題が載っていますのでご参考にどうぞ。
- https://bugzilla.redhat.com/show_bug.cgi?id=806491
- https://wiki.archlinux.org/index.php/allow_users_to_shutdown
- https://bbs.archlinux.org/viewtopic.php?id=152347
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