1、使用busybox-1.20.2制作Hi3519v101根文件系统

busybox 完整源代码就存放在 osdrv/opensource/busybox中,先解压

tar -zxf busybox-1.20.2.tgz

2、进去busybox,指定配置文件

cd busybox-1.20.2/
cp config_v500_softfp_neon .config

注:此处使用config_v500_softfp_neon对应工具链 arm-hisiv500-linux

3、配置 busybox

make menuconfig

此处采用动态库,默认配置。

注:busybox 的配置界面和内核配置相似,其功能选项容易理解,可以根据自己的需求选择配置。

在 Busybox Settings ---> Build Options中注意下面两个选项: 
[*]Build BusyBox as a static binary (no shared libs) 
[*] Build with Large File Support (for accessing files > 2 GB) 
(arm-hisiv500-linux-) Cross Compiler prefix  
()  Path to sysroot 
(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional CFLAGS (-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4)

()Additional LDFLAGS 
()  Additional LDLIBS   

其中: 
− 第一个选项选择是否把 busybox 编译成静态链接的可执行文件。如果选择该选项,编译出来的 busybox 就是静态链接的,运行时不依赖于动态库,但体积较大;清除该选项将得到动态链接的 busybox,体积较小,但需要动态库的支持。 
− 第二个选项是用于选择 SDK 推荐的交叉编译器,配置好后保存并退出。 

4、编译和安装 busybox

make
make install

编译并安装成功后,在 busybox 目录下的_install目录下生成以下目录及文件: 
 

ls _install/ -l
total 12
drwxr-xr-x 2 osrc osrc 4096 Oct 24 22:08 bin
lrwxrwxrwx 1 osrc osrc   11 Oct 24 22:08 linuxrc -> bin/busybox
drwxr-xr-x 2 osrc osrc 4096 Oct 24 22:08 sbin
drwxr-xr-x 5 osrc osrc 4096 Oct 21 22:34 usr

5、生成dev/目录文件

mkdir rootbox
cp -r _install/* rootbox/      //将_install复制到rootbox文件夹
cd rootbox/
mkdir dev
cd dev/
sudo mknod console c 5 1       //字符设备,主设备是5,次设备是1
sudo mknod null c 1 3          //字符设备,主设备是1,次设备是3
                               //文件属性可通过查看虚拟机可得
ls -l
total 0
crw-r--r-- 1 root root 5, 1 Oct 21 22:43 console
crw-r--r-- 1 root root 1, 3 Oct 21 22:44 null

6、添加etc/inittab

mkdir etc
sudo vim etc/inittab
console::askfirst:-/bin/sh
//添加/保存推出,askfirst是init运用需要调用的标准输入/输出/错误程序

7、添加C库

可以从Hi3519V101_SDK_V1.0.4.0/osdrv/opensource/toolchain/arm-hisiv500-linux/runtime_lib/default/lib文件夹拷贝

也可以从Hi3519V101_SDK_V1.0.4.0/package/image_big-little/rootfs_uclibc_big-little/lib/ 文件夹拷贝

.a文件为静态库

.so文件为动态库

mkdir lib   //创建lib文件夹
cp /home/osrc/Hi3519V101_SDK_V1.0.4.0/package/image_big-little/rootfs_uclibc_big-little/lib/* lib/ -d    //加上-d选项,拷贝链接

ls lib/ -l
total 7676
-rwxr-xr-x 1 osrc osrc   26316 Oct 24 22:27 ld-uClibc-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      21 Oct 24 22:27 ld-uClibc.so.0 -> ld-uClibc-0.9.33.2.so
-rwxr-xr-x 1 osrc osrc   10440 Oct 24 22:27 libcrypt-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      20 Oct 24 22:27 libcrypt.so.0 -> libcrypt-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      21 Oct 24 22:27 libc.so.0 -> libuClibc-0.9.33.2.so
-rwxr-xr-x 1 osrc osrc   10596 Oct 24 22:27 libdl-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      17 Oct 24 22:27 libdl.so.0 -> libdl-0.9.33.2.so
-rw-r--r-- 1 osrc osrc     132 Oct 24 22:27 libgcc_s.so
-rw-r--r-- 1 osrc osrc 1392188 Oct 24 22:27 libgcc_s.so.1
-rwxr-xr-x 1 osrc osrc   45440 Oct 24 22:27 libm-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      16 Oct 24 22:27 libm.so.0 -> libm-0.9.33.2.so
-rwxr-xr-x 1 osrc osrc    1840 Oct 24 22:27 libnsl-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      18 Oct 24 22:27 libnsl.so.0 -> libnsl-0.9.33.2.so
-rwxr-xr-x 1 osrc osrc  111704 Oct 24 22:27 libpthread-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      22 Oct 24 22:27 libpthread.so.0 -> libpthread-0.9.33.2.so
-rwxr-xr-x 1 osrc osrc    1844 Oct 24 22:27 libresolv-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      21 Oct 24 22:27 libresolv.so.0 -> libresolv-0.9.33.2.so
-rwxr-xr-x 1 osrc osrc   11704 Oct 24 22:27 librt-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      17 Oct 24 22:27 librt.so.0 -> librt-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      19 Oct 24 22:27 libstdc++.so -> libstdc++.so.6.0.20
lrwxrwxrwx 1 osrc osrc      19 Oct 24 22:27 libstdc++.so.6 -> libstdc++.so.6.0.20
-rwxr-xr-x 1 osrc osrc 5559412 Oct 24 22:27 libstdc++.so.6.0.20
-rwxr-xr-x 1 osrc osrc   21100 Oct 24 22:27 libthread_db-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      24 Oct 24 22:27 libthread_db.so.1 -> libthread_db-0.9.33.2.so
-rwxr-xr-x 1 osrc osrc  628284 Oct 24 22:27 libuClibc-0.9.33.2.so
-rwxr-xr-x 1 osrc osrc    4528 Oct 24 22:27 libutil-0.9.33.2.so
lrwxrwxrwx 1 osrc osrc      19 Oct 24 22:27 libutil.so.0 -> libutil-0.9.33.2.so

至此最简单的文件系统就做好了~

要想不费时、更简单的得到文件系统,也可以直接用sdk现有的,路径为

Hi3519V101_SDK_V1.0.4.0/package/image_big-little/rootfs_uclibc_big-little/

8、生成镜像文件

osrc@osrc:$ cd /home/osrc/Hi3519V101_SDK_V1.0.4.0/osdrv/tools/pc/ext4_utils/ext4_utils  
//跳转到ext4文件系统工具

osrc@osrc:/home/osrc/Hi3519V101_SDK_V1.0.4.0/osdrv/tools/pc/ext4_utils/ext4_utils$ sudo ./make_ext4fs -s -l 32M rootfs_hi3519v101_32M.ext4 /home/osrc/Hi3519V101_SDK_V1.0.4.0/osdrv/opensource/busybox/busybox-1.20.2/rootbox/  
//利用工具制作镜像文件

其中,-l 32M 是指定 uboot 中配置 emmc 的文件系统分区大小为 32M,-s 为使用 gzip压缩,rootfs.ext4 是生成的 Ext4 文件系统映像文件,/home/osrc/Hi3519V101_SDK_V1.0.4.0/osdrv/rootfs_scripts/rootfs是之前已经制作好的根文件系统路径。请根据实际情况修改参数。 

9、最后是烧录

参考Hi3519v101烧写映像文件到emmc

10、丰富根文件系统,增加ps运用程序查看命令

创建初始化脚本

sudo vim etc/inittab
//在原来的基础上加上
::sysinit:/etc/init.d/rcS

添加脚本内容,可以在里面添加自动执行命令

mkdir /etc/init.d
sudo vim etc/init.d/rcS
//添加下面内容,作用为挂接/etc/fstab文件制定的所有文件系统,最后改变属性,使它能执行
mount -a
sudo chmod +x etc/init.d/rcS

 创建etc/fstab

sudo vim etc/fstab
//添加如下内容,增加proc虚拟文件系统,用于收集当前运用程序
#device         mount-point     type    option          dump    fsck order
proc            /proc           proc    defaults        0       0

/etc/fstab文件被用来定义文件系统的“静态信息”,这些信息被用来控制mount命令的行为。各字段意义如下:

①device:要挂载的设备

②mount-point:挂载点

③type:文件系统类型

④options:挂接参数,以逗号隔开

⑤dump/fsck order:用来控制dump、fsck程序的行为

最后在根目录创建proc文件夹

mkdir proc
ls
bin  dev  etc  lib  linuxrc  proc  sbin  usr

下载到单板通过ps命令即可

# ps
PID   USER     TIME   COMMAND
    1 0          0:00 init
    2 0          0:00 [kthreadd]
    3 0          0:00 [ksoftirqd/0]
    4 0          0:00 [kworker/0:0]
    5 0          0:00 [kworker/0:0H]
    6 0          0:00 [kworker/u4:0]
    7 0          0:00 [rcu_sched]
    8 0          0:00 [rcu_bh]
    9 0          0:00 [migration/0]
   10 0          0:00 [migration/1]
   11 0          0:00 [ksoftirqd/1]
   12 0          0:00 [kworker/1:0]
   13 0          0:00 [kworker/1:0H]
   14 0          0:00 [khelper]
   15 0          0:00 [kdevtmpfs]
   16 0          0:00 [netns]
   17 0          0:00 [writeback]
   18 0          0:00 [bioset]
   19 0          0:00 [kblockd]
   20 0          0:00 [spi0]
   21 0          0:00 [kworker/u4:1]
   24 0          0:00 [spi1]
   29 0          0:00 [spi2]
   32 0          0:00 [spi3]
   35 0          0:00 [rpciod]
   36 0          0:00 [kworker/1:1]
   37 0          0:00 [kswapd0]
   38 0          0:00 [fsnotify_mark]
   39 0          0:00 [nfsiod]
   47 0          0:00 [kpsmoused]
   48 0          0:00 [cfinteractive]
   49 0          0:00 [ipv6_addrconf]
   50 0          0:00 [deferwq]
   51 0          0:00 [kworker/u4:2]
   52 0          0:00 [mmcqd/0]
   53 0          0:00 [mmcqd/0boot0]
   54 0          0:00 [mmcqd/0boot1]
   55 0          0:00 [jbd2/mmcblk0p3-]
   56 0          0:00 [ext4-rsv-conver]
   60 0          0:00 -/bin/sh
   61 0          0:00 [kworker/0:1]
   62 0          0:00 ps

11、使用mdev创建设备文件

mdev是udev的简化版本,它通过读取内核信息来创建设备文件。

mdev的用法参考busybox/doc/mdev.txt。

mdev主要用用途为,初始化/dev目录、动态更新。支持热插拔,即接入、卸下设备时执行某些动作。

要使用mdev,需要内核支持sysfs文件系统,为减少对Flash的读写,还要支持tmpfs文件系统。要先确保内核已经设置了CONFIG_SYSFS、CONFIG_TMPFS配置项。

要在内核启动时,自动运行mdev,需要修改etc/fstab来自动挂载文件系统、修改etc/init.d/rcS加入自动运行的命令,如下:

sudo vim etc/fstab
//添加如下内容
#device         mount-point     type    option          dump    fsck order
proc            /proc           proc    defaults        0       0
#tmpfs          /tmp            tmpfs   defaults        0       0
sysfs           /sys            sysfs   defaults        0       0
tmpfs           /dev            tmpfs   defaults        0       0
sudo vim etc/init.d/rcS
//添加如下内容
#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

添加sys文件夹

mkdir sys

至此根文件系统就做好了,接下来可以通过nfs,将开发板挂载到服务器上减小反复烧写文件系统的操作。

可参考这里Hi3519v101通过NFS挂载到服务器

但我单板遇到如下问题还未解决,后续再说吧~

问题:can't create /proc/sys/kernel/hotplug: nonexistent directory

 

 

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