在最近的 ubuntus(具体来说,我最感兴趣的是 12.04)中/var/run
是 tmpfs,因此我假设它在每次重启时都是空的。
但是,我看到有一些文件夹,像/var/run/mysqld
许多其他文件夹一样。每次重启时这些文件夹是如何创建的?是否有一些复制到的模板文件夹/var/run/
(如果是,哪个脚本执行此操作),或者每个文件夹mkdir
都是单独创建的,还是什么?
编辑:
请不要回答“/var/run
坚持不懈”或“/run
坚持不懈”。因为事实并非如此。
即使如此你的系统,但在常规的 12.04 上并非如此。
答案1
(感谢@Zulakis 和Serverfault 上的答案指出这个答案没有跟上 Ubuntu 的持续发展。)
随着systemd
15.04,现在有一个集中机制来创建这些临时文件和目录。希望使用此方法的服务可以删除mkdir
其自己的启动脚本中的命令,而是将.conf
文件放在/etc/tmpfiles.d
、/run/tmpfiles.d
或/usr/lib/tmpfiles.d
中,Ubuntu 服务似乎更喜欢最后一个选项。例如,我的系统现在有:
$ egrep -r /var/run /usr/lib/tmpfiles.d
/usr/lib/tmpfiles.d/var.conf:L /var/run - - - - ../run
/usr/lib/tmpfiles.d/sudo.conf:d /var/run/sudo 0711 root root
/usr/lib/tmpfiles.d/sudo.conf:D /var/run/sudo/ts 0700 root root
/usr/lib/tmpfiles.d/postgresql.conf:d /var/run/postgresql 2775 postgres postgres - -
/usr/lib/tmpfiles.d/sshd.conf:d /var/run/sshd 0755 root root
/usr/lib/tmpfiles.d/screen-cleanup.conf:d /var/run/screen 0775 root utmp
如果目录不存在则创建d
目录,之后是路径,其余是权限、用户和组。无论相应的服务是否启动,都会创建这些目录。
有关完整文档,请参阅man tmpfiles.d
。
旧的系统化前答案:
看起来它们是在各个服务启动时动态创建的:
$ sudo egrep -r 'mkdir.*/var/run' /etc
/etc/init.d/ssh: mkdir /var/run/sshd
/etc/init.d/bind9: mkdir -p /var/run/named
/etc/init.d/timidity: mkdir -p /var/run/timidity
/etc/init.d/bzflag: mkdir -p /var/run/bzflag
/etc/init.d/dns-clean:mkdir /var/run/pppconfig >/dev/null 2>&1 || true
/etc/init/winbind.conf: mkdir -p /var/run/samba/winbindd_privileged
/etc/init/dbus.conf: mkdir -p /var/run/dbus
/etc/init/ssh.conf: mkdir -p -m0755 /var/run/sshd
/etc/init/libvirt-bin.conf: mkdir -p /var/run/libvirt
/etc/init/cups.conf: mkdir -p /var/run/cups/certs
我相信这是处理mysqld的:
[ -d /var/run/mysqld ] || install -m 755 -o mysql -g root -d /var/run/mysqld
/lib/init/apparmor-profile-load usr.sbin.mysqld
man install
表示 -d 形式将“创建指定目录的所有组件”。
答案2
新的 tmpfs-mounted/run
文件夹允许 udev、lvm 和 mdadm 等程序保留来自 initrd 的运行时数据直到关闭。
/var
是任何 Linux/UNIX 系统的标准目录 - 它代表“变量”,是许多日志、缓存、程序变量设置文件甚至一些系统配置数据库所在的位置。
中的大多数内容/var
都应由系统正确清除和管理。虚拟内存的交换文件也位于其中,/var
因此不要弄乱它。/var/run
还保存了正在运行的进程守护程序的大量状态和参数信息。
此目录包含自系统启动以来的系统信息数据。必须在启动过程开始时清除(根据需要删除或截断)此目录下的文件。程序可以有一个子目录/var/run
;对于使用多个运行时文件的程序,建议这样做。
既然/var/run
是作为 tmpfs 安装的。这意味着当您的机器启动时它是完全空的,这样做是为了防止由于剩余的 PID 文件而导致守护进程无法启动之类的事情。
启动脚本通常在使用它们之前创建它们所需的目录。如果您想存储 PID 文件,请/var/run
直接将其放入,或在创建 PID 文件之前创建一个目录。这不是存储需要在重启后保留的数据的地方。
来源:Pathname 和 Linux 系统管理员指南
答案3
如果您遇到此线程是因为您在寻找解决方案,以了解如何配置应用程序,使其创建目录,/var/run
以便可以存储其 sock 或 pid 文件或其他内容……这里有一个例子。我遇到此线程是因为我想将 MySQL sock 文件存储在 中/var/run/mysqld
。因此,在我遇到此线程后,我开始在文件中寻找/etc/init
示例。dbus 是一个不错的选择。然后,我想出了这个 mysql 启动配置:
start on runlevel [2345]
stop on runlevel [!2345]
expect daemon
pre-start script
mkdir -p -m0755 /var/run/mysqld
chown mysql:mysql /var/run/mysqld
end script
exec /etc/init.d/mysql start
pre-stop exec /etc/init.d/mysql stop
启动前脚本部分起到了作用。
答案4
您的假设并不完全正确。文件夹的位置/var
是可以协商的 - 也就是说,您可以使用备用分区或卷来定位/var
文件夹。无论/var
文件夹位于何处,文件/var/run
夹都是指向文件夹的符号链接/run
,其内容在重新启动后仍会保留,尽管其中的许多文件/run
是在启动期间由启动的服务生成或修改的。因此,正是这些服务(例如mysqld
)要求将文件加载到/var/run
目录中,并设置为在当前不存在子目录时创建子目录。