嵌入式Linux系列第5篇:Nand Flash根文件系统制作

简介: 嵌入式Linux系列第5篇:Nand Flash根文件系统制作

1.引言

之前系列的文章介绍了如何编译Uboot、Kernel以及使用默认的ramdisk根文件系统来构建一个完整的嵌入式Linux系统,本篇文章介绍如何从头制作一个放在NAND Flash上的根文件系统。经过我这段时间的总结,rootfs相关的编译、配置等工作还是比较麻烦的。所以你可能会看到一般做核心板的第三方厂家会建议初学者直接使用现成提供的文件系统,比如一个做NUC972核心板的厂家,其文档里这么描述:


再比如另外一个做NXP I.MX6核心板的厂家,其文档里这么描述:

他们都建议初学者直接使用他们提供好的文件系统。但是我还是强烈建议大家自己一步一步的去操作制作一次,因为一是这有助于你理解根文件系统是怎么来的,最小的能用的根文件系统包含了哪些东西,二是将来你很有可能需要对文件系统做一些定制化的裁剪和修改工作,只有自己做了一遍你对会明白这个东西到底是怎么回事,比如我原来就搞不清楚Busybox、Buildroot、Yocto这些名词在Linux中的作用,现在随着实践增多,就大概知道他们的用处了。

2.环境介绍

2.1硬件

因为本系列博客都会以NUC972为平台来介绍,为了大家学习起来方便,之后所有的实验都会在网上可以买到的一个NUC972开发板上来做,通过我的仔细甄选,感觉下面这家的开发板性价比最高。



2.2软件

本篇新用到的软件工具一个是busybox,它用来生成文件系统里的几个最基本的文件夹,二是打包工具mkyaffs2,它用来生成能直接烧录到板子里的镜像文件。下载地址在:https://github.com/OpenNuvoton/NUC970_Linux_Applications



大家有没有注意,我为什么每次都把这个官方的链接放过来,让大家自己去下载,原因是我们要知道我们用的东西的源头在哪里,最官方的资料渠道在哪里,这很重要。我们这次要实现的目标是:自己亲手制作的文件系统能够跑起来,同时能够运行我们第二篇文章介绍的Helloworld程序。

3.使用Busybox制作根文件系统

1)进入到nuc972文件夹,新建一个tool文件夹,用来存放busybox、mkyaffs2等工具,把上面下载的NUC970_Linux_Applications-master.zip文件解压到tool文件夹里,因为解压后含有NUC970_Linux_Applications-master,我们把里面的内容移出来,然后删除掉空的NUC970_Linux_Applications-master文件夹和NUC970_Linux_Applications-master.zip源文件。然后进入到busybox目录里。同样的,在编译前要设置交叉编译的环境变量。

