Gitlab has successfully been upgraded to 14.0.10 🎉. Enjoy!

initramfs-init 3.76 KB
Newer Older
Natanael Copa's avatar
Natanael Copa committed
1
#!/bin/sh
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

VERSION=1.9.1-pre0
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. $*"
25
		echo "initramfs emergency recovery shell launched"
26 27 28 29 30 31 32 33 34 35 36 37 38
		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
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
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"
}

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

# 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
96 97 98 99 100 101
if [ -f /etc/modules ] ; then
	sed 's/\#.*//g' < /etc/modules |
	while read module args; do
		modprobe -q $module $args
	done
fi
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
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

Natanael Copa's avatar
Natanael Copa committed
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
# 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

151
# install new root
152
ebegin "Installing packages to root filesystem"
153
mount -t tmpfs -o size=50M tmpfs $NEWROOT
154 155
apk add --root /newroot --repository /media/cdrom/apks \
	--initdb --quiet --progress $pkgs
156 157 158 159 160 161 162 163 164 165
eend $?

# 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
166 167 168 169 170 171 172 173

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