initramfs-init 4.21 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
NEWROOT=/newroot
SINGLEMODE=no

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

11 12 13
# needed devs
mknod /dev/null c 1 3

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
# 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. $*"
29
		echo "initramfs emergency recovery shell launched"
30 31 32 33 34 35 36 37 38 39 40 41 42
		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
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
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"
}

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

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

139
mount -t tmpfs tmpfs $NEWROOT
140

Natanael Copa's avatar
Natanael Copa committed
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
# 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

157
# install new root
158
ebegin "Installing packages to root filesystem"
159 160 161 162 163
mkdir -p /etc/apk
for i in /media/$ALPINE_DEV/packages/*; do
	echo $i >> /etc/apk/repositories
done
apk add --root /newroot --initdb --quiet --progress $pkgs
164 165
eend $?

166 167 168 169
# copy alpine release info
cp /media/$ALPINE_DEV/.alpine-release $NEWROOT/
ln -sf /.alpine-release $NEWROOT/etc/alpine-release

170 171
# if there is no repositories file, then use the default
if ! [ -f $NEWROOT/etc/apk/repositories ]; then
172
	cp /etc/apk/repositories $NEWROOT/etc/apk/repositories
173 174
fi

175 176 177 178 179 180 181 182
# 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
183

184
ln -sf /.modloop/modules $NEWROOT/lib/modules
185
echo ""
Natanael Copa's avatar
Natanael Copa committed
186 187 188 189 190 191 192
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