问题描述
从technical overview of Ubuntu 11.10 Oneiric:
Ubuntu 11.10 has migrated away from
/var/run
,/var/lock
and/dev/shm
and now uses/run
,/run/lock
and/run/shm
instead (respectively).
-
我在我的应用程序中硬编码这些路径,为什么对Oneiric做出这种改变?
-
我可以做些什么来使我的应用程序向后 – 和forward-compatible?除了先检查是否存在
/run
,然后再检查/var/run
,还有其他更好的方法吗?
最佳解决方法
目的是减少tmpfs
文件系统的数量。在11.04,在/var/lock
,/var/run
和/dev/shm
有单独的tmpfs
文件系统。如果这些目录全部位于单个父目录下,那么只需要一个tmpfs
。它还为进一步的运行时状态数据提供了一个明显的位置,这些数据不应该在重新启动时保留。
除非您的应用程序依赖于文件的规范路径,否则您的应用程序应该无需修改即可运行,因为旧的位置将被符号链接到新的位置。 AppArmor策略是取决于真实路径名称的一种情况,这就是为什么它被特别提及。
以下链接应该有助于解释理由:
-
http://lists.fedoraproject.org/pipermail/devel/2011-March/150031.html
-
https://lists.linuxfoundation.org/pipermail/fhs-discuss/2011-May/000061.html
次佳解决方法
-
/run
是用于存储瞬态文件的新的cross-distribution tmpfs位置,即包含run-time信息的文件,可能需要或可能不需要在启动过程中尽早写入,并且不需要在重新启动时保留。使
/run
目录可用使我们更接近于可以正常使用系统的情况,并在read-only上安装根文件系统,而不需要任何笨重的解决方法,例如aufs/unionfs
覆盖。/run
替换文件系统层次结构标准中描述的几个现有位置:-
/var/run
→/run
-
/var/lock
→/run/lock
-
/dev/shm
→/run/shm
[目前只有Debian计划这样做] -
/tmp
→/run/tmp
[可选;目前只有Debian计划提供此功能] -
/run
还替换了一些用于临时文件的其他位置: -
/lib/init/rw
→/run
-
/dev/.*
→/run/*
-
/dev/shm/*
→/run/*
-
/etc
→/run/*
下的可写文件
(所以你可能会期望这些移动)。
-
-
我会建议在软件中创建一个部分,在这些部分中设置变量中的这些目录,更改代码以使用这些变量,然后根据所使用的系统更改变量(但我敢打赌,您已经知道这一点)。
第三种解决方法
根据我所读到的,这是关于为什么/运行被引入的原始解释。 http://lwn.net/Articles/436012/
第四种方法
注意:由于/运行介绍,小配置可能会遇到麻烦。我的Ubuntu服务器是256Mo RAM,并且/run默认设置为49Mo。在启动时,它会填满文件系统直到完整。在fstab中进行更改不会影响tempfs /运行大小。我在gg上找到的其他程序也没有。我发现要在初始化脚本中添加以下解决方案:/etc/rc.local
mount -t tmpfs tmpfs /run -o remount,size=85M
行要在启动时扩展(85M适用于我的配置)。
第五种方法
您不应该对这些/run
路径进行硬编码!
-
使用
/var/run
,因为符合链接将适用于/run
(如果适用) -
/var/lock
与上面相同 -
不要硬编码
/dev/shm
有史以来,总是使用shm_open
等(POSIX API)