HI3516DV300_12_自制Rootfs实战记录


主要查阅第三部分前面,以及第四部分

一、 教程中的实战

1.1 解压rootfs

  • 先解压rootfs
    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub
    cp ../rootfs_scripts/rootfs.tgz ./
    tar -xzvf rootfs.tgz
    mv ./rootfs ./rootfs_glibc

这个时候,在/etc的目录下,已经有相关的配置文件了

1.2 编译busybox

  • 然后解压busybox

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox
    tar -xzvf busybox-1.26.2.tgz
  • 进busybox里面去配置.config文件

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2
    cp ./config_v200_a7_softfp_neon ./.config
  • 执行menuconfig

    make CROSS_COMPILE=arm-himix200-linux- CHIP=hi3516dv300 menuconfig

    这一步,其实也是在生成.config
    一定要注意先load文件.config
    然后什么都不做,然后退出
    默认是不用做这一个步骤的

  • 编译的命令

    make CROSS_COMPILE=arm-himix200-linux- CHIP=hi3516dv300 MP_TYPE=smp BOOT_MEDIA=emmc OSDRV_CROSS_CFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -w"  LIB_TYPE=glibc RUNTIME_LIB=runtime_glibc CROSS_SPECIFIED=y -j8

1.3 安装busybox

1.3.1 默认的安装方式

  • 默认安装的命令

    默认的脚本采用这种方式,但是实际上,一般不采用这种方式
    这种默认安装方式放到的路径是./_install

    make CROSS_COMPILE=arm-himix200-linux- CHIP=hi3516dv300 MP_TYPE=smp BOOT_MEDIA=emmc OSDRV_CROSS_CFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -w"  LIB_TYPE=glibc RUNTIME_LIB=runtime_glibc CROSS_SPECIFIED=y install

1.3.2 这次流程采用的安装方式

朱有鹏视频教程中主要采用这种安装方式:

  • 首先配置menuconfig

    make CROSS_COMPILE=arm-himix200-linux- CHIP=hi3516dv300 menuconfig
  • 然后一定要记得先load这个文件.config

  • 选中Busybox Setting后回车

  • 选中(./_install) BusyBox installation prefix后回车

  • 然后填写路径:解压rootfs的路径

    /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc

    注意在删除已经填写的路径过程中,要按下Ctrl+Backspace才能正常删除
    粘贴也是要按下Ctrl+鼠标右键Paste

  • 最后执行安装

    make CROSS_COMPILE=arm-himix200-linux- CHIP=hi3516dv300 MP_TYPE=smp BOOT_MEDIA=emmc OSDRV_CROSS_CFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -w"  LIB_TYPE=glibc RUNTIME_LIB=runtime_glibc CROSS_SPECIFIED=y install
  • 检验是否安装成功

    就是查看bin目录下是否成功生成了相关二进制可执行文件
    如果有生成二进制可执行文件,说明busybox成功安装了

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/bin
    ls

1.4 复制动态链接库

cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc
cp /opt/hisi-linux/x86-arm/arm-himix200-linux/runtime_glibc/a7_softfp_neon-vfpv4/lib.tgz ./
tar -xzvf lib.tgz
cd lib/
ls -ahl
cd ..
ls
rm -rf ./lib.tgz

注意在解压的过程中,直接就覆盖了目标路径下的文件
如果出现动态链接库,那么就说明复制成功了
并且可以发现,有一些是符号链接

1.5 用Strip精简体积,节省空间用

但是因为我们使用的是EMMC,不用在乎这点空间,所以就没有做这一步了

1.6 最后,生成文件系统

  • 首先得编译生成make_ext4fs并且复制到目标路径

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/tools/pc/ext4_utils
    make
    cd bin
    cp ./make_ext4fs /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub
  • 然后回到制作目录

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub
  • 最后就开始制作

    ./make_ext4fs -l 200M -s build_rootfs_hi3516dv300.ext4 rootfs_glibc
  • 检查一下大小

    file ./build_rootfs_hi3516dv300.ext4
    du -h ./build_rootfs_hi3516dv300.ext4

    也就才59M,说明-l这个参数,只是划定最大的大小而已,本来是多大,就是多大,并不会填充空内容
    到这一步,就制作完成了

二、烧写根文件系统

2.1 烧写成功截图

2.2 相关说明

2.2.1 相关文件夹说明

进入到根目录底下来了

在bin目录下有相关的应用程序

在lib目录下有相应的动态库

在etc目录下可以看到相关的配置脚本,/etc/init.d/rcS,也都是共用的,/bin/mount -a,挂载的就是init table

的dev目录下可以看到相关的设备文件,说明mdev也工作了

ifconfig eth0 192.168.31.14,这样一来,网口也工作了,说明之前kernel里面的网卡设置,也是工作的

这仅仅是一个最小的根文件系统

2.2.2 少了的相关驱动

/dev/input:只有一个mice

少了相关的测试程序

少了mpp相关的编解码应用程序

后面相关的内容操作也就在:cp2rootfs.sh中

2.2.3 在rcS里面做了什么

S00devs里面的,这个在手动创建根文件系统的时候,也干过,尤其是console,null这个干过,其实就是创建字符设备的主设备号与次设备号

