Firefly开源社区

标题: 开贴记录制作过程及疑问(不定时更新) [打印本页]

作者: 饿客登门    时间: 2017-4-23 00:12
标题: 开贴记录制作过程及疑问(不定时更新)
本帖最后由 饿客登门 于 2017-5-30 12:55 编辑

经过一段时间的学习与折腾,趁着没有忘记,将整理好的 Server 用途固件发布一下,同时将制作方法整理一下。

同时,固件的根文件系统使用 Debian 8.7.1,ARM64 版本。如果直接拿来用,请自行测试稳定性,或者根据方法自己制作。

(如若用在商业行为上而出现问题,本人概不负责,我只是个搬运工!方便大伙而已)

至于统一固件,严格说只是整理版,用的替换法,同时也是精简版,而且很精简,高压缩率下,70MB不到!方便部署。

如果哪位朋友需要用虚拟机编译,请自行斟酌,整个过程很折磨,甚至有时还要修修补补,这找点,那拿点,需要懂很多东西,慎入!!

下面是地址,不定期更新,也许哪天就不更新了,主要看 SDK 代码更新程度。

  1. http://pan.baidu.com/s/1qXOoFpU
复制代码

我的第一块板就是 RK3399,用它做的东西也是我最近的目标,又怕忘记制作过程中的一些,开贴记录,方便自己也方便大伙。
最近在爬贴,发现如我一般的小白,如果知识的连续性有断层,就会发生一堆的问题,也才会有下面帖子里的一堆事,所以建议:
如果可以,建议看完3288的wiki再下手不迟!
作者: 饿客登门    时间: 2017-4-23 13:30
本帖最后由 饿客登门 于 2017-5-1 06:55 编辑

现在开始进入正题:

制作 rootfs 的环境,最好在板子上操作,可以省去一些模拟步骤和可以忽略的瑕疵(强迫症或完美主义者估计绕不过去的问题或毛病)。

使用整理好的固件,烧录至板子上,使用用户密码登录:
  1. normal user: firefly
  2. normal pass: firefly

  3. root user: firefly
  4. root pass: firefly
复制代码

配置基础环境:
  1. $ su - root
  2. # apt update
  3. # apt full-upgrade
  4. # apt install debootstrap
复制代码

使用下面命令构建基础雏形:
  1. # dd if=/dev/zero of=rootfs.img bs=1M count=1024
  2. # mkfs.ext4 rootfs.img
  3. # mkdir -pv rootfs
  4. # mount rootfs.img rootfs
  5. # 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 源,如不是,可以去下面地址去生成:
  1. https://mirrors.ustc.edu.cn/repogen/
复制代码

文件 rootfs/etc/hostname 可以添加自己的主机名,

同时 rootfs/etc/hosts 配置主机名对应的 ip,如:127.0.0.1 firefly

挂载虚拟文件系统,如后续结束后无法卸载,可重启板子退出,基本无影响。
  1. # export minisys=/root/rootfs
  2. # mount -v --bind /dev $minisys/dev
  3. # mount -vt devpts devpts $minisys/dev/pts
  4. # mount -vt tmpfs shm $minisys/dev/shm
  5. # mount -vt proc proc $minisys/proc
  6. # mount -vt sysfs sysfs $minisys/sys
复制代码

进入目标系统,设置时区,本地语言。
  1. # LANG=en_US.UTF-8 chroot rootfs /bin/bash
  2. # dpkg-reconfigure locales
  3. # dpkg-reconfigure tzdata
  4. # apt update
  5. # apt full-upgrade
复制代码

配置网络连接服务:
  1. # systemctl enable systemd-networkd
  2. # systemctl enable systemd-resolved
复制代码

连接网络:
  1. # mkdir -pv /etc/systemd/network
  2. # vi /etc/systemd/network/eth0.network

  3. # Use DHCP
  4. [Match]
  5. Name=eth0

  6. [Network]
  7. DHCP=yes
复制代码

增加用户进入管理员组,修改用户对应密码,最后退出 chroot 环境:
  1. # useradd -s '/bin/bash' -m -G adm,sudo firefly
  2. # passwd firefly
  3. # passwd root
  4. # exit
复制代码

