mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-28 22:57:37 +00:00
281 lines
8.7 KiB
Bash
Executable file
281 lines
8.7 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# /etc/rc.sysinit
|
|
#
|
|
|
|
. /etc/rc.conf
|
|
. /etc/rc.d/functions
|
|
|
|
echo " "
|
|
printhl "Arch Linux ARM\n"
|
|
printhl "${C_H2}http://www.archlinuxarm.org"
|
|
printsep
|
|
|
|
# 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=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
|
|
# make sure nothing can open files rw on root which would block a remount
|
|
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
|
|
|
|
HWCLOCK_PARAMS="--systz"
|
|
case $HARDWARECLOCK in
|
|
"") ;;
|
|
UTC) HWCLOCK_PARAMS+=" --utc --noadjfile";;
|
|
localtime) HWCLOCK_PARAMS+=" --localtime --noadjfile";;
|
|
*) HWCLOCK_PARAMS="";;
|
|
esac
|
|
|
|
if [[ $HWCLOCK_PARAMS ]]; then
|
|
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
|
|
|
|
# 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
|
|
[[ $USEDMRAID = [Yy][Ee][Ss] && -x $(type -P dmraid) ]] &&
|
|
status "Activating FakeRAID arrays" dmraid -i -ay
|
|
|
|
# BTRFS devices detection
|
|
[[ $USEBTRFS = [Yy][Ee][Ss] && -x $(type -P btrfs) ]] &&
|
|
status "Activating BTRFS volumes" btrfs device scan
|
|
|
|
# Activate LVM2 groups if any
|
|
activate_vgs
|
|
|
|
# Set up non-root encrypted partition mappings
|
|
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
|
|
# 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
|
|
fi
|
|
case $3 in
|
|
SWAP)
|
|
local _overwriteokay=0
|
|
if [[ -b $2 && -r $2 ]]; then
|
|
# This is DANGEROUS! If there is any known file system,
|
|
# partition table, RAID or LVM volume on the device
|
|
# we don't overwrite it.
|
|
#
|
|
# 'blkid' returns 2 if no valid signature has been found.
|
|
# Only in this case we should allow overwriting the device.
|
|
#
|
|
# 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
|
|
(( $? == 2 )) && _overwriteokay=1
|
|
fi
|
|
if (( _overwriteokay == 0 )); then
|
|
false
|
|
elif $CS -d /dev/urandom $4 $open "$a" "$b" >/dev/null; then
|
|
stat_append "creating swapspace.."
|
|
mkswap -f -L $1 /dev/mapper/$1 >/dev/null
|
|
fi;;
|
|
ASK)
|
|
printf "\nOpening '$1' volume:\n"
|
|
$CS $4 $open "$a" "$b" < /dev/console;;
|
|
/dev*)
|
|
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
|
|
# cka is not numeric: cka=filesystem, ckb=path
|
|
mkdir ${ckdir}
|
|
mount -r -t ${cka} ${ckdev} ${ckdir}
|
|
dd if=${ckdir}/${ckb} of=${ckfile} >/dev/null 2>&1
|
|
umount ${ckdir}
|
|
rmdir ${ckdir};;
|
|
*)
|
|
# Read raw data from the block device
|
|
# cka is numeric: cka=offset, ckb=length
|
|
dd if=${ckdev} of=${ckfile} bs=1 skip=${cka} count=${ckb} >/dev/null 2>&1;;
|
|
esac
|
|
$CS -d ${ckfile} $4 $open "$a" "$b" >/dev/null
|
|
dd if=/dev/urandom of=${ckfile} bs=1 count=$(stat -c %s ${ckfile}) conv=notrunc >/dev/null 2>&1
|
|
rm ${ckfile};;
|
|
/*)
|
|
$CS -d "$3" $4 $open "$a" "$b" >/dev/null;;
|
|
*)
|
|
echo "$3" | $CS $4 $open "$a" "$b" >/dev/null;;
|
|
esac
|
|
if (( $? )); then
|
|
failed=1
|
|
stat_append "failed "
|
|
else
|
|
stat_append "ok "
|
|
fi
|
|
return $failed
|
|
}
|
|
crypto_unlocked=0
|
|
read_crypttab do_unlock && stat_done || stat_fail
|
|
# Maybe someone has LVM on an encrypted block device
|
|
(( crypto_unlocked == 1 )) && activate_vgs
|
|
fi
|
|
|
|
# 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_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
|
|
|
|
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
|
|
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
|
|
|
|
# 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
|
|
[[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) && -d /sys/block ]] &&
|
|
status "Activating monitoring of LVM2 groups" \
|
|
vgchange --monitor y >/dev/null
|
|
|
|
status "Activating Swap" swapon -a
|
|
|
|
[[ $TIMEZONE ]] &&
|
|
status "Configuring Time Zone" \
|
|
cp --remove-destination "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
|
|
|
|
RANDOM_SEED=/var/lib/misc/random-seed
|
|
[[ -f $RANDOM_SEED ]] &&
|
|
status "Initializing Random Seed" \
|
|
cp $RANDOM_SEED /dev/urandom
|
|
|
|
# Remove leftover files
|
|
remove_leftover
|
|
|
|
if [[ $HOSTNAME ]]; then
|
|
stat_busy "Setting Hostname: $HOSTNAME"
|
|
echo "$HOSTNAME" >| /proc/sys/kernel/hostname && stat_done || stat_fail
|
|
fi
|
|
|
|
# Flush old locale settings and set user defined locale
|
|
stat_busy "Setting Locale: ${LOCALE:=en_US}"
|
|
echo "export LANG=$LOCALE" > /etc/profile.d/locale.sh &&
|
|
chmod 0755 /etc/profile.d/locale.sh && stat_done || stat_fail
|
|
|
|
if [[ ${LOCALE,,} =~ 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
|
|
kbd_mode -u < ${i}
|
|
printf "\e%%G" > ${i}
|
|
done
|
|
echo 1 >| /sys/module/vt/parameters/default_utf8
|
|
stat_done
|
|
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
|
|
kbd_mode -a < ${i}
|
|
printf "\e%%@" > ${i}
|
|
done
|
|
echo 0 >| /sys/module/vt/parameters/default_utf8
|
|
stat_done
|
|
fi
|
|
[[ $KEYMAP ]] &&
|
|
status "Loading Keyboard Map: $KEYMAP" loadkeys -q $KEYMAP
|
|
|
|
# Set console font if required
|
|
set_consolefont
|
|
|
|
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
|
|
|
|
# End of file
|
|
# vim: set ts=2 sw=2 noet:
|