summaryrefslogtreecommitdiff
path: root/rc.sysinit
blob: 0514343478064894c9199e2c67ce2e6b097b5846 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/bin/bash
#
# /etc/rc.sysinit
#

. /etc/rc.conf
. /etc/rc.d/functions

if [[ -s /etc/locale.conf ]]; then
	parse_envfile /etc/locale.conf "LANG"
elif [[ $LOCALE ]]; then
	export LANG=$LOCALE
fi

echo " "
printhl "Arch Linux\n"
printhl "${C_H2}https://www.archlinux.org"
printsep

# mount the API filesystems
# /proc, /sys, /run, /dev, /run/lock, /dev/pts, /dev/shm
mountpoint -q /proc    || mount -t proc proc /proc -o nosuid,noexec,nodev
mountpoint -q /sys     || mount -t sysfs sys /sys -o nosuid,noexec,nodev
mountpoint -q /run     || mount -t tmpfs run /run -o mode=0755,nosuid,nodev
mountpoint -q /dev     || mount -t devtmpfs dev /dev -o mode=0755,nosuid
mkdir -p /dev/{pts,shm}
mountpoint -q /dev/pts || mount -t devpts devpts /dev/pts -o mode=0620,gid=5,nosuid,noexec
mountpoint -q /dev/shm || mount -t tmpfs shm /dev/shm -o mode=1777,nosuid,nodev

# log all console messages
bootlogd -p /run/bootlogd.pid

if [[ ! -e /run/initramfs/root-fsck ]]; then
	# 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 -o remount,ro /
fi

run_hook sysinit_start

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 time zone"

	# Adjust the system time for time zone offset if rtc is not in UTC, as
	# filesystem checks can depend on system time. This also sets the kernel
	# time zone, used by e.g. vfat.
	# If TIMEZONE is not set in rc.conf, the time zone stored in /etc/localtime
	# is used. If HARDWARECLOCK is not set in rc.conf, the value in
	# /etc/adjfile is used.

	[[ $TIMEZONE ]] && export TZ=$TIMEZONE

	hwclock $HWCLOCK_PARAMS && stat_done || stat_fail

	unset TZ
fi

# Start/trigger udev, load MODULES, and settle udev
udevd_modprobe sysinit

# this must be done after udev has loaded the KMS modules
status 'Configuring virtual consoles' /usr/lib/systemd/systemd-vconsole-setup

# 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 ]] && type -p cryptsetup >/dev/null; then
	stat_busy "Unlocking encrypted volumes"
	crypto_unlocked=0
	read_crypttab do_unlock && stat_done || stat_fail
	# Maybe someone has LVM on an encrypted block device
	(( crypto_unlocked )) && activate_vgs
fi

# Check filesystems
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 and API filesystems" \
	/usr/lib/systemd/systemd-remount-fs

# 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" set_timezone "$TIMEZONE"

status 'Initializing random seed' /usr/lib/systemd/systemd-random-seed load

# Remove leftover files
remove_leftover

if [[ -s /etc/hostname ]]; then
	HOSTNAME=$(< /etc/hostname)
fi
if [[ $HOSTNAME ]]; then
	stat_busy "Setting hostname: $HOSTNAME"
	echo "$HOSTNAME" >| /proc/sys/kernel/hostname && stat_done || stat_fail
fi

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

if [[ -f /etc/adjtime ]]; then
	( read ; read ; read ADJTIME) < /etc/adjtime

	if [[ $ADJTIME == 'LOCAL' ]]; then
		if	[[ $HARDWARECLOCK == 'UTC' ]]; then
			printf "${C_FAIL}/etc/rc.conf says the RTC is in UTC, but /etc/adjtime says it is in localtime.\n${C_OTHER}."
		fi
	else
		if [[ $HARDWARECLOCK == 'LOCALTIME' ]]; then
			printf "${C_FAIL}/etc/rc.conf says the RTC is in localtime, but hwclock (/etc/adjtime) thinks it is in UTC.\n${C_OTHER}."
		fi
	fi
fi

run_hook sysinit_end

# End of file
# vim: set ts=2 sw=2 noet: