Gitlab has successfully been upgraded to 14.0.10 🎉. Enjoy!

initramfs-init 4.02 KB
Newer Older
Natanael Copa's avatar
Natanael Copa committed
1
#!/bin/sh
2

3 4
# this is the init script version
VERSION=1.0
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
NEWROOT=/newroot
SINGLEMODE=no

# basic environment
export PATH=/usr/bin:/bin:/usr/sbin:/sbin

# basic mounts
mount -t proc -o noexec,nosuid,nodev proc /proc
mount -t sysfs -o noexec,nosuid,nodev sysfs /sys

# some helpers
ebegin() {
	echo -n " * $*: "
}
eend() {
	local msg
	if [ "$1" = 0 ] || [ $# -lt 1 ] ; then
		echo "ok."
	else
		shift
		echo "failed. $*"
26
		echo "initramfs emergency recovery shell launched"
27 28 29 30 31 32 33 34 35 36 37 38 39
		exec /bin/busybox sh
	fi
}

scan_drivers() {
	if [ "$AUTODETECT" != no ] ; then
		find /sys -name modalias | xargs sort | while read a ; do
			modprobe $a 2>/dev/null \
				|| echo $a >> /tmp/hwdrivers.failed
		done
	fi
}

Natanael Copa's avatar
Natanael Copa committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
find_ovl() {
	local mnt="$1"
	local ovl
	local lines

	# look for apkovl's on mounted media
	ovl=$( ls -1 "$mnt"/*.apkovl.tar.gz* 2>/dev/null ) || return 1
	lines=$(echo "$ovl" | wc -l)

	if [ $lines -gt 1 ] ; then
		echo "ERROR: More than one apkovl file was found on $(basename $mnt). None will be read." >&2
		return 1
	fi
	echo "$ovl"
}

56
# gotta start from somewhere :)
57
echo "Alpine Init $VERSION"
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

# read the kernel options
for i in `cat /proc/cmdline` ; do
	case $i in
		s|single|1)
			SINGLEMODE=yes ;;
		modules=*)
			MODULES="`echo ${i#modules=} | tr ',' ' '`";;
		noautodetect)
			AUTODETECT=no;;
		*=*)    eval KOPT_$i ;;
		*)      eval KOPT_$i=yes ;;
	esac
done

ALPINE_DEV=${KOPT_alpine_dev%%:*}
ALPINE_MNT=/media/$ALPINE_DEV

# hide kernel messages
dmesg -n 1

# setup /dev
ebegin "Starting mdev"
mount -t tmpfs -o exec,nosuid,mode=0755 mdev /dev
mknod -m 666 /dev/null c 1 3
ln -s sr0 /dev/cdrom
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
mdev -s
RC=$?
[ -d /dev/pts ] || mkdir -m 755 /dev/pts
[ -c /dev/ptmx ] || mknod -m 666 /dev/ptmx c 5 2
mount -t devpts -o gid=5,mode=0620,noexec,nosuid devpts /dev/pts
[ -d /dev/shm ] || mkdir /dev/shm
mount -t tmpfs -o nodev,nosuid,noexec shm /dev/shm
eend $RC

# load available drivers to get access to modloop media
ebegin "Loading boot drivers"
[ "$MODULES" ] && modprobe $MODULES 2> /dev/null
Natanael Copa's avatar
Natanael Copa committed
97 98 99 100 101 102
if [ -f /etc/modules ] ; then
	sed 's/\#.*//g' < /etc/modules |
	while read module args; do
		modprobe -q $module $args
	done
fi
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
scan_drivers
scan_drivers
eend 0

# locate boot media and mount it
ebegin "Mounting boot media"
mount $ALPINE_MNT >/dev/null 2>&1
eend $?
ebegin "Mounting loopback device for kernel modules"
modprobe loop
mount -o loop,ro -t cramfs /media/$ALPINE_DEV/$(dirname ${KOPT_BOOT_IMAGE:-""})/modloop.cmg /.modloop
rc=$?
if [ "$rc" = 0 ]; then
	rm -rf /lib/modules
	ln -sf /.modloop/modules /lib
fi
if [ -d $ALPINE_MNT/firmware ]; then
	mkdir -p /lib/firmware
	cp -a $ALPINE_MNT/firmware/* /lib/firmware/
fi
eend $?

# early console?
if [ "$SINGLEMODE" = "yes" ]; then
	echo "Entering single mode. Type 'exit' to continue booting."
	sh
fi

# more drivers
ebegin "Loading hardware drivers"
scan_drivers
eend 0

136 137
mount -t tmpfs -o size=50M tmpfs $NEWROOT

Natanael Copa's avatar
Natanael Copa committed
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
# look for apkovl
for i in usb floppy cdrom; do
	mount /media/$i 2>/dev/null || continue
	ovl=$(find_ovl /media/$i)
	[ -f "$ovl" ] && break
	umount /media/$i 2>/dev/null
done

if [ -f "$ovl" ]; then
	ebegin "Loading user settings from $ovl"
	tar -C $NEWROOT -zxf "$ovl"
	eend $?
	umount /media/$i 2>/dev/null
	pkgs=$(sed 's/\#.*//' $NEWROOT/etc/lbu/packages.list 2>/dev/null)
fi

154
# install new root
155
ebegin "Installing packages to root filesystem"
156
apk add --root /newroot --repository /media/$ALPINE_DEV/apks \
157
	--initdb --quiet --progress $pkgs
158 159
eend $?

160 161 162 163
# copy alpine release info
cp /media/$ALPINE_DEV/.alpine-release $NEWROOT/
ln -sf /.alpine-release $NEWROOT/etc/alpine-release

164 165 166 167 168 169 170 171
# switch over to new root
cat /proc/mounts | while read DEV DIR TYPE OPTS ; do
	if [ "$DIR" != "/" -a "$DIR" != "$NEWROOT" -a -d "$DIR" ]; then
		mkdir -p $NEWROOT/$DIR
		mount -o move $DIR $NEWROOT/$DIR
	fi
done
sync
Natanael Copa's avatar
Natanael Copa committed
172

173 174
ln -sf /.modloop/modules $NEWROOT/lib/modules

175
echo -e "\nStarting $(cut -f1 $NEWROOT/.alpine-release)" 
Natanael Copa's avatar
Natanael Copa committed
176 177 178 179 180 181 182
if [ -x $NEWROOT/sbin/init ]; then
	exec /bin/busybox switch_root $NEWROOT /sbin/init $KOPT_init_args
fi

echo "initramfs emergency recovery shell launched"
exec /bin/busybox sh
reboot