每次重启时如何在 /var/run 中创建文件夹

每次重启时如何在 /var/run 中创建文件夹

在最近的 ubuntus(具体来说,我最感兴趣的是 12.04)中/var/run是 tmpfs,因此我假设它在每次重启时都是空的。

但是,我看到有一些文件夹,像/var/run/mysqld许多其他文件夹一样。每次重启时这些文件夹是如何创建的?是否有一些复制到的模板文件夹/var/run/(如果是,哪个脚本执行此操作),或者每个文件夹mkdir都是单独创建的,还是什么?

编辑:
请不要回答“/var/run坚持不懈”或“/run坚持不懈”。因为事实并非如此。

即使如此你的系统,但在常规的 12.04 上并非如此。

答案1

(感谢@Zulakis 和Serverfault 上的答案指出这个答案没有跟上 Ubuntu 的持续发展。)

随着systemd15.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目录中,并设置为在当前不存在子目录时创建子目录。

相关内容