linux_根文件系统_rootfs
bootload、kernel、rootfs

嵌入式Linux系统的构建一、嵌入式Linux系统中的典型分区结构Root filesystemKernel二、各个结构的分析1、从咱们所学的硬件知识能够明白,在系统上电后需要一段程序来进行初始化(关闭WATCHDOG、改变系统时钟、初始化存储器操纵器、将更多的代码复制到内存中)。
简单的说bootload确实是这么一段小程序(相当于PC机中的BIOS),初始化硬件设备、预备好软件环境,最后挪用操作系统内核。
从某个观点上来看Bootload能够分为两种操作模式:启动模式和下载模式。
启动模式:上电后bootload从板子上的某个固态存储器上将操作系统加载到RAM中运行,整个进程并无效户的介入下载模式:在这种模式下,开发人员能够利用各类命令,通过串口连接或网络连接等通信手腕从主机下载文件,将它们直接放在内存运行或是烧入Flash类固态存储设备中。
Bootload能够分为两个时期:第一时期实现的功能:硬件设备初始化、为加载Bootload的第二时期代码预备RAM空间、复制Bootload的第二时期代码到RAM空间中、设置好栈、跳转到第二时期代码的C入口点第二时期:初始化本时期要利用的硬件设备、检测系统内存映射、将内核镜像和根文件映像从Flash上读到RAM空间中、为内核设置启动参数、挪用内核2、内核的结构:Linux内核文件数量快要2万,除去其他构架CPU的相关文件,支持S3C2410、S3C2440这两款芯片的完整内核文件有1万多个。
这些文件组织结构并非复杂,他们别离位于顶层目录下的17个子目录,各个目录功能独立Linu内核Makefile文件分类3、根文件系统嵌入式Linux 中都需要构建根文件系统,构建根文件系统的规那么在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。
三、根文件系统的制作一、进入到/opt/studyarm 目录,新建成立根文件系统目录的脚本文create_rootfs_bash,利用命令chmod +x create_rootfs_bash 改变文件的可执行限,./create_rootfs_bash 运行脚本,就完成了根文件系统目录的创建。
根文件系统(rootfs)

根文件系统(rootfs)展开全文一、根文件系统的作用是linux挂载的第一个文件系统,rootfs包含shell命令、linux系统配置文件(文件系统的挂载、网络服务、用户名、主机名、用户密码、环境变量...)、linux应用程序、应用程序处理的数据、独立的驱动模块(*.ko)。
根文件系统,相当于linux内核外围的一个应用环境。
====================================== ========================================= =========================二、控制台输出:[ 4.183226] yaffs: dev is 32505860 name is "mtdblock4" rw //存放rootfs的设备名字mtdblock4 ,rw可读写[ 4.183291] yaffs: passed flags ""[ 4.337878] VFS: Mounted root (yaffs filesystem) on device 31:4. //31:4 --》主设备:次设备号[ 4.338028] Freeing init memory: 536K ---->rootfs挂载成功,释放内核中一些初始化函数所占用的内存[ 4.357023] usb 1-1: New USB device found, idVendor=1a40, idProduct=0101[ 4.357083] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0[ 4.357145] usb 1-1: Product: USB 2.0 Hub[ 4.357747] hub 1-1:1.0: USB hub found[ 4.357852] hub 1-1:1.0: 4 ports detected[ 5.886184] smdkc110-rtc smdkc110-rtc: rtc disabled, re-enabling[ 6.086924] eth0: link down[ 6.087198] ADDRCONF(NETDEV_UP): eth0: link is not ready[root@YueQian /]#[root@YueQian /]#[root@YueQian /]#[root@YueQian /]#最小的根文件系统的内容:# ls /bin home media proc sys usrdev lib mnt root tmp varetc lost+found opt sbin====================================== ========================================= =========================三、根文件系统启动过程1、uboot的启动参数:init=/linuxrcinit是linux运行时的第一个进程,该进程执行的是/linuxrc 其中linuxrc -> bin/busyboxinit=/sbin/init 其中:init -> ../bin/busybox--------------------------------------------------------------------------------------------------------2、内核启动后,首先通过vfs去挂在rootfs,然后再执行init=/linuxrc ,linuxrc是busybox这个工作生成的文件。
嵌入式Linux中常见的文件系统及特点

