嵌入式Linux系列第5篇:Nand Flash根文件系统制作
1.引言
之前系列的文章介绍了如何编译Uboot、Kernel以及使用默认的ramdisk根文件系统来构建一个完整的嵌入式Linux系统,本篇文章介绍如何从头制作一个放在NAND Flash上的根文件系统。经过我这段时间的总结,rootfs相关的编译、配置等工作还是比较麻烦的。所以你可能会看到一般做核心板的第三方厂家会建议初学者直接使用现成提供的文件系统,比如一个做NUC972核心板的厂家,其文档里这么描述:
再比如另外一个做NXP I.MX6核心板的厂家,其文档里这么描述:
他们都建议初学者直接使用他们提供好的文件系统。但是我还是强烈建议大家自己一步一步的去操作制作一次,因为一是这有助于你理解根文件系统是怎么来的,最小的能用的根文件系统包含了哪些东西,二是将来你很有可能需要对文件系统做一些定制化的裁剪和修改工作,只有自己做了一遍你对会明白这个东西到底是怎么回事,比如我原来就搞不清楚Busybox、Buildroot、Yocto这些名词在Linux中的作用,现在随着实践增多,就大概知道他们的用处了。
2.环境介绍
2.1.硬件
因为本系列博客都会以NUC972为平台来介绍。
2.2.软件
本篇新用到的软件工具一个是busybox,它用来生成文件系统里的几个最基本的文件夹,二是打包工具mkyaffs2,它用来生成能直接烧录到板子里的镜像文件。
大家有没有注意,我为什么每次都把这个官方的链接放过来,让大家自己去下载,原因是我们要知道我们用的东西的源头在哪里,最官方的资料渠道在哪里,这很重要。
我们这次要实现的目标是:自己亲手制作的文件系统能够跑起来,同时能够运行我们第二篇文章介绍的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/rootfs
ls
bin、sbin、usr :存放一些命令
linuxrc :挂载根文件系统时,第一个执行的文件
4)再创建几个文件夹
mkdir etc lib dev
5)在 rootfs 目录的dev目录下创建设备节点
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3
6)在根文件系统rootfs/etc目录下创建一个inittab 文件,在文件里面填写:.console::askfirst:-/bin/sh
cd ../etc
vim inittab
4.文件系统打包
1)进入到tool文件夹的yaffs2utils目录里
cd yaffs2utils
2)编译,生成mkyaffs2
make clean
make
注:编译这个工具,不需要修改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 selection
Select 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=115200
bootcmd=nboot 0x7fc0 0 0x200000; bootm 0x7fc0
bootdelay=1
ethact=emac
ethaddr=00:00:00:11:66:88
stderr=serial
stdin=serial
stdout=serial
烧写前,最好对芯片进行一次Erase。几个文件的烧写类型及地址大家注意下,别搞错了。
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 mnt
cd mnt
mkdir usb
cd usb
mount -t vfat /dev/sda1 /mnt/usb
cd /
mkdir opt
cp /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使用等。
Linux文件系统操作指令
操作系统的目的:处理各种数据。
文件系统的目的:实现数据的查询和存储。
在对数据进行调用处理等操作时需要把数据整合成文件的形式进行管理,相当于对数据进行整合和标注,反映在Linux的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。这些文件被Linux使用目录树进行管理,而目录树是以根目录(/)为主,向下呈现分支状的一种文件体系结构。
Linux文件系统文件系统挂载在Linux操作系统上,Linux操作系统整个系统又放在文件系统里。为了支持不同的体系,Linux系统对应了多种文件系统。文件系统是管理数据的,而可以存储数据的物理设备有硬盘、U盘、SD卡、NAND FLASH、NOR FLASH、网络存储设备等。不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理,比如管理NAND FLASH的话使用YAFFS文件系统,管理硬盘、SD卡的话就是ext文件系统等等。
1、Linux系统下挂载命令mount
Linux 系统下给磁盘分割时需要在Linux 下创建一个分区并且格式化好以后我们要将其“挂载”到一个目录下才能访问这个分区。“挂载”(mount)的概念,在一个区被格式化为一个文件系统之后,为了让Linux操作系统找到它,我们还需要把这个文件系统“注册”进Linux操作系统的文件体系里,这个操作就叫“挂载”。挂载是利用一个目录当成入口,将文件系统放置在该目录下,也就是说,进入该目录就可以读取该文件系统的内容。这个进入点的目录就称为“挂载点”。
2、Linux文件系统的类型
为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。VFS使得Linux可以支持多个不同的文件系统类型。Linux 下的文件系统主要有ext2、ext3、ext4 等文件系统。同时也支持Windows 的FAT 文件系统和网络文件系统NFS 等。
NFS 文件系统:NFS 文件系统是指网络文件系统,可以很方便地在局域网内实现文件共享,并且使多台主机共享同一主机上的文件系统。而且NFS 文件系统访问速度快、稳定性高,已经得到了广泛的应用,尤其在嵌入式领域,使用NFS 文件系统可以很方便地实现文件本地修改,避免了每次读写flash。
ext3文件系统:ext2+log是linux通用的文件系统,也是linux常见的默认文件系统。ext3是在ext2的基础上发展起来的。ext3完全兼容ext2文件系统,ext3 文件系统不需要经过任何修改就可以直接挂载成ext2 文件系统,ext3 提供的工具tune2fs 即可轻松进行数据转化,无须进行格式化。ext3强化了系统的日志功能,采用了日志式的管理机制,它使文件系统具有很强的快速恢复能力,更加安全可靠,即使系统非正常关机、发生死机等情况,ext3文件系统也可以快速恢复。ext3 支持大文件,完整性更高,不易受到死机或者关机对文件系统的伤害。ext3 的日志功能对磁盘驱动器读写头进行了优化,保持了较快的文件系统速度。
Ext4文件系统:是一种针对ext3系统的扩展日志式文件系统,是专门为Linux开发的原始的扩展文件系统(ext或extfs)的第四版。ext3升级到ext4能为系统提供更高的性能,消除存储限制,获取新的功能,并且不需要重新格式化分区,ext4会在新的数据上用新的文件结构,旧的文件保留原状。
xfs文件系统:一种高级的日志文件系统,最早于1993年由Silicon Graphics为他们的IRIX操作系统而开发,1994年随IRIX 5.3的发布而应用于计算,是IRIX 5.3版的默认文件系统。2000年5月,Silicon Graphics以GNU通用公共许可证发布这套系统的源代码,之后被移植到Linux内核上。xfs特别擅长处理大文件,同时提供平滑的数据传输。xfs极具伸缩性,是全新的高性能64位文件系统。
3、Linux系统文件类型的查询指令df -T -h
磁盘分区为“/dev/sda1”,挂载在“/”根目录下,文件系统类型为“ext4”。
4、根目录下文件夹
指令:①cd /;②ls
5、文件操作命令
5.1创建新文件touch指令
touch不仅可以创建文本文档,也可以创建其他类型的文档,指令:touch 参数 文档名字
5.2创建文件夹命令mkdir
5.3文件删除命令rm
5.4、删除文件夹目录命令rmdir
rmdir只适用删除空文件夹目录
5.5、文件复制命令cp
Linux 下的复制命令为“cp”,“cp”命令既可以复制文件,也可以复制目录命令格式如下:
“cp”指令还可用于文件夹的复制,复制文件夹时配合参数“-r”使用。
5.6文件移动命令mv
运用“mv”命令我们可以进行文件或者文件夹的移动,或者为文件或者文件夹进行重命名。
6、文件压缩和解压缩指令
在Ubuntu 系统下通过终端使用指令也可以对文件进行压缩和解压缩,在Linux 中可以识别的常见压缩格式有十几种,比如:“.zip”、“.gz”、“bz2”、“.tar”、“tar.gz”、“.tar.bz2”等等,运用不同的压缩指令可以对不同压缩格式的文件进行压缩和解压缩操作。命令行下进行压缩和解压缩常用的命令有三个:zip、unzip和tar。
6.1压缩命令zip
用于将一个或者多个文件压缩成一个.zip结尾的文件,常用指令:zip -rv test1.zip test1
6.2解压缩unzip
6.3压缩和解压命令tar
命令“tar”可用于其它格式的压缩和解压,比如Linux 下最常用的“.bz2”和“.gz”这两种压缩格式的压缩和解压。
压缩命令:tar -cvf test1.tar test1
tar -vcjf test1.tar.bz2 test1
tar -vczf test1.tar.gz test1
解压缩命令(压缩文件后缀.tar):tar -xvf test1.tar
解压缩命令(压缩文件后缀.bz2):tar -vxjf test1.tar.bz2
解压缩命令(压缩文件后缀.gz):tar -vxzf test1.tar.gz
7、文件查询与搜索
7.1文件查询命令find
find是目录文件的查找命令,用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为查找的目录名。如果使用该命令时,不设置任何路径,则find命令将在当前目录下查找所有子目录与文件,并且将查找到的子目录和文件全部进行显示。
7.2搜索命令grep
grep命令用于查找包含指定关键字的文件,如果发现某个文件的内容包含所指定的关键字,grep命令就会把包含指定关键字的这一行标记出来。
搜索指令:grep -ir “class” test1
8、文件类型查看
命令:ls -l
相关问答
linux 系统如何安装 flash player?1、先去adobe官网下载最新版flashplayer,注意选择系统为linux。2、下载后,直接右键选择“解压到当前文件夹”。3、在解压的flashplayer文件夹中,右键选择...
linux flashtool怎么用[最佳回答]天拿到MTK新发布的flash_tool,支持linux下直接烧手机,遂试用之,总结如下:安装流程如下:1、解压SP_Flash_Tool_Linux_v5.1336.00.100_Custome...
linux 安装 flash 出现问题?你首先有搞清楚你用的是那个发行版,按照你的说法你似乎用的ubuntu,你要装flash,有个简单的命令$sudoapt-getinstallubuntu-restricted-extras,这条...
linux 可以看外国电视吗?Linux上面看在线视频主要还是用浏览器,毕竟在线视频要有软件商提供服务,而国内的各个视频客户端都没有Linux版。Linux用浏览器看在线视频也要配置一下,Linux...
连接时出错,(.ARM.exidx+0x0): undefined reference to `__...连接时出错,(.ARM.exidx+0x0):undefinedreferenceto`__aeabi_unwind_cpp_pr0'连接时出错:D:\ProgramFiles...
LINUX 可以看的视频网站有哪些 - GoWunhee 的回答 - 懂得卓1000一看就深受linux的毒害!1,根据网页提示下载flashplayer包!(tar.gz格式)2,tarzxvfflashplayer.tar.gz(名称可能不是这个)-C/usr/lib/...
耀隆微卡参数?耀隆微卡是一款高速、高性能的嵌入式存储芯片,采用了3DNANDFlash技术和PCIeNVMe接口,具有较高的读写速度、稳定性和可靠性。其主要技术参数包括:容量可达2...
linux 的ftp服务器怎么用 - Beryl.? 的回答 - 懂得linux安装一下opensshserver然后用支持ssh连接软件就行了比如WinSCPFlashfxp等1.启动FTP服务器/sbin/servicevsftpdstart为...
Flash Player已经安装好了,为什么还要提示安装 flash ?flashplayer有好多,你装了这个浏览器的,但没装那个浏览器的,那个浏览器就会显示未安装flashplayer有好多,你装了这个浏览器的,但没装那个浏览器的,那个...
怎么复制windows文件到 linux ?要将Windows文件复制到Linux,您可以使用以下几种方法:1.**使用scp命令**:在Windows上安装支持ssh的客户端软件,如WinSCP或PuTTYpsftp,然后通过scp命令...