根文件系统制作-移植

news2025/2/8 12:08:20

【1】概念

根文件系统:系统运行所必须依赖的一些文件

(比如脚本、库、配置文件...),本质就是目录和文件。根文件系统镜像:将根文件系统按照某种格式进行打包压缩后生成的单个文件 rootfs-----> ramdisk.img

文件系统:一种管理和访问磁盘的软件机制,

不同文件系统管理和访问磁盘的机制不同

【2】 移植根文件系统的工具  busybox

1. 短小精悍

2. 版本更新较快,版本之间差异不大

【3】 如何获取busybox

https://busybox.net/downloads/

【4】根文件系统中目录的介绍

注释:个文件功能解析

bin:    命令文件(通过busybox工具制作)

dev:    设备文件(被操作系统识别的设备才有对应的文件,即设备运行时)

etc:    配置文件(配置内核相关的一些信息)

lib:    库文件、比如C的标准库(从交叉编译工具链中复制的)

linuxrc:根文件系统被挂载后运行的第一个程序(通过busybox工具制作)

mnt:    共享目录(非必要)比如挂载SD卡等时将SD卡挂载在该目录

proc:   与进程相关的文件(当有进程运行时才会有文件)

root:   用户权限(板子本身就是以root用户运行)

sbin:   超级用户命令、一般用户不可用(板子本身是超级用户  通过busybox工具制作)

sys:    系统文件(系统运行时,系统加载后才会有文件)

tmp:    临时文件(比如插入新的设备时会产生临时文件)

usr:    用户文件(通过busybox工具制作)

var:    存放下载的文件和软件 (可有可无)

mkdir lib mnt proc root sys tmp var 

【5】使用busyBox工具制作根文件系统需要使用gcc-4.9.4版本的交叉编译工具链,需要重新配置交叉编译工具链

步骤:

1. 在ubuntu的家目录(~)下,创建toolchain 

mkdir toolchain 

2. 拷贝gcc-4.9.4.tar.xz到toolchain目录下

cp 共享目录/gcc-4.9.4.tar.xz ~/toolchain

3. 解压缩交叉编译工具链

tar -vxf gcc-4.9.4.tar.xz

4. 配置环境变量

打开 sudo vi /etc/bash.bashrc 

在最后一行添加以下内容:

export PATH=$PATH:/home/hqyj/toolchain/gcc-4.9.4/bin/

修改为自己的路径

注意:需要将gcc-4.9.1的注释掉

5. 使环境变量立即生效

source /etc/bash.bashrc

6. 测试交叉编译工具链是否安装成功

切换完交叉编译工具链,ubuntu的终端需要重新开

arm-none-linux-gnueabi-gcc -v

打印以下内容,表示成功

gcc version 4.9.4 (Sourcery G++ Lite 2010.09-50) 

【6】使用busybox工具制作rootfs根文件系统

1. 拷贝busybox-1.31.1.tar.bz2到ubuntu的家目录下

cp /mnt/hgfs/share/busybox-1.31.1.tar.bz2 ~/

2. 对根文件系统进行解压缩,并切换到busybox-1.31.1目录下

tar -vxf busybox-1.31.1.tar.bz2

cd busybox-1.31.1

3. 分析README 

没有获取太多重要的信息

4. 通过make help 获取编译的帮助信息

清除中间文件

make clean - delete temporary files created by build

make distclean - delete all non-source files (including .config)

编译 

make all - Executable and documentation

通过图形化界面的配置

make menuconfig - interactive curses-based configurator

安装和卸载

make install - install busybox into CONFIG_PREFIX

make uninstall

5. 修改Makefile,配置为交叉编译工具链

打开Makefile 

将一下内容:

164 CROSS_COMPILE ?=  

190 ARCH ?= $(SUBARCH)  

修改为

164 CROSS_COMPILE ?=  arm-none-linux-gnueabi-

190 ARCH ?= arm 

6. 执行make menuconfig 命令,对busybox进行配置

1》 使用静态库,不使用共享库,共享库的话当移植到板子上面的时候,就不能使用了

Settings  --->

[*] Build static binary (no shared libs) (NEW) 

2》 配置为vi风格的行编辑命令

