浅谈ARM嵌入式中的根文件系统rootfs

uboot的环境变量——bootargs简介 以下内容源于网络资源的学习与整理,如有侵权请告知删除。 阅读详情

根文件系统和 Linux 内核是分开的,单独的 Linux 内核是没法正常工作的,必须要搭配根文件系统。根文件系统的这个“根”字就说明了这个文件系统的重要性,它是其他文件系统的根,没有这个“根”,其他的文件系统或者软件就别想工作。嵌入式会把rootfs保存在NAND flash或EMMC中。内核可以直接挂载Emmc中的rootfs;也可以使用uboot把rootfs加载到ramdisk中,挂载内存中的rootfs。

1.根文件系统和 Linux 内核是分开的,单独的 Linux 内核是没法正常工作的

根文件系统是 Linux 内核启动以后挂载(mount)的第一个文件系统,然后从根文件系统中读取初始化脚本,比如 rcS,inittab 等。根文件系统和 Linux 内核是分开的,单独的 Linux 内核是没法正常工作的,必须要搭配根文件系统。如果不提供根文件系统,Linux 内核在启动的时候就会提示内核崩溃(Kernel panic)的提示。
在这里插入图片描述
图1: 根文件系统缺失错误
最后一行:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) 

也就是提示内核崩溃,因为 VFS(虚拟文件系统)不能挂载根文件系统,因为根文件系统目录不存在,所以内核会提示在UBOOT中设置一个正确的环境变量“root=” ( Please append a correct “root=” boot option)。即使根文件系统目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。
这个就是根文件系统缺失导致的内核崩溃,但是内核是启动了的,只是根文件系统不存在而已。

2.如何构建根文件系统rootfs

根文件系统的这个“根”字就说明了这个文件系统的重要性,它是其他文件系统的根,没有这个“根”,其他的文件系统或者软件就别想工作。比如我们常用的 ls、mv、ifconfig 等命令其实就是一个个小软件,只是这些软件没有图形界面,而且需要输入命令来运行。这些小软件就保存在根文件系统中。

可以使用BusyBox,Buildroot ,Yocto,构建根文件系统rootfs
在这里插入图片描述
图2:创建好的 rootfs

Linux 内核 init 进程最后会查找用户空间的 init 程序,找到以后就会运行这个用户空间的 init 程序,从而切换到用户态。如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。

在ARM嵌入式中,UBOOT会把上面创建好的rootfs会被保存到nand flash中。

在UBOOT代码中默认的 NAND 分区为:

 #define CONFIG_MFG_NAND_PARTITION "mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs) "

分区结果如表
在这里插入图片描述
表1:NAND 分区设置
从表中可以看到,rootfs被放到了96M的位置。当然NAND 的分区是可以调整的,比如 boot 分区我们用不了 64M 这么大,因此可以将其改小,其他的分区一样的。

3.内核启动时是如何知道rootfs在哪里呢?

当然是通过Uboot传递来的环境变量 bootargs 。如下:

mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw 

可以看出环境变量 mmcargs 就是设置 bootargs 的值为“console= ttymxc0, 115200 root=/dev/mmcblk1p2 rootwait rw”,bootargs 就是设置了很多的参数的值,这些参数 Linux 内核会使用到,常用的参数有:
1、console
console 用来设置 linux 终端(或者叫控制台),也就是通过什么设备来和 Linux 进行交互,是
串口还是 LCD 屏幕?如果是串口的话应该是串口几等等。一般设置串口作为 Linux 终端,这样我们就可以在电脑上通过 SecureCRT 来和 linux 交互了。这里设置 console 为 ttymxc0,因为 linux启动以后 I.MX6ULL 的串口 1 在 linux 下的设备文件就是/dev/ttymxc0,在 Linux 下,一切皆文件。
ttymxc0 后面有个“,115200”,这是设置串口的波特率,console=ttymxc0,115200 综合起来就是设
2、root
root 用来设置根文件系统的位置,root=/dev/mmcblk1p2 用于指明根文件系统存放在
mmcblk1 设备的分区 2 中。EMMC 版本的核心板启动 linux 以后会存在/dev/mmcblk0、
/dev/mmcblk1、/dev/mmcblk0p1、/dev/mmcblk0p2、/dev/mmcblk1p1 和/dev/mmcblk1p2 这样的文件,其中/dev/mmcblkx(x=0~n)表示 mmc 设备,而/dev/mmcblkxpy(x=0n,y=1n)表示 mmc 设备x 的分区 y。在 I.MX6U-ALPHA 开发板中/dev/mmcblk1 表示 EMMC,而/dev/mmcblk1p2 表示EMMC 的分区 2。
root 后面有“rootwait rw”,rootwait 表示等待 mmc 设备初始化完成以后再挂载,否则的话
mmc 设备还没初始化完成就挂载根文件系统会出错的。rw 表示根文件系统是可以读写的,不加rw 的话可能无法在根文件系统中进行写操作,只能进行读操作。
3、rootfstype
此选项一般配置 root 一起使用,rootfstype 用于指定根文件系统类型,如果根文件系统为ext 格式的话此选项无所谓。如果根文件系统是 yaffs、jffs 或 ubifs 的话就需要设置此选项,指定根文件系统的类型。
bootargs 常设置的选项就这三个,后面遇到其他选项的话再讲解。


