RK3588制作Debian镜像

配置镜像文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 设置镜像相关变量
SKIP_MB=16
BOOTFS_MB=256
ROOTFS_MB=1024
IMG_PATH=/home/leux/debian.img
BOOT_PATH=/home/leux/bootfs
ROOT_PATH=/home/leux/rootfs
mkdir -p "${BOOT_PATH}" "${ROOT_PATH}"

# 创建挂载镜像
dd if=/dev/zero of="$IMG_PATH" bs=1M count="$((SKIP_MB + BOOTFS_MB + ROOTFS_MB + 1))" conv=fsync && sync # 创建镜像文件
sudo losetup -f -P "${IMG_PATH}" # 挂载 img镜像
IMG_LOOP=$(losetup | grep "${IMG_PATH}" | gawk '{print $1}') # 获取挂载资源

# 创建所需分区
sudo parted -s ${IMG_LOOP} mklabel gpt # 建 gpt分区表
sudo parted -s ${IMG_LOOP} mkpart primary ext4 "$(($SKIP_MB * 1024 * 1024))"b "$[($SKIP_MB + $BOOTFS_MB) * 1024 * 1024 - 1]"b # 创建boot分区
sudo parted -s ${IMG_LOOP} mkpart primary ext4 "$[($SKIP_MB + $BOOTFS_MB) * 1024 * 1024]"b "100%" # 创建root分区
#sudo parted -s ${IMG_LOOP} mkpart primary btrfs "$[($SKIP_MB + $BOOTFS_MB) * 1024 * 1024]"b "100%" # 创建root分区

# 格式化该分区
BOOTFS_UUID=$(uuidgen) # 创建随机UUID
ROOTFS_UUID=$(uuidgen) # 创建随机UUID
sudo mkfs.ext4 -U ${BOOTFS_UUID} -L "BOOTFS" -b 4k "${IMG_LOOP}p1" # 格式boot分区
sudo mkfs.ext4 -U ${ROOTFS_UUID} -L "ROOTFS" -b 4k "${IMG_LOOP}p2" # 格式root分区
#sudo mkfs.btrfs -U ${ROOTFS_UUID} -L "ROOT" -m single "${IMG_LOOP}p2"

# 挂载这些分区
sudo mount -t "ext4" "${IMG_LOOP}p1" "${BOOT_PATH}" # 挂载boot分区
sudo mount -t "ext4" "${IMG_LOOP}p2" "${ROOT_PATH}" # 挂载root分区
#sudo mount -t "btrfs" "${IMG_LOOP}p2" "${ROOT_PATH}"

搞根文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 因为是在WSL2上交叉制作所以需要,启动服务binfmt-support可解决:chroot: failed to run command '/bin/bash': Exec format error
sudo apt install binfmt-support qemu-user-static debootstrap
sudo /usr/sbin/update-binfmts --enable

# 开始获取根文件系统
sudo qemu-debootstrap --arch=arm64 stable ${ROOT_PATH}/ http://mirrors.ustc.edu.cn/debian/

# 挂载ARM64的根文件系统
sudo mount -t proc /proc ${ROOT_PATH}/proc
sudo mount -t sysfs /sys ${ROOT_PATH}/sys
sudo mount -o bind /dev ${ROOT_PATH}/dev
sudo chroot ${ROOT_PATH}/

# 切换根目录后可以执行你想要做的操作
......

# 卸载ARM64的根文件系统
exit
sudo umount ${ROOT_PATH}/proc
sudo umount ${ROOT_PATH}/sys
sudo umount ${ROOT_PATH}/dev

开始编译内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 宿主机上安装交叉编译工具
sudo apt install build-essential gcc-aarch64-linux-gnu bison bc python-is-python3 dpkg-dev
export all_proxy="172.23.240.1:7890"

# 开始编译内核
git clone --depth=1 https://github.com/unifreq/linux-5.10.y-rk35xx
cd linux-5.10.y-rk35xx/
wget -O .config https://raw.githubusercontent.com/unifreq/arm64-kernel-configs/main/config-5.10.160-rk3588-flippy-2311a
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j16

# 开始安装内核到指定位置,最好切换到root用户再安装模块,否则可能模块权限将混乱
sudo mkdir ${BOOT_PATH}/boot/ # INSTALL_PATH不存在会报错
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install INSTALL_PATH=${BOOT_PATH}/boot/
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=${ROOT_PATH}/
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- headers_install INSTALL_HDR_PATH=${ROOT_PATH}/usr/
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs_install INSTALL_DTBS_PATH=${BOOT_PATH}/boot/dtb-5.10.160-rk35xx/

制作initrd和uinitrd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 拷贝config这步mkinitramfs会用到
sudo cp ${BOOT_PATH}/boot/config-5.10.160 ${ROOT_PATH}/boot/
sudo chroot ${ROOT_PATH}/

