首页 > 系统相关 >day10(Linux底层)根文件系统基础知识及制作

day10(Linux底层)根文件系统基础知识及制作

时间:2024-12-05 12:29:56浏览次数:9  
标签:busybox 文件 make 文件系统 基础知识 etc day10 Linux rootfs

目录

根文件系统基础知识及制作

1、概念

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

3、如何获取busybox

4、根文件系统目录介绍

5、使用busybox制作根文件系统

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

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

5.3 通过make help 获取编译的帮助信息(不用一一执行)

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

5.5 执行sudo make menuconfig命令,对busybox进行配置

5.6 对源码进行编译

5.7 安装根文件系统

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

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

6、问题解决

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

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

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

4》创建其他文件

5》添加用户名

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


根文件系统基础知识及制作

1、概念

根文件系统:系统运行所必须依赖的一些文件(比如脚本、库、配置文件...),本质就是目录和文件。

根文件系统镜像:将根文件系统按照某种格式进行打包压缩后生成的单个文件

rootfs-----> ramdisk.img

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

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

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的shell。

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制作根文件系统

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

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

tar -vxf busybox-1.31.1.tar.bz2

cd busybox-1.31.1

5.3 通过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.4 修改Makefile,配置为交叉编译工具链

打开Makefile

将一下内容:

164 CROSS_COMPILE ?=

190 ARCH ?= $(SUBARCH)

修改为:

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

190 ARCH ?= arm

5.5 执行sudo make menuconfig命令,对busybox进行配置

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

1、Settings --->

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

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

1、Settings --->

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

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

Settings --->

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

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

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)

5.6 对源码进行编译

make / make all

5.7 安装根文件系统

执行:make install(回到顶层目录执行)

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

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

cd /opt/6818/rootfs/

mv rootfs rootfs-ok

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

cp ~/rootfs/ ./ -raf

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

前提,使用tftp下载uImage 使用nfs挂载根文件系统

6、问题解决

都是在根文件系统(/opt/6818/rootfs/rootfs下操作)

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

解决办法:

cd /opt/6818/rootfs/rootfs/

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

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

sudo mkdir dev 
sudo mkdir -p  etc/init.d 
cd etc/init.d 
sudo touch rcS

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

出现以下问题:

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

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

sudo 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

sudo touch fstab

sudo 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=HQYJ    #可修改主机名
export USER=root        #可修改用户名
export HOME=root    #建议加绝对路径
#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 编写以下代码 (也可直接在NFS中执行)

#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 /opt/6818/rootfs/rootfs

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

./test

出现以下错误提示:

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

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

sudo cp ~/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot/lib/* /opt/6818/rootfs/rootfs/lib/ -r

sudo cp ~/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot/lib/* /opt/6818/rootfs/rootfs/lib/ -r

标签:busybox,文件,make,文件系统,基础知识,etc,day10,Linux,rootfs
From: https://blog.csdn.net/QR70892/article/details/144168004

相关文章

  • linux进程调度器之核心函数__schedule()解析
    __schedule()是主调度器的核心函数,其作用是让调度器选择和切换到一个合适进程运行。调度的时机可分为如下3种:a、阻塞操作:互斥量(mutex)、信号量(semaphore)、等待队列(waitqueue)等b、在中断返回前和系统调用返回用户空间时,去检查TIF_NEED_RESCHED标志位以判断是否需要调度1)、内......
  • Qt编写嵌入式linux输入法/支持自定义词语和繁体/支持wayland和watson/纯QWidget/界面
    一、功能特点纯QWidget编写,原创输入法机制,没有任何第三方动态库的依赖。支持各种Qt版本,包括Qt4、Qt5、Qt6及后续版本。支持各种编译器,包括mingw、msvc、gcc、clang、wasm等。支持各种目标平台,包括windows、linux、macos、android、嵌入式linux等。支持任意控件输入,包括文本......
  • Bclinux离线安装PostgreSQL10.23+PostGIS2.5编译安装配置
    一、安装PostgreSQL1、安装PostgreSQL解压PostgreSQL软件包tar-zxvfpostgresql.tar.gz配置并安装PostgreSQL[postgres@localhostsetup]$tar-zxvfpostgresql-10.23.tar.gz进入解压后的目录,按照PostgreSQL的官方文档进行配置和安装。这通常涉及到创建数据目录、配置postgresq......
  • 线程条件变量 生产者消费者模型 Linux环境 C语言实现
    只能用来解决同步问题,且不能独立使用,必须配合互斥锁一起用头文件:#include<pthread.h>类型:pthread_cond_tPTHREAD_COND_INITIALIZER初始化初始化:intpthread_cond_init(pthread_cond_t*cond,NULL);清理:intpthread_cond_destroy(pthread_cond_t*cond);P操作:......
  • 线程信号量 Linux环境 C语言实现
    既可以解决多个同类共享资源的互斥问题,也可以解决简易的同步问题头文件:#include<semaphore.h>类型:sem_t初始化:intsem_init(sem_t*sem,intpshared,unsignedintvalue);//程序中第一次对指定信号量调用p、v操作前必须做初始化清理:intsem_destroy(sem_t*sem);//程序......
  • 嵌入式基础:Linux C语言:Day7
    重点函数:strlen()函数\strcpy()函数\strcat实现\strcmp()实现一、字符数组<1>概念字符数组本质上就是一个数组,保存一个个字符,也一般用来保存字符串字符串由多个字符组成的一个字符组,一般用“”括起来<2>定义:char数组名[数组长度];<3>初始化:单字符全部初始化单字......
  • Win10下安装WSL(Windows Subsystem for Linux)
    启用WSL(WindowsSubsystemforLinux)管理员权限运行powershell并运行下面的命令C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeEnable-WindowsOptionalFeature-Online-FeatureNameMicrosoft-Windows-Subsystem-Linux  或者:控制面板->程序和功能->启......
  • Linux Git新手入门 git常用命令 Git全面指南:基础概念、操作与远程仓库、标签、分支全
    一、GIT基础概念介绍        请记住下面这些关于Git的概念。Git有三种状态,你的文件可能处于其中之一: 已提交(committed)、已修改(modified) 和 已暂存(staged)。已修改表示修改了文件,但还没保存到数据库中。已暂存表示对一个已修改文件的当前版本做了标记,使之包......
  • Linux挂载U盘,SD卡
    Linux挂载U盘,SD(TF)卡1.插入U盘,执行如下指令后能看到设备则说明连接成功sudofdisk-l#查看外接设备名称,一般为/dev/sd...,这里假设为/dev/sdc12.在/mnt下创建挂载点,进行挂载sudomkdir/mnt/mydev#创建挂载点sudomount/dev/sda1/mnt/mydev#将/dev/sdc1挂载到mnt中的挂......
  • Linux网络编程——进程、线程同步方式
    线程同步与进程同步方式要注意这里的同步并不是指同时进行的意思,而是按照先后顺序依次进行。首先了解一下同步与互斥的概念:同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系;互斥:多个进程在同一时刻只有一个进程能进入临界区。一、进程同步方式进程同......