Linux 根文件系统构建
根文件系统一般也叫做 rootfs
以下内容部分参考正点原子。
操作系统:Ubuntu 16
交叉编译工具:gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf
BusyBox版本:1.29.0.
使用平台,正点原子开发板 ALPHA V2.2
1、/bin 目录
看到“bin”大家应该能想到 bin 文件,bin 文件就是可执行文件。所以此目录下存放着系统
需要的可执行文件,一般都是一些命令,比如 ls、mv 等命令。此目录下的命令所有的客户都可
以使用。
2、/dev 目录
dev 是 device 的缩写,所以此目录下的文件都是和设备有关的,此目录下的文件都是设备
文件。在 Linux 下一切皆文件,即使是硬件设备,也是以文件的形式存在的,比如
/dev/ttymxc0(I.MX6ULL 根目录会有此文件)就表示 I.MX6ULL 的串口 0,我们要想通过串口 0
发送或者接收数据就要操作文件/dev/ttymxc0,通过对文件/dev/ttymxc0 的读写操作来实现串口
0 的数据收发。
3、/etc 目录
此目录下存放着各种配置文件,大家可以进入 Ubuntu 的 etc 目录看一下,里面的配置文件
非常多!但是在嵌入式 Linux 下此目录会很简洁。
4、/lib 目录
lib 是 library 的简称,也就是库的意思,因此此目录下存放着 Linux 所必须的库文件。这些
库文件是共享库,命令和用户编写的应用程序要使用这些库文件。
5、/mnt 目录
临时挂载目录,一般是空目录,可以在此目录下创建空的子目录,比如/mnt/sd、/mnt/usb,
这样就可以将 SD 卡或者 U 盘挂载到/mnt/sd 或者/mnt/usb 目录中。
6、/proc 目录
此目录一般是空的,当 Linux 系统启动以后会将此目录作为 proc 文件系统的挂载点,proc
是个虚拟文件系统,没有实际的存储设备。proc 里面的文件都是临时存在的,一般用来存储系
统运行信息文件。
7、/usr 目录
要注意,usr 不是 user 的缩写,而是 Unix Software Resource 的缩写,也就是 Unix 操作系统
软件资源目录。这里有个小知识点,那就是 Linux 一般被称为类 Unix 操作系统,苹果的 MacOS
也是类 Unix 操作系统。关于 Linux 和 Unix 操作系统的渊源大家可以直接在网上找 Linux 的发
展历史来看。既然是软件资源目录,因此/usr 目录下也存放着很多软件,一般系统安装完成以
后此目录占用的空间最多。
8、/var 目录
此目录存放一些可以改变的数据。
9、/sbin 目录
此目录页用户存放一些可执行文件,但是此目录下的文件或者说命令只有管理员才能使用,
主要用户系统管理。
10、/sys 目录
系统启动以后此目录作为 sysfs 文件系统的挂载点,sysfs 是一个类似于 proc 文件系统的特
殊文件系统,sysfs 也是基于 ram 的文件系统,也就是说它也没有实际的存储设备。此目录是系
统设备管理的重要目录,此目录通过一定的组织结构向用户提供详细的内核数据结构信息。
11、/opt
可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。
关于 Linux 的根目录就介绍到这里,接下来的构建根文件系统就是研究如何创建上面这些子目
录以及子目录中的文件。
下面我们开始使用 BusyBox 进行构建根文件系统
我这里使用的是
busybox-1.29.0.tar.bz2
拿到busybox-1.29.0.tar.bz2后解压文件
tar -vxjf busybox-1.29.0.tar.bz2
最后得到
busybox 中文字符支持
修改 busybox 源码,取消 busybox 对中文显示的限制,打开文件 busybox-
1.29.0/libbb/printable_string.c,找到函数 printable_string,缩减后的函数内容如下
const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
{char *dst;const char *s;s = str;while (1) {unsigned char c = *s;if (c == '\0') {/* 99+% of inputs do not need conversion */if (stats) {stats->byte_count = (s - str);stats->unicode_count = (s - str);stats->unicode_width = (s - str);}return str;}if (c < ' ')break;/* if (c >= 0x7f)break;*/s++;}#if ENABLE_UNICODE_SUPPORTdst = unicode_conv_to_printable(stats, str);
#else{char *d = dst = xstrdup(str);while (1) {unsigned char c = *d;if (c == '\0')break;/* if (c < ' ' || c >= 0x7f)*/if(c < ' ')*d = '?';d++;}if (stats) {stats->byte_count = (d - dst);stats->unicode_count = (d - dst);stats->unicode_width = (d - dst);}}
#endifreturn auto_string(dst);
}
接着打开文件 busybox-1.29.0/libbb/unicode.c
找到 unicode_conv_to_printable2 这个函数更改这两处
下面就是配置了
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm menuconfig
找到
Location:
-> Settings
-> Build static binary (no shared libs)
确保该项没有选中
Location:
-> Settings
-> vi-style line editing commands
选中该项
Location:
-> Linux Module Utilities
-> Simplified modutils
默认会选中“Simplified modutils”,这里我们要取消勾选!!
Location:
-> Linux System Utilities
-> mdev (16 kb) //确保下面的全部选中,默认都是选中的
最后就是使能 busybox 的 unicode 编码以支持中文,配置路径如下:
Location:
-> Settings
-> Support Unicode //选中
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中
最后 退出 保存!
开始编译。
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm
编译完成
下面将编译结果保存到我们所需的目录
make install CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm CONFIG_PREFIX=/home/dwh/linux/nfs/rootfs
编译完成以后会在 busybox 的所有工具和文件就会被安装到 rootfs 目录中,内容如图所示。
下面开始完善根文件系统
向lib添加库文件
首先建一个lib目录
进入到交叉编译器的目录复制库文件到根文件系统
mkdir lib
cd /usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/
cp cp *so* *.a /home/dwh/linux/nfs/rootfs/lib/ -d
因为 ld-linux-armhf.so.3文件是个链接文件 因此我们要删掉它,并且重新复制该文件
rm ld-linux-armhf.so.3
cp ld-linux-armhf.so.3 /home/dwh/linux/nfs/rootfs/lib
然后进入/usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib目录
cd /usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a /home/dwh/linux/nfs/rootfs/lib/ -d
然后向 usr/lib目录添加文件
首先先创建一个目录
mkdir /usr/lib
cd /usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a /home/dwh/linux/nfs/rootfs/usr/lib/ -d
接着创建别的目录
mkdir dev
mkdir proc
mkdir mnt
mkdir sys
mkdir tmp
mkdir root
mkdir etc
添加 rcS文件
创建/etc/init.d/rcS
在etc/init.d/rcS下写入
#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATHmount -a
mkdir /dev/pts
mount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
创建/etc/fstab 文件
添加以下代码
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0sysfs /sys sysfs defaults 0 0
创建创建/etc/inittab 文件
添加以下代码
#etc/inittab::sysinit:/etc/init.d/rcSconsole::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
下面我们开始测试文件系统。
我们使用网络挂载的方式
在uboot启动时设置命令
setenv bootargs 'console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.0.9:/home/dwh/linux/nfs/rootfs ip=192.168.0.20:192.168.0.9:192.168.0.1:255.255.255.0::eth0:off'
saveenv
最后成功进入文件系统,大功告!
Linux 根文件系统构建相关推荐
- 构建基本的嵌入式Linux根文件系统
构建基本的嵌入式Linux根文件系统 其实在去年8月份我做系统移植时就构建好了一个可以用的根文件系统,但是那时是跟着别人的<Linux全线移植文档>做的.有些东西我也不清楚,只是跟着做,做 ...
- linux系统根文件系统构建
根文件系统构建 一.根文件系统简介 根文件系统是 Linux 内核启动以后挂载(mount)的第一个文件系统, 从根文件系统中读取初始化脚本,比如 rcS,inittab 等. 根文件系统和 Linu ...
- Linux之系统移植与根文件系统构建
Linux之系统移植与根文件系统构建 1.Uboot 1. 什么是Uboot: 一个裸机程序 就是一个bootloader用于启动Linux或其他系统 最主要的工作就是初始化DDR.因为Linux是运 ...
- 【正点原子MP157连载】第十九章 Buildroot根文件系统构建-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- linux开发 | 根文件系统构建实验及过程详解
<2.uboot和系统移植-第19部分-2.19.根文件系统构建实验及过程详解> 第一部分.章节目录 2.19.1.根文件系统的构建路线 2.19.2.busybox的移植实战 2.19. ...
- 【正点原子Linux连载】第三十八章 根文件系统构建 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- linux 开机 找不到 文件系统 下载文件系统就好了,根文件系统构建和实验过程
1.1.根文件系统构建路线 1.先逐步构建文件夹形式的根文件系统然后在制作烧录镜像 2.1.busybox移植实战 1.busybox中是一些shell命令集 2.busybox××× (1)busy ...
- 二十.Linux开发之根文件系统构建及过程详解
老规矩 有道云笔记地址: 详情看这里链接,记录太多,就不一一排版了. http://note.youdao.com/noteshare?id=15b6e982c2e66d0f47b1c787a49f4 ...
- 根文件系统构建(Buildroot 方式)
目录 何为buildroot? buildroot 简介 buildroot 下载 buildroot 构建根文件系统 配置buildroot 编译buildroot buildroot 根文件系统测 ...
最新文章
- POJ-1837 Balance
- Kali Linux 64位架构安装Veil-Evasion
- linux的ulimit各种限制之深入分析
- 方立勋_30天掌握JavaWeb_(Servlet+JSP+JavaBean实现)用户注册和登陆
- 什么是spring_Spring 源码第三弹!EntityResolver 是个什么鬼?
- 循环与函数及相关例子
- java能写驱动吗_使用纯java jdbc驱动程序实现数据库的连接
- 2020年了,JavaScript依然是前端最受欢迎的语言吗?
- 项目组网技术方案实施要点
- SQL Server高级查询之子查询(多行子查询)
- python怎么打印图片_Python打印图片
- s10_part3_django_ORM_查询相关_非常重要
- 公众号七种有效的引流方式
- 单链表的插入操作(全)
- Ubuntu18.04 LTS 安装 Synopsys VCS及一些问题
- 虚拟机VMware Workstation安装使用教程
- 线性模型是否真的能给出一个很好的解释?
- iosfifa15正在连接服务器,《FIFA15》正式登陆AppStore 必须联网才能玩
- 从实验到投稿录用的一次经历(历时小半年)
- 最小字符串(蓝桥杯试题 算法提高)
热门文章
- 有趣的推理html,关于有趣的推理评课稿
- 用C语言编写程序计算对角线的和,C语言入门级代码 计算二维数组主对角线上的元素之和...
- 2023.02.14草图大师 卧室房间 效果图
- java个人理财代码_基于JavaEE的个人理财系统
- 击败26个硕士,本科生“歪门邪道”月薪过万
- 记录一次上网正常但是【登录客户端应用网络异常问题】
- RecyclerView源码学习笔记(一)构造函数和setLayoutManager方法
- 产业智能化的大江大河,需要AI安全这样守护
- macbook键盘背光打不开怎么办?如何解决苹果笔记本键盘背光不亮的问题?
- Mac OS X平台下QuickLook开发教程