根文件系统rootfs的移植及制作镜像ramdisk.img

2023-11-06 23:10

本文主要是介绍根文件系统rootfs的移植及制作镜像ramdisk.img,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

根文件系统的移植

介绍

【1】移植根文件系统的工具 —> busybox
1. 短小精悍 2. 版本更新较快,版本之间差异不大
【2】 如何获取busybox
1)https://busybox.net/downloads/
选择busybox-1.32.0.tar.bz2版本
2)前往我的博客里下载

使用busybox工具制作根文件系统

1. 拷贝busybox-1.32.0.tar.bz2到ubuntu中
2. 解压缩 tar -vxf busybox-1.32.0.tar.bz2
3. 进入到busybox-1.32.0目录 cd busybox-1.32.0
4. 切换交叉编译器为gcc-4.9.4版本(高点的版本)
5. 配置编译busybox

1> 修改Makefile配置交叉编译器
164 CROSS_COMPILE ?=
190 ARCH ?= $(SUBARCH)
修改为 :
164 CROSS_COMPILE ?= arm-none-linux-gnueabi-
190 ARCH ?= arm
2> 清除中间文件
make distclean
3> 执行make menuconfig进行图形化界面配置
make menuconfig
a) 采用静态编译,不使用动态库
Settings —> [星号]Build static binary (no shared libs) 星号:*
b) 采用vi风格的命令行编辑
Settings —> [星号]vi-style line editing commands 星号:*
c) 修改根文件系统的安装路径 Settings —> (./rootfs) Destination path for ‘make install’
d) 支持完整的模块化命令 Linux Module Utilities —> [ ] Simplified modutils 去掉*
4> 编译busybox make all
5> 安装根文件系统 make insta
6> 测试新生成的根文件系统
将新生成的根文件系统拷贝到nfs目录下下 cp rootfs ~/nfs -rf
6,启动开发板
启动成功,但是有错误信息如下:
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

解决无法进入根文件系统的步骤

1)文件不存在就创建文件
在根文件系统中创建etc/init.d目录,并创建rcS文件 并修改rcS文件的权限为777,
$ cd ~/nfs/rootfs
$ mkdir -p etc/init.d
$ cd etc/init
$ touch rcS
$ chmod 777 rcS
打开rcS文件,并添加一下内容:
#!/bin/sh
/bin/mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
创建dev目录: $ cd ~/nfs/rootfs $ mkdir dev
2)再次启动开发板出现下图样式
在这里插入图片描述
解决: 在etc目录下创建fatab文件
$ cd ~/nfs/rootfs
$ cd etc $ touch fstab
打开fstab,并添加一下内容:
#device mount-point type options dump fsck orde
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
在这里插入图片描述
/etc/init.d/rcS: line 3: can’t create /proc/sys/kernel/hotplug: nonexistent directory 解决办法:
$ cd ~/nfs/rootfs
$ mkdir proc

