2022-05-23 21:10:31 +08:00
|
|
|
#!/usr/bin/bash
|
|
|
|
#
|
2022-09-11 23:25:47 +08:00
|
|
|
# SPDX-FileCopyrightText: 2022 Celeste Liu <CoelacanthusHex@gmail.com>
|
2022-05-23 21:10:31 +08:00
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
|
|
# shellcheck disable=1091
|
|
|
|
. /usr/share/makepkg/util.sh
|
|
|
|
colorize
|
|
|
|
|
2022-09-11 23:25:47 +08:00
|
|
|
verbose=0
|
|
|
|
use_fixed_password=0
|
2023-07-07 13:38:09 +03:00
|
|
|
build_firmware=1
|
2022-09-11 23:25:47 +08:00
|
|
|
varbose_arg=
|
2022-09-13 12:05:55 +08:00
|
|
|
rootfs="archriscv-$(date --rfc-3339=date).tar.zst"
|
2022-09-11 23:25:47 +08:00
|
|
|
|
|
|
|
show_help() {
|
|
|
|
cat << EOF
|
2023-07-07 13:38:09 +03:00
|
|
|
Usage: ${0##*/} [-hvfd] [-p PASSWORD] [-r ROOTFS] [FILENAME]
|
|
|
|
Create Arch RISC-V distro image.
|
2022-09-11 23:25:47 +08:00
|
|
|
|
|
|
|
FILENAME generated image file name
|
|
|
|
default: 'archriscv-$(date --rfc-3339=date).qcow2'
|
2023-07-07 13:38:09 +03:00
|
|
|
unless the extension is qcow2, implies raw disk format
|
2022-09-11 23:25:47 +08:00
|
|
|
|
|
|
|
-h display this help and exit
|
|
|
|
-f use fixed password instead of using systemd-firstboot to ask
|
2023-07-07 13:38:09 +03:00
|
|
|
-d only build the disk image and omit building OpenSBI/U-Boot
|
2022-09-11 23:25:47 +08:00
|
|
|
-p PASSWORD set root password to PASSWORD instead of passwd in rootfs
|
|
|
|
-r ROOTFS specify rootfs file name
|
|
|
|
-v verbose mode
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
parse-args() {
|
|
|
|
local OPTIND=1
|
2023-07-07 13:38:09 +03:00
|
|
|
while getopts 'hvfdr:p:' opt; do
|
2022-09-11 23:25:47 +08:00
|
|
|
case $opt in
|
2023-07-07 13:38:09 +03:00
|
|
|
h) show_help
|
2022-09-11 23:25:47 +08:00
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
v) verbose=$((verbose+1))
|
|
|
|
varbose_arg="--verbose"
|
|
|
|
;;
|
2023-07-07 13:38:09 +03:00
|
|
|
f) use_fixed_password=1
|
|
|
|
;;
|
|
|
|
d) build_firmware=0
|
2022-09-11 23:25:47 +08:00
|
|
|
;;
|
|
|
|
p) password=$OPTARG
|
|
|
|
;;
|
2022-09-13 12:05:55 +08:00
|
|
|
r) rootfs=$OPTARG
|
2022-09-11 23:25:47 +08:00
|
|
|
;;
|
2023-07-07 13:38:09 +03:00
|
|
|
*) show_help >&2
|
2022-09-11 23:25:47 +08:00
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
shift "$(( OPTIND-1 ))"
|
|
|
|
filename=${1:-archriscv-$(date --rfc-3339=date).qcow2}
|
|
|
|
}
|
|
|
|
|
2022-05-23 23:27:56 +08:00
|
|
|
toggle-systemd-firstboot() {
|
|
|
|
msg2 "Toggle systemd-firstboot..."
|
2023-07-07 13:38:09 +03:00
|
|
|
sudo rm -f mnt/etc/{machine-id,hostname,shadow}
|
|
|
|
sudo systemd-nspawn -D mnt systemctl enable systemd-firstboot.service
|
2022-05-23 23:27:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
use-fixed-password() {
|
2022-09-11 23:25:47 +08:00
|
|
|
msg2 "Using fixed password... $password"
|
2023-07-07 13:38:09 +03:00
|
|
|
[[ -n $password ]] && sudo usermod --root $(realpath ./mnt) --password $(openssl passwd -6 "$password") root
|
2022-05-23 23:27:56 +08:00
|
|
|
}
|
|
|
|
|
2022-09-11 23:25:47 +08:00
|
|
|
parse-args "$@"
|
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
if [ $build_firmware == 1 ]
|
|
|
|
then
|
|
|
|
msg "Building U-Boot..."
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-10 18:34:37 +08:00
|
|
|
if [[ -d u-boot ]]; then
|
|
|
|
pushd u-boot
|
|
|
|
git checkout master -- ':(top)'
|
|
|
|
git checkout master
|
|
|
|
git pull --rebase
|
|
|
|
git checkout v2023.04
|
|
|
|
popd
|
|
|
|
else
|
|
|
|
git clone --depth 1 -b v2023.04 https://github.com/u-boot/u-boot.git
|
|
|
|
fi
|
2023-07-07 13:38:09 +03:00
|
|
|
pushd u-boot
|
2022-11-01 18:33:55 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
make \
|
|
|
|
CROSS_COMPILE=riscv64-linux-gnu- \
|
|
|
|
qemu-riscv64_smode_defconfig
|
|
|
|
make CROSS_COMPILE=riscv64-linux-gnu-
|
|
|
|
popd
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
msg "Building OpenSBI..."
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-10 18:34:37 +08:00
|
|
|
if [[ -d opensbi ]]; then
|
|
|
|
pushd opensbi
|
|
|
|
git checkout master -- ':(top)'
|
|
|
|
git checkout master
|
|
|
|
git pull --rebase
|
|
|
|
git checkout v2023.04
|
|
|
|
popd
|
|
|
|
else
|
|
|
|
git clone --depth 1 -b v1.2 https://github.com/riscv-software-src/opensbi
|
|
|
|
fi
|
2023-07-07 13:38:09 +03:00
|
|
|
pushd opensbi
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
make \
|
|
|
|
CROSS_COMPILE=riscv64-linux-gnu- \
|
|
|
|
PLATFORM=generic \
|
|
|
|
FW_PAYLOAD_PATH=../u-boot/u-boot.bin
|
|
|
|
popd
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
cp ./opensbi/build/platform/generic/firmware/fw_payload.bin opensbi_fw_payload.bin
|
|
|
|
fi
|
2022-09-11 23:25:47 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
if [[ $filename == *.qcow2 ]]
|
|
|
|
then
|
|
|
|
msg "Create QCOW2 image..."
|
|
|
|
qemu-img create -f qcow2 "$filename" 10G
|
|
|
|
sudo modprobe nbd max_part=16 || exit 1
|
|
|
|
# Possible NBD device collision?
|
|
|
|
sudo qemu-nbd -c /dev/nbd0 "$filename"
|
|
|
|
loopdev=/dev/nbd0
|
|
|
|
else
|
|
|
|
msg "Create raw image..."
|
|
|
|
fallocate "$filename" -l 10G
|
|
|
|
loopdev=$(sudo losetup --show -P -f "$filename")
|
|
|
|
fi
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
msg "Partitioning..."
|
|
|
|
(echo n; echo p; echo 1; echo ''; echo ''; echo w) | sudo fdisk "$loopdev"
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
sudo partprobe "$loopdev"
|
|
|
|
partdev="$loopdev"p1
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
sudo mkfs.ext4 "$partdev"
|
|
|
|
sudo e2label "$partdev" rootfs
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
sudo mkdir -p mnt
|
|
|
|
sudo mount "$partdev" mnt
|
|
|
|
sudo chown root:root mnt
|
|
|
|
|
|
|
|
partuuid=$(sudo findmnt mnt -o UUID -n)
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2022-07-27 19:55:25 +08:00
|
|
|
msg "Extract rootfs..."
|
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
pushd mnt
|
|
|
|
sudo bsdtar $varbose_arg -kpxf "../$rootfs"
|
2022-07-27 19:55:25 +08:00
|
|
|
popd
|
|
|
|
|
2022-05-23 21:10:31 +08:00
|
|
|
msg "Install kernel package..."
|
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
sudo systemd-nspawn -D mnt pacman \
|
|
|
|
--noconfirm --needed \
|
2022-08-25 07:30:52 +03:00
|
|
|
-Syu linux linux-firmware
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
sudo mkdir -p mnt/boot/extlinux
|
|
|
|
cat << EOF | sudo tee mnt/boot/extlinux/extlinux.conf
|
|
|
|
menu title Arch RISC-V Boot Menu
|
2022-05-23 21:10:31 +08:00
|
|
|
timeout 100
|
2023-07-07 13:38:09 +03:00
|
|
|
default linux-fallback
|
2022-05-23 21:10:31 +08:00
|
|
|
|
|
|
|
label linux
|
|
|
|
menu label Linux linux
|
|
|
|
kernel /boot/vmlinuz-linux
|
2023-07-07 13:38:09 +03:00
|
|
|
initrd /boot/initramfs-linux.img
|
|
|
|
append earlyprintk rw root=UUID=$partuuid rootwait rootfstype=ext4 LANG=en_US.UTF-8 console=ttyS0
|
|
|
|
|
|
|
|
label linux-fallback
|
|
|
|
menu label Linux linux (fallback initramfs)
|
|
|
|
kernel /boot/vmlinuz-linux
|
2022-08-03 07:10:27 +03:00
|
|
|
initrd /boot/initramfs-linux-fallback.img
|
2023-07-07 13:38:09 +03:00
|
|
|
append earlyprintk rw root=UUID=$partuuid rootwait rootfstype=ext4 LANG=en_US.UTF-8 console=ttyS0
|
2022-05-23 21:10:31 +08:00
|
|
|
EOF
|
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
cat << EOF | sudo tee mnt/etc/systemd/network/default.network
|
2022-12-01 22:06:37 +08:00
|
|
|
[Match]
|
|
|
|
Name=en*
|
|
|
|
|
|
|
|
[Network]
|
|
|
|
DHCP=yes
|
|
|
|
EOF
|
2023-07-07 13:38:09 +03:00
|
|
|
sudo systemd-nspawn -D mnt systemctl enable systemd-networkd.service
|
2022-12-01 22:06:37 +08:00
|
|
|
|
2022-05-23 21:10:31 +08:00
|
|
|
msg "Clean up..."
|
|
|
|
msg2 "Clean up pacman package cache..."
|
|
|
|
yes y | sudo pacman \
|
2023-07-07 13:38:09 +03:00
|
|
|
--sysroot ./mnt \
|
2022-05-23 21:10:31 +08:00
|
|
|
--sync --clean --clean
|
|
|
|
|
2022-09-11 23:25:47 +08:00
|
|
|
(( use_fixed_password==0 )) && toggle-systemd-firstboot || use-fixed-password
|
2022-05-23 21:10:31 +08:00
|
|
|
|
2023-07-07 13:38:09 +03:00
|
|
|
msg2 "Unmount and sync..."
|
|
|
|
sudo umount mnt
|
|
|
|
if [[ $filename == *.qcow2 ]]
|
|
|
|
then
|
|
|
|
sudo qemu-nbd -d "$loopdev"
|
|
|
|
else
|
|
|
|
sudo losetup -d "$loopdev"
|
|
|
|
fi
|
|
|
|
sudo sync
|