summaryrefslogtreecommitdiff
path: root/rc.sysinit
diff options
context:
space:
mode:
Diffstat (limited to 'rc.sysinit')
-rwxr-xr-xrc.sysinit305
1 files changed, 107 insertions, 198 deletions
diff --git a/rc.sysinit b/rc.sysinit
index 011c649..236d663 100755
--- a/rc.sysinit
+++ b/rc.sysinit
@@ -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