cd ~/nuc972
mkdir tool
unzip NUC970_Linux_Applications-master.zip
cd NUC970_Linux_Applications-master
mv ./* ../
cd ..
rm NUC970_Linux_Applications-master -fr
rm NUC970_Linux_Applications-master.zip
cd busybox-1.22.1/
source ~/nuc972//toolchain/environment.sh

2)make menuconfig 进入配置界面make menuconfig

我们这里就设置一个地方,其他的全部使用默认配置。修改make install生成的文件夹路径,我们把默认的./_install改成nuc972目录下的rootfs。Busybox Settings  ---> Installation Options ("make install" behavior)  --->   (../../rootfs) BusyBox installation prefix

3)make 编译make编译成功后显示如下:


编译完成之后我们可以查看一下busybox的文件属性,可以看到如下信息,说明我们交叉编译的没问题。


4)make install 安装make install这样就在前面我们设置的地方生成一个rootfs的文件夹,进到里面看一下cd ~/nuc972/rootfsls


bin、sbin、usr :存放一些命令linuxrc :挂载根文件系统时,第一个执行的文件4)再创建几个文件夹mkdir etc lib dev5)在 rootfs 目录的dev目录下创建设备节点cd devsudo mknod console c 5 1sudo mknod null c 1 36)在根文件系统rootfs/etc目录下创建一个inittab 文件,在文件里面填写:.console::askfirst:-/bin/shcd ../etcvim inittab



4.文件系统打包

1)进入到tool文件夹的yaffs2utils目录里cd yaffs2utils2)编译,生成mkyaffs2make cleanmake注:编译这个工具,不需要修改Makefile,用file看下属性,它是在x86-64运行的,这是没问题的,因为它就是在Ubuntu下使用的,不是在嵌入式环境下去执行使用的。


将它复制到/usr/bin下以后用起来方便了,可以直接使用这个指令了,你可一在终端敲mkya,然后TAB建看不能出来。sudo cp mkyaffs2 /usr/bin/4) 生成文件系统sudo mkyaffs2 --inband-tags -p 2048 rootfs rootfs_yaffs2.img


5.内核修改

内核也要做一定的修改,具体如下:

1)make menuconfig进入到内核配置界面make menuconfig

2)默认用的RAM filesytem 需要去掉General setup —>[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support


3)默认的Boot option需要修改成如下:Boot options --->(noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 rootflags=inband-tags console=ttyS0,115200n8 rdinit=/sbin/init mem=64M)


4)NAND Flash驱动相关配置Device Drivers --->Generic Driver Options ---><*> Nuvoton NUC970 FMI function selectionSelect FMI device to support (Support MTD NAND Flash) --->


5)选中MTD的支持Device Drivers ---><*> Memory Technology Device (MTD) support  ---> <*> Caching block device access to MTD devices -*-   NAND Device Support  --->   -*- Nuvoton NUC970 MTD NAND --->NUC970 NAND Flash pin selection (Port C) --->


6)选中yaff2文件系统的支持File systems --->[*] Miscellaneous filesystems  ---> <*>   yaffs2 file system support


7)保存配置,编译

6.结果查看

6.1硬件验证文件系统是否可用

1)将上述生成的kernel 970uimage、文件系统rootfs_yaffs2.img、还有之前第三讲生成的uboot.bin,uboot-spl.bin,以及env.txt 下载到板子里,env.txt做了一些改动,主要是加入了boocmd那一行,这样下载进去就能直接启动了。baudrate=115200bootcmd=nboot 0x7fc0 0 0x200000; bootm 0x7fc0bootdelay=1ethact=emacethaddr=00:00:00:11:66:88stderr=serialstdin=serialstdout=serial  烧写前,最好对芯片进行一次Erase。几个文件的烧写类型及地址大家注意下,别搞错了。


Image Name Image Type Image start offset
u-boot-spl.bin uboot 0x200
u-boot.bin data   0x100000
env.txt env 0x80000
970uImage data 0x200000
rootfs_yaffs2.img data   0x2000000

2)上电,看看效果,调试串口打印信息如下:


这一次很顺利啊,一次就成功了,这就说明我们上述做的根文件系统是可以正常使用的了。

6.2证helloworld能否在板子上运

我们还要看看我们之前编译的helloworld程序能不能运行,我们把helloworld放到板子里去,怎么把这个文件放到板子上呢?有以下几种方式:a) 把Helloworld在Ubuntu下放到rootfs文件夹里,然后按照上述的方法打包、下载进去。b)通过scp或者NFS服务,直接通过网口放到板子里c) 先放到U盘里,然后U盘插入到板子上,再复制过去方法a)自然没问题,不过有些麻烦,方法b)现阶段我们的文件系统并不支持,暂时先不弄了,下一篇文章会介绍scp的移植,我们来试试方法c)吧1)插入U盘到电脑上,把helloworld拷贝过去


2)把U盘插入到板子上,这时调试串口会自动输出如下信息,提示我们有USB Mass Storage设备接入了,看来内核已经把USB这部门驱动已经做进去了。这不是有点像我们给PC机重装Windows系统的过程,默认鼠标键盘也是可以直接使用的。


我们进入到/dev目录里,可以看到有sda1设备,LINUX所有的存储设备都是映射成“文件”来访问的,包括U盘、光驱、硬盘等。这个sda1就对应我们刚插入的U盘。


那么该如何访问U盘的东西呢?我们需要挂载,使用mount指令,我们执行以下命令:mkdir mntcd mntmkdir usbcd usbmount -t vfat /dev/sda1 /mnt/usbcd /mkdir optcp /mnt/usb/helloworld /opt完成的事情是把sda1挂载到了/mnt/usb目录上,这样/mt/usb目录里就有了U盘里的内容,然后再复制到了系统的/opt目录。我们在/opt目录里执行./helloworld,提示如下错误:-/bin/sh: ./helloworld: not found这是怎么回事呢?原因很简单,helloworld的执行是需要依赖一些库的,不可能系统里什么都没有就执行能执行成功了。所以需要我们把交叉编译链~/nuc972/toolchain/arm-2014.05/arm-none-linux-gnueabi/libc/lib里的库文件复制到板子的lib目录里。可以先到arm-2014.05/arm-none-linux-gnueabi/libc/lib目录中,压缩下tar -cvf lib.bin *然后通过U盘放到板子的/lib目录中解压tar -xvf lib.bin这样操作之后,再次执行helloword,结果如下:


另外可以对板子断电-再上电,看看我们之前操作的内容都还在,因为它是存到NAND Flash里的,所以断电是不丢失的。

7.结束语

如果你亲自动手实现了这篇文章介绍的所有内容,相信你对根文件系统一定有了一个非常感官的认识。包括这篇在内,我用了5篇文章一直在介绍嵌入式Linux基础环境相关的内容,你应该也能感受到这和我们以前接触的单片机开发还是有着较大的差异。从下一篇文章开始,我们就正式进入到具体的应用了。我会陆续介绍GPIO、UART使用;网络通信;WIFI使用;摄像头采集数据;EC20 4G模块使用;QT编程;Opencv使用等。相关资料下载链接:https://github.com/TopSemic/NUC972_Linux  05 Lesson5 NAND Flash根文件系统下载中。


相关文章
|
8天前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
20 1
|
8天前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
26 1
|
10天前
|
存储 Linux 数据处理
探索Linux操作系统的内核与文件系统
本文深入探讨了Linux操作系统的核心组件,包括其独特的内核结构和灵活的文件系统。文章首先概述了Linux内核的主要功能和架构,接着详细分析了文件系统的工作原理以及它如何支持数据存储和检索。通过比较不同的文件系统类型,本文旨在为读者提供一个关于如何根据特定需求选择合适文件系统的参考框架。
|
8天前
|
消息中间件 安全 Java
【嵌入式软件工程师面经】Linux多进程与多线程
【嵌入式软件工程师面经】Linux多进程与多线程
8 1
|
8天前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
12 1
|
10天前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
14 4
|
11天前
|
存储 缓存 Linux
【Linux】文件系统
【Linux】文件系统
|
12天前
|
Linux
45. 【Linux教程】文件系统检查
45. 【Linux教程】文件系统检查
18 0
|
3天前
|
安全 算法 Linux
探索Linux命令gpgv2:安全通信与数据验证的利器
`gpgv2`是GPG的签名验证工具,用于确保文件完整性和来源真实性。基于公钥密码学,支持多种加密算法和OpenPGP标准。通过`--verify`等参数验证签名,例如`gpgv2 --verify signature_file file`。重要注意事项包括保护私钥、定期更新密钥、验证签名来源及使用强密码。在数据安全场景中,`gpgv2`是保障信息安全的利器。