#!/bin/bash # # /etc/rc.sysinit # . /etc/rc.conf . /etc/rc.d/functions echo " " printhl "Arch Linux\n" printhl "${C_H2}http://www.archlinux.org" printhl "Copyright 2002-2007 Judd Vinet" printhl "Copyright 2007-2010 Aaron Griffin" printhl "Distributed under the GNU General Public License (GPL)" printsep run_hook sysinit_start # mount /proc, /sys and our RAM /dev if ! /bin/mountpoint -q /proc; then /bin/mount -n -t proc none /proc fi if ! /bin/mountpoint -q /sys; then /bin/mount -n -t sysfs none /sys fi if ! /bin/mountpoint -q /dev; then if grep -q devtmpfs /proc/filesystems 2>/dev/null; then /bin/mount -n -t devtmpfs udev /dev -o mode=0755,size=10M,nosuid else /bin/mount -n -t tmpfs udev /dev -o mode=0755,size=10M,nosuid fi fi # Copy static device nodes to /dev /bin/cp -a /lib/udev/devices/* /dev/ # start up our mini logger until syslog takes over /sbin/minilogd # anything more serious than KERN_WARNING goes to the console # 'verbose' cmdline parameter enables more messages if /bin/grep -q " verbose" /proc/cmdline; then /bin/dmesg -n 8 else /bin/dmesg -n 3 fi HWCLOCK_PARAMS="--hctosys" if [ "$HARDWARECLOCK" = "UTC" ]; then HWCLOCK_PARAMS="$HWCLOCK_PARAMS --utc" elif [ "$HARDWARECLOCK" = "localtime" ]; then HWCLOCK_PARAMS="$HWCLOCK_PARAMS --localtime" else HWCLOCK_PARAMS="" fi if [ -n "$HWCLOCK_PARAMS" ]; then # enable rtc access /sbin/modprobe -q rtc-cmos # some custom kernels use rtc/genrtc, try to load those too /sbin/modprobe -q rtc /sbin/modprobe -q genrtc # If devtmpfs is used, the required RTC device already exists now # Otherwise, create whatever device is available if [ ! -c /dev/rtc -a ! -c /dev/rtc0 ]; then if [ -f /sys/class/rtc/rtc0/dev ]; then IFS=: read -r major minor < /sys/class/rtc/rtc0/dev /bin/mknod /dev/rtc0 c $major $minor elif [ -f /sys/class/misc/rtc/dev ]; then IFS=: read -r major minor < /sys/class/misc/rtc/dev /bin/mknod /dev/rtc c $major $minor fi fi # Do a clock set here for a few reasons: # 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 occurs later to match rc.conf. if [ -f /etc/localtime ]; then /sbin/hwclock $HWCLOCK_PARAMS --noadjfile fi fi echo > /proc/sys/kernel/hotplug stat_busy "Starting UDev Daemon" /sbin/udevd --daemon stat_done run_hook sysinit_udevlaunched # Trigger udev uevents if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then stat_busy "Triggering UDev uevents" /sbin/udevadm control --property=STARTUP=1 /sbin/udevadm trigger --action=add stat_done fi # Load modules from the MODULES array defined in rc.conf if ! [ "$load_modules" = "off" ]; then if [ -f /proc/modules ]; then stat_busy "Loading Modules" for mod in "${MODULES[@]}"; do if [ "$mod" = "${mod#!}" ]; then /sbin/modprobe $mod fi done stat_done fi fi # Wait for udev uevents if /bin/pidof -o %PPID /sbin/udevd >/dev/null; then stat_busy "Waiting for UDev uevents to be processed" /sbin/udevadm settle /sbin/udevadm control --property=STARTUP= stat_done fi run_hook sysinit_udevsettled # bring up the loopback interface if [ -d /sys/class/net/lo ]; then stat_busy "Bringing up loopback interface" /sbin/ifconfig lo 127.0.0.1 up if [ $? -ne 0 ]; then stat_fail else stat_done fi fi # If necessary, find md devices and manually assemble RAID arrays if [ -f /etc/mdadm.conf -a "$(/bin/grep ^ARRAY /etc/mdadm.conf 2>/dev/null)" ]; then status "Activating RAID arrays" /sbin/mdadm --assemble --scan fi if [ "$USELVM" = "yes" -o "$USELVM" = "YES" ]; then if [ -x /sbin/lvm -a -d /sys/block ]; then # Kernel 2.6.x, LVM2 groups /sbin/modprobe -q dm-mod 2>/dev/null stat_busy "Activating LVM2 groups" /sbin/lvm vgchange --ignorelockingfailure -a y >/dev/null if [ $? -ne 0 ]; then stat_fail else stat_done fi fi fi # Set up non-root encrypted partition mappings if [ -f /etc/crypttab -a -n "$(/bin/grep -v ^# /etc/crypttab | /bin/grep -v ^$)" ]; then /sbin/modprobe -q dm-mod 2>/dev/null stat_busy "Unlocking encrypted volumes:" csfailed=0 # Arch cryptsetup packages traditionally contained the binaries # /usr/sbin/cryptsetup # /sbin/cryptsetup.static # By default, initscripts used the /sbin/cryptsetup.static. # Newer packages will only have /sbin/cryptsetup and no static binary # This ensures maximal compatibility with the old and new layout if [ -x /sbin/cryptsetup ]; then CS=/sbin/cryptsetup elif [ -x /usr/sbin/cryptsetup ]; then CS=/usr/sbin/cryptsetup else CS=/sbin/cryptsetup.static fi do_crypt() { if [ $# -ge 3 ]; then cname="$1" csrc="$2" cpass="$3" shift 3 copts="$*" stat_append "${cname}.." # For some fun reason, the parameter ordering varies for # LUKS and non-LUKS devices. Joy. if [ "${cpass}" = "SWAP" ]; then # This is DANGEROUS! The only possible safety check # is to not proceed in case we find a LUKS device # This may cause dataloss if it is not used carefully if $CS isLuks $csrc 2>/dev/null; then false else $CS -d /dev/urandom $copts create $cname $csrc >/dev/null if [ $? -eq 0 ]; then stat_append "creating swapspace.." /sbin/mkswap -f -L $cname /dev/mapper/$cname >/dev/null fi fi elif [ "${cpass}" = "ASK" ]; then printf "\nOpening '${cname}' volume:\n" if $CS isLuks $csrc 2>/dev/null; then $CS $copts luksOpen $csrc $cname < /dev/console else $CS $copts create $cname $csrc < /dev/console fi elif [ "${cpass:0:1}" != "/" ]; then if $CS isLuks $csrc 2>/dev/null; then echo "$cpass" | $CS $copts luksOpen $csrc $cname >/dev/null else echo "$cpass" | $CS $copts create $cname $csrc >/dev/null fi else if $CS isLuks $csrc 2>/dev/null; then $CS -d $cpass $copts luksOpen $csrc $cname >/dev/null else $CS -d $cpass $copts create $cname $csrc >/dev/null fi fi if [ $? -ne 0 ]; then csfailed=1 stat_append "failed " else stat_append "ok " fi fi } while read line; do eval do_crypt "$line" done /dev/null fi fi fi status "Mounting Root Read-only" /bin/mount -n -o remount,ro / FORCEFSCK= [ -f /forcefsck ] && FORCEFSCK="-- -f" NETFS="nonfs,nonfs4,nosmbfs,nocifs,nocodafs,noncpfs,nosysfs,noshfs,nofuse,nofuseblk,noglusterfs" fsck_reboot() { echo "Automatic reboot in progress..." /bin/umount -a /bin/mount -n -o remount,ro / /sbin/reboot -f exit 0 } if [ -x /sbin/fsck ]; then stat_busy "Checking Filesystems" FSCK_OUT=/dev/stdout FSCK_ERR=/dev/stdout FSCK_FD= run_hook sysinit_prefsck /sbin/fsck -A -T -C$FSCK_FD -a -t "$NETFS,noopts=_netdev" $FORCEFSCK >$FSCK_OUT 2>$FSCK_ERR fsckret=$? if [ ${fsckret} -gt 1 ]; then stat_fail fi run_hook sysinit_postfsck if [ $((${fsckret}&2)) -eq 2 ]; then echo echo "********************** REBOOT REQUIRED *********************" echo "* *" echo "* The system will be rebooted automatically in 15 seconds. *" echo "* *" echo "************************************************************" echo /bin/sleep 15 fsck_reboot fi if [ ${fsckret} -gt 1 -a ${fsckret} -ne 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 /sbin/sulogin -p fsck_reboot fi stat_done fi stat_busy "Mounting Local Filesystems" /bin/mount -n -o remount,rw / if [ -x /bin/findmnt -a -e /proc/self/mountinfo ]; then /bin/findmnt -rnu -o SOURCE,TARGET,FSTYPE,OPTIONS >| /etc/mtab else cat /proc/mounts >| /etc/mtab fi run_hook sysinit_premount # now mount all the local filesystems /bin/mount -a -t $NETFS -O no_netdev stat_done status "Activating Swap" /sbin/swapon -a stat_busy "Configuring System Clock" if [ "$TIMEZONE" != "" -a -e "/usr/share/zoneinfo/$TIMEZONE" ]; then /bin/rm -f /etc/localtime /bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime fi clock_pid="" if [ -n "$HWCLOCK_PARAMS" ]; then # This time, we set the clock for real. Use the adjustment file now that # /var will definitely be available, and then set the system clock once # the hardware clock has been adjusted accordingly. The backgrounding magic # is due to the fact that the second call to hwclock will almost always # take ~1 second because of the clock granularity, and we might as well # stay busy. ( /sbin/hwclock --adjust /sbin/hwclock $HWCLOCK_PARAMS ) & clock_pid=$! fi stat_done RANDOM_SEED=/var/lib/misc/random-seed if [ -f $RANDOM_SEED ]; then stat_busy "Initializing Random Seed" /bin/cat $RANDOM_SEED > /dev/urandom stat_done fi stat_busy "Removing Leftover Files" /bin/rm -f /etc/nologin &>/dev/null /bin/rm -f /etc/shutdownpid &>/dev/null /bin/rm -f /var/lock/* &>/dev/null /bin/rm -rf /tmp/* /tmp/.* &>/dev/null /bin/rm -f /forcefsck &>/dev/null (cd /var/run && /usr/bin/find . ! -type d -exec /bin/rm -f -- {} \; ) : >| /var/run/utmp /bin/chmod 0664 /var/run/utmp # Keep {x,k,g}dm happy with xorg /bin/mkdir /tmp/.ICE-unix && /bin/chmod 1777 /tmp/.ICE-unix /bin/mkdir /tmp/.X11-unix && /bin/chmod 1777 /tmp/.X11-unix stat_done #status "Updating Shared Library Links" /sbin/ldconfig if [ "$HOSTNAME" != "" ]; then status "Setting Hostname: $HOSTNAME" /bin/hostname $HOSTNAME fi # Set the NIS domain name, if necessary [ -f /etc/conf.d/nisdomainname ] && . /etc/conf.d/nisdomainname if [ "$NISDOMAINNAME" != "" ]; then status "Setting NIS Domain Name: $NISDOMAINNAME" /bin/nisdomainname $NISDOMAINNAME fi status "Updating Module Dependencies" /sbin/depmod -A # Flush old locale settings : >| /etc/profile.d/locale.sh /bin/chmod 755 /etc/profile.d/locale.sh # Set user defined locale [ -z "$LOCALE" ] && LOCALE="en_US" stat_busy "Setting Locale: $LOCALE" echo "export LANG=$LOCALE" >>/etc/profile.d/locale.sh stat_done if echo "$LOCALE" | /bin/grep -qi utf ; then stat_busy "Setting Consoles to UTF-8 mode" # UTF-8 consoles are default since 2.6.24 kernel # this code is needed not only for older kernels, # but also when user has set vt.default_utf8=0 but LOCALE is *.UTF-8. for i in /dev/tty[0-9]*; do /usr/bin/kbd_mode -u < ${i} printf "\033%%G" > ${i} done # the $CONSOLE check helps us avoid this when running scripts from cron echo 'if [ "$CONSOLE" = "" -a "$TERM" = "linux" -a -t 1 ]; then printf "\033%%G"; fi' >>/etc/profile.d/locale.sh stat_done [ -n "$KEYMAP" ] && status "Loading Keyboard Map: $KEYMAP" /bin/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 for i in /dev/tty[0-9]*; do /usr/bin/kbd_mode -a < ${i} printf "\033%%@" > ${i} done # the $CONSOLE check helps us avoid this when running scripts from cron echo 'if [ "$CONSOLE" = "" -a "$TERM" = "linux" -a -t 1 ]; then printf "\033%%@"; fi' >>/etc/profile.d/locale.sh stat_done [ -n "$KEYMAP" ] && status "Loading Keyboard Map: $KEYMAP" /bin/loadkeys -q $KEYMAP fi # Set console font if required set_consolefont # Adding persistent network/cdrom generated rules if [ -f "/dev/.udev/tmp-rules--70-persistent-cd.rules" ]; then stat_busy "Adding persistent cdrom udev rules" /bin/cat /dev/.udev/tmp-rules--70-persistent-cd.rules >> /etc/udev/rules.d/70-persistent-cd.rules stat_done fi if [ -f "/dev/.udev/tmp-rules--70-persistent-net.rules" ]; then stat_busy "Adding persistent network udev rules" /bin/cat /dev/.udev/tmp-rules--70-persistent-net.rules >> /etc/udev/rules.d/70-persistent-net.rules stat_done fi /bin/dmesg >| /var/log/dmesg.log # final hwclock setting needs to be done at this point if [ -n "$clock_pid" ]; then wait $clock_pid fi run_hook sysinit_end # End of file # vim: set ts=2 sw=2 noet: