Buildroot构建指南——根文件系统(Rootfs)【转】
本文转载自;
版权声明:本文为博主原创文章,未经博主允许不得转载。
Buildroot构建指南——根文件系统(Rootfs)
Buildroot的Rootfs构建流程有一个大框架,有些部分是Buildroot系统做好的,有些细节需要自己来实现,Rootfs也是Buildroot中最为复杂的部分。
Rootfs的构建流程概述
Rootfs的构建流程如图1所示。其中浅色框中为Buildroot实现的框架,深紫色框为用户实现的脚本。
Figure 1 Buildroot系统的rootfs制作
需要归纳的几点如下:
1. 新版buildroot已经把rootfs的/etc/init.d/的rcS等启动脚本移到了package/initscripts/目录下。
2. 系统默认的rcS脚本不会直接做系统用户态启动初始化操作,而是会调用/etc/init.d/目录下的SXX开头的脚本执行系统用户态启动的流程,其中XX是数字,数字越小的脚本优先于数字大的脚本被调用。用于实际的系统用户态启动脚本应该以SXX这这种格式命名,install到output/target/etc/init.d/目录下。
3. fakeroot是一个主机上使用的软件包,它会被buildroot下载编译,用于为构建rootfs提供一个虚拟的root权限环境,只有在root权限下,才能把output/target/中的目录和文件变成root用户,并创建dev节点。有了fakeroot环境,系统构建者无需获取主机的root权限,也能在fakeroot下把文件改为root用户,并制作root方式。
4. 用户特定格式的rootfs制作脚本,最后都会被写到一个脚本中,该脚本会在fakeroot环境中执行。
如何构建自己的Rootfs
清楚流程后可以在Buildroot环境下构建自己的Rootfs了,以友善的tiny4412开发板的rootfs为例,demo一次构建自己的rootfs的流程。
友善官方提供的rootfs压缩包在光盘中是rootfs_qtopia_qt4-20141213.tar.gz,这个rootfs非常臃肿,我们需要对它进行裁剪,最好是能够用busybox做一个最小的rootfs出来,但是由于暂时没有摸清楚它的每一个细节,怕直接编译的rootfs无法启动,因而我们最好在它官方的/etc/init.d/目录下的启动脚本的基础上做进一步裁剪,先保证系统能够启动。
1. 在buildroot/system/目录中,拷贝一份skeleon/目录到tiny4412_skeleton/ ,同时拷贝一份device_table.txt到tiny4412_device_table.txt,因为tiny4412的文件系统中有特殊的部分需要修改,为了不影响通用的模板,所以进行拷贝。
Figure 2 拷贝后的system/目录中内容
2. 根据友善官方的rootfs内容,对tiny4412_skeleton/etc/目录进行一些删减和修改,删减修改后截图如下
Figure 3 删减修改后的tiny4412_skeleton/etc/目录
3. 将官方文件系统中,/etc/init.d/中的脚本cp到tiny4412_skeleton/etc/init.d/中,其实rcS更名为S00_tiny4412以匹配SXX的格式,XX代表数字。
4. 将tiny4412_device_table.txt稍作修改,去掉passwd等一些最小系统中用不上的内容。
Figure4 修改后的tiny4412_device_table.txt文件
5. 由于tiny4412的文件系统比较特别,使用了友善专用的make_ext4fs工具来制作的,并且这是个不开源的bin程序,把一些参数和节点都在里面写死了,因而我们需要单独在fs/中,为制作tiny4412的文件系统添加方法。
6. 在fs/目录下添加tiny4412_ext4/目录,将友善官方提供的make_ext4fs工具cp到该目录下,当然Config.in文件和tiny4412_ext4.mk脚本是必不可少的的。别忘了在fs/Config.in中将新添加的配置文件Config.in source进去哦!
Figure5 专为制作tiny4412 ext4文件系统而添加的脚本目录
Figure6 tiny4412_ext4/目录中的内容
Figure7 在fs/Config.in中将新加入的Config.in关联进去
7. 在tiny4412_ext4/Config.in中加入以下的配置代码,其中BR2_TARGET_ROOTFS_TINY4412_EXT4是必不可少,让系统能够识别的文件系统类型的变量。剩下的变量则是可在menuconfig中配置的,文件系统大小,image制作工具的路径,以及image最后的名字
- config BR2_TARGET_ROOTFS_TINY4412_EXT4
- bool"ext4 root filesystem for tiny4412"
- help
- Build aext4 root filesystem specify for tiny4412
- if BR2_TARGET_ROOTFS_TINY4412_EXT4
- config BR2_TARGET_ROOTFS_TINY4412_EXT4_LEN
- string"length of rootfs"
- default"397508608"
- config BR2_TARGET_ROOTFS_TINY4412_EXT4_MK_TOOL_PATH
- string "make image toolpath"
- default"$(TOPDIR)/fs/tiny4412_ext4/make_ext4fs"
- config BR2_TARGET_ROOTFS_TINY4412_EXT4_IMAGE_NAME
- string"image name"
- default"rootfs_qtopia_qt4.img"
- endif
8. 在tiny4412_ext4.mk脚本中加入rootfs构建脚本。制作脚本的核心其实也就是ROOTFS_TINY4412_EXT4_CMD函数,它会在fs/common.mk脚本中,被写入fakeroot的执行脚本,然后会在fakeroot环境中被执行。ROOTFS_TINY4412_EXT4_CMD 函数 调用make_ext4fs工具根据配置的参数,生成rootfs的image。
- ################################################################################
- #
- # Build the TINY4412_EXT4 root filesystem image
- #
- ################################################################################
- TINY4412_EXT4_OPTS := -s -l$(BR2_TARGET_ROOTFS_TINY4412_EXT4_LEN)
- TINY4412_EXT4_OPTS += -a root -L Linux
- ifeq ($(BR2_TARGET_ROOTFS_TINY4412_EXT4),y)
- PACKAGES_PERMISSIONS_TABLE :=
- endif
- define ROOTFS_TINY4412_EXT4_CMD
- $(BR2_TARGET_ROOTFS_TINY4412_EXT4_MK_TOOL_PATH) $(TINY4412_EXT4_OPTS)$@ $(TARGET_DIR)
- endef
- $(eval $(call ROOTFS_TARGET,tiny4412_ext4))
9. 接下来是make menuconfig的配置了。在menuconfig --> Systemconfiguration中,customer skeleton path 和 path to permissiontable 这两项填充为1—4步骤中,我们所拷贝修改过的tiny4412_skeleton和tiny4412_device_table.txt。
Figure8 menuconfig --> Systemconfiguration的配置
10. 在menuconfig --> Filesystemimages中,选中我们刚刚特制的ext4 rootfs tor tiny4412,剩下的参数估计被make_ext4fs工具程序内部写死了,用默认的就行。另外,在该选项中,busybox被默认选中,所以busybox中的所有软件默认都被当做应用编译和install到output/target/目录下。
Figure9 menuconfig --> Filesystem images的配置
11. 保存之后,make rootfs-tiny4412_ext4 就生成我们自己的文件系统了。用tiny4412的SD卡烧录进去,是可以boot起来的,对S00_tiny4412脚本进行进一步裁剪后,我们可以得到一个在tiny4412开发板上最小的能boot起来的Linux系统。
Buildroot构建指南——根文件系统(Rootfs)【转】的更多相关文章
- Buildroot构建指南--Overview
使用Buildroot,让嵌入式Linux系统构建更加便捷.本文以Buildroot-2016.05的版本为基础来讲解,不同版本之间有细节差异,需要根据读者使用的版本自行调整. Buildroot是什 ...
- Buildroot构建指南--快速上手与实用技巧
Buildroot官方全英文使用手册的链接是https://buildroot.org/downloads/manual/manual.html,需要知道每一个细节的朋友,可以仔细查阅,这篇文章只是我 ...
- Buildroot构建指南--快速上手与实用技巧【转】
本文转载自:http://blog.csdn.net/zhou_chenz/article/details/52335634 Buildroot官方全英文使用手册的链接是https://buildro ...
- 构建Linux根文件系统(未完待续)
所谓制作根文件系统, 就是创建各种目录, 并且在里面创建各种文件. 比如在/bin ./sbin 目录下存放各种可执行程序, 在/etc 目录下存放配置文件, 在/lib 目录下存放库文件 ...
- tiny4412 busybox制作根文件系统rootfs nfs 挂载 ubuntu 14.04
http://blog.csdn.net/liudijiang/article/details/50555429(转) 首先得要有制作好的uboot和linux内核镜像zImage,先烧录到sd卡里, ...
- 嵌入式 emmc 中 安装 烧录 内核 kernel,设备树 devicetree ,根文件系统 rootfs
一般调试嵌入式开发板喜欢选择 利用 TFTP 传送 内核与 设备树, 利用 nfs 加载根文件系统. uboot 环境变量 设置如下: bootargs=root=/dev/nfs rw nfs ...
- 18.14 构建Linux根文件系统
18.14.1 Busybox1.7.0之init程序分析 1.读取配置文件 2.解析配置文件 3.执行用户程序(根据配置文件中指定的内容) 配置文件: 1.指定应用程序 2.何时执行 busybox ...
- Buildroot构建指南——工具链
Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件.一般大家默认工具链等于gcc或者arm-linux-gcc,但是实际上,gcc只是工具链的编译器部分,不是全部,制作一个工 ...
- Buildroot构建指南——工具链【转】
本文转载自:http://blog.csdn.net/zhou_chenz/article/details/52346134 Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软 ...
随机推荐
- Android开发——获取应用数据/缓存大小并清理缓存
1. 获取应用数据/缓存大小 其中pm为实例化的PackageManager,因为需要遍历所有的已安装的应用.因此需要开启子线程进行处理. 还有需要注意的是,在Android4.2之前getPacka ...
- 图的最小生成树——Kruskal算法
Kruskal算法 图的最小生成树的算法之一,运用并查集思想来求出最小生成树. 基本思路就是把所有边从小到大排序,依次遍历这些边.如果这条边所连接的两个点在一个连通块里,遍历下一条边,如果不在,就把这 ...
- HDU1021-Fibonacci Again,,找规律就好了~~~
Fibonacci Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Sudoku Killer--hdu1426(数独 跟上一题差不多 但是输入时问题)
http://acm.hdu.edu.cn/showproblem.php?pid=1426 注意输入问题就行 还是dfs #include<stdio.h> #include<st ...
- python 爬虫(转,我使用的python3)
原文地址:http://blog.csdn.net/pi9nc/article/details/9734437 [Python]网络爬虫(一):抓取网页的含义和URL基本构成 分类: 爬虫 Pyt ...
- 某考试 T1 arg
题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 输入格式 第一行两个整数 n, m. 接下来一行 m 个整数, 表示 A. 输出格式 ...
- <项目><day12>通讯录(视频)
1 需求分析(需求分析师) 功能分析: 1)添加联系人 2)修改联系人 3)删除联系人 4)查询所有联系人 2 需求设计(系统分析师/架构师/资深开发人员) 2.1设计实体(抽象实体) 联系人实体: ...
- MySQL查询count(*)、count(1)、count(field)的区别收集
经过查询研究得出这个和MySQL中用什么引擎有关,比如InnoDB和MyISAM在处理这count(*).count(1).count(field)都有不同的方式,还有就是和版本都有关系,不同的版本会 ...
- datasnap中间件如何控制长连接的客户端连接?
ActiveConnections: TClientDataSet; ... 有客户端连接上来的时候 procedure TForm8.DSServer1Connect(DSConnectEventO ...
- MySQL入门笔记 - 数据类型
参考书籍<MySQL入门很简单> 数据类型是数据的一种属性,可以决定数据的存储方式.有效范围和相应的限制. 1.整数类型 1.1 MySQL的整数类型 MySQL中int类型和inte ...