嵌⼊式Linux中常见的⽂件系统及特点1、Linux可⽀持的⽂件系统有多种,但是这么多种的⽂件系统都是基于Linux内核所提供的⽂件系统VFS的接⼝API。
因此对于Linux内核级别实现的⽂件系统只有VFS虚拟⽂件系统; 其余实现的⽂件系统都是调⽤VFS⽂件系统的API更上⼀层实现的;2、Linux⽂件系统的组成结构: 1、⽤户层:⽤户层向外提供Linux内核所⽀持⽂件系统的VFS的API接⼝ 内核层:内核实现了所说的各种⽂件系统 驱动层:驱动层是块设备的驱动程序 硬件层:硬件层是不同⽂件系统⽀持的存储器;3、Linux启动时的⽂件系统: 硬件上电启动,各项硬件初始化后,第⼀个启动的⽂件系统时RootFS根⽂件系统,如果说根⽂件系统没有起来,系统出现异常、将重启;4、常⽤的⽂件系统运⾏、存储设备有: DRAM、SDRAM以及ROM其中常使⽤flash;5、根据不同的存储介质,常见的⽂件系统有: 基于Flash(Nor、Nand)的⽂件系统有: jffs2:可读写,数据压缩、⽀持哈希表的⽂件系统,掉电保护;缺点:不适合使⽤在⼤容量的Nand Flash中,内存使⽤量太⼤极⼤降低数据操作速度; yaffs:读写速度快,占⽤内存⼩,实现内存访问异常处理;混合的垃圾回收算法;特别适合嵌⼊式设备使⽤;跨平台、⾃带Nand 芯⽚驱动 cramfs:只读的⽂件系统,执⾏速度快,内容⽆法扩充;⽂件系统健壮; romfs:简单紧凑、只读、不⽀持动态擦写;较多使⽤在uclinux系统上; 基于RAM存储介质的⽂件系统: ramdisk:将⼀部分固定⼤⼩的内存当做分区使⽤,不能真正算的上实际的⽂件系统,更像是⼀种机制,将实际的⽂件系统加载到内存中;将⼀些经常被访问的⽽⼜不会更改的⽂件放⼊到内存中,达到提⾼系统效率的⽬的;同时还负责将内核镜像与⽂件系统⼀块加载到内存中; ramfs/tmpfs :基于内存的⽂件系统,⼯作于虚拟⽂件系统层,可以创建多个⽂件系统,可以指定每个⽂件系统最⼤使⽤内存;这种⽂件系统将所有的⽂件都放在RAM中,既可以提⾼读写速度,也可以避免对flash⼤量的读写操作;⽂件系统不可以格式化,占⽤内存⼤⼩可以指定; ⽹络⽂件系统: NFS:是⼀种基于⽹络共享技术,可以在不同平台、不同机器、不同操作系统上实现⽂件共享、⽂件传输;在嵌⼊式Linux系统初始开发阶段可以⾮常⽅便⽂件传输、⽂件修改;地址异常进⼊模式描述0x0000,0000复位管理模式电平复位0x0000,0004未定义指令异常未定义模式遇到不能处理的指令,⽆法识别的指令0x0000,000c 软件中断管理模式异常发⽣时CPU处理的步骤:R13(sp),R15(PC)1、保存当前执⾏位置:LR寄存器(R14)2、保存当前执⾏状态:CPSR3、寻找中断⼊⼝,中断向量表:PC寄存器找向量地址4、执⾏中断处理完成:5、中断返回,继续执⾏:R14 <exception_mode> = return linkSPSR<exception_mode>=CPSRCPSR[4:0] =exception mode number;/* 处理器⼯作模式控制位 */CPSR[5]=0; /* 使⽤ARM指令集 */If<exception_mode> == reset or FIQ thenCPSR[6]= 1;/* 屏蔽快速中断FIQ */CPSR[7]=1; /* 屏蔽外部中断IRQ */PC=exception vector address;复位异常中断处理程序的主要功能:1、设置异常中断向量表:2、初始化数据栈和寄存器:3、初始化存储系统MMU:4、初始化关键IO设备:5、使能中断:6、处理器切换到合适的模式:7、初始化C变量跳转到应⽤程序执⾏:R14<SVC> = 设置相应的值;SPSR<SVC> = 设置相应的值;CPSR[4:0]=0b10011;/* 进⼊特权模式 */CPSR[5]=0; /* 使⽤ARM指令集 */CPSR[6] =1; /* 禁⽌相关关闭FIQ */CPSR[7] =1; /* 禁⽌IRQ */If high vectors configured thenPC=0xffff,0000;ElsePC= 0x0000,0000;其余的异常以此类推;异常的优先级:1、Reset: 优先级1(最⾼)2、Data abort:23、FIQ:34、IRQ:45、Prefetch abort:56、SWI或者undefined instruction:6(最低),软件中断异常或者未定义指令异常ARM硬件接⼝:1、程序的链接地址和程序地址:ld程序链接地址程序链接地址:是程序运⾏的起始地址;程序地址:是程序保存在硬盘中的地址;2、呵呵呵。
buildroot make 原理

buildroot make 原理一、什么是buildrootBuildroot是一个用于嵌入式Linux系统的简化和自动化构建工具。
它允许用户通过配置文件定制自己的Linux系统,并使用make命令自动构建整个系统。
Buildroot主要用于构建根文件系统(rootfs),它是Linux系统的基础,包含了操作系统运行所需的所有文件和目录。
二、make的基本原理在介绍buildroot的make原理之前,我们先来了解一下make的基本原理。
make 是一个基于文件时间戳的自动化构建工具,它通过比较源文件和目标文件的时间戳来判断是否需要重新编译。
make工具通过读取Makefile文件中的规则来执行构建过程。
Makefile中定义了目标(target)、依赖关系(prerequisites)和构建命令(recipe)。
当make命令执行时,它会根据Makefile中的规则来判断哪些目标需要重新构建。
make会先判断目标文件是否存在,如果不存在或者目标文件的时间戳早于依赖文件,则需要执行构建命令来生成目标文件。
构建命令可以是编译源代码、链接目标文件等。
构建命令执行完毕后,会更新目标文件的时间戳。
make会递归地处理所有的依赖关系,确保所有的依赖文件都是最新的。
这样,只有需要重新构建的目标才会执行相应的构建命令,提高了构建的效率。
三、buildroot的make原理buildroot使用make作为构建工具,通过读取Makefile来执行构建过程。
buildroot的Makefile是由Kconfig文件和一些其他的Makefile片段生成的。
1. Kconfig文件Kconfig文件是buildroot的配置文件,用于定义系统的配置选项。
Kconfig文件使用一种特定的语法来描述配置选项,包括菜单(menu)、菜单项(menuconfig)和配置项(config)等。
Kconfig文件中的配置选项会生成一个.config文件,用于指定构建rootfs所需的软件包和配置参数。
Linux通过nfs挂载根文件系统失败:VFS:Unabletomountrootfsvi。。。

Linux通过 nfs挂载根文件系统失败: VFS: Unabletomountrootfsvi。 。 。
在网上搜索各种资料均未解决。
最终发现原因是我的Ubuntu版本太新了,不兼容导致。
终于在大神的博客里找到解决方法:
查找资料发现从Ubuntu17.04开始,nfs默认只支持协议3和协议4,而kernel中默认支持协议2,所以才会出现挂载失败的情况,现有两种方 法可以解决该问题:
1. 设置Ubuntu18.04系统中的nfs服务支持协议2,修改nfs配置文件 /etc/default/nfs-kernel-server,在文件末尾加入一句:RPCNFSDOPTS="-nfs-version 2,3,4 --debug --syslog"。
2. 如果kernel版本较高支持nfs协议3的话,可以在Uboot传到Kernel的bootargs参数中加入'nfsvers=3',使kernel使用nfБайду номын сангаас协议3。
解决mount root fs问题的方法

解决mount root fs问题的方法在Linux系统中,"mount root fs"问题是一个常见的技术难题,通常发生在系统启动过程中,由于根文件系统未能正确挂载而导致系统无法正常加载。
下面将详细介绍几种解决这一问题的方法。
一、理解"mount root fs"问题"mount root fs"问题指的是在Linux系统启动时,内核未能成功挂载作为根文件系统的分区。
这可能是由于多种原因造成的,如文件系统损坏、分区表错误、挂载选项问题等。
二、解决方法1.修复文件系统如果文件系统受损,可以使用fsck工具进行修复。
通常,在系统启动时,可以通过以下步骤进行:- 重启系统,进入GRUB引导加载器界面。
- 选择需要启动的Linux内核,按e键进入编辑模式。
- 找到以"linux"或"linux16"开头的行,通常包含启动参数。
- 在行尾添加"init=/bin/bash"或"rw init=/sysroot/bin/sh",按Ctrl + X或F10启动。
- 在紧急模式下,运行"fsck -y /dev/sdXn"(将sdXn替换为根文件系统的设备名和分区号)来检查和修复文件系统。
- 修复完成后,执行"exec /sbin/init"或"exec switchroot /sysroot"来继续启动。
2.修改GRUB启动参数如果是挂载选项问题,可以在GRUB启动参数中修改:- 同样进入GRUB编辑模式。
- 找到启动参数行,修改或添加"ro"为"rw",表示以读写模式挂载根文件系统。
- 或者,尝试移除"rhgb"(redhat graphics boot)和"quiet"参数,以便在启动过程中查看可能的错误信息。
BUSYBOX

