|
发表于 2017-4-23 13:30:26
只看该作者
沙发
本帖最后由 饿客登门 于 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
复制代码 |
|