问题描述
在最近的ubuntus中(具体来说,最让我感兴趣的是12.04)/var/run
是tmpfs,因此我假设每次重启都会启动它。
然而,我看到一些文件夹,如/var/run/mysqld
和许多其他文件夹。如何在每次重启时创建这些文件夹?是否有一些模板文件夹复制到/var/run/
(如果是,哪个脚本会这样做),或者每个文件夹mkdir
分别编辑,或者是什么?
编辑:请不要回答/var/run
是持久的,或者/run
是持久性的。因为它不是。
即使你的系统是如此,它也不是常规的12.04。
最佳解决办法
(感谢@Zulakis和an answer on Serverfault指出这个答案跟不上Ubuntu正在进行的开发。)
从从upstart切换到systemd的基本原理?开始采用systemd
,现在有一个集中的机制来创建临时文件和目录,例如这些。希望使用此方法的服务可以在其自己的启动脚本中删除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
。
老PRE-SYSTEMD答案:
看起来它们是由各个服务在启动时动态创建的:
$ 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表单将“创建指定目录的所有组件”。
次佳解决办法
对于遇到此线程的任何人,因为您正在寻找一个解决方案,以便您可以如何配置应用程序,以便它在/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
pre-start脚本部分完成了这一操作。
第三种解决办法
新的tmpfs-mounted /run
文件夹允许udev,lvm和mdadm等程序将运行时数据从initrd保留到关闭状态。
/var
是任何Linux /UNIX系统的标准目录 – 它代表”variable”,并且是许多日志,cahces,BUT还编程变量设置文件甚至一些系统配置数据库的地方。
/var
中的大多数东西都应该被系统正确清除和调节。您的虚拟内存交换文件也存在于/var
中,所以不要乱用它。 /var/run
还拥有大量正在运行的进程daemans的状态和参数信息。
此目录包含描述系统自引导以来的系统信息数据。必须在引导过程开始时清除(删除或截断)此目录下的文件。程序可能包含/var/run
的sub-directory;对于使用多个run-time文件的程序,我们鼓励这样做。
好吧,因为/var/run
安装为tmpfs。这意味着当你的机器启动它时它完全是空的,这意味着要防止守护进程因为left-over PID-file而无法启动。
启动脚本通常在使用它们之前创建所需的目录。如果要存储PID-file,请直接将其放入/var/run
或在创建PID-file之前创建目录。这不是存储需要在重新启动时保留的数据的地方。
来源:路径名称& Linux系统管理员指南
第四种办法
Yet, I see there some folders, like /var/run/mysqld and numerous others. How those folders created on each reboot ? Is there some template folder which copied to /var/run/ (and if so, which script does that), or each folder mkdired separately, or what ?
如File Hierarchy Standard中所定义,/var/run
或/run
用于存储易失性运行时数据。
在那里创建的所有文件夹和文件都由创建文件的相应程序管理。没有复制的模板文件夹这样的东西,每个程序都可以使用该文件夹来存储易失性信息。系统重新启动时,存储的数据会丢失。
使用/run
文件夹的一个常见问题是存储运行守护程序的pid
,这些标记文件包含进程的进程号。它们主要用于您可以在/etc/init.d/
中找到的启动/停止脚本
我希望能让你清楚明白!
BR
参考资料