关于根文件系统的制作,网络上有很多文章,大多数 都只讲到建几个目 录,然后用 Busybox 做个 Shell,有很多关键的东西没有说。经过很长 时间的摸爬滚打,我终于能够白手起家建立一个根文件系统了。 其实我 也不懂得原理,只是告诉大家我的作法,其中也不免有错误,欢迎大家 指正。 首先介绍根文件系统的组成:目录、Shell、库、脚本,一个个 来。 目录 根文件系统要包含这些必须有的目录:/dev、/bin、/usr、/sbin、/lib、 /etc、/proc、/sys /dev 是 devfs(设备文件系统)或者 udev 的挂在点所在。在使用 devfs 的内核里如果没有/dev,根本见不到 Shell 启动的信息,因为内核找不 到 /dev/console;在使用 udev 的系统里,也事先需要在/dev 下建立 console 和 null 这两个节点。关于 devfs 和 udev 的区别, 网上很多文 章说。当然如果你的内核已经不支持 devfs 了(2.6.12 以后),可以使 用纯纯的静态节点。也就是用 mknod 人工生成。 /bin、 /usr/bin、/usr/sbin、/sbin 是编译 Busybox 这个 Shell 时候 就有的,用于存放二进制可执行文件,就不多解释了。 /lib 用于存放动态链接库。网上很多文章都说静态编译 Busybox,可以 省去建库的麻烦过程。这样做只能让 Busybox 启动,我们自己写的,或 者是编译的软 件包还是需要动态库的。 除非全部静态编译, 你可以试试, 一个 Hello world 就要几百 k。关于库的内容后面仔细说。 /etc 是用来存放初始 化脚本和其他配置文件的。关于初始化脚本的内 容后面仔细说。 /proc 是用来挂载存放系统信息虚拟文件系统——“proc 文件系统”, “proc 文件系统”在内核里面可以选。如果没有“proc 文件系统”, 很多 Shell 自己的命令就没有办法运行,比如 ifconfig。“proc 文件系 统”不像 devfs 可以自动挂载, 它需要使用初始化脚本挂载。 另外, udev 也需要“proc 文件系统”的支持。 /sys 用于挂载“sysfs 文件系 统”,“sysfs 文件系统”在内核里面可 以选。 目前我认为它就是给 udev 提供支持的, 呵呵。 “sysfs 文件系统” 也需要使用初始化脚本挂载。 另 外还可以有/tmp、/mnt、/swp、/var 这样的不是嵌入式系统必须的 目录,在说完 Shell 的制作之后,我再谈建立目录的事情。 Shell Shell 很简单,就是 Busybox,上网下载一个来: /downloads/。说 Busybox 和 arm- linux-gcc 有兼容性问题, 不过我觉得那是比较低版本的时代问题了, 我用 Busybox 1.8.2 和 arm-linux-gcc 3.4.1/3.3.2 都可以。 解压缩以后找到 Makefile 里面的 ARCH 和 CROSS_COMPILE,改成: ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
linux之fstab文件详解,实现rootfs根文件目录下prog和dapa的挂载

