嵌入式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根文件系统下载中。


相关文章
|
15天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
57 8
|
21天前
|
存储 Linux 文件存储
Linux文件系统
Linux文件系统 一切皆文件 在Linux中,“一切皆文件”的概念意味着系统中的所有资源,包括硬件设备、目录及进程等,均被视为文件。这种设计简化了操作和管理,具体包括: 普通文件:存储数据的常规文件。 目录文件:包含其他文件和子目录的文件。 进程文件:在/proc目录下代表系统中运行的进程。 设备文件:位于/dev目录,代表硬件设备。 网络字节流套接字文件:用于网络通信的数据流。 链接文件:指向另一个文件的符号链接或硬链接。 管道文件:用于进程间通信的文件。
47 7
|
3月前
|
存储 Linux 索引
Linux 下最主流的文件系统格式——ext
【9月更文挑战第8天】硬盘被划分为若干相同大小的块(Block),默认大小为4K,便于灵活管理文件数据。文件数据分散存放于这些块中,提高了数据添加、删除和插入的便利性。
|
4月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
46 12
|
4月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
56 6
|
4月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
4月前
|
存储 监控 Linux
|
4月前
|
存储 监控 Linux
|
3月前
|
存储 缓存 Linux
Linux文件系统的功能规划
【9月更文挑战第12天】本文通过类比图书馆,形象地解释了文件系统的组织形式和管理方法。首先,文件系统需按块存储文件,并设有索引区方便查找。其次,热点文件应有缓存层提高效率,文件需分类存储以便管理。最后,Linux内核需记录文件使用情况,通过文件描述符区分不同文件,确保文件操作准确无误。
|
4月前
|
算法 Linux 索引
Linux0.11 根文件系统挂载(四)
Linux0.11 根文件系统挂载(四)
34 0