Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save kurochan/752a93f831aee2023b68020bcc9f7a27 to your computer and use it in GitHub Desktop.

Select an option

Save kurochan/752a93f831aee2023b68020bcc9f7a27 to your computer and use it in GitHub Desktop.
Install Ubuntu24.04 with ZFS root for Turing RK1
#!/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