上面的例子中我们把根文件系统放在了EMMC中,加载rootfs时直接从EMMC中加载rootfs,并没有使用ramdisk。想使用ramdisk可以参考下面的文章:https://blog.csdn.net/weixin_30608131/article/details/98945515

NAND FLASH加载ramdisk文件系统

虚拟机下制作ramdisk的命令

dd if=/dev/zero of=ramdisk bs=2M count=14

/sbin/losetup /dev/loop2 ramdisk

mkfs.ext2 /dev/loop2

mount -t ext2 /dev/loop2 /mnt

cp -r /tmp/myroot/* /mnt/

umount /dev/loop2

/sbin/losetup -d /dev/loop2

cp /tmp/ramdisk /tftpboot

其中bs,和count的大小可以改变。据观察,发现生成的ramdisk大小,大约为bs*count用命令查看ramdisk的大小

du -h ramdisk

在超级终端uboot下做相应配制

tftp 0x80700000 uImage-ti-davinci_evm-2.6.10_mvl401-1.1.1.0600990
nand erase 0x2250000 0x200000
nand write 0x80700000 0x2250000 0x200000

tftp 0x82000000 ramdisk
nand erase 0x60000 0x2000000
nand write 0x82000000 0x60000 0x2000000

setenv bootcmd 'nand read 0x82000000 0x60000 0x2000000; nboot 0x80700000 0 0x2250000; bootm'
setenv bootargs mem=120M console=ttyS0,115200n8 root=/dev/ram0 rw initrd=0x82000000,29M ip=192.168.1.14:192.168.1.13:192.168.1.1:255.255.255.0

其中,内核uImage-ti-davinci_evm-2.6.10_mvl401-1.1.1.0600990通过tftp传到ddr中(0x80700000),然后烧写进nand flash(相对于0x02000000的偏移地址0x2250000,大小0x200000)。制作好的ramdisk文件系统ramdisk,通过tftp下载到ddr中(0x82000000),然后烧写进nand flash(相对于0x02000000的偏移地址0x60000,大小0x2000000)。
注意(0x82000000+0x2000000)不要和(0x80700000+0x2250000)重叠了。

bootcmd参数,‘nand read 0x82000000 0x60000 0x2000000’ ,是把0x60000处的文件系统数据拷贝到0x82000000处,共32M字节(要比文件系统大)。nboot 0x80700000 0 0x2250000,是打开device 0,把0x2000000字节搬移到0x80700000中。

root=/dev/ram0指明根文件系统存放在内存ram0中。

bootargs参数 initrd=0x82000000是文件系统的位置,29M是文件系统的大小。

NOTE:当NAND FLASH报错Skipping bad block ……时,不会有影响的。

后记,我对根文件系统的一些体会:

我们提到的根文件系统根据使用的时机,其实分为三种:第一种是在内核启动时由内核在内存中创造出来的一个虚拟的rootfs,这个rootfs只有超级块和根目录。第二种是用户生成的内存根文件系统,早期是initrd,后来是initramfs和tmpfs,这三种根文件系统相对来说会完整一些包含了各种库函数和命令,供内核启动时调用。第三种是保存在磁盘或者是flash中的能够提供完整功能的根文件系统,可以供内核和用户调用。

下面简单讲下三种根文件系统是在何时被使用到的:
**1.**bootloader在加载内核时会把initramfs(或者是initrd,tmpfs)和kernel一起加载到内存中。对于嵌入式这个initramfs就是最终的根文件系统(这是一个完整的,包含各种lib,各种命令和文件)。(这个initramfs里面的目录和文件,会被kernel copy到内核创造出的内存rootfs空间中)。

**2.**由于我们不想把kernel变得很大,并没有把保存根文件系统的硬件驱动包含在kernel中,这时内核是没有办法挂载在外部设备中的根文件系统。为了解决这个问题,内核最开始会生成一个内存rootfs。这个rootfs只有根目录,里面没有任何文件。然后内核会把这个内存rootfs挂载到vfs系统中。然后这个内存rootfs会把initramfs中的内容copy到他自己的空间中,形成了一个比较完整根文件系统。

**3.**对于有些嵌入式来说,完成上面两个步骤根文件系统就已经构建完成了。也有些嵌入式系统的内核可以直接挂载Emmc中的rootfs(可以参考《浅谈ARM嵌入式中的根文件系统rootfs 》这篇博文:https://blog.csdn.net/katerdaisy/article/details/135747568)。但是对于大部分设备来说,内核还会把内存rootfs替换成磁盘中的根文件系统。

内核可以直接挂载Emmc中的rootfs,uboot传递参数如下:
mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw
其中root=/dev/mmcblk1p2 用于指明根文件系统存放在

内核要使用内存rootfs和initrd时,uboot传递参数如下:
setenv bootargs mem=120M console=ttyS0,115200n8 root=/dev/ram0 rw initrd=0x82000000,29M ip=192.168.1.14:192.168.1.13:192.168.1.1:255.255.255.0
其中root=/dev/ram0指明根文件系统存放在内存ram0中,initrd=0x82000000指明initrd在内存中的位置。

总的来说,我们需要linux需要一个根文件系统提供的库和命令集,但是在linux内核还没有完全初始化之前还没有办法访问外部存储设备上的根文件系统时,就需要一个折中的方法。如上面所讲的会在内存中先构建一个够linux初始化的根文件系统,于是就有了内存rootfs和initramfs。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/katerdaisy/article/details/135767990

Uboot启动内核和根文件系统命令分析 uboot有两种启动 Linux 内核和rootfs的方法,一种是直接从flash(nand或emmc)启动,一种是从网络启动。这里面用到了两个非常重要的环境变量bootcmd 和 bootargs。 一、bootcmd 和 bootargs 环境变量 bootcmd 保存着 uboot 默认命令, uboot 倒计时结束以后就会执行 bootcmd 中的命令。这些命令一般都是用来启动 Linux 内核的,比如读取 EMMC 或者 NAND Flash 中的 Linux 内核镜像文件和设备树文件到 DRAM 阅读详情

相关推荐

基于Linux的Buildroot 制作根文件系统(rootfs)

基于Linux的Buildroot 制作根文件系统(rootfs)1.需要条件2.安装交叉编译链3.下载Buildroot代码包4.开始buildroot 制作根文件系统5.配置文件系统 menuconfig5.1、Target options —> 配置说明5.2.Build options —> 配置说明5.3.Toolchain —> 配置说明5.4.System configuration —> 配置说明5.5Kernel —> 配置说明5.6.Target packa

qq_39721016的博客 1万+

ARM 制作简易的根文件系统

(1)镜像文件形式的根文件系统,主要目的是用来烧录到块设备上,设备上的内核启动后,去挂载它。镜像文件形式的根文件系统,是由文件夹形式的根文件系统,使用专用的镜像制作工具制作而成的。(2) 最初在开发主机中随便 mkdir 创建了一个空文件夹,然后向其中添加一些必要的文件(包括 etc 目录下的运行时配置文件、/bin 等目录下的可执行程序、/lib 目录下的库文件等···)后就形成了一个文件夹形式的 rootfs。然后。

weixin_42109053的博客 1163

BusyBox制作根文件系统(rootfs)

定制根文件系统的方法很多,最常用的是使用BusyBox来构建。它能使用户迅速方便地建立一套相对完整、功能丰富的文件系统,其中包括大量常用的应用程序。它集成压缩了Linux的许多工具和命令。下面详细介绍有关BusyBox定制根文件系统。   一、系统环境: 1、操作系统:Ubuntu12.04 2、交叉编译工具:arm-linux-gcc4.4.3 3、busybox源码包:busybox

happy_stars_2016的博客 1万+

嵌入式Linux系统开发笔记(十四)

U-Boot环境变量

SudekiMing的博客 640

一键构建 Ubuntu 根文件系统 | `create_rootfs.sh` 深度解析

💾 想要快速创建一个 Ubuntu 根文件系统(RootFS)? 🔹 用于嵌入式开发? 想在 ARM 设备上运行 Ubuntu? 🔹 用于虚拟机? 需要生成可启动的 Ubuntu 磁盘镜像? 🔹 用于容器、Chroot? 需要一个最小化的 Ubuntu 环境?

linyujiang的博客 1609

ARM《8》_制作linux最小根文件系统

BusyBox 是一个轻量级的开源工具箱,该项目是由Bruce Perens in 在1996创建的,官网地址是:http://www.busybox.net/,BusyBox 是在 GNU GPL 许可协议下发行的开源软件,享有“嵌入式Linux的瑞士军刀”美誉;Busybox是一个UNIX系统工具集,它将很多普通的UNIX工具集成到一个很小的可执行文件中,为普通用户提供大多数常用的命令;make menuconfig (重新配置)make clean (建议清掉旧对象)

sz1125218970的博客 1124

嵌入式Linux 根文件系统rootfs的构建

嵌入式Linux 根文件系统rootfs的构建

坚韧与专注 1776

Rootfs 根文件系统移植

Rootfs 根文件系统移植

lpaim的博客 495

构建根文件系统ROOTFS

相信你点进这篇文章之前,想必已经跟up主移植好uboot以及简单编译了一遍Linux内核源码并且通过tftp启动了Linux内核了吧,哈哈哈,那么我们现在开始Linux移植最后一步,构建根文件系统rootfs吧在开始之前,确保你已经搭建了nfs和tftp共享文件夹,好那我们话不多说开始吧!!!

weixin_72233202的博客 1246

linux 内核启动Initramfs与initrd 及其挂载

Initramfs/initrd则是填充(仅仅是释放文件到rootfs根目录)/扩充(通过挂载其他文件系统类型到rootfs指定目录)rootfs的关键,以保证Linux系统的后续启动。 1.initrd 在早期的linux系统中,一般只有硬盘或者软盘被用来作为linux根文件系统的存储设备,因此也就很容易把这些设备的驱动程序集成到内核中。但是现在的嵌入式系统中可能将根文件系统保存到各种存储设备上,包括scsi、sata,u-disk等等。因此把这些设备的驱动代码全部编译到内核中显然就不是很方便。 为了

LETFLY'S LAB 1万+

arm linux rootfs 根文件系统

根据busybox-1.19.3编译生成的根文件系统,可直接烧写到开发板上

从零开始构建嵌入式 rootfs

文章目录根目录&&根文件系统什么是根文件系统根文件系统的作用根文件系统包含哪些内容为什么要这样设计文件系统需要那些东西怎样构建文件系统总结参考 根目录&&根文件系统 根目录:在 Linux 中,所有的目录都属于根目录 根文件系统:挂载在根目录下面的文件系统 什么是根文件系统 根文件系统是 Kernel 启动后第一个加载的文件系统 根文件系统的作用 Kernel 启动后,总得先挂载一个文件系统,这样其它文件系统才能被挂载和使用。 所以,根文件系统,为其它文件系统提供挂载点,是一

lyndon 1万+

嵌入式系统/ARM技术中的关于Linux启动时挂载rootfs的几种方式

一直对linux启动时挂载根文件系统的过程存在着很多疑问,今天在水木精华区找到了有用的资料,摘录如下:   1、Linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等做准备,mount 根文件系统有这么几种方式:   1)文件系统已经存在于硬盘(或者类似的设备)的某个分区上了,kernel根据启动的命令行参数(root=/dev/xxx),直接进行mount。 这里有一个问题,在root文件系统本身还不存在的情况下,kernel如何根据/dev/xxx来找到对应的设备呢?注意:根文件系统和其他文件系统的mount方式是不一样的,kernel通过直接解析

ARM嵌入式系统启动流程中的根文件系统rootfs加载机制解析

本文深入解析ARM嵌入式系统中根文件系统rootfs的加载机制,详细介绍了从U-Boot环境变量配置到内核参数传递的全过程。通过对比直接挂载与RAM磁盘两种方式的优缺点,并结合实际案例讲解如何构建和调试rootfs,帮助开发者解决常见的启动故障,优化系统性能。

go5gopher的博客 436

Hifiasm参数调优实战:当N50不理想时的7个排查方向与解决方案

本文详细解析了Hifiasm参数调优实战,针对基因组组装中N50不理想的7个排查方向与解决方案。通过调整--hom-cov、-D、-N等核心参数,结合HiFi数据和参考基因组分析,有效提升组装质量。文章以猪毛菜基因组为例,展示了从2.1MB到4.3MB的N50优化过程,为生物信息学研究者提供实用指南。

weixin_30642561的博客 422

从零开始:Ubuntu 24.04 LTS + Win11双系统安装教程

本文将简单直白介绍如何从零开始在同一台电脑上安装 Ubuntu 24.04 LTS 和 Windows 11,你可以在需要进行专业开发或运维工作时,轻松切换到 Ubuntu,享受其带来的高效与自由;而在日常学习生活和娱乐休闲时,依然可以无缝使用熟悉的 Windows 环境。

萑澈的博客 8087

《嵌入式》自己制作rootfs根文件系统

帮助同学制作rootfs根文件系统

u014452136的博客 837

SKILL实现电路virtuoso原理图schematic中引脚pin的net自动打上pin label

SKILL实现电路virtuoso原理图schematic中引脚pin的net自动打上pin label

qq_41510657的博客 2601

根文件系统(rootfs)理解

说明 最近学习了使用qemu搭建ARM vexpress环境,对rootfs有了一些大致理解并且对rootfs的构建做了些测试验证,特记录下。 简介 文件系统有两种意思: 文件管理系统,例如:ext2、ext3、vfat、ntfs等文件管理和组织结构。 一定规模文件的集合,分别起不同作用的文件按照一定结构组合形成系统。 显而易见根文件系统不是类似于ntfs等文件管理系统,它属于第2种意思,根表示设备启动后该文件系统将被mount到根目录即路径’/'下。 根文件系统不是一种文件管理系统,但是根文

qazw9600的专栏 2226

NeuralKG的安装及简单demo使用(浙江大学开源知识图谱表示学习工具)

记录NeuralKG的安装和使用,以及解决windows系统下的运行demo.py出现的问题。

m0_46621271的博客 1383

ego-planner启动参数深度解析:从配置到实战避障应用

本文深入解析EGO-Planner启动参数的配置与实战应用,重点探讨无人机自主导航中的避障性能优化。通过环境感知、运动约束和算法控制三类参数的详细说明,结合ROS和RViz工具,提供从基础配置到高级调优的完整指南,帮助开发者提升无人机在复杂场景下的规划效率和安全性。

rum55的博客 241

如何使用busybox编译和生成最简linux根文件系统(rootfs)

继前几天对uboot和内核编译进行了初步了解之后,昨天开始研究如何制作rootfs根文件系统。昨晚对busybox这个工具有了初步的了解,今天继续深入研究,终于成功的制作出了一套完整可用的最简linux rootfs根文件系统。现记录详细步骤以备日后查阅。一、准备工作1、首先交代系统版本和开发环境 操作系统:ubuntu 12.04(64bit); 交叉编译工具链:arm-linux-gcc 4.4

不积跬步,无以至千里! 1万+

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX,不依赖盗版破解的Keil MDK、IAR等软件。

wangyuewu08的博客 3370

根文件系统(rootfs) 制作方法(BusyBox、Buildroot、Yocto、Ubuntu Base)

制作的四种主流方法(BusyBox、Buildroot、Yocto、Ubuntu Base)的详细教程与对比分析,结合不同场景的需求提供具体实现步骤和关键要点。

niuTyler的博客 2746

统计滤波器

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对统计滤波器做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1640

(ICLR 2025)【源码讲解+复现】TIMER-XL: Long-Context Transformers for Unified Time Series Forecasting

本文提出了一种统一的多变量时序预测模型Timer-XL,其核心创新包括:1)采用自回归解码器架构,将多变量时序预测统一为next-token预测问题;2)设计TimeAttention机制,通过相对位置编码和因果掩码捕获时序位置和变量间交互;3)支持长上下文预训练以提升零样本迁移能力。模型架构包含嵌入层、时间感知注意力块和预测头,采用MSE损失进行端到端训练。实验表明该方法在多种时序任务上表现优异,特别是在长跨度预测和少样本场景下。代码实现提供了完整的模型定义、数据加载和训练流程,支持自定义配置参数。

1134
上一篇: 文件系统(六)—文件系统mount过程 转载
下一篇: Linux线程概述
盼望孤独的二进制
博客等级 码龄18年 595粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值