The general consensus amongst distributions is that requiring /var/run to be moved to /run is a good thing(tm) – or, at least, a battle not worth fighting.
I note that the “you have to pre-mount the partition from an initrd” which is now being applied to /usr doesn’t appear to apply to /var (and thank goodness no-one is arguing that /var also has to be conjoined with the root partition)…
One of the greatest strengths of Linux is the ability to do things the way you feel is right – and there’s an awful lot of legacy software with still relies upon the existence of /var/run, and I’m just not keen on having yet another mandatory root-directory entry.
So, here is a patch which will create a custom openrc-0.11.5 ebuild in a (pre-existing) /usr/local/portage repository. As a bonus, it fixes a cosmetic bug when clearing out /var/run on boot.
diff -urx Manifest --unidirectional-new-file /usr/portage/sys-apps/openrc/files/openrc-0.11.5-bootmisc.in.patch /usr/local/portage/sys-apps/openrc/files/openrc-0.11.5-bootmisc.in.patch --- /usr/portage/sys-apps/openrc/files/openrc-0.11.5-bootmisc.in.patch 1970-01-01 01:00:00.000000000 +0100 +++ /usr/local/portage/sys-apps/openrc/files/openrc-0.11.5-bootmisc.in.patch 2012-11-21 23:14:14.732424125 +0000 @@ -0,0 +1,11 @@ +--- init.d/bootmisc.in.dist 2012-11-21 22:27:04.431229165 +0000 ++++ init.d/bootmisc.in 2012-11-21 22:28:29.844249885 +0000 +@@ -145,7 +145,7 @@ + case "$x" in + *.pid) + start-stop-daemon --test --quiet \ +- --stop --pidfile "$x" && continue ++ --stop --pidfile "$x" >/dev/null 2>&1 && continue + ;; + esac + rm -f -- "$x" diff -urx Manifest --unidirectional-new-file /usr/portage/sys-apps/openrc/files/openrc-0.11.5-init.sh.Linux.in.patch /usr/local/portage/sys-apps/openrc/files/openrc-0.11.5-init.sh.Linux.in.patch --- /usr/portage/sys-apps/openrc/files/openrc-0.11.5-init.sh.Linux.in.patch 1970-01-01 01:00:00.000000000 +0100 +++ /usr/local/portage/sys-apps/openrc/files/openrc-0.11.5-init.sh.Linux.in.patch 2012-11-21 23:14:14.699092258 +0000 @@ -0,0 +1,127 @@ +--- sh/init.sh.Linux.in.dist 2012-11-21 21:59:46.133254024 +0000 ++++ sh/init.sh.Linux.in 2012-11-21 22:03:42.763725042 +0000 +@@ -3,6 +3,62 @@ + # Copyright (c) 2007-2009 Roy Marples <roy@marples.name> + # Released under the 2-clause BSD license. + ++# This basically mounts $RC_SVCDIR as a ramdisk. ++# The tricky part is finding something our kernel supports ++# tmpfs and ramfs are easy, so force one or the other. ++svcdir_restorecon() ++{ ++ local rc=0 ++ if [ -x /usr/sbin/selinuxenabled -a -c /selinux/null ] && ++ selinuxenabled; then ++ restorecon $RC_SVCDIR ++ rc=$? ++ fi ++ return $rc ++} ++ ++mount_svcdir() ++{ ++ # mount from fstab if we can ++ fstabinfo --mount "$RC_SVCDIR" && return 0 ++ ++ local fs= fsopts="-o rw,noexec,nodev,nosuid" ++ local svcsize=${rc_svcsize:-1024} ++ ++ # Some buggy kernels report tmpfs even when not present :( ++ if grep -Eq "[[:space:]]+tmpfs$" /proc/filesystems; then ++ local tmpfsopts="${fsopts},mode=755,size=${svcsize}k" ++ mount -n -t tmpfs $tmpfsopts rc-svcdir "$RC_SVCDIR" ++ if [ $? -eq 0 ]; then ++ svcdir_restorecon ++ [ $? -eq 0 ] && return 0 ++ fi ++ fi ++ ++ if grep -Eq "[[:space:]]+ramfs$" /proc/filesystems; then ++ fs="ramfs" ++ # ramfs has no special options ++ elif [ -e /dev/ram0 ] \ ++ && grep -Eq "[[:space:]]+ext2$" /proc/filesystems; then ++ devdir="/dev/ram0" ++ fs="ext2" ++ dd if=/dev/zero of="$devdir" bs=1k count="$svcsize" ++ mkfs -t "$fs" -i 1024 -vm0 "$devdir" "$svcsize" ++ else ++ echo ++ eerror "OpenRC requires tmpfs, ramfs or a ramdisk + ext2" ++ eerror "compiled into the kernel" ++ echo ++ return 1 ++ fi ++ ++ mount -n -t "$fs" $fsopts rc-svcdir "$RC_SVCDIR" ++ if [ $? -eq 0 ]; then ++ svcdir_restorecon ++ [ $? -eq 0 ] && return 0 ++ fi ++} ++ + . "$RC_LIBEXECDIR"/sh/functions.sh + [ -r /etc/rc.conf ] && . /etc/rc.conf + +@@ -46,29 +102,34 @@ + fi + mkdir /run + else +- eerror "The /run directory does not exist. Unable to continue." +- return 1 ++ #eerror "The /run directory does not exist. Unable to continue." ++ #return 1 ++ : + fi + fi + +-if [ "$sys" = VSERVER ]; then +- rm -rf /run/* +-elif ! mountinfo -q /run; then +- ebegin "Mounting /run" +- rc=0 +- if ! fstabinfo --mount /run; then +- mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run +- rc=$? +- fi +- if [ $rc != 0 ]; then +- eerror "Unable to mount tmpfs on /run." +- eerror "Can't continue." +- exit 1 ++if [ -d /run ]; then ++ if [ "$sys" = VSERVER ]; then ++ rm -rf /run/* ++ elif ! mountinfo -q /run; then ++ ebegin "Mounting /run" ++ rc=0 ++ if ! fstabinfo --mount /run; then ++ mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run ++ rc=$? ++ fi ++ if [ $rc != 0 ]; then ++ eerror "Unable to mount tmpfs on /run." ++ eerror "Can't continue." ++ exit 1 ++ fi + fi ++ checkpath -d -m 0775 -o root:uucp /run/lock ++else ++ checkpath -d -m 0775 -o root:uucp /var/lock + fi + + checkpath -d $RC_SVCDIR +-checkpath -d -m 0775 -o root:uucp /run/lock + + # Try to mount xenfs as early as possible, otherwise rc_sys() will always + # return RC_SYS_XENU and will think that we are in a domU while it's not. +@@ -80,9 +141,4 @@ + eend $? + fi + +-if [ -e "$RC_LIBEXECDIR"/cache/deptree ]; then +- cp -p "$RC_LIBEXECDIR"/cache/* "$RC_SVCDIR" 2>/dev/null +-fi +- +-echo sysinit >"$RC_SVCDIR"/softlevel +-exit 0 ++. "$RC_LIBEXECDIR"/sh/init-common-post.sh diff -urx Manifest --unidirectional-new-file /usr/portage/sys-apps/openrc/files/openrc-0.11.5-rc.h.in.patch /usr/local/portage/sys-apps/openrc/files/openrc-0.11.5-rc.h.in.patch --- /usr/portage/sys-apps/openrc/files/openrc-0.11.5-rc.h.in.patch 1970-01-01 01:00:00.000000000 +0100 +++ /usr/local/portage/sys-apps/openrc/files/openrc-0.11.5-rc.h.in.patch 2012-11-21 23:14:14.772422358 +0000 @@ -0,0 +1,13 @@ +--- src/librc/rc.h.in.dist 2012-11-20 20:21:51.043277551 +0000 ++++ src/librc/rc.h.in 2012-11-20 20:22:12.610081532 +0000 +@@ -39,8 +39,10 @@ + #define RC_LIBEXECDIR "@LIBEXECDIR@" + #if defined(PREFIX) + #define RC_SVCDIR RC_LIBEXECDIR "/init.d" ++/* + #elif defined(__linux__) + #define RC_SVCDIR "@PREFIX@/run/openrc" ++ */ + #else + #define RC_SVCDIR RC_LIBEXECDIR "/init.d" + #endif diff -urx Manifest --unidirectional-new-file /usr/portage/sys-apps/openrc/openrc-0.11.5.ebuild /usr/local/portage/sys-apps/openrc/openrc-0.11.5.ebuild --- /usr/portage/sys-apps/openrc/openrc-0.11.5.ebuild 2012-11-19 23:31:30.000000000 +0000 +++ /usr/local/portage/sys-apps/openrc/openrc-0.11.5.ebuild 2012-11-22 00:10:20.809626760 +0000 @@ -20,7 +20,7 @@ LICENSE="BSD-2" SLOT="0" IUSE="debug elibc_glibc ncurses pam newnet prefix selinux static-libs unicode - kernel_linux kernel_FreeBSD" + +varrun kernel_linux kernel_FreeBSD" RDEPEND="virtual/init kernel_FreeBSD? ( || ( >=sys-freebsd/freebsd-ubin-9.0_rc sys-process/fuser-bsd ) ) @@ -44,6 +44,11 @@ sed -i "/^GITVER[[:space:]]*=/s:=.*:=${ver}:" mk/git.mk || die fi + if use varrun ; then + epatch "${FILESDIR}/openrc-0.11.5-rc.h.in.patch" || die "rc.h.in epatch failed" + epatch "${FILESDIR}/openrc-0.11.5-init.sh.Linux.in.patch" || die "init.sh.Linux.in epatch failed" + fi + epatch "${FILESDIR}/openrc-0.11.5-bootmisc.in.patch" || die "bootmisc.in epatch failed" # Allow user patches to be applied without modifying the ebuild epatch_user }