Linux内核驱动学习(二)----根文件系统的构成 (root filesystem)

1、建立根文件系统目录和文件

1.1创建目录

1.2创建设备文件(命令mknod);必须创建设备文件---consle\null

1.3创建配置文件---复制已有的/etc目录下的文件

1.4添加内核模块

进入Linux内核目录下,(注意,应该先编译内核,即命令make uImage ARCH=arm  CROSS_COMPILE=arm-linux-)

1.4.1、编译内核模块---命令 make modules ARCH=arm CROSS_COMPILE=arm-linux-

1.4.2、将编译好的内核模块集中到一起,并将其放置到新建文件系统目录下/rootfs-->

命令 make modules_install ARCH=arm INSTALL_MOD_PATH=.../rootfs

1.5编译/安装busybox(含有Linux下的执行命令)

1.5.1、配置busybox

make menuconfig

主要配置的选项有

**Busybox Settings ->build Options->

选中 “build busybox as a static binary”,静态链接

cross compiler prefix (arm-linux-)  ,编译交叉工具链

**Busybox Settings ->Installation Options ->

选中“donot use /usr”,,选中该项可以避免busybox被安装到宿主系统的/usr目录下,破坏宿主系统

busybox installation prefix(/xxx/rootfs)  该选项表明编译后的busybox的安装位置

1.5.2、编译、安装

编译命令: make

安装: make install

安装后的效果 /xxx/rootfs/bin目录下多出了许多命令


2、挂载根文件系统到内核

2.1关于文件系统介绍及分类

根据存储设备的硬件特性(NOR Flash? nandflash?)、系统需求(可读可写? 只读?),且不同的文件系统类型有不同的应用场合。

2.1.1、基于nandflash的文件系统

a>yaffs2主要用于nand型flash,支持跨平台。

b>ubifs

以上两种均为可读可写的文件系统

2.1.2、基于norflash的文件系统

a>Jffs2(可读可写)

主要用于nor型flash,特点是可读写,支持数据压缩的日志型文件系统。

2.1.3、基于内存的文件系统

a>Ramdisk

基于ram的文件系统。是将一部分固定大小的内存当做块设备来用。它并非是一个实际的文件系统,而是一种将实际的文件系统装入内存的机制。将一些经常访问而又无需更改的文件通过ramdisk放在内存中,可以明显的提高系统的性能。

b>Initramfs(现在多使用,启动系统非常快,缺点:不可保存用户数据)

基于ram的文件系统。initramfs出现在2.6内核中,它类似于tmpfs,是一种基于内存的文件系统,它的使用不需要创建内存块设备。增加文件到ramfs会自动配置更多的内存,并删除或截去文件以释放内存。(若ramdisk没有满,已被占用的额外的内存也不能用来做其它事情,若ramdisk满了,但其它仍有闲置的内存,也必须重新格式化以后才能扩展使用)

2.1.4、基于网络的文件系统

a>NFS(主要在开发阶段使用)

是由sun开发的一种在不同机器之间通过网络共享文件的技术。在嵌入式linux系统的开发调试阶段,可以利用该技术在主机上建立基于nfs的根文件系统,挂载到嵌入式设备,可以很方便的修改根文件系统的内容。

实际使用时可使用混合操作系统。。利用各个文件系统的优势。

2.2使用Initramfs 文件系统

Initramfs 文件系统是与内核固定在一起的,修改文件系统中的内容后不会立即生效,需重新编译内核。(在建立好的文件系统下操作
/xxx/rootfs/)

2.2.1、执行命令(建立软链接的原因:initramfs文件系统启动时会在根文件系统中执行第一个init程序,它对uboot传过来的参数init=/linuxrc不予理睬,所以需要在制作的根文件系统里的根目录加入init程序,否则无法启动。init程序和linuxrc程序一样都是符号链接文件,它们都是指向/bin/busybox程序。))

ln -s ./bin/busybox init

2.2.2、配置Linux内核,支持initramfs   如下图

2.2.3编译内核

2.2.4、设置uboot环境变量(传给内核的启动参数)

setenv bootargs noinitrd console=ttySAC0,115200

2.2.5、在uboot命令行下可以查看其文件系统的内容,如下


2.3使用NFS文件系统

(相对于Initram文件系统,在nfs服务器上修改文件系统内容时,在开发版会立即生效。。而Initramfs文件系统需要重新编译内核,即静态编译)

2.3.1、取消在制作Initram文件系统的以下选项

2.3.2、**file systems-->Network File Systems--->Root file system on nfs选中该选项

2.3.3、编译内核

2.3.4、启动参数配置(uboot 中)

setenv bootargs noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.1.112:/home/kindlyde/Desktop/arm-5/lesson4/rootfs
ip=192.168.1.130:192.168.1.112:192.168.1.1:255.255.255.0:  :eth0:off

noinitrd :

console=ttySAC0,115200 :串口,波特率//错误:console写成了consoles,,造成信息出现在开发版上。。串口中没出现

init=/init

root=/dev/nfs :nfs作为根目录:----》但在Linux系统中或制作的文件系统中均未发现此根目录??

rw :可读可写

nfsroot=192.168.1.112:虚拟机IP(NFS服务器地址)

:/home/kindlyde/Desktop/arm-5/lesson4/rootfs 创建的文件系统路径

ip=192.168.1.130:(开发板的IP)

192.168.1.112(NFS服务器地址)

:192.168.1.1(网关地址)

:255.255.255.0(掩码地址)

:(开发板的主机名,未取名,所以为空)

:eth0:off

2.3.5、将内核通过tftp下载到开发板中,之后启动开发板。结果如下图所示

注意事项以及实现系统挂载时出现的错误:

需同时设置NFS服务器的主目录地址(/etc/exports)---设计详见笔记--《配置NFS服务器》

