Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >第4阶段——制作根文件系统 (4)

第4阶段——制作根文件系统 (4)

作者头像
诺谦
发布于 2018-01-03 09:12:32
发布于 2018-01-03 09:12:32
2.6K0
举报
文章被收录于专栏:Linux驱动Linux驱动

在上节制作busybox后(位于/work/nfs_root/mini_fs), 然后根据以下5个来构建最小根文件系统:

(1)/dev/console(终端控制台, 提供标准输入、标准输出以及标准错误)

/dev/null  (表示空设备终端, 所有写到这个文件中的数据都会被丢弃掉。)

(2)init进程的程序(也就是busybox,因为init程序位于busybox中,已经完成)

(3)/etc/inittab(用于init进程读取配置, 然后执行inittab里的指定应用程序)

(4)应用程序(被inittab配置文件调用的应用程序)

(5)C库(glibc,被应用程序调用的C库函数,比如:printf,strcmp,fopen等)

1.创建终端(/dev/console和/dev/null)

1.1输入ls /dev/console /dev/null -l 查看pc机上终端的设备号:

得出:/dev/console主设备号=5,次设备号=1

     /dev/null  主设备号=1,次设备号=3

1.2根据上面得出的设备号,创建console和null字符设备文件

mkdir dev                 //先在mini_fs目录下创建个dev目录(设备都放在dev目录下)

cd dev/

sudo mknod console c 5 1    //创建console字符设备,

sudo mknod null c 1 3    //创建null 字符设备,

2. busybox已做好,所以init进程的程序也就做好了

3.构造/etc/inittab (执行inittab里的指定应用程序)

mkdir etc          //在mini_fs目录下创建个etc目录

vi  etc/inittab       //创建inittab文件

inittab里添加内容:

console::askfirst:-/bin/sh      //action值必须小写  id可以写成/dev/xx或xx

表示action= askfirst(每次启动/bin/sh进程之前等待用户按下enter键),然后指定/bin/sh的终端对应/dev/console字符设备

4.安装glibc库

mkdir lib              //在mini_fs目录下创建个lib目录 (存放库函数)

cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib     //进入源目录

cp *.so* /work/nfs_root/mini_fs/lib -d        //复制glibc库到lib目录(*:匹配符,-d:保持链接)

5.使用mkyaffs2image制作文件系统(yaffs1针对小页512B,yaffs2针对大页2KB)

5.1生成mkyaffs2image工具

在/work/system目录中 有一个压缩文件yaffs_source_util_larger_small_page_nand.tar.bz2(保存了yaffs1和yaffs2)

tar –xjf  yaffs_source_util_larger_small_page_nand.tar.bz2    //解压

解压得到Development_util_ok,里面就有yaffs1和yaffs2,如下图:

5.2然后,进入yaffs2/utils,执行make 命令生成mkyaffs2image工具,将它复制到usr/local/bin目录:

cd yaffs2/utils

make

sudo cp mkyaffs2image /usr/local/bin

sudo chmod +x /usr/local/bin/ mkyaffs2image                //添加可执行属性

5.3 mkyaffs2image制作yaffs2文件系统

cd /work/nfs_root               //进入文件系统目录上一层

mkyaffs2image  mini_fs  mini_fs.yaffs2      //将mini_fs文件系统制作成mini_fs.yaffs2映像文件系统

6.将制作好的mini_fs.yaffs2通过DNW下载到板子上,进行试验

串口输出如下图,发现无法打开控制台:

发现是在创建console和null字符设备文件那里出了问题,因为没有加权限模式,所以内核无法找到console。

删除console和null设备,重新创建它们:

sudo mknod –m 660  console c 5 1    //创建console字符设备,设置权限用户和组都能读写

sudo mknod –m 660 null c 1 3    //创建null 字符设备, 设置权限用户和组都能读写

重新制作yaffs2并烧写就能成功了, 如下图:

刚好对应inittab配置文件中内容:console:: askfirst:-/bin/sh

askfirst: 启动/bin/sh进程之前等待用户按下enter键    

最简单的根文件系统就完成了,接下来开始完善根文件系统。

7 完善系统——添加ps命令

它是通过proc虚拟文件系统挂接到proc目录,然后当前进程的信息会以文件的形式保存到proc目录,就可以用ps命令来查看内存中当前进程的状态了

mkdir proc                    //创建proc目录

mount –t proc none /proc      //挂载proc,  none:表示运行mount命令时显示proc相关的输出

接下来就可以使用ps命令了,如下图:

这里的PID进程号都以文件的形式存在了/proc目录里,例如cd proc/1 ,进入init进程(init进程是内核第1个挂载的进程),如下图

其中fd文件就是保存init进程的3个文件描述符--标准输入(0)、标准输出(1)以及标准错误(2)

通过ls –l fd   可以看出这3个文件描述符都指向/dev/console控制台,如下图:

7.1 inittab配置文件中追加内容,避免手动mount挂载proc

方法1:

在inittab里追加内容:

::sysinit:/etc/init.d/rcS          //将/etc/init.d/rcS脚本设置成系统的初始化文件

然后mkdir -p etc/init.d 和vi etc/init.d/rcS, 添加一行命令(也可以添加其它命令)

mount -t proc none /proc      //挂载proc(前提根文件系统有proc目录)

并加上可执行权限

sudo chmod +x etc/init.d/rcS               //使脚本rcS能够执行命令

方法2:

除了使用在rcS中添加mount -t proc non /proc命令

也可以用mount -a  作用是加载文件/etc/fstab中配置的所有设备

它会依赖一个配置文件/etc/fstab

它的格式如下 (参考linux应用开发手册第368页)

vi etc/init.d/rcS, 添加一行命令

mount -a      //加载文件/etc/fstab中配置的所有设备

然后创建fstab文件vi  etc /fstab,添加内容:

#device   mount-point  type     options   dump   fsck order

proc       /proc       proc     defaults   0       0

可以直接在板子里操作,然后重启就能使用ps命令了。

通过cat proc/mounts 命令就可以查看当前挂载proc虚拟文件系统:

8 完善系统——使用mdev自动在/dev下创建设备节点

现在dev下只有2个字符设备,如果大量增加设备的话,手动创建太麻烦,可以使用udev。

mdev 是udev的一个迷你版, 它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及热插拔的功能

mdev使用说明在busybox-1.7.0/docs/medev.txt中以及linux应用开发手册第369页,如下图:

从上面得出mdev都需要内核sysfs、tmpfs、devpts的支持,

sysfs是管理虚拟系统,为udev提供设备入口和uevent通道,sysfs类型,需要挂载到/sys目录下

tmpfs是内存文件系统,tmpfs类型,需要挂载到/dev目录下

devpts是内核虚拟系统, 管理员通过文件系统和内核进行沟通(读\写)的一种渠道, devpts类型,需要挂载到/dev/pts目录下

8.1 创建sysfs、tmpfs、devpts要挂载的目录

mkdir   /sys                     //创建sysfs要挂载的目录

mkdir   /dev/pts                 //创建pevptes要挂载的目录

8.2  vi etc/init.d/rcS, 追加热拔插命令和配置/dev设备,添加内容如下:

echo /sbin/mdev > /proc/sys/kernel/hotplug  

//自动创建/proc/sys/kernel/hotplug, /sbin/mdev并指向hotplug,使mdev支持热插拔

mdev -s                      //将/dev目录下的设备文件创建成节点

8.3  vi  etc /fstab,添加sysfs、tmpfs、pevpts挂载内容:

sysfs     /sys      sysfs      defaults   0       0

tmpfs     /dev      tmpfs      defaults   0       0

devpts    /dev/pts   devpts     defaults   0       0

