根文件系统
根文件系统(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这个工作生成的文件。
ramdisk根文件系统制作

制作ramdisk类型文件系统ramdisk也就是内存盘的意思。
所谓的RAM驱动器,实际上是把系统内存划出一部分当作硬盘使用.对于操作系统来讲内存的存取速度远远大于机械磁盘,所以RAM驱动器肯定要比机械的硬盘快得多.你可以把整个应用程序都安装在ramdisk的驱动器中,然后用内存的速度运行它。
使用RAM驱动器技术对于延长笔记本电脑电池使用时间也是十分有利的,因为这样做可以减少访问“耗电大户”--硬盘的次数。
Ram:内存,Disk:磁盘,在Linux中可以将一部分内存当作分区来使用,称之为Ramdisk。
对于一些经常被访问、并且不会被更改的文件,可以将它们通过Ramdisk放在内存中,能够明显地提高系统性能。
Ramdisk工作于虚拟文件系统(VFS)层,不能格式化,但可以创建多个Ramdisk。
虽然现在硬盘价钱越来越便宜,但对于一些我们想让其访问速度很高的情况下,Ramdisk还是很好用的.如果对计算速度要求很高,可以通过增加内存来实现,使用ramdisk技术。
一个A Ramdisk就是把内存假设为一个硬盘驱动器,并且在它的上面存储文件。
假设有几个文件要频繁的使用,如果将它们加到内存当中,程序运行速度会大幅度提高,因为内存的读写速度远高于硬盘。
划出部分内存提高整体性能,不亚于更换新的CPU。
像Web服务器这样的计算机,需要大量读取和交换特定的文件。
因此,在Web服务器上建立Ramdisk会大大提高网络读取速度。
从制作Ramdisk 根文件系统的方法上来说,是很简单的.1。
配置Linux内核支持Ramdisk类型的文件系统。
2。
制作好根文件系统,使用之前实验案例制作好的根文件系统。
3。
将制作好的根文件系统制作成Ramdisk类型文件系统.4.下载到TPAD上使用测试.实现1.对内核进行配置,使得内核能够支持Ramdisk类型的文件系统,如图-9,图—10,图—11.$ cd /home/tarena/workdir/tools/linux-2.6.35。
ramdisk根文件系统制作

制作根文件系统有两种方法1、利用开发板提供的映像文件制作ramdisk2、利用busybox制作根文件系统(制作过程复杂)采用第一种方法制作需要的ramdisk1、拷贝已有的uramdisk.image.gz 到新建的tmp/下,cp uramdisk.image.gz tmp/2、去掉mkimage生成的64 bytes 的文件头,生成新的ramdisk.image.gz$ dd if=uramdisk.image.gz of=ramdisk.image.gz bs=64 skip=13、 gunzip解压ramdisk.image.gz 生成ramdisk.image$ gunzip ramdisk.image.gz4、新建挂载目录“ramdisk”,并将ramdisk.image挂载$ sudo mount -o loop,rwramdisk.imageramdisk5、接下来,只需要将ramdisk目录下的内容全部拷贝到rootfs下即可cp -R ramdisk /* rootfs这样就有了自己的rootfs,省去利用busybox制作的麻烦了有了制作好的rootfs,下面就开始制作映像文件了1、创建镜像文件ramdisk8M.image,并设置大小为8M,文件系统格式为ext2$dd if=/dev/zero of=ramdisk8M.image bs=1024 count=8192$mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0$tune2fs ramdisk8M.image -i 0$chmod 777 ramdisk8M.image大小可以按照需要自己调整,但是最好不要超过32M,创建ramdisk目录,将ramdisk8M.image 挂载到该目录下$mkdirramdisk$mount -o loop ramdisk8M.image ramdisk/接下来,只需要将rootfs目录下的内容全部拷贝到ramdisk下即可$cp -R rootfs/* ramdisk注意,这里cp的参数一定是R而非r。
根文件系统的移植

根文件系统的移植1.下载busybox-1.13.4.tar.bz2网址:/2.解压busybox-1.13.4.tar.bz2到桌面[root@localhost Desktop]# tar-xjvf busybox-1.13.4.tar.bz2-C./[root@localhost Desktop]# cd busybox-1.13.4[root@localhost busybox-1.13.4]#3.编辑Makefile文件[root@localhost busybox-1.13.4]# gedit Makefile将CROSS_COMPILE ?=改为CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-将ARCH ?= $(SUBARCH)改为ARCH ?= arm4.进行默认配置[root@localhost busybox-1.13.4]# make defconfig //恢复默认配置5.对配置信息进行修改[root@localhost busybox-1.13.4]# make menuconfigHOSTLD scripts/kconfig/mconfHOSTCC scripts/kconfig/lxdialog/checklist.oHOSTCC scripts/kconfig/lxdialog/inputbox.oHOSTCC scripts/kconfig/lxdialog/lxdialog.oHOSTCC scripts/kconfig/lxdialog/menubox.oHOSTCC scripts/kconfig/lxdialog/msgbox.oHOSTCC scripts/kconfig/lxdialog/textbox.oHOSTCC scripts/kconfig/lxdialog/util.oHOSTCC scripts/kconfig/lxdialog/yesno.oHOSTLD scripts/kconfig/lxdialog/lxdialogscripts/kconfig/mconf Config.in在弹出的TUI界面中进行如下配置:检查Miscellaneous Utilities--->taskset 是否去除同时设置如下:Busybox Settings --->Build Options --->[*]Build BusyBox as a static binry (no shared libs) //选用静态连接[*]Build with Large File Support (for accessing files > 2 GB)(/usr/local/arm/3.4.1/bin/arm-linux-) Cross Compiler prefixInstallation Options --->[*] Don't use /usr(./_install) BusyBox installation prefix //安装路径Busybox Library Tuning --->(6) Minimum password length(2) MD5: Trade Bytes for Speed[*] Faster /proc scanning code (+100 bytes)[ ] Support for /etc/networks[*] Command line editing(1024) Maximum length of input[*] vi-style line editing commands(15) History size[*] History saving[*] Tab completion[*] Username completion[*] Fancy shell prompts //Setting this option allows for prompts to use things like \w and// \$ and escape codes.[ ] Give more precise messages when copy fails (cp, mv etc)(4) Copy buffer size, in kilobytes[ ] Use clock_gettime(CLOCK_MONOTONIC) syscall[*] Use ioctl names rather than hex values in error messages[*] Support infiniband HW设置完毕后,保存、退出。
qt根文件系统制作

Linux-2.6.31交叉编译器版本:arm-linux-gcc 4.1.2操作系统平台:Linux -- Red Hat 9.0开发板平台:QT2440使用的工具:Busybox-1.15.2第一步:创建根文件系统目录,主要包括以下目录:/bin,/etc,/dev,/home,/lib,/mnt,/opt,/proc,/root,/sbin,/sys,/tmp,/usr,/var.建一个名为root 的文件夹mkdir root在该文件夹下创建以上目录mkdir bin etc dev ……………第二步:获取busybox1.15.2 源码,在/downloads/ 找到busybox-1.15.2.tar.bz2这个压缩包,下载,解压:tar xjvf busybox-1.15.2进入源码目录,修改Makefile第164 行,CROSS_COMPILE = arm-linux-第190 行,ARCH = arm执行#make menuconfig进行配置busybox配置完后,执行#make make install然后就会在上一级目录下生成rootfs 文件夹,里面包含几个文件夹/bin /sbin /usr linuxrc把这些文件全部复制到刚建好的root目录下,#cp –rf * ../root第三步:在dev 目录下,创建两个设备节点:#mknod console c 5 1#mknod null c 1 3进入etc 目录,添加文件:拷贝Busybox-1.15.2/examples/bootfloopy/etc/* 到当前目录下。
# cp –r ../../busybox-1.15.2/examples/bootfloopy/etc/* ./包括文件:fstab init.d inittab profile拷贝/etc/passwd, /etc/group, /etc/shadow 到当前目录下。
yaffs2根文件系统的制作

Yaffs2文件系统移植到mini2440现在大部分开发板都可以支持yaffs2 文件系统,它是专门针对嵌入式设备,特别是使用nand flash作为存储器的嵌入式设备而创建的一种文件系统,早先的yaffs仅支持小页(512byte/page)的nand flash,使用yaffs2 就可以支持大页的nand flash。
所谓的根文件系统,就是创建各个目录,并且在里面创建各种文件,比如在/bin,/sbin/目录下存放各种可执行的程序,在/etc目录下存放配置文件,在/lib目录下存放库文件,下面就开始文件系统的移植。
一、准备工作1.Yaffs2源代码的获取在bbb:///node/346可以下载到最新的yaffs2 源代码,如果使用git工具,在命令行输入:就可以下载到yaffs2的源代码,到当前目录下。
2.下载Busybox-1.13.3可以从bbb:///downloads/下载Busybox-1.13.3。
3.下载Yaffs2的整理工具可以到友善之臂的网站下载,mkyaffs2image.tgz,其中解压出来有两个可执行的文件,一个是针对小页的,一个是针对NandFlash大页的,其名字为mkyaffs2image-128M,一开始在这里犯了错误,我的NandFlash是128MB的,可以按照网上用的是mkyaffs2image文件,所以老是出来假坏块的提示,仔细一分析,NandFlash不可能一下子出来这么多的坏块,而且我用他们公司提供的根文件系统却没有任何的问题,所以问题处在了整理Yaffs2的工具上面。
因为这两种大小NandFlash的ECC校验是不一样的,也就是spare区的大小是不一样的,造成了ECC校验出错。
4.链接库整理根文件系统时,要使用到链接库,这里直接使用友善之臂根文件系统中的链接库。
从网站下载root_qtopia.tgz。
使用lib目录下的链接库。
5.给内核打上YAffs2补丁然后进入yaffs2源代码目录执行:#cd yaffs2#./patch-ker.sh c /opt/mini2440/linux-2.6.33.3此时进入linux-2.6.32.2/fs目录,可以看到已经多了一个yaffs2目录。
Buildroot根文件系统构建

Buildroot根⽂件系统构建前⾯我们学习了如何使⽤ busybox 来构建根⽂件系统,但是 busybox 构建的根⽂件系统不其全,很多东西需要我们⾃⾏添加,⽐如 lib 库⽂件。
在我们后⾯的驱动开发中很多第三⽅软件也需要我们⾃⼰去移植,这些第三⽅软件有很多⼜依赖其他的库⽂件,导致移植过程⾮常的繁琐。
本章我们来学习⼀下另外⼀种实⽤的根⽂件系统构建⽅法,那就是使⽤ buildroot 来构建根⽂件系统。
1 何为 buildroot ?1.1 buildroot 简介我们讲解了如何使⽤ busybox 构建⽂件系统,busybox 仅仅只是帮我们构建好了⼀些常⽤的命令和⽂件,像 lib 库、/etc ⽬录下的⼀些⽂件都需要我们⾃⼰⼿动创建,⽽且 busybox 构建的根⽂件系统默认没有⽤户名和密码设置。
在后续的实验中,我们还要⾃⼰去移植⼀些第三⽅软件和库,⽐如 alsa、iperf、mplayer 等等。
那么有没有⼀种傻⽠式的⽅法或软件,它不仅包含了busybox 的功能,⽽且⾥⾯还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。
答案肯定是有的,buildroot 就是这样⼀种⼯具,buildroot⽐ busybox 更上⼀层楼,buildroot 不仅集成了 busybox,⽽且还集成了各种常见的第三⽅库和软件,需要什么就选择什么,就跟我们去吃⾃助餐⼀样,想吃什么就拿什么。
buildroot 极⼤的⽅便了我们嵌⼊式Linux 开发⼈员构建实⽤的根⽂件系统。
从 busybox 开始⼀步⼀步的构建根⽂件系统适合学习、了解根⽂件系统的组成,但是不适合做产品(主要是⾃⼰构建的话会有很多不完善、没有注意到的细节)。
buildroot 会帮我们处理好各种细节地⽅,是我们的根⽂件系统更加的合理、有效。
因此⼤家在做产品的时候推荐⼤家使⽤ buildroot 来构建⾃⼰的根⽂件系统,当然了,类似buildroot 的软件还有很多,⽐如 yocto。
使用ubifs格式的根文件系统

使⽤ubifs格式的根⽂件系统配置内核,使其⽀持ubifs⽂件系统 1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Unsorted block images --->Enable UBI 2)File systems --->Miscellaneous filesystems --->UBIFS file system support制作ubifs格式的根⽂件系统镜像先说明⼀下,板⼦上既有NorFlash,⼜有NandFlash,其中根⽂件系统和应⽤程序放在NandFlash上,uboot和kernel放在NorFlash上,⽽根⽂件系统所在的mtd设备为mtd2,分区⼤⼩为34MiBuboot kernel rootfs=34MiB app./mkfs.ubifs -v -r ./rootfs -o rootfs.img -m 2048 -e 129024 -c 272 -r:制定⽂件内容的位置 -m:页⾯⼤⼩ -e:逻辑擦除块⼤⼩ -c:最⼤的逻辑擦除块数量mkfs.ubifs -m 2048 -e 129024 -c 1984 -o rootfs.ubifs -x none-m 2048 (Minimum input/output unit size: 2048 bytes)-e 129024 (Default UBI LEB size: 129024 bytes, 126.0 KiB)-c 1984 (Amount of eraseblocks: 1984 (260046848 bytes, 248.0 MiB))-o rootfs.ubifs (output file)-x none (no compression)./ubinize -v -o rootfs.ubi -m 2048 -p 128KiB -s 2048 hi.cfg-p:物理擦除块⼤⼩-m:页⾯⼤⼩-s: 最⼩的硬件输⼊输出页⾯⼤⼩,如:k9f1208为256(上下半页访问)配置⽂件hi.cfg如下:[ubifs] mode=ubi image=rootfs.img vol_id=0 vol_size=34MiB vol_type=dynamic vol_alignment=1 vol_name=rootfs vol_flag=autoresize然后修改uboot的环境变量:setenv bootargs 'mem=288M console=ttyAMA0,115200 root=ubi0:rootfs rw rootflags=sync rootfstype=ubifs ubi.mtd=2mtdparts=hi_sfc:5M(boot),1M(picture);hinand:34M(rootfs),8M(config),86M(app)';保存环境变量,执⾏如下命令setenv ipaddr 192.168.253.132;setenv serverip 192.168.253.130;setenv ethaddr 40:61:86:67:33:47;mw.b 82000000 ff 2200000;tftp 82000000 rootfs.ubi;nand erase 0 2200000;nand write 82000000 0 $(filesize);sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000说明:其实从上⾯的烧写命令可以看出,ubifs格式的镜像中是不包含oob信息的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
根文件系统
物联网学院平震宇
根文件系统
根文件系统就是一种目录结构,根文件系统包括Linux启动时所必需的目录和关键性的文件。
例如Linux启动时都需要有init日录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件系统等,根文件系统中还包括了许多的应用程序bin目录等。
基本根文件系统目录构成解析
目录名称含义/bin 存放二进制程序,如:ls,cp
/boot 存放系统启动的一些程序
/dev 存放设备文件
/etc 存放系统配置文件,如:group,profile /home 用户根目录
/lib 存放库文件
/media 媒介的挂载点,如:闪存
/mnt 该目录用来为其他文件系统提供安装点
/opt 不随发行版本一起交付的程序
/proc proc文件系统
/root 超级用户根目录
/sbin 存放超级用户运行的二进制文件
/src 存放一些服务的目录
/sys sys文件系统的目录
/var 存放经常变化的文件,如临时文件等
根文件系统引导过程
BusyBox的init进程会依次进行以下工作
☐为init设置信号处理进程。
☐初始化控制台。
☐剖析inittab文件、/etc/inittab文件。
☐执行系统初始化的命令行。
☐BusyBox在缺省情况下会使用/etc/init.d/rcS命令行。
☐执行所有会导致init暂停的inittab命令。
☐执行所有仅执行一次的inittab命令。
☐一旦完成以上工作,init进程便会循环执行以下工作:
☐执行所有终止时必须重新启动的inittab命令。
☐执行所有终止时必须重新启动但启动前必须先询问过用户的☐inittab命令
根文件系统的基本结构
☐/bin、/dev、/etc、/lib、/proc、/sbin和/usr,都是不可或缺的。
☐为多用户提供可扩展环境的所有目录(例如/home、/mnt、/opt和/root)可以省略。
☐调整根文件系统的时候,我们甚至可以进一步移除/tmp和/var,不过这么做可能会
危害到某些软件的运行。
因此不建议采用这种过于简化的做法。
二进制目录Bin
在根文件系统上,存放二进制文件的目录主要有四个/bin、/sbin、/usr/bin和
/usr/sbin。
二进制文件要放在其中哪个目录,这与它在系统中所扮演的角色
有很大的关系。
如果这是用户和系统管理员必备的二进制文件,就会放在/bin。
如果这是系统管理员必备、但是一般用户根本不会用到的二进制工件,就会放
在/sbin。
相对而言,如果不是用户必备的二进制文件,多半会放在/usr/bin;
如果不是系统管理必备的工具,多半会放在/usr/sbin。
☐至于链接库的摆放位置,也是同样的道理。
系统引导以及执行最基本命令需要的链接库会摆在/lib。
所有其他的链接库则会摆在/usr/lib。
通常,套件安装时,会在/usr/lib中产生子目录,以便摆放它自己的链接库。
☐以Perl 5.x为例,它会产生/usr/lib/perl5目录,里自摆放的都是与Perl有关的链接库和模块。
☐实际的共享链接库
这类文件的文件名格式为libLIBRARY_NAME-VERSION.so其中。
LBRARY_NAME是链接库的名称,VERSION是你使用的链接库的版本编号。
例如,glibc 2.2.3的数学链接库的名称为libm-2.2.3.so。
☐主修订版本的符号链接
主修订版本的编号方式与实际的版本号不同。
以glibc 2.2.3实际的共享C链接库libc-2.2.3.so为例,它的主修订版本编号为6。
相对而言,libdl-2.2.3. so的主修订版本编号为2。
主修订版本的符号链接的名称格式为libLIBRARY_NAME.so.MAJOR_REVISION _VERSION,其中
MAJOR_REVISION_VERSION是链接库的主修订版本编号。
以实际的C链接库为例,其符号链接的名称为libc.so.6。
libdl则是libdl.so.2。
☐与版本无关的符号链接指向主修订版本的符号链接
这些符号链接的主要功能,是为需要链接特定链接库的所有程序提供一个通用的条目,与主修订版本的编号或glibc涉及的版本无关。
这些符号链接典型的格式为libLIBRARY_NAME.so.例如,libm. so指向libm.so.6,libm.so.6指向实际的共享链接库libm-2.2.3.so。
☐静态链接库文件
选择以静态方式链接链接库的应用程序便会使用这些静态库文件。
这些包的文件名格式为IibLIBRARY_NAME.a,例如libdl的静态包文件就是libdl.a。
设备文件目录/dev
☐选择用devfs(设备文件系统)来取代固定的静态设备文件,则可免去寻找设备信息的麻烦。
☐内核源码树的Documentation/devices.txt文档就是静态设备主要和次要编号的正式信包
来源。
☐基本的/dev条目
设备文件目录/dev
文件名说明类型主编号次编号仅限位
mem 物理内存存取字符 1 1 600 null null(黑洞)设备(译注1) 字符集 1 3 666 zero 以null byte(零值字节)为数据来源字符 1 5 666 random 真随机数产生器字符 1 8 644 try0 现行的虚拟控制台字符 4 0 600 tty1 第一个虚拟控制台字符 4 1 600
tlyS0 第一个UART串行端口字符 4 64 600
tty 现行的TTY设备字符 5 0 666
console 系统控制台字符 5 1 600。