本帖最后由 饿客登门 于 2017-5-1 06:55 编辑
现在开始进入正题:
制作 rootfs 的环境,最好在板子上操作,可以省去一些模拟步骤和可以忽略的瑕疵(强迫症或完美主义者估计绕不过去的问题或毛病)。
使用整理好的固件,烧录至板子上,使用用户密码登录:
normal user: firefly
normal pass: firefly
root user: firefly
root pass: firefly
配置基础环境:
$ su - root
# apt update
# apt full-upgrade
# apt install debootstrap
使用下面命令构建基础雏形:
# dd if=/dev/zero of=rootfs.img bs=1M count=1024
# mkfs.ext4 rootfs.img
# mkdir -pv rootfs
# mount rootfs.img rootfs
# debootstrap --arch=arm64 --verbose --include=locales,dbus jessie rootfs http://debian.ustc.edu.cn/debian/
chroot 进去 rootfs 之前配置基本信息,查看 rootfs/etc/resolv.conf 是否包含:nameserver 192.168.1.1,如包含则忽略,否则添加。
查看 rootfs/etc/apt/sources.list 是否是正确的 apt 源,如不是,可以去下面地址去生成:
https://mirrors.ustc.edu.cn/repogen/
文件 rootfs/etc/hostname 可以添加自己的主机名,
同时 rootfs/etc/hosts 配置主机名对应的 ip,如:127.0.0.1 firefly
挂载虚拟文件系统,如后续结束后无法卸载,可重启板子退出,基本无影响。
# export minisys=/root/rootfs
# mount -v --bind /dev $minisys/dev
# mount -vt devpts devpts $minisys/dev/pts
# mount -vt tmpfs shm $minisys/dev/shm
# mount -vt proc proc $minisys/proc
# mount -vt sysfs sysfs $minisys/sys
进入目标系统,设置时区,本地语言。
# LANG=en_US.UTF-8 chroot rootfs /bin/bash
# dpkg-reconfigure locales
# dpkg-reconfigure tzdata
# apt update
# apt full-upgrade
配置网络连接服务:
# systemctl enable systemd-networkd
# systemctl enable systemd-resolved
连接网络:
# mkdir -pv /etc/systemd/network
# vi /etc/systemd/network/eth0.network
# Use DHCP
[Match]
Name=eth0
[Network]
DHCP=yes
增加用户进入管理员组,修改用户对应密码,最后退出 chroot 环境:
# useradd -s '/bin/bash' -m -G adm,sudo firefly
# passwd firefly
# passwd root
# exit
在收尾前,为后续精简 rootfs.img 体积,可自行删除一些文件,至于每个文件或目录的定义,可从网络上找!
收尾:卸载,修复,缩减
# umount -R $minisys
# e2fsck -p -f rootfs.img
# resize2fs -M rootfs.img
至此:可以说算是 rootfs 已经制作完成,如果条件不足需要用电脑或虚拟机来操作,
则需要安装 qemu-user-static,命令由 debootstrap 替换成 qemu-debootstrap 即可,其它照旧。
----------========== 进入第二部分 ==========----------
现在开始 uboot / kernel / initramfs 的编译部分,此环节使用虚拟机,因为内核包中有一些辅助程序是 x86 环境下的,ARM64 下无法执行:
安装前置依赖包:
# apt install openjdk-7-jdk git x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-glx mingw-w64 tofrodos lib32z1 lib32ncurses5 python-markdown git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk3.0-dev squashfs-tools build-essential zip curl zlib1g-dev pngcrush libxml2 libxml2-utils xsltproc libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev lib32readline-gplv2-dev gcc-multilib libswitch-perl lzop libncurses5-dev libssl-dev libssl1.0.0
编译器使用 Linaro 的 4.9.4 版本,下载地址:
# wget -c https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/aarch64-linux-gnu/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu.tar.xz
设置环境变量,或添加进 ~/.bashrc 中,然后 source ~/.bashrc 即可:
# export GCC="/usr/local/gcc-4.9.4"
# export PATH="$GCC:$GCC/bin:$PATH"
# export CROSS_COMPILE="aarch64-linux-gnu-"
# export ARCH="arm64"
# export ARCHV="aarch64"
Git 检出 u-boot,分支 rkproduct:
# git clone -b rkproduct https://github.com/rockchip-linux/u-boot.git u-boot
Git 检出 kernel,分支 release-4.4:
# git clone -b release-4.4 https://github.com/rockchip-linux/kernel.git kernel
编译 u-boot 部分:
# cd u-boot
# make rk3399_linux_defconfig
# make menuconfig
# make
结果会生成文件:RK3399MiniLoaderAll_V1.05.bin / u-boot.img / trust.img
编译 kernel 部分:
# cd kernel
# make rockchip_linux_defconfig
# make menuconfig
# make rk3399-firefly-linux.img -j8
结果会生成文件:kernel.img / resource.img
最后将所有生成的文件放在 rockdev 目录中,可从 AndroidTool 软件中找到,同时编辑 rockdev 目录中的 mkupdate.bat 文件。
Afptool -pack .\backupimage backupimage\backup.img
Afptool -pack ./ Image\update.img
RKImageMaker.exe -RK330C RK3399_Loader_v1.07.105.bin Image\update.img update.img -os_type:androidos
del Image\update.img
pause
编辑 package-file 文件:
package-file package-file
bootloader RK3399_Loader_v1.07.105.bin
parameter parameter
uboot uboot.img
trust trust.img
kernel kernel.img
resource resource.img
backup RESERVED
boot rootfs.img
编辑 parameter 文件:
FIRMWARE_VER: 6.0.1
MACHINE_MODEL: RK3399
MACHINE_ID: 007
MANUFACTURER: RK3399
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3399
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
#KERNEL_IMG: 0x00280000
#FDT_NAME: rk-kernel.dtb
#RECOVER_KEY: 1,1,0,20,0
#in section; per section 512(0x200) bytes
CMDLINE: console=ttyFIQ0 root=/dev/mmcblk1p6 rw rootwait mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(resource),0x00010000@0x00008000(kernel),0x00002000@0x00018000(backup),-@0x0001A000(boot)
如果一切正常,将 RK3399_Loader_v1.07.105.bin / parameter / uboot.img / trust.img / kernel.img / resource.img / rootfs.img 这些文件放在一起,执行 mkupdate.bat,生成的 update.img 就是最终的统一固件了,如果烧录后出现无法挂载,可修改 parameter 文件的 root 挂载点(根据分区顺序数),也可去Q群咨询。但有一点:内核源码中网卡驱动部分不稳定,待此部分驱动问题解决后再说或自行修正(期待大神!)。
----------========== 进入第三部分 ==========----------
替换法:
使用 AndroidTool 2.39 解包 Firefly 发布的固件,将主要的部分保留,替换成自己的 rootfs。
最后再打包生成最后的结果,此种方法都是通用方法,很多人都是这么做的,驱动部分比较全。应急时还是不错的选择。
如果需要自己添加内核模块,自己写的那种,可以使用 dracut 生成 initramfs !使用方法可参照手册:
(initrd 的制作如果不能支持 systemd,则不建议用,因为 busybox,具体原因可自行网络搜索)
https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html
至于生成 boot.img 参照下面的命令:
# mkbootimg --kernel kernel.img --ramdisk initramfs-4.4.52.img --second resource.img --out boot.img