df –Th をしたときに出てくる気になるあいつ — /run/user/$uid


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

はじめに

df -Thをしたとき、マウントポイントに/run/user/1000が表示されているときと、表示されていないときがあることに気づきました。
「……一体これはどういう仕様なんだ」、と気になったので調べたこと / 検証したことを備忘録としてここに記録します。

/run/user/1000とは…

今回私が用意した環境(RHEL7.9)でdf -Thを実行すると以下のような表示になります。
今回のお話の主役は最下行のの/run/user/1000です。

[ec2-user@ip-10-0-2-61 ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  471M     0  471M   0% /dev
tmpfs          tmpfs     495M     0  495M   0% /dev/shm
tmpfs          tmpfs     495M   13M  482M   3% /run
tmpfs          tmpfs     495M     0  495M   0% /sys/fs/cgroup
/dev/xvda2     xfs        10G  1.1G  9.0G  11% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/0
tmpfs          tmpfs      99M     0   99M   0% /run/user/1000

この/run/user/1000とは何なのでしょうか。

結論ファースト

  • tmps、つまり「コンピュータのメモリに作成できるファイルシステム]でフォーマットされている。
  • 1000という数字は$UIDのことである。
  • /run/user/$UIDはpam_systemdによって作成される。
  • /run/user/$UIDは個々のユーザのプロセスが使用するfileを一時的に格納する領域である。
  • ユーザがログアウトしてセッションが切れると、pam_systemdが/run/user/$uidを削除する。

つまり、ログインしたユーザのUIDに合わせて作成されるユーザごとの揮発性のストレージ領域であるというわけです。

また、このような領域が存在する理由として以下のような背景があったそうです。

  • systemd以前は/tmpが似たような役割を担っていたが、誰でも書き込める場所のためファイルの所有やパーミッションについて問題が起きやすかった。
  • systemdがユーザごとに/run/user/$uidを作成できるようになったおかげで、アクセスコントロールの問題は生じなくなった。

参考:
LinuC豆知識
https://linuc.org/study/knowledge/441/

StackExchange "What is this folder /run/user/1000?"
https://unix.stackexchange.com/questions/162900/what-is-this-folder-run-user-1000#:~:text=%2Frun%2Fuser%2F%24uid%20is%20created%20by%20pam_systemd%20and%20used%20for,these%20applications%20typically%20stored%20their%20files%20in%20%2Ftmp.

検証

設定確認

どうやら、pamの設定で制御されていることが分かりましたので実際に設定ファイルを確認してみます。

[root@ip-10-0-2-134 ~]# grep 'pam_systemd' /etc/pam.d/*
/etc/pam.d/fingerprint-auth:-session     optional      pam_systemd.so
/etc/pam.d/fingerprint-auth-ac:-session     optional      pam_systemd.so
/etc/pam.d/password-auth:-session     optional      pam_systemd.so
/etc/pam.d/password-auth-ac:-session     optional      pam_systemd.so
/etc/pam.d/runuser-l:-session   optional        pam_systemd.so
/etc/pam.d/smartcard-auth:-session     optional      pam_systemd.so
/etc/pam.d/smartcard-auth-ac:-session     optional      pam_systemd.so
/etc/pam.d/system-auth:-session     optional      pam_systemd.so
/etc/pam.d/system-auth-ac:-session     optional      pam_systemd.so

たしかに、pam設定においてpam_systemdモジュールがoptionalで利用されていることが分かります。これらの設定によって、/run/user/$uidのマウントポイントが動的に作成されるようです。

pam_systemdとは

しかし、そもそもpam_systemdとはなんなのでしょう。
manを見てみると次のように書かれてあります。

pam_systemd registers user sessions with the systemd login manager systemd-logind.service(8), and hence the systemd control group hierarchy.

  1. If it does not exist yet, the user runtime directory /run/user/$UID is either created or mounted as new "tmpfs" file system with quota applied, and its ownership changed to the user that is logging in.

