#!/bin/sh # apk add qemu-img losetup blkid parted dosfstools e2fsprogs wget tar set -eu : "${DISK:=gru-mmc.img}" : "${DISKSIZE:=500M}" readonly SCRIPT="${0##*/}" readonly TMPDIR="$(mktemp -dt "${SCRIPT%.*}".XXXXXX)" readonly APK_KEY="alpine-devel@lists.alpinelinux.org-60ac2099.rsa.pub" readonly MIRROR="http://dl-cdn.alpinelinux.org/alpine" readonly LOOPDEV="$(losetup --find)" readonly KERNDEV="$LOOPDEV"p1 readonly BOOTDEV="$LOOPDEV"p2 readonly ROOTDEV="$LOOPDEV"p3 cleanup() { set +e mountpoint -q "$TMPDIR"/boot && umount "$TMPDIR"/boot mountpoint -q "$TMPDIR" && umount "$TMPDIR" losetup --detach-all rm -rf "$TMPDIR" } trap cleanup EXIT INT kernel="linux-rockchip-6.1.2-r0.apk" #if [ ! -f $kernel ]; then # wget https://dev.alpinelinux.org/~mps/riscv64/"$kernel" #fi #if [ ! -f "$DISK" ]; then echo "Creating qemu raw disk" qemu-img create -f raw "$DISK" "$DISKSIZE" chown "$USER":"$USER" "$DISK" #else # echo "Disk already exists exiting." # exit 1 #fi echo "Paritioning disk" # fat32 64MB, ext4 rest of device parted -s "$DISK" mktable gpt > /dev/null cgpt create $DISK secgpt=$(cgpt show $DISK | grep 'Sec GPT table' | awk '{print $1}') endpart=$(expr $secgpt - 73728) endpart=$(expr $secgpt - 335872) cgpt add -i 1 -t kernel -b 8192 -s 65536 -l uboot -S 1 -T 5 -P 10 $DISK cgpt add -i 2 -t data -b 73728 -s 262144 -l boot $DISK cgpt add -i 3 -t data -b 335872 -s $endpart -l root $DISK parted -s $DISK -- set 2 legacy_boot on echo "Creating dirs and mounting" losetup -P "$LOOPDEV" "$DISK" mkfs.ext4 -qL boot "$BOOTDEV" mkfs.ext4 -qL root "$ROOTDEV" mount -t ext4 "$ROOTDEV" "$TMPDIR" mkdir -p "$TMPDIR"/boot mkdir -p "$TMPDIR"/etc/apk/keys mount -t ext4 "$BOOTDEV" "$TMPDIR"/boot echo "Setup apk keys and repositories" wget -qP "$TMPDIR"/etc/apk/keys https://alpinelinux.org/keys/"$APK_KEY" printf "$MIRROR/edge/%s\n" main community testing > "$TMPDIR"/etc/apk/repositories echo "installing base packages" apk --allow-untrusted --root "$TMPDIR" --arch aarch64 --initdb add \ alpine-base alpine-baselayout alpine-conf kmod openrc \ dbus util-linux blkid chrony \ sysfsutils ssl_client ca-certificates-bundle alpine-keys \ ethtool e2fsprogs e2fsprogs-extra libudev-zero libudev-zero-helper \ iwd linux-firmware-rockchip linux-firmware-mrvl installkernel mkinitfs \ agetty openresolv tar wget cgpt linux-gru #apk --allow-untrusted --root "$TMPDIR" --arch aarch64 add $kernel echo "Setting up services and inittab" for rc in boot/bootmisc boot/hostname boot/modules boot/sysctl boot/urandom boot/networking \ sysinit/devfs sysinit/hwdrivers sysinit/mdev sysinit/modules \ shutdown/mount-ro shutdown/killprocs \ default/dbus default/chronyd default/local; do ln -s /etc/init.d/"${rc##*/}" "$TMPDIR"/etc/runlevels/"$rc" done echo 'SUBSYSTEM=drm;.* root:video 660 */usr/libexec/libudev-zero-helper' >> $TMPDIR/etc/mdev.conf echo 'SUBSYSTEM=input;.* root:input 660 */usr/libexec/libudev-zero-helper' >> $TMPDIR/etc/mdev.conf echo "Settting boot loader" rootuuid=$(blkid -s PARTUUID -o value $ROOTDEV) mkdir -p "$TMPDIR"/boot/extlinux cat < "$TMPDIR"/boot/extlinux/extlinux.conf menu title Alpine timeout 50 default gru label gru menu label Alpine Linux kernel /vmlinuz-gru initrd /initramfs-gru fdtdir /dtbs-gru append console=tty1 earlyprintk=tty1 root=PARTUUID=$rootuuid rootfstype=ext4 rw rootwait init=/sbin/init nospectre_bhb loglevel=7 EOF dd if=u-boot-depthcharge.kpart of=$KERNDEV sed -i 's/^tty1.*/tty1::respawn:\/sbin\/agetty -L 115200 tty1 linux --login-pause --autologin root --noclear/' $TMPDIR/etc/inittab echo "Finished, cleaning up"