aboutsummaryrefslogtreecommitdiff
path: root/sh.Linux/init.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'sh.Linux/init.sh.in')
-rw-r--r--sh.Linux/init.sh.in189
1 files changed, 189 insertions, 0 deletions
diff --git a/sh.Linux/init.sh.in b/sh.Linux/init.sh.in
new file mode 100644
index 00000000..90dbea82
--- /dev/null
+++ b/sh.Linux/init.sh.in
@@ -0,0 +1,189 @@
+#!@SHELL@
+# Copyright 1999-2007 Gentoo Foundation
+# Copyright 2007-2008 Roy Marples <roy@marples.name>
+# All rights reserved. Released under the 2-clause BSD license.
+
+# This basically mounts $RC_SVCDIR as a ramdisk, but preserving its content
+# which allows us to store service state and generate dependencies if needed.
+# The tricky part is finding something our kernel supports
+# tmpfs and ramfs are easy, so force one or the other.
+mount_svcdir()
+{
+ local fs= fsopts="-o rw,noexec,nodev,nosuid" devdir="rc-svcdir" devtmp="none" x=
+ local svcsize=${rc_svcsize:-1024}
+
+ if grep -Eq "[[:space:]]+tmpfs$" /proc/filesystems; then
+ fs="tmpfs"
+ fsopts="${fsopts},mode=0755,size=${svcsize}k"
+ elif grep -Eq "[[:space:]]+ramfs$" /proc/filesystems; then
+ fs="ramfs"
+ # ramfs has no special options
+ elif [ -e /dev/ram0 -a -e /dev/ram1 ] \
+ && grep -Eq "[[:space:]]+ext2$" /proc/filesystems; then
+ devdir="/dev/ram0"
+ devtmp="/dev/ram1"
+ fs="ext2"
+ for x in ${devdir} ${devtmp}; do
+ dd if=/dev/zero of="${x}" bs=1k count="${svcsize}"
+ mkfs -t "${fs}" -i 1024 -vm0 "${x}" "${svcsize}"
+ done
+ else
+ echo
+ eerror "OpenRC requires tmpfs, ramfs or 2 ramdisks + ext2"
+ eerror "compiled into the kernel"
+ echo
+ return 1
+ fi
+
+ local dotmp=false
+ if [ -e "${RC_SVCDIR}"/deptree ]; then
+ dotmp=true
+ mount -n -t "${fs}" -o rw "${devtmp}" "${RC_LIBDIR}"/tmp
+ cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/depconfig \
+ "${RC_SVCDIR}"/nettree "${RC_LIBDIR}"/tmp 2>/dev/null
+ fi
+
+ # If we have no entry in fstab for $RC_SVCDIR, provide our own
+ if fstabinfo --quiet "${RC_SVCDIR}"; then
+ mount -n "${RC_SVCDIR}"
+ else
+ mount -n -t "${fs}" ${fsopts} "${devdir}" "${RC_SVCDIR}"
+ fi
+
+ if ${dotmp}; then
+ cp -p "${RC_LIBDIR}"/tmp/deptree "${RC_LIBDIR}"/tmp/depconfig \
+ "${RC_LIBDIR}"/tmp/nettree "${RC_SVCDIR}" 2>/dev/null
+ umount -n "${RC_LIBDIR}"/tmp
+ fi
+}
+
+. /etc/init.d/functions.sh
+. "${RC_LIBDIR}"/sh/rc-functions.sh
+[ -r /etc/conf.d/rc ] && . /etc/conf.d/rc
+[ -r /etc/rc.conf ] && . /etc/rc.conf
+
+# Set the console loglevel to 1 for a cleaner boot
+# the logger should anyhow dump the ring-0 buffer at start to the
+# logs, and that with dmesg can be used to check for problems
+if [ -n "${dmesg_level}" -a "${RC_SYS}" != "VPS" ]; then
+ dmesg -n "${dmesg_level}"
+fi
+
+# By default VServer already has /proc mounted, but OpenVZ does not!
+# However, some of our users have an old proc image in /proc
+# NFC how they managed that, but the end result means we have to test if
+# /proc actually works or not. We to this by comparing uptime to one a second
+# ago
+mountproc=true
+if [ -e /proc/uptime ]; then
+ up="$(cat /proc/uptime)"
+ sleep 1
+ if [ "${up}" = "$(cat /proc/uptime)" ]; then
+ eerror "You have cruft in /proc that should be deleted"
+ else
+ einfo "/proc is already mounted, skipping"
+ mountproc=false
+ fi
+ unset up
+fi
+
+if ${mountproc}; then
+ procfs="proc"
+ [ "${RC_UNAME}" = "GNU/kFreeBSD" ] && proc="linprocfs"
+ ebegin "Mounting ${procfs} at /proc"
+ if fstabinfo --quiet /proc; then
+ mount -n /proc
+ else
+ mount -n -t "${procfs}" -o noexec,nosuid,nodev proc /proc
+ fi
+ eend $?
+fi
+unset mountproc
+
+# Read off the kernel commandline to see if there's any special settings
+# especially check to see if we need to set the CDBOOT environment variable
+# Note: /proc MUST be mounted
+if [ -r /sbin/livecd-functions.sh ]; then
+ . /sbin/livecd-functions.sh
+ livecd_read_commandline
+fi
+
+if [ "${RC_UNAME}" != "GNU/kFreeBSD" -a "${RC_SYS}" != "VPS" ]; then
+ if grep -Eq "[[:space:]]+sysfs$" /proc/filesystems; then
+ if [ -d /sys ]; then
+ if ! mountinfo --quiet /sys; then
+ ebegin "Mounting sysfs at /sys"
+ if fstabinfo --quiet /sys; then
+ mount -n /sys
+ else
+ mount -n -t sysfs -o noexec,nosuid,nodev sysfs /sys
+ fi
+ eend $?
+ fi
+ else
+ ewarn "No /sys to mount sysfs needed in 2.6 and later kernels!"
+ fi
+ fi
+fi
+
+# Try to figure out how the user wants /dev handled
+if [ "${rc_devices}" = "static" \
+ -o "${RC_SYS}" = "VPS" \
+ -o "${RC_UNAME}" = "GNU/kFreeBSD" ]
+then
+ ebegin "Using existing device nodes in /dev"
+ eend 0
+else
+ case ${rc_devices} in
+ devfs) managers="devfs udev mdev";;
+ udev) managers="udev devfs mdev";;
+ mdev) managers="mdev udev devfs";;
+ *) managers="udev devfs mdev";;
+ esac
+
+ for m in ${managers}; do
+ # Check kernel params
+ if get_bootparam "no${m}" || ! has_addon ${m}-start; then
+ continue
+ fi
+ # Let's see if we can get this puppy rolling
+ start_addon ${m} && break
+
+ # Clean up
+ mountinfo -q /dev && umount -n /dev
+ done
+fi
+
+# Mount required stuff as user may not have then in /etc/fstab
+for x in "devpts /dev/pts 0755 ,gid=5,mode=0620 devpts" "tmpfs /dev/shm 1777 ,nodev shm"
+do
+ set -- ${x}
+ grep -Eq "[[:space:]]+$1$" /proc/filesystems || continue
+ mountinfo -q "$2" && continue
+
+ if [ ! -d "$2" ] && \
+ [ "${m}" = "devfs" -o "${m}" = "udev" ]; then
+ mkdir -m "$3" -p "$2" >/dev/null 2>&1 || \
+ ewarn "Could not create $2!"
+ fi
+
+ if [ -d "$2" ]; then
+ ebegin "Mounting $1 at $2"
+ if fstabinfo --quiet "$2"; then
+ mount -n "$2"
+ else
+ mount -n -t "$1" -o noexec,nosuid"$4" "$5" "$2"
+ fi
+ eend $?
+ fi
+done
+
+# If booting off CD, we want to update inittab before setting the runlevel
+if [ -f /sbin/livecd-functions.sh -a -n "${CDBOOT}" ]; then
+ ebegin "Updating inittab"
+ livecd_fix_inittab
+ eend $?
+ telinit q &>/dev/null
+fi
+
+. "${RC_LIBDIR}"/sh/init-common-post.sh