ざっくり、systemd-logind.serviceと一緒に動くこと、また/run/user/$UIDを(なければ)作るとも書いてますね。先述した通りの説明です(これ以外にも色々と働きがあるようですが詳しくはmanを参照ください)。
以下、systemctl statusを実行してみると確かに当該のservice unitが動いていることも確認できます。

[root@ip-10-0-2-61 ~]# systemctl status systemd-logind
● systemd-logind.service - Login Service
   Loaded: loaded (/usr/lib/systemd/system/systemd-logind.service; static; vendor preset: disabled)
   Active: active (running) since Sat 2023-12-23 10:15:46 UTC; 48min ago
     Docs: man:systemd-logind.service(8)
           man:logind.conf(5)
           http://www.freedesktop.org/wiki/Software/systemd/logind
           http://www.freedesktop.org/wiki/Software/systemd/multiseat
 Main PID: 518 (systemd-logind)
   Status: "Processing requests..."
   CGroup: /system.slice/systemd-logind.service
           └─518 /usr/lib/systemd/systemd-logind
略

参考:
man pam_systemd
https://www.freedesktop.org/software/systemd/man/249/pam_systemd.html

作成 / 削除されるか検証

実際に/run/user/$UIDが作成されたり削除されたりするのか検証してみます。

rootユーザの場合

rootユーザでログインしている場合どうなるのでしょうか。
結論、/run/user/1000はいません。(/run/user/0はいます)