在收尾前,为后续精简 rootfs.img 体积,可自行删除一些文件,至于每个文件或目录的定义,可从网络上找!
收尾:卸载,修复,缩减
  1. # umount -R $minisys
  2. # e2fsck -p -f rootfs.img
  3. # resize2fs -M rootfs.img
复制代码

至此:可以说算是 rootfs 已经制作完成,如果条件不足需要用电脑或虚拟机来操作,
则需要安装 qemu-user-static,命令由 debootstrap 替换成 qemu-debootstrap 即可,其它照旧。

----------========== 进入第二部分 ==========----------
现在开始 uboot / kernel / initramfs 的编译部分,此环节使用虚拟机,因为内核包中有一些辅助程序是 x86 环境下的,ARM64 下无法执行:

安装前置依赖包:
  1. # 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 版本,下载地址:
  1. # 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 即可:
  1. # export GCC="/usr/local/gcc-4.9.4"
  2. # export PATH="$GCC:$GCC/bin:$PATH"
  3. # export CROSS_COMPILE="aarch64-linux-gnu-"
  4. # export ARCH="arm64"
  5. # export ARCHV="aarch64"
复制代码

Git 检出 u-boot,分支 rkproduct:
  1. # git clone -b rkproduct https://github.com/rockchip-linux/u-boot.git u-boot
复制代码

Git 检出 kernel,分支 release-4.4:
  1. # git clone -b release-4.4 https://github.com/rockchip-linux/kernel.git kernel
复制代码

编译 u-boot 部分:
  1. # cd u-boot
  2. # make rk3399_linux_defconfig
  3. # make menuconfig
  4. # make
复制代码
结果会生成文件:RK3399MiniLoaderAll_V1.05.bin / u-boot.img / trust.img

编译 kernel 部分:
  1. # cd kernel
  2. # make rockchip_linux_defconfig
  3. # make menuconfig
  4. # make rk3399-firefly-linux.img -j8
复制代码
结果会生成文件:kernel.img / resource.img

最后将所有生成的文件放在 rockdev 目录中,可从 AndroidTool 软件中找到,同时编辑 rockdev 目录中的 mkupdate.bat 文件。
  1. Afptool -pack .\backupimage backupimage\backup.img
  2. Afptool -pack ./ Image\update.img
  3. RKImageMaker.exe -RK330C RK3399_Loader_v1.07.105.bin  Image\update.img update.img -os_type:androidos
  4. del  Image\update.img
  5. pause
复制代码

编辑 package-file 文件:
  1. package-file package-file
  2. bootloader RK3399_Loader_v1.07.105.bin
  3. parameter parameter
  4. uboot uboot.img
  5. trust trust.img
  6. kernel kernel.img
  7. resource resource.img
  8. backup RESERVED
  9. boot rootfs.img
复制代码

编辑 parameter 文件:
  1. FIRMWARE_VER: 6.0.1
  2. MACHINE_MODEL: RK3399
  3. MACHINE_ID: 007
  4. MANUFACTURER: RK3399
  5. MAGIC: 0x5041524B
  6. ATAG: 0x00200800
  7. MACHINE: 3399
  8. CHECK_MASK: 0x80
  9. PWR_HLD: 0,0,A,0,1
  10. #KERNEL_IMG: 0x00280000
  11. #FDT_NAME: rk-kernel.dtb
  12. #RECOVER_KEY: 1,1,0,20,0
  13. #in section; per section 512(0x200) bytes
  14. 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,具体原因可自行网络搜索)
  1. https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html
复制代码

至于生成 boot.img 参照下面的命令:
  1. # mkbootimg --kernel kernel.img --ramdisk initramfs-4.4.52.img --second resource.img --out boot.img
复制代码

作者: 饿客登门    时间: 2017-4-23 13:39
本帖最后由 饿客登门 于 2017-5-8 19:01 编辑

这里是制作内核为主,纯 Linux 的,需要手工去做,所以会是个很慢的过程。只能慢慢来~
下面记录的暂时可以忽略,把这里当做记事本尝试在板子上直接编译:
  1. # apt install openjdk-7-jdk git x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-glx mingw-w64 tofrodos python-markdown 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 libswitch-perl lzop libncurses5-dev libssl1.0.0 libssl-dev
