#!/bin/sh PREFIX= . "$PREFIX/lib/libalpine.sh" MBR=${MBR:-"/usr/share/syslinux/mbr.bin"} in_list() { local i="$1" shift while [ $# -gt 0 ]; do [ "$i" = "$1" ] && return 0 shift done return 1 } enumerate_fstab() { local mnt="$1" [ -z "$mnt" ] && return awk "\$2 == \"$mnt\" {print \$0}" /proc/mounts | \ sed "s-$mnt-/-; s-/+-/-; s: :\t:g" } install_mounted_root() { local mnt="$1" local features="ata base bootchart cdrom ext2 ext3 ide scsi usb" rootdev=$(awk "\$2 == \"$mnt\" { print \$1 }" /proc/mounts) if [ -z "$rootdev" ]; then echo "$mnt does not seem to be a mount point" >&2 return 1 fi local fs=$(awk "\$1 == \"$rootdev\" {print \$3}" /proc/mounts) if [ "$fs" != "ext2" ] && [ "$fs" != "ext3" ]; then echo "$fs is not supported. Only ext2 and ext3 are supported" >&2 return 1 fi rootdisk=${rootdev%[0-9]*} echon "Installing system on $rootdev: " lbu package - | tar -C "$mnt" -zx apk add -q --progress --root "$mnt" $(cat "$mnt"/var/lib/apk/world) \ linux-grsec linux-grsec-mod acct mkinitfs echo "" # make things bootable kernel=$(ls "$mnt"/lib/modules) if [ "$rootdisk" = "/dev/md" ]; then local md=${rootdev#/dev/} features="$features raid" raidmod=$(cat /sys/block/$md/md/level) raidmod=",$raidmod" raidopt="-r" # get a list of slaves rootdisk= for i in /sys/block/$md/slaves/*; do j=${i##*/} i=${j%[0-9]*} rootdisk="$rootdisk /dev/${i}" done fi chroot "$mnt" /sbin/mkinitfs -F "$features" $kernel # create an extlinux.conf sed '/append initrd/d' /media/*/syslinux.cfg > "$mnt"/boot/extlinux.conf echo -e "\tappend initrd=/boot/grsec.gz root=$rootdev modules=ext3$raidmod quiet" >> "$mnt"/boot/extlinux.conf # fix the fstab enumerate_fstab "$mnt" >> "$mnt"/etc/fstab # install extlinux apk add -q syslinux extlinux -i $raidopt "$mnt"/boot umount "$mnt" # fix mbr for all disk devices for i in $rootdisk; do local errmsg echo "Writing MBR to $i" errmsg=$(dd if="$MBR" of=$i 2>&1) \ || echo "$errmsg" done echo "" echo "Installation is done. Please reboot." apk del -q syslinux } useall() { local i size echo "Creating root partition..." apk_add -q parted e2fsprogs # erase all partitions for i in $(parted /dev/$rootdisk print | awk '$1 ~ /[0-9]+/ {print $1}'); do parted /dev/$rootdisk rm $i >/dev/null done # create new partition size=$(parted /dev/$rootdisk print | awk '/^Disk / {print $3}') parted /dev/$rootdisk mkpart primary 0 $size >/dev/null parted /dev/$rootdisk set 1 boot on >/dev/null # create device node if not exist mdev -s rootdev=/dev/${rootdisk}1 mkfs.ext3 -q $rootdev # we are done with parted and dont want it in the lbu package apk del -q parted e2fsprogs mount -t ext3 $rootdev /mnt || return 1 install_mounted_root /mnt } if [ -d "$1" ]; then # install to given mounted root install_mounted_root "${1%/}" exit $? fi usbdisk=$(readlink /dev/usbdisk) disks= cd /dev for i in sd[a-z] hd[a-z]; do case "$usbdisk" in $i[0-9]*);; *) [ -b "$i" ] && disks="$disks $i";; esac done # no disks so lets exit quietly. [ -z "$disks" ] && exit 0 rootdisk= while ! in_list "$rootdisk" $disks "none" "abort"; do echo "Available disks are: $disks" echon "Which one is the root disk? (or none) [none] " default_read rootdisk "none" done [ -b "/dev/$rootdisk" ] || exit 0 echon "Do you want use *all* of $rootdisk for Alpine? (y/n) [n] " default_read useall "n" case "$useall" in [Yy]*) useall="yes";; esac if [ "x$useall" != "xyes" ]; then echo "Only 'use all' option is available at the moment. Sorry" exit 1 fi useall