Settings  --->

[*]   vi-style line editing commands (NEW)

3》 配置根文件系统的安装路径

Settings  --->

(./_install) Destination path for 'make install'

修改./_install 为 /home/hq/rootfs

进来以后先按一下tab键,然后再去修改就可以

4》配置支持驱动模块化的命令

Linux Module Utilities  ---> 

此前前边默认是*,将*修改为空

 [ ] Simplified modutils  

 [*] depmod (27 kb) (NEW)          

 [*] insmod (22 kb) (NEW)          

 [*] lsmod (1.9 kb) (NEW)          

 [*] Pretty output (NEW)         

 [*] modinfo (24 kb) (NEW)         

 [*] modprobe (28 kb) (NEW)        

 [*] Blacklist support (NEW)     

[*] rmmod (3.3 kb) (NEW)  

7. 对源码进行编译 

make  /  make all 

8. 安装根文件系统到/home/hqyj/rootfs 

make install

9. 测试根文件系统,对根文件系统进行部署 

1》首先将nfs目录的的rootfs跟换一个其他的名字

cd ~/nfs 

mv rootfs rootfs-ok 

2》将自己制作的rootfs文件拷贝到~/nfs 

cp ~/rootfs  ~/nfs -raf

10. 重启开发板,测试rootfs是否可以正常使用

前提,使用tftp下载uImage

使用nfs挂载根文件系统

1》挂载成功,但是打印一下错误信息:

can't run '/etc/init.d/rcS': No such file or directory

can't open /dev/tty2: No such file or directory

can't open /dev/tty3: No such file or directory

can't open /dev/tty4: No such file or directory

解决办法: 

Cd  ~/nfs/rootfs 

创建dev文件夹,创建etc/init.d文件夹,

在etc/init.d目录下创建rcS文件

mkdir -p  etc/init.d 

mkdir dev 

cd etc/init.d 

touch rcS

2》继续重启开发板,进行测试

出现以下问题:

can't run '/etc/init.d/rcS': Permission denied

此问题解决办法:修改rcS的权限最大

chmod 777 rcS

在rcS文件中必须添加以下内容:

#!/bin/sh 

/bin/mount -a

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

/sbin/mdev -s 

解释:

mount -a:系统会自动解析fstab配置文件,系统根据

   此配置文件进行一系列的挂接动作      

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

 向文件/proc/sys/kernel/hotplug写入字符串"/sbin/mdev"  其实就是告诉内核驱动将来创建设备文件的程序是/sbin/mdev

  mdev -s:系统启动,将内核驱动对应的设备文件进行自动创建

can't open /dev/tty2: No such file or directory

can't open /dev/tty3: No such file or directory

can't open /dev/tty4: No such file or directory

此问题,后边会解决

再次重启开发板:

3》在根文件系统的etc目录下创建文件fstab inittab 

cd etc 

touch fstab 

touch inittab 

打开inittab文件添加以下内容:

::sysinit:/etc/init.d/rcS 

::askfirst:-/bin/sh

::restart:/sbin/init 

::ctrlaltdel:/sbin/reboot 

解释:系统启动的流程

打开fstab文件添加以下内容

#device mount-point type options dump fsck orde

proc   /proc  proc  defaults  0  0

tpfs  /tmp   tmpfs defaults  0  0

sysfs  /sys   sysfs defaults  0  0

tmpfs  /dev   tmpfs defaults  0  0 

解析:

第一列:设备类型

第二列:挂载点

第三列:类型

第4,5,6列:访问权限

再次重启开发板,基本上成功,

4》创建其他文件:

mkdir lib mnt proc root sys tmp var 

再次重启开发板,根文件系统制作成功。

5》添加用户名 

在根文件系统的etc目录下创建profile文件,

打开profile文件,添加以下内容:

export HOSTNAME=hq

export USER=root

export HOME=ot

#export PS1="\[\u@\h \W\]\$ "

#cd root

export PS1="[$USER@$HOSTNAME \W\]\# "

PATH=/bin:/sbin:/usr/bin:/usr/sbin

LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH LD_LIBRARY_PATH

重启开发板

6》移植共享库到根文件系统中,

在ubuntu中创建test.c 编写以下代码 

