Linux搭建根文件系统

根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

使用BusyBox构建根文件系统

先在NFS服务器目录下创建一个rootfs文件夹,用于通过NFS挂载根文件系统。(存放在NFS下的文件夹)

获取的busybox压缩包

放入任意文件夹中并解压。(存放在自定义任意文件夹)

/*命令*/
mkdir rootfs
tar -vxjf busybox-1.29.0.tar.bz2

完成后如下:

接下来打开顶层Makefile,添加 ARCH 和 CROSS_COMPILE(绝对路径) 的值。

让busybox支持中文

首先打开busybox-1.29.0/libbb目录下的 printable_string.c 文件,找到 printable_string 函数。

在vim编辑器中,在命令行模式下:用以下命令可以搜索字符串。

/xxx

修改后的代码如下

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')/*      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);
}

再打开 unicode.c 文件,找到 unicode_conv_to_printable2 函数,修改后如下

static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags)
{char *dst;unsigned dst_len;unsigned uni_count;unsigned uni_width;if (unicode_status != UNICODE_ON) {char *d;if (flags & UNI_FLAG_PAD) {d = dst = xmalloc(width + 1);while ((int)--width >= 0) {unsigned char c = *src;if (c == '\0') {do*d++ = ' ';while ((int)--width >= 0);break;}/*      *d++ = (c >= ' ' && c < 0x7f) ? c : '?';        */*d++ = (c >= ' ') ? c : '?';src++;}*d = '\0';} else {d = dst = xstrndup(src, width);while (*d) {unsigned char c = *d;/*      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);}return dst;}......}

配置busybox

默认配置命令:

make defconfig

利用图形化配置界面进行配置,命令:

make menuconfig

打开后如下图所示:

要配置的路径:

1.
Location: -> Settings -> Build static binary (no shared libs)     //不选中2.
Location: -> Settings -> vi-style line editing commands           //选中3.
Location: -> Linux Module Utilities-> Simplified modutils                     //不选中4.
Location: -> Linux System Utilities -> mdev (16 kb)//确保下面的全部选中,默认都是选中的5.
Location: -> Settings-> Support Unicode                                               //选中-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables  //选中

编译busybox

make
make install CONFIG_PREFIX=/home/swiler/workdir/rootfs

编译完成后如下所示:

向根文件系统添加lib库

此时的rootfs目录下的内容如图所示:

接下来在根目录下新建 lib 目录,添加动态库,动态库位于交叉编译器中

目录
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

拷贝所有的带so和.a的文件到lib目录下

cp *so* *.a /home/swiler/workdir/rootfs/lib/ -d

注意要将 ld-linux-armhf.so.3 这个换成文件本身,不能是一个软链接文件。删除原来的软链接文件,再复制一份其本身即可。

/* 命令 */
rm ld-linux-armhf.so.3cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/libcp ld-linux-armhf.so.3 /home/swiler/workdir/rootfs/lib/

再进入另一个目录下,拷贝其它的库文件

目录
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib/* 命令 */
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libcp *so* *.a /home/swiler/workdir/rootfs/lib/ -d

拷贝完成后lib目录内容如下图所示

接着在usr目录下新建lib目录添加库文件

再进入到如下目录拷贝库文件到usr/lib目录下

目录:
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/* 命令 */
cp *so* *.a /home/swiler/workdir/rootfs/usr/lib/ -d

拷贝完成后 usr/lib 目录内容如下图所示

创建其它文件夹

创建完如下图所示

测试

进入uboot模式,配置bootargs变量

格式如下:

root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

说明

server-ip 服务器 IP 地址
root-dir 根文件系统的存放路径
nfs-options NFS 的其他可选选项,一般不设置
client-ip 客户端 IP 地址
server-ip 服务器 IP 地址
gw-ip 网关地址
netmask 子网掩码
hostname 客户机的名字,一般不设置,此值可以空着
device 设备名,也就是网卡名,一般是 eth0,eth1
autoconf 自动配置,一般不使用,所以设置为 off
dns0-ip DNS0 服务器 IP 地址,不使用
dns1-ip DNS1 服务器 IP 地址,不使用

完整命令例子:

命令
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250:
/home/swiler/workdir/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:
255.255.255.0::eth0:off' //设置 bootargssaveenv //保存环境变量

启动Linux内核

boot命令启动内核,进入后可以用 ls 命令看看根文件系统是否工作

下图就是正常启动后的样子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zF8xie8-1651580862231)(C:\Users\15894\AppData\Roaming\Typora\typora-user-images\image-20220503195502573.png)]

进一步完善根文件系统

rcS脚本

在 /etc/init.d 目录创建rcS脚本,帮助Linux内核启动后需要启动的一些服务。

内容如下:

#!/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

给予文件可执行权限

chmod 777 rcS

之后要修改该文件时,如果碰到 Read-only file system 的错误时,可以利用以下命令修改目录为可读写模式

/data 指的是 data 目录

mount -o remount -rw  /data

fstab文件

在 /etc 目录下创建 fstab 文件

内容如下:

#<file system>  <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
tmpfs           /tmp            tmpfs   defaults        0       0
sysfs           /sys            sysfs   defaults        0       0
file system 要挂载的特殊的设备
mount point 挂载点
type 文件系统类型
options 挂载选项,“man mount”命令可以查看具体的选项
dump 为 1 的话表示允许备份,为 0 不备份
pass 磁盘检查设置,为 0 表示不检查。只有根目录设置为1

inittab文件

在 /etc 目录下创建 inittab 文件

内容如下:

#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
动作 描述
sysinit 在系统初始化的时候 process 才会执行一次
respawn 当 process 终止以后马上启动一个新的
askfirst 和 respawn 类似,在运行 process 之前在控制台上显示“Please press Enter to activate this console.”。只要用户按下“Enter”键以后才会执行 process
wait 告诉 init,要等待相应的进程执行完以后才能继续执行
once 仅执行一次,而且不会等待 process 执行完成
restart 当 init 重启的时候才会执行 procee
ctrlaltdel 当按下 ctrl+alt+del 组合键才会执行 process
shutdown 关机的时候执行 process

resolv.conf文件

该文件是用来配置域名解析服务器的 IP 地址,一般域名解析地址可以设置为所处网络的网关地址,比如 192.168.1.1。也可以设置为 114.114.114.114,这个是运营商的域名解析服务器地址。配置完,重启后就可以联网了。

文件创建在 /etc 目录下,内容如下:

nameserver 114.114.114.114
nameserver 192.168.1.1

ping成功则如下图所示:

这样根文件系统也就配置好了。

IMX6ULL驱动开发前奏三:根文件系统构建步骤明细相关推荐

  1. 全志V3S嵌入式驱动开发(制作根文件系统)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 根文件系统是嵌入式开发很重要的一环.目前对于大多数soc来说,制作嵌入式系统就是配置buildr ...

  2. 【正点原子Linux连载】第三十八章 根文件系统构建 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. 【正点原子MP157连载】第十九章 Buildroot根文件系统构建-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  4. linux开发 | 根文件系统构建实验及过程详解

    <2.uboot和系统移植-第19部分-2.19.根文件系统构建实验及过程详解> 第一部分.章节目录 2.19.1.根文件系统的构建路线 2.19.2.busybox的移植实战 2.19. ...

  5. 二十.Linux开发之根文件系统构建及过程详解

    老规矩 有道云笔记地址: 详情看这里链接,记录太多,就不一一排版了. http://note.youdao.com/noteshare?id=15b6e982c2e66d0f47b1c787a49f4 ...

  6. 根文件系统构建(Buildroot 方式)

    目录 何为buildroot? buildroot 简介 buildroot 下载 buildroot 构建根文件系统 配置buildroot 编译buildroot buildroot 根文件系统测 ...

  7. 根文件系统构建(BusyBox方式)

    目录 根文件系统简介 BusyBox构建根文件系统 BusyBox简介 编译BusyBox构建根文件系统(生成bin.sbin.usr.linuxrc) 向根文件系统添加lib库 创建其他文件夹 根文 ...

  8. Linux之系统移植与根文件系统构建

    Linux之系统移植与根文件系统构建 1.Uboot 1. 什么是Uboot: 一个裸机程序 就是一个bootloader用于启动Linux或其他系统 最主要的工作就是初始化DDR.因为Linux是运 ...

  9. linux 开机 找不到 文件系统 下载文件系统就好了,根文件系统构建和实验过程

    1.1.根文件系统构建路线 1.先逐步构建文件夹形式的根文件系统然后在制作烧录镜像 2.1.busybox移植实战 1.busybox中是一些shell命令集 2.busybox××× (1)busy ...

最新文章

  1. 【Vegas原创】“無法解析 equal to 動作的定序衝突”错误的处理
  2. 【js】indexOf()
  3. python3模块socket怎么安装_Python中socket模块的使用方法(一)
  4. qwt自定义时间标尺TimeScale
  5. activiti页面展示流程图乱码_activiti 5.17 流程图中文乱码问题
  6. python 八数码_python 处理八数码 双向BFS 拼图游戏 | 学步园
  7. 详解JS中的事件机制(带实例)
  8. hive explain 源码分析
  9. java课程设计仓库管理系统_Java课程设计-仓库管理系统
  10. java web 04 jQuery jQuery api与jquery-1.7.2.js资料分享
  11. php 连接 mysql 8.0
  12. 手机号注册获取随机验证码
  13. 感冒喝抹茶牛奶的效果
  14. 人民币与美元汇率兑换程序
  15. SAP BDC的应用
  16. 疫情过后第一次线下考试感想
  17. android 仿微博评论编辑框_android 仿新浪微博开写篇
  18. wsl2下安装lammps
  19. 快速排序的优化1: 选取中间值或随机值作为基准,C语言实现
  20. 我的世界四大微软签约服务器,一年吸纳1.5亿用户,《我的世界》宣布开启“阴阳师”等四大IP联动 - 全文...

热门文章

  1. js 常用的开发技巧
  2. vue 自动生成二维码,并点击按钮下载二维码
  3. linux文件夹设置密码,使用 Vim 给文件设置密码保护
  4. 正当防卫4无法启动程序因为计算机中丢失,正当防卫4缺少dll文件解决方法介绍-正当防卫4epic版缺少dll文件怎么解决_牛游戏网...
  5. 联邦身份认证——SAML
  6. JavaScript:向上取整和向下取整
  7. 网络安全笔记——第三天:认识Linux操作系统
  8. 五一假期怒肝一天大厂Redis面试高频问点,这解析不全你找我!
  9. 网易严选,使用uni-app实现,包含后台数据文件
  10. 【算法】梯度下降算法及python实现