然后烧录至板子中查看效果,如下图,dev目录下自动创建了很多节点,然后/proc/mounts里也有挂载记录

9 mkfs.jffs2制作jffs2文件系统(参考linux应用手册375页)

9.1 安装zlib(压缩动态库)

cd /work/GUI/xwindow/X/deps

tar -xzf zlib-1.2.3.tar.gz

cd zlib-1.2.3

./configure --shared --prefix=/usr  //配置安装动态库(shared)到指定(prefix)的/usr目录下

make            //编译

sudo make install         //安装

9.2 然后编译mkfs.jffs2工具

cd /work/tools

tar -xjf mtd-utils-05.07.23.tar.bz2

cd mtd-utils-05.07.23/util

make

sudo make install

9.3制作jffs2文件系统

cd /work/nfs_root                   //准备制作子目录mini_fs

mkfs.jffs2 -n  -s 2048  -e 128KiB  -d mini_fs  -o mini_fs.jffs2

/*-n:表示每块不添加清除标记,-s:size一页大小为2k,-e:一块大小为128kb

-d:制作的dir目录,-o:输出文件        */

9.4 烧入板子中,并设置bootags参数为yaffs启动

在uboot中输入:

set bootargs noinitrd  root=/dev/mtdblock3 rootfstype=jffs2  init=/linuxrc console=ttySAC0

// rootfstype:将root file system type(根文件系统类型)强制设为jffs2

然后save保存后重新启动内核:

10 使用nfs挂载虚拟机目录

10.1确定板子是否与虚拟机位于同一网段

ifconfig eth0 up                 //开启网关0,连接网线到路由器

ifconfig eth0 192.168.0.107       //设置ip

ping 192.168.0.106             //与虚拟机ping一下,是否已通

10.2确定虚拟机是否能被挂载目录

首先要使虚拟机能够被别人挂载目录,在/etc/exports中添加需要被挂载的目录即可

例如:

sudo vi /etc/exports            

添加以下一段内容:

/work/nfs_root/mini_fs   *(rw,sync,no_root_squash) //添加挂载目录:/work/nfs_root/mini_fs

sudo  /etc/init.d/nfs-kernel-sever  restart        //然后重启nfs服务

10.3 然后将板子内核来挂载虚拟机目录

mkdir  /mnt                  //创建要挂载的目录

mount -t nfs -o nolock,vers=2 192.168.0.106:/work/nfs_root/mini_fs     /mnt

           //将远端虚拟机/work/nfs_root/mini_fs目录挂载到开发板/mnt目录里

//命令详细参数参考: http://www.cnblogs.com/lifexy/p/7380549.html

如下图,然后板子内核的/mnt目录就是虚拟机/work/nfs_root/mini_fs目录了

11 使用nfs 作为根文件系统启动

通过设置u-boot的bootargs来更改开机自动进入nfs文件系统,不需要mount指令

步骤(参考http://www.cnblogs.com/lifexy/p/7049743.html):

进入uboot,输入:

set  bootargs  noinitrd  root=/dev/nfs  nfsroot=192.168.0.106:/work/nfs_root/mini_fs  ip=192.168.0.107:192.168.0.106:192.168.0.1:255.255.255.0::eth0:off   init=/linuxrc console=ttySAC0            

 //设置npptargs,添加nfsroot(红色:远端服务器参数,蓝色:开发板客户端参数)

save                                            //保存参数

然后重启开发板进入内核,就启动nfs文件系统了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)
1.安装mkyaffsimage, mkyaffs2image命令(用来制作yaffs文件系统)
呆呆
2021/05/27
1.6K0
08.构建根文件系统
 终于自动挂载文件系统成功了!!!出错的地方两个!!!   第一,恢复出厂设置一定要用eop下载uboot,dnw下载的不行!!!最后记得erase nand params!!   第二,set bootargs noinitrd root=/dev/nfs nfsroot=202.193.61.195:/work/nfs_root/first_fs ip=202.193.61.196:202.193.61.195:202.193.61.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 参数解读:  nfsroot=202.193.61.195: ubuntu ip地址  /work/nfs_root/first_fs要挂载的目录  ip=202.193.61.196: 单板ip(恢复出厂设置后记得先配置ip,手动挂载下能不能成功,可以成功的话再修改bootargs自动挂载!)  202.193.61.195: 依然是ubuntu ip !!!!!注意!!!  202.193.61.1: 网关,只要处于同一网段就好。  255.255.255.0:: 子网掩码  eth0: 网卡,一般都是0  off 是否自动配置 off就可以