#include <stdio.h>

int main(int argc, char *argv[])

{

printf("hello world!\n");

return 0;

}

使用交叉编译工具链编译test.c生成test可执行程序

arm-none-linux-gnueabi-gcc test.c -o test 拷贝test可执行程序到新制作的文件系统中

cp test ~/nfs/rootfs 

重启开发板,在超级终端终端上,运行应用程序test

./test

出现以下错误提示:

-/bin/sh: ./test: not found

问题原因:缺少应用程序运行必要的动态库。

解决办法:将交叉编译工具链中的库,拷贝到根文件系统的lib目录

cp /home/hq/toolchain/gcc-4.9.4/arm-none-linux-gnueabi/sysroot/lib/*  ~/nfs/rootfs/lib

cp /home/hq/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot/lib/*  ~/nfs/rootfs/lib 

到此课程结束:

具体的ramdisk.img根文件系统的制作,可以根据实验手册按照步骤要求去做即可

交叉编译工具链,132M,太大,不往板子里面装交叉编译工具链

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1336109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多行文本(多行字符串)中,如果每行文本前都有空格,各行文本前空格数最小为n,则删除每行文本前的n个空格。textwrap.dedent(多行字符串)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 多行文本(多行字符串)中&#xff0c; 如果每行文本前都有空格&#xff0c; 各行文本前空格数最小为n&#xff0c; 则删除每行文本前的n个空格。 textwrap.dedent(多行字符串) 请问以下代…

汽车项目管理

项目节点&#xff1a; MR (Management Review)——管理层评审 KO (Kick Off)——项目正式启动 SI (Strategy Intent)——战略意图 SC (Strategy Confirmation)——战略确认 PA (Program Approval)——项目批准 PR (Product Readiness)——产品就绪 VP (Verification Prototype)…

在Vue3中使用vue-qrcode库实现二维码生成

本文主要介绍在Vue3中使用qrcode库实现二维码生成的方法。 目录 一、基础用法实现vue-qrcode库的参数介绍 在Vue3中实现二维码生成需要使用第三方库来处理生成二维码的逻辑。常用的库有 qrcode和 vue-qrcode。 一、基础用法实现 在Vue3中使用vue-qrcode库实现二维码生成的方…

人大金仓助力某市公积金核心业务系统国产化升级

近日&#xff0c;在金仓数据库的支撑下&#xff0c;某市住房公积金管理中心多个核心业务系统顺利上线&#xff0c;服务该市330余万常住人口&#xff0c;进一步“让信息多跑路&#xff0c;群众少跑路”&#xff0c;提升公积金服务效率。 “ 适应信息技术应用创新趋势的重点示范项…

Docker部署Nexus Maven私服并实现远程访问Nexus界面

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定N…

arduino声波测距

先安装&#xff1a;Ultrasonic库&#xff1b; #include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> #include <Ultrasonic.h>U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,A5,A4, U8X8_PIN_NONE); // SDA:21 scl:22 Ultrasonic ul…

MyBatis——MyBatis的缓存

MyBatis的缓存 创建工程&#xff1a; 1缓存介绍 为什么使用缓存&#xff1f; 首次访问时&#xff0c;查询数据库&#xff0c;并将数据存储到内存中&#xff1b;再次访问时直接访问缓存&#xff0c;减少IO、硬盘读写次数、提高效率 Mybatis中的一级缓存和二级缓存&#xff1f;…

计算机网络简述

前言 计算机网路是一个很庞大的话题。在此我仅对其基础概述以及简单应用进行陈述。后续或有补充以形成完善的计算机网络知识体系。 一.计算机网络的定义 根据百度词条的描述&#xff0c;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过…

简单实现一个自定义loader

webpack定义的loader需要遵循单一功能原则&#xff0c;也就是一个loader只实现一个功能。在实现开发中&#xff0c;我们会直接使用诸如蓝湖等生成的样式&#xff0c;比如 button{background: rgb(255, 85, 46); }但为了考虑主题换肤&#xff0c;我们实现的想要的可能是 butto…

c语言中数据结构

一、结构体的由来 1. 数据类型的不足 C语言中&#xff0c;基本数据类型只有整型、字符型、浮点型等少数几种&#xff0c;无法满足复杂数据类型的需要。 2. 数组的限制 虽然数组可以存储多个同类型的数据&#xff0c;但是数组中的元素个数是固定的&#xff0c;无法动态地改变…

如何恢复未保存/误删除的 Excel 文件

想象一下&#xff0c;在处理一个重要的Excel文件时&#xff0c;如果Excel突然崩溃&#xff0c;你被迫关闭它而不保存文件&#xff0c;那会是什么感觉&#xff1f;我知道这是一种可怕的感觉&#xff0c;避免这种情况的最佳方法是使用自动保存功能。但是这个功能也能帮助找回已删…

shell 编程中内置的变量(冷门又好用)

简介 分别盘点一下 shell 中的内置变量&#xff0c;真的巨好用&#xff01;&#xff01;&#xff01;包括&#xff1a;环境变量类、shell 变量类、终端设置类和其他一些变量。 常用的内置变量目录如下 1. 环境变量类 $MACHTYPE&#xff1a;机器类型 $OSTYPE&#xff1a;操作…

【Python高阶技巧】闭包、装饰器

一、闭包 1、闭包的用途和用法2、nonlocal关键字的作用闭包注意事项 优缺点 二、装饰器 装饰器的作用和用法 一、闭包 在编程中&#xff0c;闭包&#xff08;Closure&#xff09;是指一种函数对象&#xff0c;它可以访问其自身范围&#xff08;词法作用域&#xff09;之外…

详细讲解Java8中的forEach()用法

目录 前言1. forEach()函数2. demo 前言 在实战中学习新用法&#xff0c;特此记录下每个笔记&#xff0c;感兴趣也可收藏也可补充细节 代码例子&#xff1a; import java.util.Arrays; import java.util.List;public class ForEachExample {public static void main(String[…

shell 循环遍历的详细用法

简介 在 shell 脚本中&#xff0c;循环结构用于重复执行一组代码块&#xff0c;包括 for 循环、while 循环&#xff0c;可以用于遍历数字、字符串、数组、文件等。这篇文章会详细介绍这两种遍历方式&#xff0c;以及各种实例场景。 文章目录结构如下 1. 循环遍历的特点 2. 循…

VMware安装linux系统二

1、设置光驱 1.1、编辑虚拟机设置 1.2、设置虚拟机镜像 1.3、设置好后开机 2、安装Linux系统 2.1、等待安装 2.2、开始安装 2.3、选择语言&#xff0c;我选择中文 2.4、本地化不用改 2.5、软件选择一定要选&#xff0c;否则就会是默认最小安装 2.6、我这里选择的是带GUI的&am…

Java---IO流讲解(2)

文章目录 1. 字符流1.1 为什么出现字符流1.2 字符流写数据的5种方式1.3 字符流读数据的两种方式1.4 字符缓冲流1.5 字符缓冲流特有功能 2. IO流小结2.1 字节流2.2 字符流 1. 字符流 1.1 为什么出现字符流 由于字节流操作中文时不是特别方便&#xff0c;因此Java提供了字符流。…

分包zip压缩,解压报错:invalid zip file with overlapped components (possible zip bomb)

背景 在生产环境中&#xff0c;需要把安装包从本地传到服务器上&#xff0c;传输过程中网络抖动的原因造成大文传输失败。可以将文件分包压缩成200M或500M大小的文件&#xff0c;然后分批传输到服务器。最近生产环境传输了starrocks的安装包&#xff0c;分包压缩之后上传服务器…

uniapp中如何使用image图片

当在UniApp中使用图片时&#xff0c;可以通过<image>标签将图片显示在页面上。这个标签可以指定src属性来引用图片&#xff0c;并且可以通过mode属性来设置图片的显示模式。除此之外&#xff0c;还可以利用click事件来实现图片的点击事件。在编写代码时&#xff0c;要注意…

鸿蒙项目二—— 注册和登录

此部分和上篇文章是连续剧 &#xff0c;如果需要&#xff0c;请查看 一、注册 import http from ohos.net.http; Entry Component struct Reg {// 定义数据&#xff1a;State username: string "";State userpass: string "";State userpass2: string …