mdev: /sys/dev: No such file or directory 解决办法:
$ cd ~/nfs/rootfs $ mkdir sys
3)再次启动开发板观察现象
在这里插入图片描述
解决办法: $ cd ~/nfs/rootfs $ mkdir tmp
4)再次重启开发板,观察现象
在这里插入图片描述
解决办法: 在etc目录下创建inittab文件
$ cd ~/nfs/rootfs
$ cd etc $ touch inittab 打开inittab文件,并添加一下内容
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
5)再次重启开发板,观察现象。
根文件系统基本制作成功。
将其他的几个文件创建出来: mkdir lib home mnt root var
6)进入根文件系统成功
发现用户名没有 解决方案:
在这里插入图片描述
在etc目录下创建profile文件,并添加一下信息:
export HOSTNAME=… (…:改为自己设的名字)
export USER=root
export HOME=root
#export PS1=“[\u@\h \W\ ]$ "
#cd root
export PS1=”[ U S E R @ USER@ USER@HOSTNAME \W]# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
在这里插入图片描述
7)测试根文件系统
编译hello.c的应用程序,使用交叉编译器进行编译,
拷贝到开发板中去运行,查看运行结果。运行之后出现以下出错误:
在这里插入图片描述
使用以下命令查看hello依赖的动态库是: arm-none-linux-gnueabi-readelf -d hello
在这里插入图片描述
解决办法: 移植动态库到根文件系统中 从交叉编译器中找对应的动态库。
$ cd ~/toolchain/gcc-4.9.4 $ find . -name libc.so.6
在这里插入图片描述
将交叉编译器./arm-none-linux-gnueabi/sysroot/lib/ 目录中的所有的动态库,
全部拷贝到根文件系统的lib目录下
$ cp -rf ./arm-none-linux-gnueabi/sysroot/lib/* ~/nfs/rootfs/lib
在这里插入图片描述
在这里插入图片描述

将rootfs打包生成ramdisk.img的镜像文件

1,将根文件系统(rootfs)制作成根文件系统镜像(ramdisk.img)
进入到ubuntu的家目录 cd ~

执行如下命令制作一个大小为8M的镜像文件 dd if=/dev/zero of=ramdisk bs=1k count=8192

将该镜像格式化为ext2格式 mkfs.ext2 -F ramdisk

将该镜像文件挂载到ubuntu下的/mnt目录下 sudo mount -t ext2 ramdisk /mnt

删除库文件中的符号表减小库文件体积: su root$ arm-none-linux-gnueabi-strip lib/* (下图错误不用搭理)
在这里插入图片描述
效果如下图
在这里插入图片描述
将制作的根文件系统中所有的文件拷贝到该镜像中 :sudo cp -a /home/linux/nfs/rootfs/* /mnt/

解除挂载 sudo umount /mnt

压缩镜像 gzip --best -c ramdisk > ramdisk.gz

使用mkimage为镜像文件添加校验头然后生成可用的镜像ramdisk.img
mkimage -n “ramdisk” -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
在这里插入图片描述
将制作生成的根文件系统镜像拷贝到tftp的下载目录下并修改其权限
cp ramdisk.img /home/linux/tftpboot/$ chmod 777 /home/linux/tftpboot/ramdisk.img

重新配置linux内核使其支持ramdisk文件系统进入到的linux源码的顶层目录下
cd kernel-3.4.39/

执行以下命令进入内核配置界面
make menuconfig (如果ubuntu没安装,就先安装一个 )
在图形化界面中进入到“Device Drivers —>”菜单,
再进入“[*] Block devices —>”菜单,将 “RAM block device support” 选为“Y”,
将“Default RAM disk size (kbytes)”修改为“8192”,如图所示:
在这里插入图片描述

配置完成后保存退出。
回到内核源码的顶层目录下重新编译内核源码(将交叉编译器切换到4.5.1版本*****低版本,可以在我的博客下载)
make uImage
将生成的uImage文件拷贝到tftp服务器的下载目录中:
cp arch/arm/boot/uImage /home/linux/tftpboot/
chmod 777 /home/linux/tftpboot/uImage
3,将新生成的内核镜像uImage和根文件系统镜像ramdisk.img烧写到EMMC中并从EMMC中启动测试
【产品阶段系统部署方式(项目完成)】
uboot —>EMMC/SD卡
uImage —>EMMC/SD卡
ramdisk.img —>EMMC/SD卡
1> 将内核镜像uImage烧写到EMMC中
tftp 0x41000000 uImage mmc write 0x41000000 0x800 0x4000
在这里插入图片描述
2>. 将根文件系统镜像ramdisk.img烧写到EMMC中
tftp 0x41000000 ramdisk.img mmc write 0x41000000 0x20800 0x20800
在这里插入图片描述
3>. 设置uboot的启动参数

setenv bootcmd mmc read 0x48000000 0x800 0x4000; mmc read 0x49000000 0x20800 0x20800; bootm 0x48000000 0x49000000
saveenv

setenv bootargs root=/dev/ram rw initrd=0x49000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200
saveenv

到此如果串口工具软件可以通过U-boot自启动并且进入根文件系统,则表示完成

这篇关于根文件系统rootfs的移植及制作镜像ramdisk.img的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/359623

相关文章

docker 重命名镜像的实现方法

《docker重命名镜像的实现方法》在Docker中无法直接重命名镜像,但可通过添加新标签、删除旧镜像后重新拉取/构建,或在DockerCompose中修改配置文件实现名称变更,感兴趣的可以了解一下... 目录使用标签(Tagging)删除旧的php镜像并重新拉取或构建使用docker Compose在Do

linux配置podman阿里云容器镜像加速器详解

《linux配置podman阿里云容器镜像加速器详解》本文指导如何配置Podman使用阿里云容器镜像加速器:登录阿里云获取专属加速地址,修改Podman配置文件并移除https://前缀,最后拉取镜像... 目录1.下载podman2.获取阿里云个人容器镜像加速器地址3.更改podman配置文件4.使用po

使用python制作一款文件粉碎工具

《使用python制作一款文件粉碎工具》这篇文章主要为大家详细介绍了如何使用python制作一款文件粉碎工具,能够有效粉碎密码文件和机密Excel表格等,感兴趣的小伙伴可以了解一下... 文件粉碎工具:适用于粉碎密码文件和机密的escel表格等等,主要作用就是防止 别人用数据恢复大师把你刚删除的机密的文件恢

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Conda国内镜像源及配置过程

《Conda国内镜像源及配置过程》文章介绍Conda镜像源使用方法,涵盖临时指定单个/多个源、永久配置及恢复默认设置,同时说明main(官方稳定)、free(逐渐弃用)、conda-forge(社区更... 目录一、Conda国内镜像源二、Conda临时使用镜像源指定单个源临时指定多个源创建环境时临时指定源

Python自动化批量重命名与整理文件系统

《Python自动化批量重命名与整理文件系统》这篇文章主要为大家详细介绍了如何使用Python实现一个强大的文件批量重命名与整理工具,帮助开发者自动化这一繁琐过程,有需要的小伙伴可以了解下... 目录简介环境准备项目功能概述代码详细解析1. 导入必要的库2. 配置参数设置3. 创建日志系统4. 安全文件名处

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h