2020-10-15 (Th) [長年日記]
_ systemd-homed に手を出してみた
/etc/passwd や /etc/group に手を加えずにユーザ追加できんかな、と思ってた。 /etc/passwd が drop-in に対応すればいいのに、と。 ふと気づけば systemd-homed がユーザ管理できるようになっていた。
というわけで試してみる。
/etc/nsswitch.conf に systemd が入ってる必要があるし、 pam でも pam_systemd_homed.so を使う設定になってる必要がある。 が、そこの説明は省略。
もともと
- masm
- /home/masm
- UID:1000
- GID:1000
な感じ。でストレージは zfs。
homed は、ホームディレクトリの暗号化ができて、 いろいろなストレージにホームディレクトリを置ける。 luks とか fscrypt とか。
luks なんかだと、イメージファイルをどこかに置いておいて、 それを復号してホームに mount する。
で、ストレージとして、単なるディレクトリにも対応していて、 よくわからないけど、bind mount しているのだろうと思う。
というわけで、
- user: masm
- home: /home/masm
- image: /homedir/masm
- UID: 1000
- GID: 1000
という感じでいく。
まず、旧来の方法でユーザを削除して、ホームディレクトリは退避して、 万一に備えてバックアップを取っておく。
ここで一旦 reboot した方がいいみたい。nss ってどこかにキャッシュしてるのかな。
homectl create masm --uid 1000 --storage directory --image-path /homedir/masm
新規ユーザ用のパスワードを2回入力する。
ユーザ名 masm で、UID 1000 で、ストレージはディレクトリで、イメージは /homedir/masm とする。指定してないけど、ホームは /home/masm。 ログイン時に /homedir/masm が /home/masm に bind mount される。
どっかの記事を読んでいて、ホームが /home/masm.homedir に変わっちゃうのか? 使えね−w と 思ったけど、それは間違い。↑これで正しそう。
で、ホームを復元しないといかんので…
- /homedir/masm を /homedir/masm- に rename する。まだ消さない。
- 退避していたホームを /homedir/masm に rename する。
- /homedir/masm-/.identity ファイルを /home/masm/ にコピーする。このファイルの中にパスワードとか含まれてるみたい。
あとは、おもむろにログイン。 カレントディレクトリは /home/masm で、中身もちゃんと見えてるはず。
えーっと、なんかちょっとミスった? ユーザを作り直したい? という場合は
homectl remove masm
で消せる。ただし、/homedir/masm も消える!!! ちゃんとその前に退避しておきましょう。
「時間かかってる! やばい!」と思って C-c で止めたけど、コマンドは止まったけど、 裏で削除が動き続けてて、結局全部消してくれた。orz zfs の snapshot を clone して promote して、その他調整して復活させられる目に遭った。
homectl update masm --image-path=/another/dir
した時、現在のディレクトリがないよ、と言われてできなかった。 おそらく、元のディレクトリから新しいディレクトリへ中身を移動するつもりだったのでは なかろうか。
いたれりつくせり、余計なお世話。
さて、これでだいたい大丈夫かな。
real name や shell は
homectl update --real-name 'Foo Bar'
homectl update --shell /usr/bin/zsh
で変更できる。 ただし、なぜかどちらも root のパスワードが必要で、ユーザのパスワードも必要。
それから、新規作成したユーザをグループに所属させたい場合は
homectl update masm --member-of=wheel
wheel と docker の両方に所属させたい場合は
homectl update masm --member-of=wheel,docker
その後、片方のみを指定して update すると、それだけしか所属しなくなる。 所属させたいグループを常に全て指定してやる必要があるみたい。