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


相关文章
|
9月前
|
自然语言处理 监控 Linux
Linux 内核源码分析---proc 文件系统
`proc`文件系统是Linux内核中一个灵活而强大的工具,提供了一个与内核数据结构交互的接口。通过本文的分析,我们深入探讨了 `proc`文件系统的实现原理,包括其初始化、文件的创建与操作、动态内容生成等方面。通过对这些内容的理解,开发者可以更好地利用 `proc`文件系统来监控和调试内核,同时也为系统管理提供了便利的工具。
505 16
|
11月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
611 15
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
548 13
|
12月前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
2693 7
|
12月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
293 7
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
3月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
475 1
二、Linux文本处理与文件操作核心命令
|
3月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
325 137
|
3月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
760 57
|
2月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
544 2