diff options
Diffstat (limited to 'rc.sysinit')
-rwxr-xr-x | rc.sysinit | 305 |
1 files changed, 107 insertions, 198 deletions
@@ -12,27 +12,17 @@ printhl "${C_H2}http://parabolagnulinux.org" printhl "You're booting into a /libre/ version of Archlinux" printsep -run_hook sysinit_start - -# export standard PATH (will be overridden later when /etc/profile is sourced, but is useful for UDev) -export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - # mount /proc, /sys, /run, /dev, /run/lock, /dev/pts, /dev/shm (the api filesystems) mountpoint -q /proc || mount -n -t proc proc /proc -o nosuid,noexec,nodev mountpoint -q /sys || mount -n -t sysfs sys /sys -o nosuid,noexec,nodev -mountpoint -q /run || mount -n -t tmpfs run /run -o mode=755,size=10M,nosuid,nodev -if ! mountpoint -q /dev; then - if grep -q devtmpfs /proc/filesystems &>/dev/null; then - mount -n -t devtmpfs udev /dev -o mode=0755,size=10M,nosuid - else - mount -n -t tmpfs udev /dev -o mode=0755,size=10M,nosuid - fi -fi -mkdir -p /run/lock /dev/{pts,shm} -chmod 1777 /run/lock -mountpoint -q /dev/pts || mount -n /dev/pts &> /dev/null \ - || mount -n -t devpts devpts /dev/pts -o mode=620,gid=5,nosuid,noexec -mountpoint -q /dev/shm || mount -n /dev/shm &> /dev/null \ +mountpoint -q /run || mount -n -t tmpfs run /run -o mode=0755,size=10M,nosuid,nodev +mountpoint -q /dev || mount -n -t devtmpfs udev /dev -o mode=0755,size=10M,nosuid &>/dev/null \ + || mount -n -t tmpfs udev /dev -o mode=0755,size=10M,nosuid +mkdir -p -m 1777 /run/lock +mkdir -p /dev/{pts,shm} +mountpoint -q /dev/pts || mount -n /dev/pts &>/dev/null \ + || mount -n -t devpts devpts /dev/pts -o mode=0620,gid=5,nosuid,noexec +mountpoint -q /dev/shm || mount -n /dev/shm &>/dev/null \ || mount -n -t tmpfs shm /dev/shm -o mode=1777,nosuid,nodev # remount root ro to allow for fsck later on, we remount now to @@ -40,10 +30,16 @@ mountpoint -q /dev/shm || mount -n /dev/shm &> /dev/null \ findmnt / --options ro &>/dev/null || status "Mounting Root Read-Only" mount -n -o remount,ro / +run_hook sysinit_start + # start up our mini logger until syslog takes over minilogd bootlogd -p /run/bootlogd.pid +if [[ ! -a /usr/lib ]] ; then + printf "${C_FAIL}/usr is not mounted. This is not supported.${C_OTHER}\n" +fi + HWCLOCK_PARAMS="--systz" case $HARDWARECLOCK in "") ;; @@ -53,86 +49,66 @@ case $HARDWARECLOCK in esac if [[ $HWCLOCK_PARAMS ]]; then - # enable rtc access - modprobe -q -a rtc-cmos rtc genrtc - # If devtmpfs is used, the required RTC device already exists now - # Otherwise, create whatever device is available - if ! [[ -c /dev/rtc || -c /dev/rtc0 ]]; then - for dev in /sys/class/rtc/rtc0/dev /sys/class/misc/rtc/dev; do - [[ -e $dev ]] || continue - IFS=: read -r major minor < "$dev" - mknod /dev/rtc c $major $minor - done - fi - - # Adjust the system time for timezone offset if rtc is not in UTC - # 1. Make creation time on udev nodes sane (FS#8665) - # 2. Filesystem checks can depend on system time - # 3. This will set the clock, if using non-UTC, off the last known - # configured timezone. Any new timezone put in rc.conf is copied over at - # a later time. - # This does *NOT* take into account a time adjustment file as /var may not be - # mounted yet. A second set may occur in rc.d/hwclock to match rc.conf. - if [[ -f /etc/localtime ]]; then - hwclock $HWCLOCK_PARAMS - fi + stat_busy "Adjusting system time and setting kernel timezone" + # enable rtc access + modprobe -q -a rtc-cmos rtc genrtc + # If devtmpfs is used, the required RTC device already exists now + # Otherwise, create whatever device is available + if ! [[ -c /dev/rtc || -c /dev/rtc0 ]]; then + for dev in /sys/class/rtc/rtc0/dev /sys/class/misc/rtc/dev; do + [[ -e $dev ]] || continue + IFS=: read -r major minor < "$dev" + mknod /dev/rtc c $major $minor + done + fi + + # Adjust the system time for timezone offset if rtc is not in UTC + # 1. Make creation time on udev nodes sane (FS#8665) + # 2. Filesystem checks can depend on system time + # 3. This also sets the kernel time zone, used by e.g. vfat + # If TIMEZONE is not set in rc.conf, the timezone stored in /etc/localtime + # is used. If HARDWARECLOCK is not set in rc.conf, the value in + # /var/lib/hwclock/adjfile is used (in this case /var can not be a separate + # partition). + TZ=$TIMEZONE hwclock $HWCLOCK_PARAMS && stat_done || stat_fail fi -status "Starting UDev Daemon" udevd --daemon - -run_hook sysinit_udevlaunched - -stat_busy "Triggering UDev uevents" - udevadm trigger --action=add --type=subsystems - udevadm trigger --action=add --type=devices -stat_done - -# Load modules from the MODULES array defined in rc.conf -mods=${MODULES[@]/!*/} -if [[ $load_modules != off && -f /proc/modules && $mods ]]; then - status "Loading Modules" modprobe --all $mods -fi -unset mods - -status "Waiting for UDev uevents to be processed" \ - udevadm settle --timeout=${UDEV_TIMEOUT:-30} - -run_hook sysinit_udevsettled +# Start/trigger UDev, load MODULES and settle UDev +udevd_modprobe sysinit # bring up the loopback interface [[ -d /sys/class/net/lo ]] && status "Bringing up loopback interface" ip link set up dev lo # FakeRAID devices detection -if [[ $USEDMRAID =~ yes|YES && -x $(type -P dmraid) ]]; then +[[ $USEDMRAID = [Yy][Ee][Ss] && -x $(type -P dmraid) ]] && status "Activating FakeRAID arrays" dmraid -i -ay -fi # BTRFS devices detection -if [[ $USEBTRFS =~ yes|YES && -x $(type -P btrfs) ]]; then +[[ $USEBTRFS = [Yy][Ee][Ss] && -x $(type -P btrfs) ]] && status "Activating BTRFS volumes" btrfs device scan -fi +# Activate LVM2 groups if any activate_vgs # Set up non-root encrypted partition mappings -if [[ -f /etc/crypttab && -n $CS ]] && grep -q ^[^#] /etc/crypttab; then - modprobe -q dm-crypt 2>/dev/null +if [[ -f /etc/crypttab && $CS ]] && grep -q ^[^#] /etc/crypttab; then stat_busy "Unlocking encrypted volumes:" + modprobe -q dm-crypt 2>/dev/null do_unlock() { # $1 = requested name # $2 = source device # $3 = password # $4 = options stat_append "${1}.." - local open=create a="$1" b="$2" failed=0 + local open=create a=$1 b=$2 failed=0 # Ordering of options is different if you are using LUKS vs. not. # Use ugly swizzling to deal with it. # isLuks only gives an exit code but no output to stdout or stderr. if $CS isLuks "$2" 2>/dev/null; then open=luksOpen - a="$2" - b="$1" + a=$2 + b=$1 fi case $3 in SWAP) @@ -148,11 +124,9 @@ if [[ -f /etc/crypttab && -n $CS ]] && grep -q ^[^#] /etc/crypttab; then # This sanity check _should_ be sufficient, but it might not. # This may cause dataloss if it is not used carefully. blkid -p "$2" &>/dev/null - if [[ $? -eq 2 ]]; then - _overwriteokay=1 - fi + (( $? == 2 )) && _overwriteokay=1 fi - if [[ $_overwriteokay -eq 0 ]]; then + if (( _overwriteokay == 0 )); then false elif $CS -d /dev/urandom $4 $open "$a" "$b" >/dev/null; then stat_append "creating swapspace.." @@ -162,12 +136,12 @@ if [[ -f /etc/crypttab && -n $CS ]] && grep -q ^[^#] /etc/crypttab; then printf "\nOpening '$1' volume:\n" $CS $4 $open "$a" "$b" < /dev/console;; /dev*) - ckdev=${3%%:*} - cka=${3#*:} - ckb=${cka#*:} - cka=${cka%:*} - ckfile=/dev/ckfile - ckdir=/dev/ckdir + local ckdev=${3%%:*} + local cka=${3#*:} + local ckb=${cka#*:} + local cka=${cka%:*} + local ckfile=/dev/ckfile + local ckdir=/dev/ckdir case ${cka} in *[!0-9]*) # Use a file on the device @@ -190,7 +164,7 @@ if [[ -f /etc/crypttab && -n $CS ]] && grep -q ^[^#] /etc/crypttab; then *) echo "$3" | $CS $4 $open "$a" "$b" >/dev/null;; esac - if (($? != 0)); then + if (( $? )); then failed=1 stat_append "failed " else @@ -199,137 +173,72 @@ if [[ -f /etc/crypttab && -n $CS ]] && grep -q ^[^#] /etc/crypttab; then return $failed } crypto_unlocked=0 - if read_crypttab do_unlock; then - stat_done - else - stat_fail - fi - if [[ ${crypto_unlocked} -eq 1 ]]; then - # Maybe someone has LVM on an encrypted block device - activate_vgs - fi + read_crypttab do_unlock && stat_done || stat_fail + # Maybe someone has LVM on an encrypted block device + (( crypto_unlocked == 1 )) && activate_vgs fi -NETFS="nonfs,nonfs4,nosmbfs,nocifs,nocodafs,noncpfs,nosysfs,noshfs,nofuse,nofuseblk,noglusterfs,nodavfs" - +# Check filesystems +[[ -f /forcefsck ]] || in_array forcefsck $(< /proc/cmdline) && FORCEFSCK="-- -f" +declare -r FORCEFSCK +run_hook sysinit_prefsck if [[ -x $(type -P fsck) ]]; then stat_busy "Checking Filesystems" - fsck_reboot() { - echo "Automatic reboot in progress..." - umount -a - mount -n -o remount,ro / - reboot -f - exit 0 - } - FSCK_OUT=/dev/stdout - FSCK_ERR=/dev/stdout - FSCK_FD= - FORCEFSCK= - [[ -f /forcefsck ]] && FORCEFSCK="-- -f" - for cmdarg in $(< /proc/cmdline); do - [[ "$cmdarg" == forcefsck ]] && FORCEFSCK="-- -f" && break - done - run_hook sysinit_prefsck - fsck -A -T -C$FSCK_FD -a -t "$NETFS,noopts=_netdev" $FORCEFSCK >$FSCK_OUT 2>$FSCK_ERR - fsckret=$? - if ((fsckret > 1)); then - stat_fail - fi - run_hook sysinit_postfsck - if (( ( fsckret & 2) == 2)); then - echo - echo "********************** REBOOT REQUIRED *********************" - echo "* *" - echo "* The system will be rebooted automatically in 15 seconds. *" - echo "* *" - echo "************************************************************" - echo - sleep 15 - fsck_reboot - elif ((fsckret > 1 && fsckret != 32)); then - echo - echo "***************** FILESYSTEM CHECK FAILED ****************" - echo "* *" - echo "* Please repair manually and reboot. Note that the root *" - echo "* file system is currently mounted read-only. To remount *" - echo "* it read-write type: mount -n -o remount,rw / *" - echo "* When you exit the maintenance shell the system will *" - echo "* reboot automatically. *" - echo "* *" - echo "************************************************************" - echo - sulogin -p - fsck_reboot - fi - stat_done + fsck_all >|"${FSCK_OUT:-/dev/stdout}" 2>|"${FSCK_ERR:-/dev/stdout}" + declare -r fsckret=$? + (( fsckret <= 1 )) && stat_done || stat_fail +else + declare -r fsckret=0 fi +run_hook sysinit_postfsck + +# Single-user login and/or automatic reboot if needed +fsck_reboot $fsckret -stat_busy "Mounting Local Filesystems" +status "Remounting Root Read/Write" \ mount -n -o remount,rw / - # don't touch /etc/mtab if it is a symlink to /proc/self/mounts - if [[ -L /etc/mtab ]]; then - : - elif [[ -x $(type -P findmnt) && -e /proc/self/mountinfo ]]; then - findmnt -rnu -o SOURCE,TARGET,FSTYPE,OPTIONS >| /etc/mtab - else - cat /proc/mounts >| /etc/mtab - fi +# don't touch /etc/mtab if it is a symlink to /proc/self/mounts +if [[ ! -L /etc/mtab ]]; then + stat_busy "Creating mtab" + if [[ -x $(type -P findmnt) && -e /proc/self/mountinfo ]]; then + findmnt -rnu -o SOURCE,TARGET,FSTYPE,OPTIONS >| /etc/mtab + else + cat /proc/mounts >| /etc/mtab + fi + (( $? == 0 )) && stat_done || stat_fail +fi - run_hook sysinit_premount - # now mount all the local filesystems - mount -a -t $NETFS -O no_netdev -stat_done +# now mount all the local filesystems +run_hook sysinit_premount +status "Mounting Local Filesystems" \ + mount_all +run_hook sysinit_postmount # enable monitoring of lvm2 groups, now that the filesystems are mounted rw -if [[ $USELVM =~ yes|YES && -x $(type -P lvm) && -d /sys/block ]]; then +[[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) && -d /sys/block ]] && status "Activating monitoring of LVM2 groups" \ vgchange --monitor y >/dev/null -fi status "Activating Swap" swapon -a -if [[ $TIMEZONE && -e /usr/share/zoneinfo/$TIMEZONE ]]; then - rm -f /etc/localtime +[[ $TIMEZONE ]] && status "Configuring Time Zone" \ - cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime -fi + cp --remove-destination "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime RANDOM_SEED=/var/lib/misc/random-seed -if [[ -f $RANDOM_SEED ]]; then +[[ -f $RANDOM_SEED ]] && status "Initializing Random Seed" \ - cat $RANDOM_SEED > /dev/urandom -fi + cp $RANDOM_SEED /dev/urandom -stat_busy "Removing Leftover Files" - rm -rf /etc/{nologin,shutdownpid} /forcefsck &>/dev/null - rm -rf /tmp/* /tmp/.* &>/dev/null - [[ ! -L /var/lock ]] && rm -rf /var/lock/* - [[ ! -L /var/run && -d /var/run ]] && find /var/run/ \! -type d -delete - [[ ! -L /var/run && ! -L /var/run/daemons ]] && - rm -rf /var/run/daemons && - ln -s /run/daemons /var/run/daemons - : >| /var/run/utmp - chmod 0664 /var/run/utmp - chown root:utmp /var/run/utmp - # Keep {x,k,g}dm happy with xorg - mkdir -m1777 /tmp/.{X11,ICE}-unix -stat_done +# Remove leftover files +remove_leftover if [[ $HOSTNAME ]]; then stat_busy "Setting Hostname: $HOSTNAME" - echo $HOSTNAME > /proc/sys/kernel/hostname - stat_done + echo "$HOSTNAME" >| /proc/sys/kernel/hostname && stat_done || stat_fail fi -stat_busy "Setting Locale: ${LOCALE:=en_US}" - # Flush old locale settings - : >| /etc/profile.d/locale.sh - chmod 755 /etc/profile.d/locale.sh - # Set user defined locale - echo "export LANG=$LOCALE" >>/etc/profile.d/locale.sh -stat_done - if [[ ${LOCALE,,} =~ utf ]]; then stat_busy "Setting Consoles to UTF-8 mode" # UTF-8 consoles are default since 2.6.24 kernel @@ -339,9 +248,8 @@ if [[ ${LOCALE,,} =~ utf ]]; then kbd_mode -u < ${i} printf "\e%%G" > ${i} done - echo 1 > /sys/module/vt/parameters/default_utf8 + echo 1 >| /sys/module/vt/parameters/default_utf8 stat_done - [[ $KEYMAP ]] && status "Loading Keyboard Map: $KEYMAP" loadkeys -q -u $KEYMAP else stat_busy "Setting Consoles to legacy mode" # make non-UTF-8 consoles work on 2.6.24 and newer kernels @@ -349,22 +257,23 @@ else kbd_mode -a < ${i} printf "\e%%@" > ${i} done - echo 0 > /sys/module/vt/parameters/default_utf8 + echo 0 >| /sys/module/vt/parameters/default_utf8 stat_done - [[ $KEYMAP ]] && status "Loading Keyboard Map: $KEYMAP" loadkeys -q $KEYMAP fi +[[ $KEYMAP ]] && + status "Loading Keyboard Map: $KEYMAP" loadkeys -q $KEYMAP # Set console font if required set_consolefont -if [[ -e /proc/sys/kernel/dmesg_restrict && $(< /proc/sys/kernel/dmesg_restrict) -eq 1 ]]; then - : >| /var/log/dmesg.log - chmod 600 /var/log/dmesg.log -else - : >| /var/log/dmesg.log - chmod 644 /var/log/dmesg.log -fi -dmesg >| /var/log/dmesg.log +stat_busy "Saving dmesg Log" + if [[ -e /proc/sys/kernel/dmesg_restrict ]] && + (( $(< /proc/sys/kernel/dmesg_restrict) == 1 )); then + install -Tm 0600 <( dmesg ) /var/log/dmesg.log + else + install -Tm 0644 <( dmesg ) /var/log/dmesg.log + fi +(( $? == 0 )) && stat_done || stat_fail run_hook sysinit_end |