复制代码

这些天一直惦念一个问题,贴出代码:
  1. [  136.793742] NETDEV WATCHDOG: eth0 (rk_gmac-dwmac): transmit queue 0 timed out
  2. [  136.794502] ------------[ cut here ]------------
  3. [  136.794917] WARNING: at net/sched/sch_generic.c:306
复制代码
暂时只能找出一个折中的办法,但效果只能说一般般吧,后续再继续找解决方法。
编辑文件:/drivers/net/ethernet/rockchip/vmac/rk29_vmac.c
查找:dev->netdev_ops = &vmac_netdev_ops;
改为:dev->netdev_ops = TX_TIMEOUT;
之后从新编译内核并烧录。效果只是网卡不被 hold 住!(如果情况特殊,上面的办法依然不行,算得上是疑难杂症了)
作者: 饿客登门    时间: 2017-4-23 13:40
本帖最后由 饿客登门 于 2017-5-9 22:18 编辑

这里写的都是感觉有疏漏的地方

在折腾的过程中,尝试使用过 Rockchip 提供的方法烧录分区固件,
但是有很多地方不懂,几乎就把板子中的内容弄了个错乱,甚至分区格式,进入 MaskRom 也没法重新做,
就想到了一个最贱的方法,可以来个大清理,
但这种方法对 emmc 有多大的伤害,我想谁都清楚,所以这只是应急的方法,别经常这么做:
  1. # dd if=/dev/zero of=/dev/mmcblk1 bs=4k
复制代码

使用命令:df -h 和 lsblk 可以查看分区容量占用和分区标识,
如果自己尝试制作出统一固件,记得开机后第一件事就是对 rootfs 进行扩容,不然会出现问题而导致你不知道这啥情况:
  1. # resize2fs /dev/mmcblk1p5 或 /dev/mmcblk1p6
复制代码

最近更新的 Linux 环境固件,如果使用 AndroidTool 解包,最好使用 2.39 版本的解包,不然会失败。

命令 mkbootimg 是打包工具,对应的还有 unmkbootimg 这个解包工具,
用好它,再配合 dracut 可制作出自定义内核模块 initramfs,对想开发出特定要求的有一定意义。
贴下我的,当然,我这个只是挂载本地 rootfs 的:
  1. dracut --kver "4.4.16" --force --omit "console-setup caps" --omit-drivers "autofs4" --kernel-cmdline "init=/sbin/init root=/dev/mmcblk1p5 rootfstype=ext4 rd.shell rd.vconsole.unicode rd.locale.LANG=en_US.utf8" --strip --prelink --nomdadmconf --nolvmconf --stdlog "4" --verbose --hostonly --printsize
复制代码
如果 initramfs 无法进入 rootfs 而出现 console 环境提示符,将 rootfs 挂载到 /sysroot 并 输入 exit 退出 initramfs 环境即可。

说说挂载点 /dev/mmcblk1p1 ~ /dev/mmcblk1p6
p1 p2 p3 p4 p5 p6 ... 这些是分区顺序数,对应的分区标签可以在文件 parameter 中定义,只要启动过程的最后能挂载到 rootfs 就算 OK,所以 rootfs 一定要确定好,不然折腾死你!之前也曾用各种方式定义,比如:/dev/block/mtd/by-name/linuxroot ,但这个 linuxroot 是个软链接,挂载的时候未必好用且并非一定会找到,所以直接用 /dev/mmcblk1p5 这种到哪都可以正确识别的。

启动好后,会编辑,会定义属于自己的环境,同时需要重启板子,但好像 MAC 地址变来变去,SSH 连接总要改板子所属的 IP,这时候需要对 MAC 地址做永久固定,烧录固然方便,不过还是没弄懂,也许 WIFI 的 MAC 地址是定义在芯片中,但有线网卡的则是内核启动时随机生成的,所以......
方法:
1,以 root 用户编辑文件 /etc/init.d/networking
2,搜索:case "$1"
3,在:start) 后另起一行,加入:ifconfig eth0 hw ether 01:23:45:67:89:AB (注意缩进)
4,设置新的 MAC 地址后,保存重启,就会被分配一个固定的 MAC 地址,至于如何用,个人觉得用路由绑定 MAC 并分配个固定 IP 是比较好的。