嵌入式与Linux那些事
2021/05/20
2K0
构建Linux根文件系统
类似于Windows下的C、D、E等各个盘,Linux系统也可以将磁盘、Flash等存储设备划分为若干个分区,在不同分区存放不同类别的文件。与Windows的C盘类似,Linux一样要在一个分区上存放系统启动所必需的文件,比如内核映象文件(在嵌入式系统中,内核一般单独存放在一个分区中)、内核启动后运行的第一个程序(init)、给用户提供操作界面的shell程序、应用程序所依赖的库等。这些必需的、基本的文件,合称为根文件系统,它们存放在一个分区中。Linux系统启动后首先挂接这个分区──称为挂接(mount)根文件系统。其他分区上所有目录、文件的集合,也称为文件系统,比如我们常说:“挂接硬盘第二个分区”、“挂接硬盘第二个分区上的文件系统”。
韦东山
2020/09/30
3.6K0
构建Linux根文件系统
S3C2440移植linux3.4.2内核之支持YAFFS文件系统
  如上图,问题都是出在fs/yaffs2/下,很多error都讲述:调用的成员名,在struct mtd_info结构体里没有定义.
嵌入式与Linux那些事
2021/05/20
1.4K0
S3C2440移植linux3.4.2内核之支持YAFFS文件系统
嵌入式Linux利用busybox制作根文件系统
将busybox源码拷贝到linux主机并解压,同时新建一个rootfs文件夹,用于保存待会制作好的根文件系统。
知否知否应是绿肥红瘦
2025/02/19
2480
嵌入式Linux利用busybox制作根文件系统
详解-使用nfs作为根文件系统启动,(3)
摘要总结:本文介绍了使用NFS作为根文件系统启动的详细步骤,包括设置U-Boot的bootargs、更改内核编译选项、使用NFS共享文件系统等。作者通过一个实际的例子演示了如何使用NFS作为根文件系统,并分享了U-Boot命令行工具的使用方法。
诺谦
2018/01/03
2.2K0
详解-使用nfs作为根文件系统启动,(3)
i.MX6ULL嵌入式Linux开发5-根文件系统完善
上篇文章,使用BusyBox构建了基础的嵌入式Linux系统的根文件系统,基本的功能可以正常运行,但在这个基础功能上,还要许多地方需要完善。
xxpcb
2021/08/13
1.4K0
嵌入式 linux 根文件系统原理和制作方法
一套linux体系,只有内核本身是不能工作的,必须要 rootfs 上的 etc 目录下的配置文件、/bin /sbin 等目录下的 shell 命令,还有 /lib 目录下的库文件等···)相配合才能工作 。
杨源鑫
2021/07/30
4.3K0
第4阶段——制作根文件系统之编译配置安装busybox(3)
本文介绍了如何编译配置busybox并制作一个最小的根文件系统,包括编译配置、安装过程以及根文件系统的构建方法。
诺谦
2018/01/03
1.7K0
第4阶段——制作根文件系统之编译配置安装busybox(3)
2.移植3.4内核-支持烧写yaffs2,裁剪内核并制作补丁
如上图,问题都是出在fs/yaffs2/下,很多error都讲述:调用的成员名,在struct mtd_info结构体里没有定义.
诺谦
2019/05/24
1.4K0
S3C2440移植linux3.4.2内核之修改分区以及制作根文件系统
  在si里搜索上图出现的”S3C2410 flash partition”字段,找到位于common-smdk.c中,里面有个数组smdk_default_nand_part[],内容如下所示:
嵌入式与Linux那些事
2021/05/20
1.7K0
S3C2440移植linux3.4.2内核之修改分区以及制作根文件系统
Linux根文件系统:/etc/init.d/rcS文件分析
1. rcS文件的作用 rcS是一个脚本文件,在inittab文件中本解析调用,用于配置Linux系统。 2.rcS文件分析 #! /bin/sh #指定系统使用的shell #初始化环境变量PATH,操作系统执行程序默认到PATH指定的目录下寻找该程序 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: runlevel=S #设置系统运行级别为S,即单用户模式,只有一个控制台终端,供“root”帐号做系统维护。 prevlev
心跳包
2020/08/31
3.6K0
NFS挂载的2种方式
在第一期视频 : 第0课第7节_刚接触开发板之制作根文件系统及初试驱动.wmv ,因为要测试驱动,所以必须要把驱动程序弄到开发板里才行。 于是韦老师介绍了两种方式:
韦东山
2020/09/30
5.1K0
NFS挂载的2种方式
AT91SAM9260——NFS挂载根文件系统
对于嵌入式Linux开发,通过NFS挂载根文件系统,根文件系统无需下载到FLASH( FLASH还需要先擦除再写入),可以直接保存在Linux主机,而且在Linux开发的驱动程序也无需下载到Linux开发板的FLASH,这使得开发十分方便快捷,下面记录了我自己通过NFS挂载根文件系统的过程。
知否知否应是绿肥红瘦
2025/02/19
880
AT91SAM9260——NFS挂载根文件系统
U-boot常用命令汇总
我们经常使用uboot命令,虽然资料光盘->常见问题目录有U-boot常用命令汇总文档,但从大家的反馈来看,并没有很多人注意到这个文档,所以把它挪到这里。如此全的uboot命令汇总,建议收藏。
韦东山
2020/09/30
9550
Linux下BusyBox根文件系统制作
BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统的自带的shell。BusyBox提供了一个比较完善的环境,可以适用于任何小的嵌入式系统。
DS小龙哥
2022/04/08
6.4K0
Linux下BusyBox根文件系统制作
【教程】从零制作文件系统到jz2440,使其支持telnet , ftp 和tftp
开发板:jz2440 主机linux:ubuntu 9.10(资料光盘那个) 内核:linux2.6.22.6 交叉编译器:arm-linux-gcc 3.4.5(也可以用毕业班4.3.2那个编译器,不过我没找对lib,失败了,先不深究) busybox:busybox-1.21.0.tar.bz2 本来想用韦老师视频用的busybox-1.17.0,后来发现不支持ftp和tftp, 只好放弃了
韦东山
2020/09/30
2.4K0
【教程】从零制作文件系统到jz2440,使其支持telnet , ftp 和tftp
嵌入式Linux开发-busybox根文件系统制作
如果大家做过linux系统移植、或者Linux相关开发,对根文件系统这个名词应该很熟悉,在搭建嵌入式开发环境过程中,移植bootloader,移植kernel制作根文件系统是必须要做3件事情。
DS小龙哥
2022/04/08
4.3K1
嵌入式Linux开发-busybox根文件系统制作
Linux根文件系统(rootfs原理详解)
文件系统是os用来明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 文件系统由三部分组成:文件系统的接口,对对象操作和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
JavaEdge
2021/02/23
13.6K0
busybox引导linux内核_linux移植教程
【点此进入busybox官网】,网站链接为:https://busybox.net/。进入官网后依次查找下述菜单,进入下载页面。
全栈程序员站长
2022/11/08
5.7K0
推荐阅读
相关推荐
详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档