はじめに
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.
略
- 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 failedrequired
orrequisite
module test.sufficient
— The module result is ignored if it fails. However, if the result of a module flaggedsufficient
is successful and no previous modules flaggedrequired
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 asoptional
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.