根文件系统制作-移植

2023-12-26 09:29:10

【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,太大,不往板子里面装交叉编译工具链

文章来源:https://blog.csdn.net/m0_74937538/article/details/135213060
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。