X-Git-Url: https://git.pld-linux.org/?a=blobdiff_plain;f=rc.d%2Frc.sysinit;h=b5fc94fff66196da6f4e172c50aa1707cccc7e7d;hb=1062272ed0bc43356bd849cd7277ab2dd73db515;hp=25abb6edaeff853e1d2b50843a0eec3d15043eec;hpb=ffa93fa23fb7e399feaf5cfbf024ea7c77cd20dc;p=projects%2Frc-scripts.git diff --git a/rc.d/rc.sysinit b/rc.d/rc.sysinit index 25abb6ed..b5fc94ff 100755 --- a/rc.d/rc.sysinit +++ b/rc.d/rc.sysinit @@ -1,7 +1,6 @@ #!/bin/sh # # /etc/rc.d/rc.sysinit - run once at boot time -# $Id$ # # Taken in part from Miquel van Smoorenburg's bcheckrc. # @@ -37,7 +36,113 @@ fi CONSOLE_LOGLEVEL=1 # Read functions -. /etc/rc.d/init.d/functions +. /lib/rc-scripts/functions + +modprobe_c_cache="" +modprobe_c() { + if [ "$modprobe_c_cache" ]; then + echo "$modprobe_c_cache" + return + fi + + # filter only what is wanted by this script: aliases and options + modprobe_c_cache=$(modprobe -c | grep -E '^(alias|options)') + echo "$modprobe_c_cache" +} + +# parse kernel cmdline +# needs /proc mounted +parse_cmdline() { + local arg cmdline + read cmdline < /proc/cmdline + + for arg in $cmdline; do + case "$arg" in + noudev) + # default is set in /etc/sysconfig/system + START_UDEV=no + ;; + nomdadm) + # default is set in /etc/sysconfig/system + MDADM=no + ;; + nomultipath) + # default is set in /etc/sysconfig/system + DM_MULTIPATH=no + ;; + noselinux) + # default is set in /etc/sysconfig/system + SELINUX=no + ;; + nousb) + nousb=1 + ;; + nohdparm) + nohdparm=1 + ;; + fastboot) + fastboot=1 + ;; + nopnp) + nopnp=1 + ;; + nomodules) + nomodules=1 + ;; + nofirewire) + nofirewire=1 + ;; + nofsck) + nofsck=1 + ;; + esac + done +} + +# resolve a device node to its major:minor numbers in decimal or hex +get_numeric_dev() { + local dev=$1 enc=${2:-hex} res + + res=$(stat -Lc "%t:%T" "$dev") + if [ "$enc" = dec ]; then + local oifs=$IFS + IFS=":" + set -- $res + IFS=$oifs + res=$((0x$1)):$((0x$2)) + fi + echo -n $res +} + +# setup SELINUX variable +init_selinux() { + # user knows! + if is_no "$SELINUX"; then + return + fi + + if ! grep -Fq selinuxfs /proc/filesystems; then + # no support in kernel, no chance + SELINUX=no + return + fi + + if ! is_fsmounted selinuxfs $selinuxfsdir; then + mount -n -o gid=17 -t selinuxfs selinuxfs $selinuxfsdir + fi + + # Check SELinux status + local selinuxfs=$(awk '/ selinuxfs / { print $2 }' /proc/mounts 2> /dev/null) + SELINUX= + if [ -n "$selinuxfs" ] && [ "$(cat /proc/self/attr/current)" != "kernel" ]; then + if [ -r $selinuxfs/enforce ] ; then + SELINUX=$(cat $selinuxfs/enforce) + else + # assume enforcing if you can't read it + SELINUX=1 + fi + fi +} disable_selinux() { local _d selinuxfs _t _r @@ -70,9 +175,35 @@ relabel_selinux() { echo $SELINUX > $selinuxfs/enforce } +# Enable automatic swapon of all partitions with the proper swap magic. +# This allows setting up swap without editing /etc/fstab. +enable_autoswap() { + local swappartitions=$(blkid -t TYPE=swap -o device) + if [ -z "$swappartitions" ]; then + return + fi + + local curswap=$(awk '/^\/dev/ { print $1 }' /proc/swaps | while read x; do echo -n " "; get_numeric_dev $x; echo -n " "; done) + + local partition + for partition in $swappartitions; do + [ ! -e $partition ] && continue + majmin=$(get_numeric_dev $partition) + if ! strstr "$curswap" " $majmin "; then + run_cmd "$(nls 'Enabling local swap partitions: %s' $partition)" swapon $partition + fi + done +} + + +enable_swap() { + run_cmd "Activating swap" swapon -a "$@" + is_yes "$AUTOSWAP" && enable_autoswap +} + # Remove duplicate entries from mtab (for vserver guest use only) clean_vserver_mtab() { - :>/etc/mtab.clean + > /etc/mtab.clean while read device mountpoint line; do grep -qs "$mountpoint" /etc/mtab.clean || \ echo "$device $mountpoint $line" >> /etc/mtab.clean @@ -83,13 +214,19 @@ clean_vserver_mtab() { # Loads modules from /etc/modules, /etc/modules.X.Y and /etc/modules.X.Y.Z load_kernel_modules() { + local modules_file=$1 + local _x _y _z v v1 old_IFS kernel kerneleq { - local _x _y v _z - read _x _y v _z + read _x _y v _z old_IFS=$IFS - IFS='.' + # strip _* or -* from versions like: "2.6.25_vanilla-1", "2.6.25-1" + IFS='_-' set -- $v + v1=${1} + IFS='.' + set -- $v1 IFS=$old_IFS + kernel="$1.$2" kerneleq="$1.$2.$3" } < /proc/version @@ -97,16 +234,43 @@ load_kernel_modules() { local module args # Loop over every line in modules file ( \ - grep -hvE '^(#|[[:blank:]]*$)' /etc/modules /etc/modules.$kernel /etc/modules.$kerneleq 2>/dev/null + grep -hvE '^(#|[[:blank:]]*$)' /etc/$modules_file /etc/$modules_file.$kernel /etc/$modules_file.$kerneleq 2>/dev/null echo '' # make sure there is a LF at the end ) | while read module args; do [ -z "$module" ] && continue # strip comments args=${args%%#*} - modprobe -s $module -- $args + show "Loading %s kernel module(s)" "$module" + busy + modprobe -s $module -- $args && ok || fail done } +# launch repair shell +# which after exiting will reboot +repair_shell() { + local reason="$2" + + # don't use '\n' in nls macro ! + echo + echo + echo "$reason" + nls "*** Dropping you to a shell; the system will reboot" + nls "*** when you leave the shell." + echo + + [ "$SELINUX" = "1" ] && disable_selinux + if ! is_no "$RUN_SULOGIN_ON_ERR"; then + /sbin/sulogin + else + /bin/sh + fi + + run_cmd "Unmounting file systems" umount -a + run_cmd "Remounting root filesystem in ro mode" mount -n -o remount,ro / + run_cmd "Automatic reboot in progress" reboot +} + check_root_fs() { show "Checking root filesystem"; started initlog -c "fsck -C -T -a $fsckoptions /" @@ -115,25 +279,10 @@ check_root_fs() { # A return of 4 or higher means there were serious problems. if [ $rc -gt 3 ]; then [ -e /proc/splash ] && echo "verbose" > /proc/splash - # don't use '\n' in nls macro ! - echo - echo - nls "*** An error occurred during the file system check." - nls "*** Dropping you to a shell; the system will reboot" - nls "*** when you leave the shell." - echo PS1="$(nls '(Repair filesystem)# ')"; export PS1 - [ "$SELINUX" = "1" ] && disable_selinux - if ! is_no "$RUN_SULOGIN_ON_ERR"; then - /sbin/sulogin - else - /bin/sh - fi + repair_shell "$(nls '*** An error occurred during the file system check.')" - run_cmd "Unmounting file systems" umount -a - mount -n -o remount,ro / - run_cmd "Automatic reboot in progress" reboot # A return of 2 or 3 means that filesystem was repaired but we need # to reboot. elif [ "$rc" = "2" -o "$rc" = "3" ]; then @@ -152,39 +301,144 @@ check_root_fs() { fi } +# mdadm - manage MD devices aka Linux Software RAID +init_mdadm() { + if [ ! -x /sbin/mdadm -o ! -f /etc/mdadm.conf ]; then + return + fi + + modprobe -s md + local rc=0 golvm=0 have_md=0 + if [ ! -f /proc/mdstat ]; then + return + fi + + # assume we have md if at least one ARRAY line is present + if grep -qE "^([[:blank:]]|)ARRAY[[:blank:]]" /etc/mdadm.conf; then + have_md=1 + fi + # configured to do auto scanning + if [ $have_md = 0 ] && grep -qE "^([[:blank:]]|)DEVICE[[:blank:]]partitions" /etc/mdadm.conf; then + have_md=1 + fi + + # none found + if [ $have_md = 0 ]; then + return + fi + + show "Starting up RAID devices"; busy + mdadm_out=$(/sbin/mdadm --assemble --scan --auto=yes 2>&1) + rc=$? + + if (echo -n "$mdadm_out" | grep -q "Found some drive for an array that is already active:"); then + rc=0 + fi + + echo -n "$MDADM_OUT" >&2 + + if [ "$rc" -eq 0 -o "$rc" -eq 2 ]; then + # rc is used later too, so set sane value + rc=0 + deltext; ok + golvm=1 + else + deltext; fail + fi + + # A non-zero return means there were problems + if [ $rc -gt 0 ]; then + [ -e /proc/splash ] && echo "verbose" > /proc/splash + show "Starting up RAID devices"; fail + + PS1="$(nls '(RAID Repair)# ')"; export PS1 + repair_shell "$(nls '*** An error occurred during the RAID startup.')" + fi + + # LVM on RAID (keep in sync with LVM init) + if [ "$golvm" -eq "1" ]; then + if [ -x /sbin/vgscan -a -x /sbin/vgchange ]; then + run_cmd "Scanning for LVM volume groups (on RAID)" /sbin/vgscan $lvmignorelocking + run_cmd "Activating LVM volume groups (on RAID)" /sbin/vgchange -a y $lvmsysinit + [ "$lvmversion" = "2" ] && /sbin/vgmknodes + fi + fi + show "Starting up RAID devices"; ok + return $rc +} + +# Init LVM +init_lvm() { + if [ ! -x /sbin/vgscan -o ! -x /sbin/vgchange ] && ! is_yes "$EVMS_LVM"; then + return + fi + + if is_no "$LVM2"; then + lvmversion=$(LC_ALL=C /sbin/vgchange --version 2>/dev/null | awk '/LVM version:/{if ($3 >= 2) print "2"}') + else + lvmversion=2 + fi + + if [ "$lvmversion" = "1" ] ; then + modprobe -s lvm-mod + lvmignorelocking="" + lvmsysinit="" + elif [ "$lvmversion" = "2" ] ; then + modprobe -s dm-mod + lvmignorelocking="--ignorelockingfailure" + lvmsysinit="--sysinit" + else + modprobe -s lvm-mod + # device mapper (2.5+ and patched 2.4) + modprobe -s dm-mod + lvmignorelocking="" + lvmsysinit="" + fi + + run_cmd "Scanning for LVM volume groups" /sbin/vgscan $lvmignorelocking + run_cmd "Activating LVM volume groups" /sbin/vgchange -a y $lvmsysinit + if [ "$lvmversion" = "2" ]; then + /sbin/vgmknodes $lvmignorelocking + # display VG statistics + /sbin/vgdisplay -s $lvmignorelocking + fi +} + # boot logging to /var/log/boot.log. install showconsole package to get it. -if [ -x /sbin/blogd ] && ! is_no "$RC_BOOTLOG"; then +if ! is_no "$RC_BOOTLOG" && [ -x /sbin/blogd ]; then RC_BOOTLOG=1 else RC_BOOTLOG= fi -if ! is_yes "$VSERVER" ; then - if [ -d /run ]; then - is_fsmounted tmpfs /run || mount -n -t tmpfs run /run - fi - +if ! is_yes "$VSERVER" && [[ "$container" != lxc* ]]; then # we need /proc mounted before everything - is_fsmounted proc /proc || mount -n -o gid=17 -t proc /proc /proc + is_fsmounted proc /proc || mount -n /proc || mount -n -o gid=17,hidepid=2 -t proc /proc /proc + + parse_cmdline - # Only read this once. - cmdline=$(cat /proc/cmdline) - if strstr "$cmdline" "pld.no-upstart" ; then - USE_UPSTART="no" + if [ -d /run ]; then + is_fsmounted tmpfs /run || mount -n -t tmpfs run /run -o mode=0755,noexec,nosuid,nodev fi + # Early sysctls + apply_sysctl + # sysfs is also needed before any other things (under kernel > 2.5) - if grep -q sysfs /proc/filesystems 2>/dev/null ; then - is_fsmounted sysfs /sys || mount -n -o gid=17 -t sysfs sysfs /sys - if grep -q securityfs /proc/filesystems 2>/dev/null ; then - mount -n -o gid=17 -t securityfs securityfs /sys/kernel/security - fi + if ! is_fsmounted sysfs /sys; then + grep -Fq sysfs /proc/filesystems && mount -n -o gid=17 -t sysfs sysfs /sys + fi + if grep -Fq securityfs /proc/filesystems; then + mount -n -o gid=17 -t securityfs securityfs /sys/kernel/security fi - # selinux - if grep -q selinuxfs /proc/filesystems 2>/dev/null && ! is_fsmounted selinuxfs /selinux; then - mount -n -o gid=17 -t selinuxfs selinuxfs /selinux + if [ -d /sys/fs/selinux ]; then + # Linux 3.0+ + selinuxfsdir=/sys/fs/selinux + else + selinuxfsdir=/selinux fi + init_selinux # PLD Linux LiveCD support if [ -x /etc/rc.d/rc.live ]; then @@ -192,7 +446,7 @@ if ! is_yes "$VSERVER" ; then fi # Choose Hardware profile - if [ -f /etc/sysconfig/hwprof ]; then + if ! is_no "$HWPROFILES" && [ -f /etc/sysconfig/hwprof ]; then . /etc/sysconfig/hwprof if is_yes "${HWPROFILES}" && [ -x /sbin/hwprofile -a -d /etc/sysconfig/hwprofiles/data ]; then mount -n / -o rw,remount @@ -204,18 +458,6 @@ if ! is_yes "$VSERVER" ; then # Disable splash when requested is_no "$BOOT_SPLASH" && [ -e /proc/splash ] && echo "0" > /proc/splash - # Check SELinux status - selinuxfs=$(awk '/ selinuxfs / { print $2 }' /proc/mounts 2> /dev/null) - SELINUX= - if [ -n "$selinuxfs" ] && [ "$(cat /proc/self/attr/current)" != "kernel" ]; then - if [ -r $selinuxfs/enforce ] ; then - SELINUX=$(cat $selinuxfs/enforce) - else - # assume enforcing if you can't read it - SELINUX=1 - fi - fi - if [ -x /sbin/restorecon ] && is_fsmounted tmpfs /dev; then /sbin/restorecon -R /dev 2>/dev/null fi @@ -237,7 +479,7 @@ fi # Set the hostname if [ -z "${HOSTNAME}" ]; then - show "$(nls 'Host:') $(hostname)" ; ok + show "$(nls 'Host:') $(hostname)"; ok else run_cmd "$(nls 'Host:') ${HOSTNAME}" hostname ${HOSTNAME} fi @@ -249,17 +491,18 @@ else domainname "" fi -if ! is_yes "$VSERVER"; then +if ! is_yes "$VSERVER" && [[ "$container" != lxc* ]]; then # Set console loglevel if [ -n "$CONSOLE_LOGLEVEL" ]; then dmesg -n $CONSOLE_LOGLEVEL fi - if ! is_no "$START_UDEV" && [ -x /sbin/start_udev ]; then + if ! is_no "$START_UDEV" && [ -x /sbin/start_udev ] && [[ "$container" != lxc* ]]; then + is_fsmounted devtmpfs /dev || mount -n -t devtmpfs devtmpfs /dev + load_kernel_modules modules.preudev /sbin/start_udev - [ -x /sbin/initctl ] && /sbin/initctl -q start udev elif [ -x /lib/firmware/firmware-loader.sh ]; then - /sbin/sysctl -e -w kernel.hotplug=/lib/firmware/firmware-loader.sh > /dev/null 2>&1 + /sbin/sysctl -q -e -w kernel.hotplug=/lib/firmware/firmware-loader.sh fi # Unmount the initrd, if necessary @@ -274,9 +517,8 @@ if ! is_yes "$VSERVER"; then /sbin/blogd fi - # Configure Linux kernel (initial configuration, some required modules still - # may be missing). - sysctl -e -p /etc/sysctl.conf > /dev/null 2>&1 + # Configure Linux kernel (initial configuration, some required modules still may be missing). + apply_sysctl # Check if timezone definition is available if [ -e /etc/localtime ] && [ -e /dev/rtc -o -e /dev/rtc0 ] ; then @@ -292,7 +534,7 @@ if ! is_yes "$VSERVER"; then # XXX might need modules dep # Device mapper & related initialization if ! grep -qF device-mapper /proc/devices; then - modprobe dm-mod + modprobe -s dm-mod fi . /etc/rc.d/init.d/cryptsetup @@ -303,17 +545,17 @@ if ! is_yes "$VSERVER"; then fi # Start up swapping - run_cmd "Activating swap partitions" swapon -a -e + enable_swap -e # Initialize USB controllers usb=0 - if ! strstr "$cmdline" "nousb" && ! is_fsmounted usbfs /proc/bus/usb ; then - aliases=$(/sbin/modprobe -c | awk '/^alias[\t ]+usb-controller/ { print $3 }') + if [ -z "$nousb" ] && ! is_fsmounted usbfs /proc/bus/usb; then + aliases=$(modprobe_c | awk '/^alias[[:space:]]+usb[-_]controller[[:space:]]+/{ print $3 }') if [ -n "$aliases" -a "$aliases" != "off" ] ; then - /sbin/modprobe -s usbcore + modprobe -s usbcore for alias in $aliases ; do [ "$alias" = "off" ] && continue - run_cmd "$(nls 'Initializing USB controller') ($alias)" /sbin/modprobe -s $alias + run_cmd "$(nls 'Initializing USB controller') ($alias)" modprobe -s $alias done [ $? -eq 0 -a -n "$aliases" ] && usb=1 fi @@ -322,7 +564,7 @@ if ! is_yes "$VSERVER"; then fi fi - if [ "$usb" = "1" ] && ! is_fsmounted usbfs /proc/bus/usb ; then + if [ "$usb" = "1" -a -d /proc/bus/usb ] && ! is_fsmounted usbfs /proc/bus/usb; then run_cmd "Mounting USB filesystem" mount -n -t usbfs -o devgid=78,devmode=664 usbfs /proc/bus/usb fi @@ -330,27 +572,25 @@ if ! is_yes "$VSERVER"; then if [ "$usb" = "1" ]; then needusbstorage=$(cat /proc/bus/usb/devices 2>/dev/null | grep -e "^I.*Cls=08" 2>/dev/null) if [ "$(kernelverser)" -lt "002006" ]; then - grep -q 'hid' /proc/bus/usb/drivers 2>/dev/null || run_cmd "Initializing USB HID interface" modprobe hid 2> /dev/null + grep -Fq 'hid' /proc/bus/usb/drivers 2>/dev/null || run_cmd "Initializing USB HID interface" modprobe -s hid mouseoutput=$(cat /proc/bus/usb/devices 2>/dev/null|grep -E "^I.*Cls=03.*Prot=02" 2>/dev/null) kbdoutput=$(cat /proc/bus/usb/devices 2>/dev/null|grep -E "^I.*Cls=03.*Prot=01" 2>/dev/null) if [ -n "$kbdoutput" ]; then - run_cmd "Initializing USB keyboard" modprobe keybdev + run_cmd "Initializing USB keyboard" modprobe -s keybdev fi if [ -n "$mouseoutput" ]; then - run_cmd "Initializing USB mouse" modprobe mousedev + run_cmd "Initializing USB mouse" modprobe -s mousedev fi fi fi # Setup hdparm thing (if exists and is needed) - if ! strstr "$cmdline" nohdparm; then + if [ -z "$nohdparm" ]; then [ -x /etc/rc.d/rc.hdparm ] && /etc/rc.d/rc.hdparm fi - if [ -f /fastboot ] || strstr "$cmdline" "fastboot"; then - fastboot=yes - else - fastboot= + if [ -z "$fastboot" ] && [ -f /fastboot ]; then + fastboot=1 fi if [ -f /fsckoptions ]; then @@ -372,24 +612,17 @@ if ! is_yes "$VSERVER"; then _ROOTFS_DEVICE=$(awk '($1 !~ /^#/ && $2 == "/" && NF >= 6) { print $1}' /etc/fstab) _ROOTFS_TYPE=$(awk '$2 == "/" && $3 != "rootfs" { print $3 }' /proc/mounts 2>/dev/null) - if [ -z "$fastboot" -a "$_ROOTFS_TYPE" != "aufs" -a "$_ROOTFS_TYPE" != "nfs" -a "$_ROOTFS_TYPE" != "romfs" -a "$_ROOTFS_TYPE" != "squashfs" -a "$_ROOTFS_PASSNO" != 0 -a -e $_ROOTFS_DEVICE ]; then + if [ -z "$fastboot" -a "$_ROOTFS_TYPE" != "aufs" -a "$_ROOTFS_TYPE" != "nfs" -a "$_ROOTFS_TYPE" != "romfs" -a "$_ROOTFS_TYPE" != "squashfs" -a "$_ROOTFS_PASSNO" != 0 -a -e $_ROOTFS_DEVICE ] && [[ "$container" != lxc* ]]; then check_root_fs fi - # Check for arguments - if strstr "$cmdline" nopnp; then - PNP= - else - PNP=yes - fi - # set up pnp and kernel pnp - if [ -n "$PNP" ]; then - if ! is_no "$RUN_USERPNP" && [ -x /sbin/isapnp -a -f /etc/isapnp/isapnp.conf ]; then + if is_yes "$RUN_USERPNP" || is_yes "$RUN_KERNELPNP"; then + if [ -z "$nopnp" ] && is_yes "$RUN_USERPNP" && [ -x /sbin/isapnp -a -f /etc/isapnp/isapnp.conf ]; then run_cmd "Setting up ISA PNP devices (userspace pnp)" /sbin/isapnp /etc/isapnp/isapnp.conf fi - if ! is_no "$RUN_KERNELPNP"; then - /sbin/modprobe isa-pnp 2> /dev/null + if [ -z "$nopnp" ] && is_yes "$RUN_KERNELPNP"; then + modprobe -s isa-pnp if [ -e /proc/isapnp -a -f /etc/isapnp/isapnp-kernel.conf ]; then show "Setting up ISA PNP devices (kernelspace pnp)"; busy grep -v "^#" /etc/isapnp/isapnp-kernel.conf 2>/dev/null >/proc/isapnp && (deltext; ok) || (deltext; fail) @@ -409,8 +642,8 @@ if ! is_yes "$VSERVER"; then fi # Clean up SELinux labels - if [ -n "$SELINUX" ]; then - for file in /etc/mtab /etc/cryptomtab /etc/ld.so.cache ; do + if is_yes "$SELINUX"; then + for file in /etc/mtab /etc/cryptomtab /etc/ld.so.cache; do [ -r $file ] && restorecon $file >/dev/null 2>&1 done fi @@ -450,39 +683,39 @@ if [ -n "$IN_INITLOG" ]; then IN_INITLOG="" fi -if ! is_yes "$VSERVER"; then +if ! is_yes "$VSERVER" && [[ "$container" != lxc* ]]; then # Clear mtab - :>/etc/mtab - [ -f /etc/cryptomtab ] && :>/etc/cryptomtab + > /etc/mtab + [ -f /etc/cryptomtab ] && > /etc/cryptomtab # Enter root, /proc, /sys and other into mtab. - mount -f / - mount -f /proc + mount -f / 2> /dev/null + mount -f /proc 2> /dev/null + if is_fsmounted devtmpfs /dev; then + mount -f -t devtmpfs devtmpfs /dev 2> /dev/null + fi if is_fsmounted tmpfs /run; then - mount -f -t tmpfs run /run + mount -f -t tmpfs run /run -o mode=0755,noexec,nosuid,nodev 2> /dev/null fi if is_fsmounted usbfs /proc/bus/usb; then - mount -f -t usbfs -o devgid=78,devmode=664 usbfs /proc/bus/usb + mount -f -t usbfs -o devgid=78,devmode=664 usbfs /proc/bus/usb 2> /dev/null fi if is_fsmounted sysfs /sys; then - mount -f -t sysfs sysfs /sys + mount -f -t sysfs sysfs /sys 2> /dev/null if is_fsmounted securityfs /sys/kernel/security ; then - mount -f -t securityfs securityfs /sys/kernel/security + mount -f -t securityfs securityfs /sys/kernel/security 2> /dev/null fi fi - if is_fsmounted selinuxfs /selinux; then - mount -f -t selinuxfs selinuxfs /selinux + if is_fsmounted selinuxfs $selinuxfsdir; then + mount -f -t selinuxfs selinuxfs $selinuxfsdir 2> /dev/null fi - emit --no-wait root-filesystem - emit --no-wait virtual-filesystems - if [ ! -f /proc/modules ]; then USEMODULES= - elif ! strstr "$cmdline" nomodules; then + elif [ -z "$nomodules" ]; then USEMODULES=y else USEMODULES= @@ -514,40 +747,40 @@ if ! is_yes "$VSERVER"; then if [ -f /proc/sys/kernel/modprobe ]; then if [ -n "$USEMODULES" ]; then - sysctl -w kernel.modprobe="/sbin/modprobe" >/dev/null 2>&1 + sysctl -q -w kernel.modprobe="/sbin/modprobe" else # We used to set this to NULL, but that causes # 'failed to exec' messages" - sysctl -w kernel.modprobe="/bin/true" >/dev/null 2>&1 + sysctl -q -w kernel.modprobe="/bin/true" fi fi # Load usb storage here, to match most other things if [ -n "$needusbstorage" ]; then - modprobe usb-storage >/dev/null 2>&1 + modprobe -s usb-storage fi # Load firewire devices - if ! strstr "$cmdline" nofirewire; then - aliases=$(/sbin/modprobe -c | awk '/^alias ieee1394-controller/ { print $3 }') + if [ -z "$nofirewire" ]; then + aliases=$(modprobe_c | awk '/^alias[[:space:]]+ieee1394[-_]controller[[:space:]]+/{ print $3 }') if [ -n "$aliases" -a "$aliases" != "off" ] ; then for alias in $aliases ; do [ "$alias" = "off" ] && continue - run_cmd "$(nls 'Initializing firewire controller') ($alias)" /sbin/modprobe $alias + run_cmd "$(nls 'Initializing firewire controller') ($alias)" modprobe $alias done - grep -E "SBP2" /proc/bus/ieee1394/devices 2>/dev/null && /sbin/modprobe -s sbp2 > /dev/null 2>&1 + grep -E "SBP2" /proc/bus/ieee1394/devices 2>/dev/null && modprobe -s sbp2 fi fi # Load sound modules if they need persistent DMA buffers - if /sbin/modprobe -c | grep -q "^options sound dmabuf=1"; then + if modprobe_c | grep -q "^options sound dmabuf=1"; then RETURN=0 - alias=$(/sbin/modprobe -c | grep -sE "^alias[[:space:]]+sound[[:space:]]+" 2>/dev/null | awk '{ print $3 }') + alias=$(modprobe_c | awk '/^alias[[:space:]]+sound[[:space:]]+/{ print $3 }') if [ -n "$alias" -a "$alias" != "off" ] ; then run_cmd "$(nls 'Loading sound module') ($alias)" modprobe -s $alias RETURN=$? fi - alias=$(/sbin/modprobe -c | grep -sE "^alias[[:space:]]+sound-slot-0[[:space:]]+" 2>/dev/null | awk '{ print $3 }') + alias=$(modprobe_c | awk '/^alias[[:space:]]+sound[-_]slot[-_]0[[:space:]]+/ { print $3 }') if [ -n "$alias" -a "$alias" != "off" ] ; then run_cmd "$(nls 'Loading sound module') ($alias)" modprobe -s $alias RETURN=$? @@ -555,39 +788,46 @@ if ! is_yes "$VSERVER"; then fi # Load modules - load_kernel_modules + load_kernel_modules modules + for f in /etc/modules-load.d/*.conf; do + # already loaded by implicit "modules" load + [ "${f##*/}" = "modules.conf" ] && continue - if [ -x /sbin/multipath ]; then - # first make nodes that were discarded due (possible) new /dev mount + [ -r $f ] || continue + load_kernel_modules ${f##/etc/} + done + + if ! is_no "$DM_MULTIPATH" && [ -x /sbin/multipath ]; then modprobe -s dm-mod - /sbin/dmsetup mknodes modprobe -s dm-multipath + # make nodes that were discarded due (possible) new /dev mount + /sbin/dmsetup mknodes run_cmd "Activating dm-multipath" /sbin/multipath -v 0 /sbin/dmsetup ls --target multipath --exec '/sbin/kpartx -a -p p' fi - if [ -x /sbin/dmraid ]; then + if ! is_no "$DMRAID" && [ -x /sbin/dmraid ]; then run_cmd "Activating ATARAID devices" /sbin/dmraid -ay fi # Find and activate volume groups: # EVMS - if [ -x /sbin/evms_activate ]; then + if is_yes "$EVMS_LVM" && [ -x /sbin/evms_activate ]; then if [ "$(kernelverser)" -lt "002006" ]; then # Linux 2.4 core modules - modprobe -s evms > /dev/null 2>&1 - modprobe -s evms_passthru > /dev/null 2>&1 - modprobe -s ldev_mgr > /dev/null 2>&1 - modprobe -s dos_part > /dev/null 2>&1 + modprobe -s evms + modprobe -s evms_passthru + modprobe -s ldev_mgr + modprobe -s dos_part else # Linux 2.6 core module - modprobe -s evmscore > /dev/null 2>&1 + modprobe -s evmscore fi - is_yes "$EVMS_GUID_PTABLE" && modprobe -s gpt_part >/dev/null 2>&1 - is_yes "$EVMS_LVM" && modprobe -s lvm_vge >/dev/null 2>&1 - is_yes "$EVMS_AIX" && modprobe -s AIXlvm_vge >/dev/null 2>&1 - is_yes "$EVMS_OS2" && modprobe -s os2lvm_vge >/dev/null 2>&1 + is_yes "$EVMS_GUID_PTABLE" && modprobe -s gpt_part + is_yes "$EVMS_LVM" && modprobe -s lvm_vge + is_yes "$EVMS_AIX" && modprobe -s AIXlvm_vge + is_yes "$EVMS_OS2" && modprobe -s os2lvm_vge run_cmd "Discovering EVMS volumes" /sbin/evms_activate if is_yes "$EVMS_LVM" && is_yes "$EVMS_LVM_COMPAT_NODES" ; then # Link nodes for compatibility with LVM @@ -597,33 +837,9 @@ if ! is_yes "$VSERVER"; then fi fi - # LVM (keep in sync with LVM starting after RAID run!) - if is_no "$LVM2" || [ -x /sbin/vgscan -a -x /sbin/vgchange ] || is_yes "$EVMS_LVM"; then - if is_no "$LVM2"; then - lvmversion=$(LC_ALL=C /sbin/vgchange --version 2>/dev/null | awk '/LVM version:/{if ($3 >= 2) print "2"}') - else - lvmversion=2 - fi - if [ "$lvmversion" = "1" ] ; then - modprobe -s lvm-mod >/dev/null 2>&1 - lvmsysinit="" - elif [ "$lvmversion" = "2" ] ; then - modprobe -s dm-mod >/dev/null 2>&1 - lvmsysinit="--sysinit" - else - modprobe -s lvm-mod >/dev/null 2>&1 - # device mapper (2.5+ and patched 2.4) - modprobe -s dm-mod >/dev/null 2>&1 - lvmsysinit="" - fi - - run_cmd "Scanning for LVM volume groups" /sbin/vgscan $lvmsysinit - run_cmd "Activating LVM volume groups" /sbin/vgchange -a y $lvmsysinit - if [ "$lvmversion" = "2" ]; then - /sbin/vgmknodes $lvmsysinit - # display VG statistics - /sbin/vgdisplay -s $lvmsysinit - fi + # Init LVM + if ! is_no "$LVM2"; then + init_lvm fi if [ "$delay_cryptsetup" != 0 ]; then @@ -633,106 +849,13 @@ if ! is_yes "$VSERVER"; then [ $delay_cryptsetup = 0 ] && ok || fail fi - # Add raid devices - if [ -x /sbin/mdadm -a -f /etc/mdadm.conf ] || [ -f /etc/raidtab ]; then - modprobe -s md >/dev/null 2>&1 - if [ -f /proc/mdstat ]; then - goraidtab=1 - golvm=0 - rc=0 - if [ -x /sbin/mdadm -a -f /etc/mdadm.conf ]; then - if (grep -qE "^([[:blank:]]|)ARRAY[[:blank:]]" /etc/mdadm.conf 2>/dev/null); then - show "Starting up RAID devices"; busy - /sbin/mdadm --assemble --scan --auto=yes - rc=$? - if [ "$rc" -eq 0 -o "$rc" -eq 2 ]; then - # rc is used later, too so set sane value - rc=0 - deltext; ok - goraidtab=0 - golvm=1 - else - deltext; fail - fi - - fi - fi - - if [ -f /etc/raidtab -a "$goraidtab" -eq 1 ]; then - for i in $(awk '!/^#/ && /raiddev/{print $2}' /etc/raidtab 2>/dev/null); do - golvm=1 - RAIDDEV=$(basename $i) - RAIDSTAT=$(grep "^$RAIDDEV : active" /proc/mdstat 2>/dev/null) - show "Starting up RAID device %s" $RAIDDEV - busy - if [ -z "$RAIDSTAT" ]; then - # Try raidstart first...if that fails then - # fall back to raid0run and if that fails too - # fall back to raidadd, raidrun. - RESULT=1 - if [ -x /sbin/raidstart ]; then - /sbin/raidstart $i - RESULT=$? - fi - if [ $RESULT -gt 0 -a -x /sbin/raid0run ]; then - /sbin/raid0run $i - RESULT=$? - fi - if [ $RESULT -gt 0 -a -x /sbin/raidadd -a -x /sbin/raidrun ]; then - /sbin/raidadd $i - /sbin/raidrun $i - RESULT=$? - fi - if [ $RESULT -gt 0 ]; then - rc=1 - fail - else - ok - fi - else - ok - fi - done - fi - - # A non-zero return means there were problems - if [ $rc -gt 0 ]; then - [ -e /proc/splash ] && echo "verbose" > /proc/splash - show "Starting up RAID devices"; fail - echo - echo - nls "*** An error occurred during the RAID startup." - nls "*** Dropping you to a shell; the system will reboot" - nls "*** when you leave the shell." - echo - - PS1="$(nls '(RAID Repair)# ')"; export PS1 - [ "$SELINUX" = "1" ] && disable_selinux - if ! is_no "$RUN_SULOGIN_ON_ERR"; then - /sbin/sulogin - else - /bin/sh - fi - - run_cmd "Unmounting file systems" umount -a - run_cmd "Remounting root filesystem in ro mode" mount -n -o remount,ro / - run_cmd "Automatic reboot in progress" reboot - fi - # LVM on RAID (keep in sync with LVM setting few lines above) - if [ "$golvm" -eq "1" ]; then - if [ -x /sbin/vgscan -a -x /sbin/vgchange ]; then - run_cmd "Scanning for LVM volume groups (on RAID)" /sbin/vgscan $lvmsysinit - run_cmd "Activating LVM volume groups (on RAID)" /sbin/vgchange -a y $lvmsysinit - [ "$lvmversion" = "2" ] && /sbin/vgmknodes - fi - fi - show "Starting up RAID devices"; ok - fi + if ! is_no "$MDADM"; then + init_mdadm fi _RUN_QUOTACHECK=0 # Check filesystems - if [ -z "$fastboot" ] && ! strstr "$cmdline" nofsck; then + if [ -z "$fastboot" ] && [ -z "$nofsck" ]; then rc_splash "fsck start" show "Checking filesystems"; started initlog -c "fsck -C -T -R -A -a -P $fsckoptions" @@ -742,24 +865,10 @@ if ! is_yes "$VSERVER"; then # A return of 2 or higher means there were serious problems if [ $rc -gt 1 ]; then [ -e /proc/splash ] && echo "verbose" > /proc/splash - echo - echo - nls "*** An error occurred during the file system check." - nls "*** Dropping you to a shell; the system will reboot" - nls "*** when you leave the shell." - echo PS1="$(nls '(Repair filesystem)# ')"; export PS1 - [ "$SELINUX" = "1" ] && disable_selinux - if ! is_no "$RUN_SULOGIN_ON_ERR"; then - /sbin/sulogin - else - /bin/sh - fi + repair_shell "$(nls '*** An error occurred during the file system check.')" - run_cmd "Unmounting file systems" umount -a - run_cmd "Remounting root filesystem in ro mode" mount -n -o remount,ro / - run_cmd "Automatic reboot in progress" reboot elif [ "$rc" = "1" -a -x /sbin/quotacheck ]; then _RUN_QUOTACHECK=1 fi @@ -769,7 +878,6 @@ if ! is_yes "$VSERVER"; then # Mount all other filesystems (except for NFS and /proc, which is already # mounted). Contrary to standard usage, # filesystems are NOT unmounted in single user mode. - run_cmd "Mounting local filesystems" mount -a -t nonfs,nfs4,smbfs,ncpfs,proc,cifs -O no_netdev # now we have /usr mounted, recheck if we have gettext and tput available. @@ -785,7 +893,7 @@ if ! is_yes "$VSERVER"; then # option is removed from /etc/mtab if [ -z "$fastboot" ] && grep "^[^#].*encryption=" /etc/fstab 2>/dev/null | grep -v -q "noauto" 2>/dev/null; then show "Checking encrypted filesystems"; started - LOOPLIST="$(awk ' + LOOPLIST="$(LC_ALL=C awk ' FILENAME=="/proc/mounts" { TAB[$2]=$1; } @@ -805,30 +913,16 @@ if ! is_yes "$VSERVER"; then # A return of 2 or higher means there were serious problems. if [ $rc -gt 1 ]; then [ -e /proc/splash ] && echo "verbose" > /proc/splash - echo - echo - nls "*** An error occurred during the file system check." - nls "*** Dropping you to a shell; the system will reboot" - nls "*** when you leave the shell." - echo PS1="$(nls '(Repair filesystem)# ')"; export PS1 - [ "$SELINUX" = "1" ] && disable_selinux - if ! is_no "$RUN_SULOGIN_ON_ERR"; then - /sbin/sulogin - else - /bin/sh - fi + repair_shell "$(nls '*** An error occurred during the file system check.')" - run_cmd "Unmounting file systems" umount -a - run_cmd "Remounting root filesystem in ro mode" mount -n -o remount,ro / - run_cmd "Automatic reboot in progress" reboot elif [ "$rc" = "1" -a -x /sbin/quotacheck ]; then _RUN_QUOTACHECK=1 fi show "Remounting encrypted filesystems back in rw mode"; busy - awk ' + LC_ALL=C awk ' FILENAME=="/proc/mounts" { TAB[$2]=$1; } @@ -856,12 +950,6 @@ if ! is_yes "$VSERVER"; then run_cmd "Turning on quotas for local filesystems" /sbin/quotaon -aug fi - emit --no-wait local-filesystems - - # FIXME: this should be delayed until remote filesystems are mounted, - # especialy when /usr or other standard fs is remote - emit --no-wait filesystem - # Turn on process accounting if [ -x /etc/rc.d/rc.acct ]; then /etc/rc.d/rc.acct start @@ -879,20 +967,15 @@ if ! is_yes "$VSERVER"; then . /etc/rc.d/rc.serial fi - if [ -f /proc/sys/kernel/panic -a -n "$PANIC_REBOOT_TIME" -a "$PANIC_REBOOT_TIME" -gt "0" ]; then + if [ -n "$PANIC_REBOOT_TIME" -a "$PANIC_REBOOT_TIME" -gt "0" -a -f /proc/sys/kernel/panic ]; then show 'Setting %s seconds for kernel reboot after panic' "$PANIC_REBOOT_TIME"; busy - # NOTE: you should use /etc/sysctl.conf instead - if sysctl -w kernel.panic=$PANIC_REBOOT_TIME >/dev/null 2>&1; then ok; else fail; fi + # DEPRECATED: use /etc/sysctl.conf or kernel commandline instead + if sysctl -q -w kernel.panic=$PANIC_REBOOT_TIME; then ok; else fail; fi fi # ... and here finish configuring parameters - sysctl -e -p /etc/sysctl.conf > /dev/null 2>&1 + apply_sysctl else - emit --no-wait root-filesystem - emit --no-wait virtual-filesystems - emit --no-wait local-filesystems - emit --no-wait filesystem - # /var/log should be writable now, so start saving the boot output if [ "$RC_BOOTLOG" ]; then echo > /var/log/boot.log @@ -902,8 +985,7 @@ else clean_vserver_mtab fi - -[ -n "$SELINUX" ] && [ -f /.autorelabel ] && relabel_selinux +is_yes "$SELINUX" && [ -f /.autorelabel ] && relabel_selinux # Clean up /. rm -f /fastboot /fsckoptions /forcefsck /halt /poweroff >/dev/null 2>&1 @@ -934,34 +1016,33 @@ rm -rf /tmp/.X*-unix /tmp/.ICE-unix /tmp/.font-unix /tmp/hsperfdata_* \ { # Clean up utmp/wtmp -if ! is_no "$NEED_XFILES"; then - :>/var/run/utmpx - touch /var/log/wtmpx - chown root:utmp /var/run/utmpx /var/log/wtmpx - chmod 0664 /var/run/utmpx /var/log/wtmpx -else - :>/var/run/utmp - touch /var/log/wtmp - chown root:utmp /var/run/utmp /var/log/wtmp - chmod 0664 /var/run/utmp /var/log/wtmp +rm -f /var/run/utmpx +> /var/run/utmp +if [ -e /var/log/wtmpx ]; then + if [ -e /var/log/wtmp ]; then + rm -f /var/log/wtmpx + else + mv /var/log/wtmpx /var/log/wtmp + fi fi +touch /var/log/wtmp +chown root:utmp /var/run/utmp /var/log/wtmp +chmod 0664 /var/run/utmp /var/log/wtmp # Clean /tmp -if is_yes "$CLEAN_TMP"; then - # XXX LC_ALL needed here - rm -rf /tmp/* /tmp/.[a-zA-Z0-9]* +if is_yes "$CLEAN_TMP" && ! is_fsmounted tmpfs /tmp; then + LC_ALL=C rm -rf /tmp/* /tmp/.[a-zA-Z0-9]* fi # System protected dirs mkdir -m 1777 -p /tmp/.ICE-unix > /dev/null 2>&1 chown root:root /tmp/.ICE-unix -[ -n "$SELINUX" ] && restorecon /tmp/.ICE-unix >/dev/null 2>&1 +is_yes "$SELINUX" && restorecon /tmp/.ICE-unix >/dev/null 2>&1 + +test -d /var/run/netreport || mkdir -m 770 /var/run/netreport if ! is_yes "$VSERVER"; then - run_cmd "Enabling swap space" true - # Right, now turn on swap in case we swap to files - swapon -a >/dev/null 2>&1 - emit --no-wait all-swaps + enable_swap # If a SCSI tape has been detected, load the st module unconditionally # since many SCSI tapes don't deal well with st being loaded and unloaded @@ -969,26 +1050,27 @@ if ! is_yes "$VSERVER"; then if grep -qv ' 9 st' /proc/devices 2>/dev/null; then if [ -n "$USEMODULES" ] ; then # Try to load the module. If it fails, ignore it... - insmod -p st >/dev/null 2>&1 && modprobe -s st >/dev/null 2>&1 + insmod -p st >/dev/null 2>&1 && modprobe -s st fi fi fi # Now that we have all of our basic modules loaded and the kernel going, # let's dump the syslog ring somewhere so we can find it later - dmesg > /var/log/dmesg + mode=0600 + if [ "$(cat /proc/sys/kernel/dmesg_restrict)" = 0 ]; then + mode=0644 + fi + dmesg --raw > /var/log/dmesg + chmod $mode /var/log/dmesg i=5 while [ $i -ge 0 ]; do if [ -f /var/log/dmesg.$i ]; then - chmod 0600 /var/log/dmesg.$i mv -f /var/log/dmesg.$i /var/log/dmesg.$(($i+1)) fi i=$(($i-1)) done - cp -f /var/log/dmesg /var/log/dmesg.0 - chmod 0600 /var/log/dmesg /var/log/dmesg.0 -else - emit --no-wait all-swaps + cp -pf /var/log/dmesg /var/log/dmesg.0 fi if ! is_no "$RC_PROMPT"; then @@ -1012,6 +1094,3 @@ if ! is_no "$RC_PROMPT"; then rm -f /var/run/getkey_done fi echo - -emit --no-wait pld.sysinit-done -