版本

作者

参与者

日期

备注

V1.0

wuya(微信号:wangwenxue1989)

2019/05/17

创建

1.引言

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

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

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

2.环境介绍

2.1.硬件

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

有兴趣购买的朋友,大家去下方他们的淘宝店购买即可:

https://s.click.taobao.com/t?e=m%3D2%26s%3DVqeqPgNPc7IcQipKwQzePOeEDrYVVa64LKpWJ%2Bin0XJRAdhuF14FMYcqQp9jM3JMRitN3%2FurF3weYrs2z1V%2BWARwPYjsuD9IQ67nx0X4I%2FwbK4NckI8ZycEnxKDasWxncCadkoABCrnmL8IX2r%2Bngfx81NZbGhxUxiXvDf8DaRs%3D

建议大家选择4.3寸电阻屏的,因为价格最便宜,另外再配个摄像头和WIFI模块供后面实验使用。

希望大家不要让自己的开发板吃灰,真正的用起来,相信大家跟着我的整个系列文章,自己亲自动手去实践,最后一定有所收获。

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/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。几个文件的烧写类型及地址大家注意下,别搞错了。

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 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使用等。大家有任何想法,欢迎给我留言反馈,发邮件也可以,邮箱:Topsemic@sina.com ,或者关注Topsemic微信公众号留言

本期相关的资料在百度网盘,链接: https://pan.baidu.com/s/1pN5Jc8L2FbrD8YgX6yHWhQ   提取码:lke3;(05 Lesson5 NAND Flash根文件系统)

里面包含了如下内容:

从单片机开发转向Linux开发系列博客五:Nand Flash根文件系统制作相关推荐

  1. 嵌入式Linux根文件系统制作

    嵌入式Linux根文件系统制作 一.根文件系统简介 根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统而言它还是内核启动时所挂载(mount)的 ...

  2. iPhone开发网站、论坛和博客

    整理了一下手中的iPhone开发网站.论坛和博客,精选了这10个常去的网站.其中有2篇教学文章,由于非常经典,于是单列出来,与其网站并列. 建议新入行的朋友在看教学文章的同时多上论坛,与大家交流,偶尔 ...

  3. 10个iPhone开发网站、论坛、博客

    整理了一下手中的iPhone开发网站.论坛和博客,精选了这10个常去的网站.其中有2篇教学文章,由于非常经典,于是单列出来,与其网站并列. 建议新入行的朋友在看教学文章的同时多上论坛,与大家交流,偶尔 ...

  4. 【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. 主题:10个iPhone开发网站、论坛、博客

    整理了一下手中的iPhone开发网站.论坛和博客,精选了这10个常去的网站.其中有2篇教学文章,由于非常经典,于是单列出来,与其网站并列. 建议新入行的朋友在看教学文章的同时多上论坛,与大家交流,偶尔 ...

  6. xFace3.x 开发技巧(1)---从web开发转向移动开发

    2019独角兽企业重金招聘Python工程师标准>>> 介绍一些针对移动设备常用的HTML5开发技巧. 从web开发转向移动开发 视野范围的转变 这点是针对可显示的内容区域而言的,P ...

  7. GitStats:Git开发历史统计工具 - liyropt - 博客园

    GitStats:Git开发历史统计工具 - liyropt - 博客园

  8. 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站

    这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...

  9. <Linux开发>linux开发工具- 之-TFTP

    <Linux开发>linux开发工具- 之-TFTP tftp命令的作用和nfs命令一样,都是用于通过网络下载东西到DRAM中,只是tftp命令使用的TFTP协议,Ubuntu主机作为TF ...

最新文章

  1. iscsi target 配置(服务端安装)--一
  2. 鸿蒙45000,华为发布鸿蒙系统沟通口径通知 网友表示支持国货
  3. 徐教授的对于商业模式创新的讲座!十分有用!
  4. Python安装第三方库太慢?配置好这个速度飞起
  5. x264中I,P,B帧和PTS,DTS的关系
  6. Mybatis foreach 批量插入
  7. STM32单片机启动文件startup_stm32f10x_hd.s详解
  8. 中国吉非替尼行业市场供需与战略研究报告
  9. 基于cnn的人脸识别_人脸识别技术:从传统方法到深度学习
  10. Splines(样条曲线)
  11. 奥尼捷多功能证件包护照包证件夹男士卡包女士必备 A101 黑色【图片 价格 品牌 报价】-京东商城...
  12. 高绩效团队-VUCA时代的五个管理策略《一》—全书回顾
  13. 服装标准中纰裂试验方法的比较与探讨
  14. 开关磁阻电机控制仿真 开关磁阻电机传统控制:电流斩波控制、电压PWM控制、角度位置控制。 智能控制:12/8三相开关磁阻电机有限元分析本体建模
  15. python多个箱线图_python-matplotlib | 箱线图及解读
  16. 一语中的丨高对抗重实战攻防视角下,企业安全运营到底该怎么做?
  17. 小米平板2win下屏蔽按键
  18. 安检机出彩色图及三点一线校准问题
  19. 分享:Web 网页设计规范
  20. 年后胖三斤,减肥你准备好了吗

热门文章

  1. Unity学习笔记--Editor、Resource等常用文件夹的用处
  2. 4 UML 图中,一张交互图显示一个交互,由一组对象及其之间的关系组成,包含它 们之间可能传递的消息,以下不是交互图的是( )
  3. 软考初级程序员易错题:在统一建模语言 (UML)中,( )展现了 一组对象以及它们之间的关系, 给出了系统的静态设计视图或静态进程视图,描述了( )中所建立的事物 实例的静态快照。
  4. 利用celebA数据集训练MTCNN网络
  5. 创建自己的Visual Studio插件仓库
  6. null在matlab中什么意思,null表示什么
  7. 系统选Linux还是mac,如何选择一款适合自己操作系统、Windows、Mac还是Linux?
  8. 12月21日世界末日==人生末日?
  9. 对于英语小白,运行Pycharm后要做的第一件事,下载一个官方插件,汉化Pycharm
  10. rfid读卡器方案rfid读卡器方案,采用hid接口,无需安 装驱动,设备自动识别