S01udev里面的,主要是创建了udev,创建了虚拟文件系统,然后去挂载

S80network里面,是和网络有关的,/proc/cmdline,即为传参文件,即通过bootargs传参的时候,有没有传ipinfo,如果有就读进来,通过ifconfig去设定它,并打印出来,否则就算了。

三、全程编译的流程

3.1首先要下载的软件

要下载一下软件

要配置以下工具

cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/tools/board/eudev-3.2.7

阅读该路径下的readme_cn.txt文件:

具体描述如下图,按照描述操作:

注意:
eudev-3.2.7工具编译时依赖gperf工具,服务器上需要安装gperf工具。
下载网址:http://ftp.gnu.org/pub/gnu/gperf/gperf-3.1.tar.gz
安装说明:
tar -xzf gperf-3.1.tar.gz
cd gperf-3.1
sudo ./configure
sudo make
sudo make install

3.2然后执行编译命令

注意从这里开始,直接看第四部分就行了

并且,第三部分只需要做一次就行

仅编译的话,就只执行第一条命令,后面两条分别是清理,彻底清理

make CROSS_COMPILE=arm-himix200-linux- CHIP=hi3516dv300  BOOT_MEDIA=emmc all

make CROSS_COMPILE=arm-himix200-linux- clean

make CROSS_COMPILE=arm-himix200-linux- distclean

3.3全程的编译流程

  • 详情见41.1-全程编译笔记

四、参考全程编译,单独制作Rootfs

4.1 单独制作过程记录,并且已经成功

  • 先清除记录

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv
    
    make CROSS_COMPILE=arm-himix200-linux- clean
  • 编译生成板载工具

    make hiboardtools -j8
  • 解压rootfs.tgz

    rm /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc* -rf
    
    tar xzf /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/rootfs_scripts/rootfs.tgz -C /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub
    
    mv /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc
  • 生成lib文件

    tar xzf /opt/hisi-linux/x86-arm/arm-himix200-linux/runtime_glibc/a7_softfp_neon-vfpv4/lib.tgz -C /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc
  • 用strip工具缩小体积

海思官方使用了这一个步骤,但是朱有鹏的教程中,是没有使用这一条命令的,没有使用这一条命令,测试通过

cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc

arm-himix200-linux-strip -d ./lib/*
  • 解压busybox,以下几步是为了bin目录

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv
    
    rm /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2 -rf
    
    tar xzf /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2.tgz -C /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox
    
    find /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2 | xargs touch
  • 配置busybox的.config文件

    cp /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2/config_v200_a7_softfp_neon /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2/.config
  • 编译busybox

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2/
    
    make

    !!!更确切的编译方法是,用的这种方法,测试通过

cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2/

make CROSS_COMPILE=arm-himix200-linux- CHIP=hi3516dv300 MP_TYPE=smp BOOT_MEDIA=emmc OSDRV_CROSS_CFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -w"  LIB_TYPE=glibc RUNTIME_LIB=runtime_glibc CROSS_SPECIFIED=y -j8
  • 部署busybox
    make install
    
    cp -af /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2/_install/* /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc

    !!!更确切的部署方法是,用的这种方法,测试通过

make CROSS_COMPILE=arm-himix200-linux- CHIP=hi3516dv300 MP_TYPE=smp BOOT_MEDIA=emmc OSDRV_CROSS_CFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -w"  LIB_TYPE=glibc RUNTIME_LIB=runtime_glibc CROSS_SPECIFIED=y install

cp -af /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/opensource/busybox/busybox-1.26.2/_install/* /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc
  • 复制板载工具到rootfs

    cp -af /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/tools/board/e2fsprogs/bin/* /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/bin
    
    cp -af /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/tools/board/reg-tools-1.0.0/bin/* /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/bin
    
    cp -af /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/tools/board/eudev-3.2.7/rootfs/. /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/
  • 删除非必要的工具,海思官方是删掉了这些工具包的

!!!其实,这一个步骤是可以不执行的,保留最好了,制作的时候,选择不删除,测试通过

rm /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/dev/* -rf

rm /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/bin/himm -rf

rm /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/bin/himc -rf

rm /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/bin/himd -rf

rm /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc/bin/himd.l -rf
  • 对文件设置权限

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc
    
    ln -s sbin/init init
    
    chmod 750 * -R
    
    chmod 750 usr/* -R
    
    chmod -w usr/bin -R
    
    chmod -w usr/sbin -R
    
    chmod -w sbin -R
  • 编译生成make_ext4fs工具

    cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/tools/pc/ext4_utils
    
    make
    
    cd ./bin/
  • 制作生成rootfs镜像

    ./make_ext4fs -l 96M -s /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_hi3516dv300_96M.ext4 /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub/rootfs_glibc

96M只是一个最大的大小,如果小于这个大小,并不会去填充到96M

生成的rootfs文件位于:/home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub

cd /home/book/Hi3516DV300_Original/Hi3516CV500_SDK_V2.0.2.0/osdrv/pub

4.2成功,并成功下载的页面截图



Author: Ruimin Huang
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Ruimin Huang !
  TOC