# 切换根目录后制作initrd和uinitrd
apt install initramfs-tools u-boot-tools xz-utils wireless-regdb
mkinitramfs -c xz -o /boot/initrd.img-5.10.160 5.10.160
mkimage -A arm64 -T ramdisk -C none -n uInitrd -d /boot/initrd.img-5.10.160 /boot/uInitrd-5.10.160

# 文件boot.scr的制作
# wget https://github.com/unifreq/openwrt_packit/raw/master/files/bootfiles/rockchip/rk3588/h88k-v3/boot.cmd
# mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr

# 配置链接以方便调用
exit && cd ${BOOT_PATH}/boot/
sudo ln -s initrd.img-5.10.160 initrd.img
sudo ln -s uInitrd-5.10.160 uInitrd
sudo ln -s vmlinuz-5.10.160 vmlinuz
sudo ln -s dtb-5.10.160-rk35xx/ dtb

配置引导相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 修改引导分区相关配置
cat > ${BOOT_PATH}/armbianEnv.txt <<EOF
verbosity=7
bootlogo=false
fdtfile=rockchip/rk3588-hlink-h88k-v3.dtb
rootdev=UUID=${ROOTFS_UUID}
rootfstype=ext4
rootflags=
console=serial
consoleargs=console=ttyFIQ0 console=tty1
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
earlycon=on
docker_optimizations=on
extraargs=
extraboardargs=net.ifnames=0
overlay_prefix=rk3588
overlays=
user_overlays=
EOF


# 配置开机挂载。二次运行需要blkid才能查看正确的UUID
cat >> ${ROOT_PATH}/etc/fstab <<EOF
UUID=${BOOTFS_UUID} /boot ext4 noatime,errors=remount-ro 0 2
UUID=${ROOTFS_UUID} / ext4 defaults,noatime,commit=600,errors=remount-ro 0 1
EOF


# 写入 u-boot 到磁盘镜像,rockchip的bootloader统一从硬盘的第65个扇区开始至16MB这个范围
wget https://github.com/unifreq/openwrt_packit/raw/master/files/rk3588/h88k/rk3588-h88k-bootloader.bin
wget https://github.com/unifreq/openwrt_packit/raw/master/files/bootfiles/rockchip/rk3588/h88k-v3/boot.scr
dd if=rk3588-h88k-bootloader.bin of=/dev/loop0 conv=fsync,notrunc bs=512 skip=64 seek=64
cp boot.scr ${BOOTFS_UUID}/


# 卸载镜像,如果target is busy则lsof查看是谁占用,然后杀了即可
losetup -D
lsof | grep ${BOOT_PATH}
lsof | grep ${ROOT_PATH}
kill 14897

umount /dev/loop0p1
umount /dev/loop0p2

使用Flippy预编译的内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Flippy的预编译内核:https://pan.baidu.com/s/1tY_-l-Se2qGJ0eKl7FZBuQ?pwd=846l
ls /root/2311B/
boot-5.10.160-rk3588-flippy-2311b.tar.gz
dtb-rockchip-5.10.160-rk3588-flippy-2311b.tar.gz
modules-5.10.160-rk3588-flippy-2311b.tar.gz
header-5.10.160-rk3588-flippy-2311b.tar.gz

KERNEL_PATH=/root/2311B
BOOT_PATH=/mnt/boot
ROOT_PATH=/mnt/root

cd ${BOOT_PATH}
tar -xzvf ${KERNEL_PATH}/boot-5.10.160-rk3588-flippy-2311b.tar.gz -C ${BOOT_PATH}
mkdir -p ${BOOT_PATH}/dtb-5.10.160-rk3588-flippy-2311b/rockchip/
tar -xzvf ${KERNEL_PATH}/dtb-rockchip-5.10.160-rk3588-flippy-2311b.tar.gz -C ${BOOT_PATH}/dtb-5.10.160-rk3588-flippy-2311b/rockchip/

ln -s vmlinuz-5.10.160-rk3588-flippy-2311b Image
ln -s uInitrd-5.10.160-rk3588-flippy-2311b uInitrd
ln -s dtb-5.10.160-rk3588-flippy-2311b dtb

mkdir -p ${ROOT_PATH}/lib/modules/ ${ROOT_PATH}/lib/firmware/
tar -xzvf ${KERNEL_PATH}/modules-5.10.160-rk3588-flippy-2311b.tar.gz -C ${ROOT_PATH}/lib/modules/

cp -r ${KERNEL_PATH}/firmware/* ${ROOT_PATH}/lib/firmware/

cp ${KERNEL_PATH}/boot/boot.scr ${BOOT_PATH}