[root@ip-10-0-2-61 ~]# whoami
root
[root@ip-10-0-2-61 ~]#
[root@ip-10-0-2-61 ~]#
[root@ip-10-0-2-61 ~]# id root
uid=0(root) gid=0(root) groups=0(root)
[root@ip-10-0-2-61 ~]#
[root@ip-10-0-2-61 ~]#
[root@ip-10-0-2-61 ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  471M     0  471M   0% /dev
tmpfs          tmpfs     495M     0  495M   0% /dev/shm
tmpfs          tmpfs     495M   13M  482M   3% /run
tmpfs          tmpfs     495M     0  495M   0% /sys/fs/cgroup
/dev/xvda2     xfs        10G  1.1G  9.0G  11% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/0

ec2-userの場合

次に、ec2-userでログインした場合どうなるか確認してみます。
結論、/run/user/1000が作成されます。
(以下では別サーバからsshでec2-userとして接続しています)

[root@ip-10-0-2-82 ~]# ssh ec2-user@10.0.2.61
Last login: Sat Dec 23 10:22:45 2023 from ip-10-0-2-82.ap-northeast-1.compute.internal
[ec2-user@ip-10-0-2-61 ~]$
[ec2-user@ip-10-0-2-61 ~]$
[ec2-user@ip-10-0-2-61 ~]$ id ec2-user
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),190(systemd-journal)
[ec2-user@ip-10-0-2-61 ~]$
[ec2-user@ip-10-0-2-61 ~]$
[ec2-user@ip-10-0-2-61 ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  471M     0  471M   0% /dev
tmpfs          tmpfs     495M     0  495M   0% /dev/shm
tmpfs          tmpfs     495M   13M  482M   3% /run
tmpfs          tmpfs     495M     0  495M   0% /sys/fs/cgroup
/dev/xvda2     xfs        10G  1.1G  9.0G  11% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/0
tmpfs          tmpfs      99M     0   99M   0% /run/user/1000

カスタムで作成したユーザの場合

最後に、適当に作成したユーザ(tom, uid=1599)で接続した場合を確認してみます。
結論、/run/user/1000は削除され、/run/user/1599が作成されます。

まずユーザ作成します。

[root@ip-10-0-2-61 ~]# useradd -u 1599 tom
[root@ip-10-0-2-61 ~]#
[root@ip-10-0-2-61 ~]#
[root@ip-10-0-2-61 ~]# id tom
uid=1599(tom) gid=1599(tom) groups=1599(tom)
[root@ip-10-0-2-61 ~]#
[root@ip-10-0-2-61 ~]#
[root@ip-10-0-2-61 ~]# passwd tom
Changing password for user tom.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.

また、別サーバからsshでtomとして接続してみます。

[root@ip-10-0-2-82 ~]# ssh tom@10.0.2.61
tom@10.0.2.61's password:
[tom@ip-10-0-2-61 ~]$
[tom@ip-10-0-2-61 ~]$
[tom@ip-10-0-2-61 ~]$ id tom
uid=1599(tom) gid=1599(tom) groups=1599(tom)
[tom@ip-10-0-2-61 ~]$
[tom@ip-10-0-2-61 ~]$
[tom@ip-10-0-2-61 ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  471M     0  471M   0% /dev
tmpfs          tmpfs     495M     0  495M   0% /dev/shm
tmpfs          tmpfs     495M   13M  482M   3% /run
tmpfs          tmpfs     495M     0  495M   0% /sys/fs/cgroup
/dev/xvda2     xfs        10G  1.1G  9.0G  11% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/0
tmpfs          tmpfs      99M     0   99M   0% /run/user/1599

想定通りの動作ですね。

suした場合

蛇足ですが、suした場合はどうなるのか検証してみます。
結論、作成されたり削除されたりはしませんでした。

[tom@ip-10-0-2-61 ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  471M     0  471M   0% /dev
tmpfs          tmpfs     495M     0  495M   0% /dev/shm
tmpfs          tmpfs     495M   13M  482M   3% /run
tmpfs          tmpfs     495M     0  495M   0% /sys/fs/cgroup
/dev/xvda2     xfs        10G  1.1G  9.0G  11% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/0
tmpfs          tmpfs      99M     0   99M   0% /run/user/1599
[tom@ip-10-0-2-61 ~]$
[tom@ip-10-0-2-61 ~]$
[tom@ip-10-0-2-61 ~]$ su - ec2-user
Password:
Last login: Sat Dec 23 11:15:20 UTC 2023 from ip-10-0-2-82.ap-northeast-1.compute.internal on pts/1
[ec2-user@ip-10-0-2-61 ~]$
[ec2-user@ip-10-0-2-61 ~]$
[ec2-user@ip-10-0-2-61 ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  471M     0  471M   0% /dev
tmpfs          tmpfs     495M     0  495M   0% /dev/shm
tmpfs          tmpfs     495M   13M  482M   3% /run
tmpfs          tmpfs     495M     0  495M   0% /sys/fs/cgroup
/dev/xvda2     xfs        10G  1.1G  9.0G  11% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/0
tmpfs          tmpfs      99M     0   99M   0% /run/user/1599

補遺 pam設定ファイルのフォーマット

pamの設定ファイルの見方についてです。
詳しくは参考のURLを参照お願いします。

module_interface    control_flag    module_name module_arguments

e.g., /etc/pam.d/system-auth:

-session     optional      pam_systemd.so

module_interface

  • auth — This module interface authenticates users. For example, it requests and verifies the validity of a password. Modules with this interface can also set credentials, such as group memberships.
  • account — This module interface verifies that access is allowed. For example, it checks if a user account has expired or if a user is allowed to log in at a particular time of day.
  • password — This module interface is used for changing user passwords.
  • session — This module interface configures and manages user sessions. Modules with this interface can also perform additional tasks that are needed to allow access, like mounting a user’s home directory and making the user’s mailbox available.

control_flag

  • required — The module result must be successful for authentication to continue. If the test fails at this point, the user is not notified until the results of all module tests that reference that interface are complete.
  • requisite — The module result must be successful for authentication to continue. However, if a test fails at this point, the user is notified immediately with a message reflecting the first failed required or requisite module test.
  • sufficient — The module result is ignored if it fails. However, if the result of a module flagged sufficient is successful and no previous modules flagged required have failed, then no other results are required and the user is authenticated to the service.
  • optional — The module result is ignored. A module flagged as optional only becomes necessary for successful authentication when no other modules reference the interface.
  • include — Unlike the other controls, this does not relate to how the module result is handled. This flag pulls in all lines in the configuration file which match the given parameter and appends them as an argument to the module.

参考URL:
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/pam_configuration_files

おわりに

Last modified: 2023-12-23

Author