饿客登门 发表于 2017-4-23 00:12:19

开贴记录制作过程及疑问(不定时更新)

本帖最后由 饿客登门 于 2017-5-30 12:55 编辑

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

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

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

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

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

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

http://pan.baidu.com/s/1qXOoFpU
我的第一块板就是 RK3399,用它做的东西也是我最近的目标,又怕忘记制作过程中的一些,开贴记录,方便自己也方便大伙。
最近在爬贴,发现如我一般的小白,如果知识的连续性有断层,就会发生一堆的问题,也才会有下面帖子里的一堆事,所以建议:
如果可以,建议看完3288的wiki再下手不迟!

饿客登门 发表于 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

Name=eth0


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.binImage\update.img update.img -os_type:androidos
delImage\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

饿客登门 发表于 2017-4-23 13:39:44

本帖最后由 饿客登门 于 2017-5-8 19:01 编辑

这里是制作内核为主,纯 Linux 的,需要手工去做,所以会是个很慢的过程。只能慢慢来~
下面记录的暂时可以忽略,把这里当做记事本{:4_180:}尝试在板子上直接编译:
# 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
这些天一直惦念一个问题,贴出代码:
NETDEV WATCHDOG: eth0 (rk_gmac-dwmac): transmit queue 0 timed out
------------[ cut here ]------------
WARNING: at net/sched/sch_generic.c:306暂时只能找出一个折中的办法,但效果只能说一般般吧,后续再继续找解决方法。{:4_210:}
编辑文件:/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:12

本帖最后由 饿客登门 于 2017-5-9 22:18 编辑

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

在折腾的过程中,尝试使用过 Rockchip 提供的方法烧录分区固件,
但是有很多地方不懂,几乎就把板子中的内容弄了个错乱,甚至分区格式,进入 MaskRom 也没法重新做,
就想到了一个最贱的方法,可以来个大清理,
但这种方法对 emmc 有多大的伤害,我想谁都清楚,所以这只是应急的方法,别经常这么做:
# dd if=/dev/zero of=/dev/mmcblk1 bs=4k
使用命令:df -h 和 lsblk 可以查看分区容量占用和分区标识,
如果自己尝试制作出统一固件,记得开机后第一件事就是对 rootfs 进行扩容,不然会出现问题而导致你不知道这啥情况:
# resize2fs /dev/mmcblk1p5 或 /dev/mmcblk1p6
最近更新的 Linux 环境固件,如果使用 AndroidTool 解包,最好使用 2.39 版本的解包,不然会失败。

命令 mkbootimg 是打包工具,对应的还有 unmkbootimg 这个解包工具,
用好它,再配合 dracut 可制作出自定义内核模块 initramfs,对想开发出特定要求的有一定意义。
贴下我的,当然,我这个只是挂载本地 rootfs 的:
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 直接好像不行,贴出试过好用的:
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 这样的提示,只需要同步时间即可:
timedatectl set-ntp true
git clone 时发生下面错误:Cloning into 'rockchip-linux-mainline'...
remote: Counting objects: 5274011, done.
remote: Compressing objects: 100% (804473/804473), done.
error: RPC failed; result=56, HTTP code = 2000.44 MiB | 92.00 KiB/s   
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed可以扩大全局缓冲:git config --global http.postBuffer 2097152000
如果某个i386架构下的程序不能在x86_64架构下无法执行,执行如下面的命令,即包名后加冒号和架构名称,如:
sudo dpkg --add-architecture i386
sudo apt install libc6:i386或者https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit

zhansb 发表于 2017-4-24 09:56:53

赞一个{:4_131:}

gaozhenyan 发表于 2017-4-25 16:34:16

提供一个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:15

楼主能制作一个Kali_Linux的固件吗?

饿客登门 发表于 2017-4-28 04:18:46

ohyeah888 发表于 2017-4-27 13:54
楼主能制作一个Kali_Linux的固件吗?

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

ohyeah888 发表于 2017-4-28 15:22:27

饿客登门 发表于 2017-4-28 04:18
实话实说:能力有限,目前我还有很多问题没有解决,比如系统稳定性,功能缺失,驱动,模块。
不说我能弄 ...

确实,官方的技术水平也很烂,否则不会弄出这么个残次品来。社区交流没人气,QQ群也死气沉沉的。社区里面发个帖子好久都没人回复。

饿客登门 发表于 2017-4-28 17:54:11

ohyeah888 发表于 2017-4-28 15:22
确实,官方的技术水平也很烂,否则不会弄出这么个残次品来。社区交流没人气,QQ群也死气沉沉的。社区里面 ...

不应该说烂,其实很多大神都是很厉害的{:4_160:},或许他们的方向不在这些细节上,比如:dracut 可以生成 initrd,但发布的固件里却还在用旧方法制作的。也是我最近在琢磨的东西。
页: [1] 2
查看完整版本: 开贴记录制作过程及疑问(不定时更新)