试了下,repo init 直接好像不行,贴出试过好用的:
  1. repo init --repo-url https://github.com/rockchip-linux/repo.git -u https://github.com/rockchip-linux/manifests -m rk3399.xml
复制代码

git pull 时发生:server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none 这样的提示,只需要同步时间即可:
  1. timedatectl set-ntp true
复制代码

git clone 时发生下面错误:
  1. Cloning into 'rockchip-linux-mainline'...
  2. remote: Counting objects: 5274011, done.
  3. remote: Compressing objects: 100% (804473/804473), done.
  4. error: RPC failed; result=56, HTTP code = 2000.44 MiB | 92.00 KiB/s   
  5. fatal: The remote end hung up unexpectedly
  6. fatal: early EOF
  7. fatal: index-pack failed
复制代码
可以扩大全局缓冲:
  1. git config --global http.postBuffer 2097152000
复制代码

如果某个i386架构下的程序不能在x86_64架构下无法执行,执行如下面的命令,即包名后加冒号和架构名称,如:
  1. sudo dpkg --add-architecture i386
  2. sudo apt install libc6:i386
复制代码
或者
  1. https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit
复制代码

作者: zhansb    时间: 2017-4-24 09:56
赞一个
作者: gaozhenyan    时间: 2017-4-25 16:34
提供一个repo工具的下载地址: git@git.oschina.net:gaozhenyan/repo.git

使用方法:
repo init --repo-url git@git.oschina.net:gaozhenyan/repo.git --repo-branch master --no-repo-verify -u https://github.com/rockchip-linux/manifests -b yocto

这样就不用分析那个xml了
作者: ohyeah888    时间: 2017-4-27 13:54
楼主能制作一个Kali_Linux的固件吗?
作者: 饿客登门    时间: 2017-4-28 04:18
ohyeah888 发表于 2017-4-27 13:54
楼主能制作一个Kali_Linux的固件吗?

实话实说:能力有限,目前我还有很多问题没有解决,比如系统稳定性,功能缺失,驱动,模块。
不说我能弄到什么程度,单说 Firefly-RK3399_Ubuntu16.04_201703181519.img 这个发布过的固件,就算未更新的使用,虽说稳定性很好,但细究,有些地方还是有问题的,而且没看有能解决的人。
作者: ohyeah888    时间: 2017-4-28 15:22
饿客登门 发表于 2017-4-28 04:18
实话实说:能力有限,目前我还有很多问题没有解决,比如系统稳定性,功能缺失,驱动,模块。
不说我能弄 ...

确实,官方的技术水平也很烂,否则不会弄出这么个残次品来。社区交流没人气,QQ群也死气沉沉的。社区里面发个帖子好久都没人回复。
作者: 饿客登门    时间: 2017-4-28 17:54
ohyeah888 发表于 2017-4-28 15:22
确实,官方的技术水平也很烂,否则不会弄出这么个残次品来。社区交流没人气,QQ群也死气沉沉的。社区里面 ...

不应该说烂,其实很多大神都是很厉害的,或许他们的方向不在这些细节上,比如:dracut 可以生成 initrd,但发布的固件里却还在用旧方法制作的。也是我最近在琢磨的东西。
作者: 饿客登门    时间: 2017-4-30 05:21
gaozhenyan 发表于 2017-4-25 16:34
提供一个repo工具的下载地址: :gaozhenyan/repo.git

使用方法:

repo 的使用方法尝试过后感觉还是有不理想的地方,或许我还没学会用?但后面可能不太会继续用,好多地方,直接打 git 命令可能会更方便。
作者: dianziit    时间: 2017-4-30 11:05
赞一个,无回帖,不论坛

作者: 饿客登门    时间: 2017-5-1 16:05
再说一下吧,如果可以,希望版主将网站上关于制作方面的东西,整理好一份,更新一下吧,方法都是旧有的,虽管用,但问题也不少。
作者: libsong    时间: 2021-3-30 22:59

作者: b271262123    时间: 2021-10-9 15:17
牛逼的




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1