linux之fstab⽂件详解,实现rootfs根⽂件⽬录下prog和dapa的挂载mtdparts的格式如下:mtdparts=<mtddef>[;<mtddef]<mtddef> := <mtd-id>:<partdef>[,<partdef>]<partdef> := <size>[@offset][<name>][ro]<mtd-id> := unique id used in mapping driver/device<size> := standard linux memsize OR "-" to denote all remaining space<name> := (NAME)在使⽤的时候需要按照下⾯的格式来设置:mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)这⾥⾯有⼏个必须要注意的:a. mtd-id必须要跟你当前平台的flash的``mtd-id⼀致,不然整个mtdparts会失效b. size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表⽰剩余的所有空间。
kernel⾥.config配置⽂件CONFIG_CMDLINE="mem=64M console=ttyS0,115200 mtdparts=nand0:8M(bootstrap/uboot/kernel)ro,16M(rootfs),16M(appbin),-(appdapa) root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 ubi.mtd=2 ubi.mtd=3 root=ubi0:rootfs"kernel分配8M,rootfs分配16M,appbin分配16M,剩余空间分配给appdapa/etc/fstab是⽤来存放⽂件系统的静态信息的⽂件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、什么是文件系统(Filesystem)
文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。
二、主要嵌入式采用的文件系统
* Linux 中,rootfs 是必不可少的。
PC 上主要实现有ramdisk 和直接挂载HD(Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从HD 启动,而是从Flash 启动,最简单的方法是将rootfs load 到RAM 的RAMDisk,稍复杂的就是直接从Flash 读取的Cramfs,更复杂的是在Flash 上分区,并构建JFFS2 等文件系统。
* RAMDisk 将制作好的rootfs 压缩后写入Flash,启动的时候由Bootloader load 到RAM,解压缩,然后挂载到/。
这种方法操作简单,但是在RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源RAM。
ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk通常使用磁盘文件系统的压缩存放在flash中,在系统初始化时,解压缩到SDRAM并挂载根文件系统, 在linux系统中,ramdisk有二种,一种就是可以格式化并加载,在linux内核2.0/2.2就已经支持,其不足之处是大小固定;另一种是2.4的内核才支持,通过,ramfs来实现,他不能被格式化,但用起来方便,其大小随所需要的空间增加或减少,是目前linux常用的ramdisk技术.
* initrd 是RAMDisk 的格式,kernel 2.4 之前都是image-initrd,Kernel 2.5 引入了cpio-initrd,大大简化了Linux 的启动过程,附合Linux 的基本哲学:Keep it simple, stupid(KISS). 不过cpio-initrd 作为新的格式,还没有经过广泛测试,嵌入式Linux 中主要采用的还是image-initrd。
* Cramfs 是Linus 写的很简单的文件系统,有很好的压缩绿,也可以直接从Flash 上运行,不须load 到RAM 中,因此节约了RAM。
但是Cramfs 是只读的,对于需要运行时修改的目录(如:/etc, /var, /tmp)多有不便,因此,一般将这些目录做成ramfs 等可写的fs。
* SquashFS 是对Cramfs 的增强。
突破了Cramfs 的一些限制,在Flash 和RAM 的使用量方面也具有优势。
不过,据开发者介绍,在性能上可能不如Cramfs。
这也是一种新方法,在嵌入式系统采用之前,需要经过更多的测试
三、建一个包含所有文件的目录
1。
建一个目录rootfs 用来装文件系统
2。
mkdir bin dev etc lib proc sbin tmp usr var
3. ln -fs bin/busybox linuxrc(使用busybox)
4. 到系统/dev 把所有的device打一个包,拷贝到dev下面(最省事的做法);
5。
将编译好的busybox拷贝到/bin下面,除了busybox外,所有其他的命令都是他的link
所有的命令你可以在busybox下面用make menuconfig来增减
6。
同样/sbin下面也是busybox的link
halt ifconfig init insmod klogd losetup lsmod mkswap modprobe reboot rmmod route swapoff swapon
7。
同样/usr/bin下面也是busybox的link
basename dirname env free id logger reset tail tr tty uptime which xargs
awk cut du expr head killall mkfifo sort test traceroute uniq wc whoami yes
上面几乎是最全的link,各个看官可以酌情删减,不过link也不占什么空间!
8。
同样/usr/sbin下面放着所有编译完的可执行文件,具体就不多说了
9。
非常重要之/lib,务必重视
找到你编译环境的target目录,把需要的lib文件先用strip压縮(非target目录下的,而已编译环境提供的strip),先把最基本的libc, ld等等,必须同样做跟target/lib里面一样的link。
然后根据特定的应用加相应的lib,不要把不用的加进去,lib比较占空间。
10。
在/etc下面加上需要的配置文件,最最重要的是rcS
四、生成一个ramdisk
五、生成一个cramfs
找到cramfs的toolchain。
/mkcramfs -r $(FS1_DIR) $(FS_NAME).1
六、生成一个mksquashfs
找到squashfs的toolchain。
/mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI
做文件系统最困难和最可能出问题的地方是在/lib库和/dev方面,请大家多注意这两方面。