使用NFS服务器挂载文件系统时;

出现如下错误:Unable to mount root fs via NFS, trying floppy.

出错原因:

1、在下载内核的后启动内核而出现的这个问题,那么就是下载内核之前设置引导参数的时候没有设置正确,可能是nfs的解压路径不正确,

2、NFS的目录内容改变了。。解决方法:重启NFS服务

3、查看nfs服务器是否配置正确。。如下

学习博客:http://blog.csdn.net/suiyuan19840208/article/details/7246390

时间: 2024-11-03 21:02:31

Linux内核驱动学习(二)----根文件系统的构成 (root filesystem)的相关文章

linux内核驱动学习指南

目录: 1.参考链接 1. 参考链接 小白的博客 ONE_Tech 你为什么看不懂Linux内核驱动源码? 求教怎么学习linux内核驱动 原文地址:https://www.cnblogs.com/agui125/p/10071452.html

linux内核驱动学习(八)----驱动分类 | 学习方法 | 硬件访问

驱动分类: 对于驱动,我们一般按两种方法进行分类:常规分类法和总线分类法. 按照常规分类法,可以分为以下三类: 1.字符设备: 以字节为最小访问单位的设备.一般通过字符设备文件来访问字符设备驱动程序.字符驱动程序则负责驱动字符设备, ,这样的驱动通常支持open.close.read.write系统调用,应用程序可以通过设备文件(比如/dev/ttySAC0等)来访问字符设备(串口).例如:串口\led\按键 2.块设备: 以块(一般512字节)为最 小传输单位的设备.大多数UNIX系统中,块设

Linux内核驱动学习(一)----内核简介 | 配置 | 编译| 安装(PC平台下)

Linux体系结构: 由上图知:Linux架构分为用户空间和内核空间 划分成用户空间与内核空间的原因? 保护操作系统,使应用程序和内核拥有不同的权限.为不同的代码制造不同的等级... 内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转换 内核的构成: a-->系统调用接口(SCI). b-->进程管理(PM). c-->内存管理(MM) . d-->关于处理器代码(arch) . e-->虚拟文件系统(VFS). f-->

Linux内核驱动学习(三)----内核模块基础 | 设计 | 可选项

内核模块基础--特点及其命令使用 1.模块本身并不被编译进内核文件(zImage或bzImage) 2.可以根据需要在内核运行时动态加载.卸载---->进而达到节省空间的目的 命令详解(以下载驱动DNW为例): insmod 模块名称(注意有.ko后缀)--安装 insmod dnw_usb.ko lsmod-->查看安装的内核模块 rmmod 模块名称(注意没有.ko后缀)---->卸载内核模块 rmmod dnw_usb 内核模块设计--简单的模块编写 根据上图范例代码,比较应用程序

u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统

http://www.linuxidc.com/Linux/2012-09/70510.htm  来源:Linux社区  作者:赵春江 uboot最主要的功能就是能够引导内核启动.本文就介绍如何实现该功能,并组成一个最简单的系统,这不仅要移植uboot,还要移植linux内核及创建一个根文件系统. 首先我们对nandflash进行分区,规划好每个文件存放在nandflash的位置.下面是nandflash的分区: 第0分区:0x000000000000-0x000000080000为uboot区

Linux内核源代码情景分析-设备文件系统devfs

我们以前多次讲过到,以主设备号/次设备号为基础的设备文件管理方式是有根本性的缺点的.这种从Unix早期一直沿用下来的方案一方面给设备号的管理带来了麻烦,一方面也破坏了/dev目录结构.Unix/Linux系统中的所有目录的结构都是层次的,惟独/dev目录是"平面"的.这不光是风格的问题,也直接影响着访问的效率和管理的方便与否. 那么理想中的/dev目录应该是什么样的呢?首先,它应该是层次的.树状的.其次,它的规模应该是可伸缩的,而且不受数量的限制(例如256个主设备号).还有,/dev

你为什么看不懂Linux内核驱动源码?

学习嵌入式Linux驱动开发,最核心的技能就是能够编写Linux内核驱动.深入理解Linux内核.而做到这一步的基础,就是你要看得懂Linux内核源码,了解其基本的框架和具体实现,了解其内核API的使用方法,然后才能根据自己的需求写出高质量的内核驱动程序. 说易行难,很多新人.甚至工作1-2年的开发者刚接触Linux内核时,别说写了,看内核代码可能都是一脸懵逼:明明是C语言,但是就是看不懂是什么意思,除了根据函数名.函数参数.函数的返回值以及注释,了解整个函数的基本功能外,一旦分析其细节,你会发

EasyARM i.mx28学习笔记——根文件系统rootfs修改和烧写

0 前言 本文详细说明如何修改和制作根文件系统,包括修改根文件系统中的配置文件:在根文件系统中加入可执行文件,最后通过uboot tftp方式烧录根文件系统和镜像. [相关博文] [EasyARM i.mx28学习笔记--文件IO方式操作GPIO] [EasyARM i.mx28学习笔记--安装和使用tftp] [EasyARM i.mx28学习笔记--minicom配置和使用] [EasyARM i.mx28学习笔记--通过modbus tcp控制GPIO] 1 准备 若使用uboot tft

Linux内核驱动注册方式泛谈

Linux驱动注册有多种方式,通常是以内核提供的表征数据结构封装后按照内核子系统提供的接口函数进行注册,还有一些是比较复杂的以链表方式进行维护.以下对几种驱动注册方式进行介绍: 一.子系统有专门的驱动注册函数: 例如RTC子系统,提供rtc_device_register注册接口函数. 例如: rtc_device_register(client->name,&client->dev, &rx8025_rtc_ops, THIS_MODULE); static struct r