aboutsummaryrefslogtreecommitdiff
path: root/rc.sysinit
blob: a0bbaa63a466956749e8d8d71c16e4d2e3219060 (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
#!/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}http://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 -m 1777 /run/lock
mkdir -p /dev/{pts,shm}
mountpoint -q /dev/pts || mount /dev/pts &>/dev/null ||
	mount -t devpts devpts /dev/pts -o mode=0620,gid=5,nosuid,noexec
mountpoint -q /dev/shm || mount /dev/shm &>/dev/null ||
	mount -t tmpfs shm /dev/shm -o mode=1777,nosuid,nodev
mountpoint -q /proc/sys/fs/binfmt_misc || mount /proc/sys/fs/binfmt_misc &>/dev/null ||
	mount -t binfmt_misc binfmt /proc/sys/fs/binfmt_misc

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

status 'Configuring Virtual Consoles' /usr/lib/systemd/systemd-vconsole-setup

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 timezone"

		# Adjust the system time for timezone offset if rtc is not in UTC
		# 1. Make creation time on device 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).
	[[ $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

# 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

run_hook sysinit_end

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