Last active
January 2, 2026 17:50
-
-
Save kurochan/752a93f831aee2023b68020bcc9f7a27 to your computer and use it in GitHub Desktop.
Install Ubuntu24.04 with ZFS root for Turing RK1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| set -euo pipefail | |
| pushd $(dirname $0) | |
| export DEBIAN_FRONTEND=noninteractive | |
| NVME_DEVICE="/dev/nvme0n1" | |
| NVME_DEVICE_P1="${NVME_DEVICE}p1" | |
| NVME_DEVICE_P2="${NVME_DEVICE}p2" | |
| UBUNTU_IMAGE_URL="https://github.com/Joshua-Riek/ubuntu-rockchip/releases/download/v2.4.0/ubuntu-24.04-preinstalled-server-arm64-turing-rk1.img.xz" | |
| UBUNTU_IMAGE_SHA256="f256c055084c43b131dcd6b48d1a01be4c5efa020fe5aad8cfeaf122fc6e60ec" # xzではなくimgのsha256sum | |
| UBUNTU_IMAGE_FILENAME="ubuntu-24.04-preinstalled-server-arm64-turing-rk1.img" | |
| RELEASE_NUM="6.1.0-1025-rockchip" # uname -r | |
| # sudo apt-get update | |
| # sudo apt-get -y upgrade | |
| # sudo reboot | |
| echo "" | |
| read -n1 -p "INITIALIZE NVMe? (y/n): " yn | |
| if [[ $yn = [yY] ]]; then | |
| echo "" | |
| echo "### start initializing NVMe ###" | |
| else | |
| exit 1 | |
| fi | |
| echo "" | |
| sudo apt-get -y install nvme-cli zfsutils-linux | |
| echo "" | |
| echo "### Download ubuntu image ###" | |
| need_download=1 | |
| if [ -f ./${UBUNTU_IMAGE_FILENAME} ]; then | |
| echo "#### check file hash ####" | |
| file_hash=$(cat ./${UBUNTU_IMAGE_FILENAME} | sha256sum | cut -d ' ' -f 1) | |
| if [ "${UBUNTU_IMAGE_SHA256}" = "${file_hash}" ]; then | |
| echo "file hash match! skip download." | |
| need_download=0 | |
| else | |
| echo "file hash NOT match! got: ${file_hash}" | |
| fi | |
| fi | |
| if [ $need_download -ne 0 ]; then | |
| echo "#### downloading ####" | |
| curl -L -o ./${UBUNTU_IMAGE_FILENAME}.xz ${UBUNTU_IMAGE_URL} | |
| echo "#### extracting ####" | |
| xz -f -d ./${UBUNTU_IMAGE_FILENAME}.xz | |
| echo "#### check file hash ####" | |
| file_hash=$(cat ./${UBUNTU_IMAGE_FILENAME} | sha256sum | cut -d ' ' -f 1) | |
| if [ "${UBUNTU_IMAGE_SHA256}" != "${file_hash}" ]; then | |
| echo "file hash NOT match! abort!" | |
| exit 1 | |
| fi | |
| fi | |
| echo "" | |
| echo "### get S.M.A.R.T. ###" | |
| sudo nvme smart-log ${NVME_DEVICE} | |
| echo "" | |
| echo "### WIPE NVMe ###" | |
| # 0はデータ上書きなしの初期化、1は0埋め、2はsecure erase(暗号鍵破棄), 2は対応しているデバイスでしかできない | |
| sudo nvme format ${NVME_DEVICE} -s 0 -f | |
| sudo partprobe ${NVME_DEVICE} | |
| sudo wipefs -a ${NVME_DEVICE} | |
| echo "" | |
| echo "### NVMEe partitions ###" | |
| lsblk ${NVME_DEVICE} | |
| echo "" | |
| echo "### create partitions ###" | |
| sudo parted ${NVME_DEVICE} --script \ | |
| mklabel gpt \ | |
| mkpart boot ext4 1MiB 1025MiB \ | |
| mkpart rootfs 1025MiB 100% | |
| lsblk ${NVME_DEVICE} | |
| echo "" | |
| echo "### init /boot partitions ###" | |
| sudo mkfs.ext4 -L boot ${NVME_DEVICE_P1} | |
| echo "" | |
| echo "### create ZFS pool ###" | |
| sudo mkdir -p /mnt/zroot | |
| # altrootを指定しないと/が上書きマウントされてしまうので注意 | |
| sudo zpool create -f \ | |
| -o ashift=12 \ | |
| -o altroot=/mnt/zroot \ | |
| -O atime=off \ | |
| -O compression=zstd \ | |
| -O mountpoint=none \ | |
| rpool ${NVME_DEVICE_P2} | |
| sudo zpool list | |
| echo "" | |
| echo "### create ZFS ###" | |
| sudo zfs create \ | |
| -o mountpoint=/ \ | |
| -o canmount=noauto \ | |
| rpool/ROOT | |
| sudo zfs list | |
| echo "" | |
| echo "### mount / ###" | |
| sudo zfs mount rpool/ROOT | |
| echo "" | |
| echo "### mount /boot ###" | |
| sudo mkdir -p /mnt/zroot/boot | |
| sudo mount ${NVME_DEVICE_P1} /mnt/zroot/boot | |
| echo "" | |
| echo "### mount ubuntu image ###" | |
| sudo losetup -Pf ./${UBUNTU_IMAGE_FILENAME} | |
| loop_device=$(losetup -j ./${UBUNTU_IMAGE_FILENAME} | cut -d ':' -f 1 | grep loop) | |
| sudo mkdir -p /mnt/imgroot | |
| loop_device_p2=${loop_device}p2 | |
| sudo mount -o ro ${loop_device_p2} /mnt/imgroot | |
| echo "" | |
| echo "### copy rootfs ###" | |
| sudo rsync -aAX --numeric-ids \ | |
| --exclude={"/boot/*","/EFI/*","/dev/*","/proc/*","/sys/*","/run/*"} \ | |
| /mnt/imgroot/ /mnt/zroot/ | |
| echo "" | |
| echo "### copy /boot ###" | |
| sudo rsync -a /mnt/imgroot/boot/ /mnt/zroot/boot/ | |
| echo "" | |
| echo "### copy device tree file ###" | |
| sudo mkdir -p /mnt/zroot/boot/dtb/${RELEASE_NUM}/rockchip | |
| sudo cp -a \ | |
| /mnt/zroot/lib/firmware/${RELEASE_NUM}/device-tree/rockchip/rk3588-turing-rk1.dtb \ | |
| /mnt/zroot/boot/dtb/${RELEASE_NUM}/rockchip/rk3588-turing-rk1.dtb | |
| echo "" | |
| echo "### configure fstab ###" | |
| cat <<EOF | sudo tee /mnt/zroot/etc/fstab | |
| # <file system> <mount point> <type> <options> <dump> <fsck> | |
| LABEL=boot /boot ext4 defaults 0 2 | |
| EOF | |
| echo "" | |
| echo "### configure u-boot ###" | |
| cat <<EOF | sudo tee -a /mnt/zroot/etc/default/u-boot | |
| U_BOOT_ROOT="root=ZFS=rpool/ROOT" | |
| U_BOOT_FDT_DIR="/dtb/" | |
| U_BOOT_FDT="rockchip/rk3588-turing-rk1.dtb" | |
| EOF | |
| echo "" | |
| echo "### configure zfs param ###" | |
| echo "options zfs zfs_arc_max=8589934592" | sudo tee /mnt/zroot/etc/modprobe.d/zfs.conf # limit arc_max to 8GB | |
| echo "" | |
| echo "### chroot ###" | |
| sudo mount --bind /dev /mnt/zroot/dev | |
| sudo mount --bind /proc /mnt/zroot/proc | |
| sudo mount --bind /sys /mnt/zroot/sys | |
| sudo mount --bind /run /mnt/zroot/run | |
| sudo chroot /mnt/zroot /bin/bash -c "$(cat <<'EOF' | |
| set -euo pipefail | |
| export DEBIAN_FRONTEND=noninteractive | |
| echo "" | |
| echo "### configure zfs ###" | |
| # rootでchrootしてるのでsudo不要 | |
| apt-get update | |
| apt-get install -y zfsutils-linux zfs-initramfs | |
| zpool set bootfs=rpool/ROOT rpool | |
| echo "" | |
| echo "### configure initramfs ###" | |
| update-initramfs -u -k all | |
| lsinitramfs /boot/initrd.img-* | grep -i zfs.ko | |
| echo "" | |
| echo "### update u-boot config(extlinux.conf) ###" | |
| u-boot-update | |
| echo "" | |
| echo "### exit chroot ###" | |
| exit | |
| EOF | |
| )" | |
| echo "" | |
| echo "### unmount devices ###" | |
| sudo umount -R /mnt/imgroot | |
| sudo umount -R /mnt/zroot | |
| sudo zpool export rpool | |
| sudo losetup -d ${loop_device} | |
| echo "" | |
| echo "### SUCCESS ###" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment