diff options
Diffstat (limited to 'sh.Linux/init.sh.in')
-rw-r--r-- | sh.Linux/init.sh.in | 189 |
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 |