a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 60|回复: 0

[综合辅导] Linux认证辅导:Linux根文件系统的制作

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证辅导:Linux根文件系统的制作
( K' E' Q' u6 S1 p1. 根文件系统2 l/ I5 X) i$ z& [
文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。
7 o0 ]% P- F6 `9 a+ X$ k- f5 J注:对于我们应用开发来说,购买开发板的时候,厂家会提供好现成的根文件系统和BootLoader等,如果需要,我们可以改变其中的命令而无需从头开始制作一个新的根文件系统。不过这儿的制作过程可以让我们更深一点理解Linux的文件系统。
3 n( z! m# {/ v4 C$ |2.主要的根文件系统# Z6 r' x( ^. ?- D# T
* Linux 中,rootfs 是必不可少的。PC 上主要实现有 ramdisk 和直接挂载 HD(Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从 HD 启动,而是从 Flash 启动,最简单的方法是将 rootfs load 到 RAM 的 RAMDisk,稍复杂的就是 直接从Flash 读取的 Cramfs,更复杂的是在 Flash 上分区,并构建 JFFS2 等文件系统。
, Q0 y, a; n/ e) Y. m* RAMDisk 将制作好的 rootfs 压缩后写入 Flash,启动的时候由 Bootloader load 到RAM,解压缩,然后挂载到 /。这种方法操作简单,但是在 RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。" K! f" j+ C8 d$ w
ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk通常使用磁盘文件系统的压缩存放在flash中,在系统初始化时,解压缩到SDRAM并挂载根文件系统, 在linux系统中,ramdisk有二种,一种就是可以格式化并加载,在linux内核2.0/2.2就已经支持,其不足之处是大小固定;另一种是 2.4的内核才支持,通过,ramfs来实现,他不能被格式化,但用起来方便,其大小随所需要的空间增加或减少,是目前linux常用的ramdisk技术。
. z* f& c! Z+ a: @1 K. \3 d* initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入了 cpio-initrd,大大简化了 Linux 的启动过程,附合 Linux 的基本哲学:Keep it simple, stupid(KISS)。 不过cpio-initrd 作为新的格式,还没有经过广泛测试,嵌入式 Linux 中主要采用的还是 image-initrd。
1 d* y. U3 o) g* Cramfs 是 Linus 写的很简单的文件系统,有很好的压缩绿,也可以直接从 Flash 上运行,不须 load 到 RAM 中,因此节约了 RAM。但是 Cramfs 是只读的,对于需要运行时修改的目录(如: /etc, /var, /tmp)多有不便,因此,一般将这些目录做成ramfs 等可写的 fs。! f/ @7 j( m% G) p, F+ p* b( A
* SquashFS 是对 Cramfs 的增强。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有优势。不过,据开发者介绍,在性能上可能不如 Cramfs。这也是一种新方法,在嵌入式系统采用之前,需要经过更多的测试。+ R7 J) R9 g$ j0 I: l6 ~* d* |1 W, y+ w
3.Ramdisk制作: Z8 l. o8 l' @# N9 q
RAMDisk的制作方法如下:; e, t! j' J# Y0 @' g! W
(1) 在PC机的Linux操作系统环境下,生成可以虚拟成块设备的文件,假设文件名为init.img。
* y8 s' c% X2 e# Z  o$ dd if=/dev/zero of=init.img bs=4096 count=10242 P" r: q/ M. J1 |6 ?& z
其中bs*count为块设备大小(单位:字节),生成init.img文件以后,还必须对该文件进行格式化。( W! f2 b- G5 Y) t# i8 x  t
$ mke2fs –m0 –F init.img
" @1 O# B7 M0 H" A  C. v(2) 新建一个文件夹ram,并将init.img挂接到ram目录。" x/ v: M$ _2 x: j: x$ n% D: K
$ mkdir ram
) ~) b) B' k* h; ?1 |3 p/ x) W$ mount init.img ram/ -o loop) W" t/ V7 ~2 `  z  \
这时,读写ram目录,等效于读写init.img文件。用户可以将根文系统所需的文件写入到ram目录中。往ram目录写完文件以后,还需要使用umount ram命令卸载init.img,才能将已写入的文件保存到init.img中。7 H6 E5 V8 x& u2 t( c3 A
(3)添加完毕,需要umount ram
+ U" \; `% [/ B
! d8 a( E. {* Y
5 Q/ I' o& l) p! v2 {4. Cramfs制作+ Q1 ?3 x0 e0 }: v* @
CramFS(Compressed Rom File System)是Linux Torvalds在Transmeta任职时,所参与开发的文件系统。它是针对Linux内核2.4之后的版本所设计的一种新型只读文件系统,采用了zlib 压缩,压缩比一般可以达到1:2,但仍可以作到高效的随机读取,Linux系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为Cramfs不会影响系统的读取文件的速度,而且是一个高度压缩的文件系统。因此非常广泛应用于嵌入式系统中。6 s; |. y+ R# M; F4 {' b
在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK方式来使用文件系统,那么在系统运行之后,首先要把Flash上的映像文件解压缩到内存中,构造起RAMDISK环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在Flash中占据了空间(以压缩后的形式存在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在),这违背了嵌入式环境下尽量节省资源的要求。
# t, [( d! j0 q. q" V$ g5 E% Y! u0 F使用CramFS文件系统就是一种解决这个问题的方式。CramFS是一个压缩格式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时候,马上计算出该数据在CramFS中的位置,将它实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS中的解压缩以及解压缩之后的内存中数据存放位置都是由CramFS文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。
- s5 ^' K" e* M3 Q# r但是Cramfs也有其缺点:延迟、小于16MB、不支持写,只支持PAGE_CREATE_SIZE=4096的内核。
3 G% ^1 V+ [* O% Z+ ^! q5 I1 S制作的命令:(root文件夹中存放着文件系统)6 `4 P1 [( T/ k- S; r  G" k5 j! L
#mkcramfs root cramfs.img
3 N4 w8 G0 e/ Y6 o0 m8 u, {5. 其他根文件系统的制作
7 m1 a4 D8 d. Z5 r制作yaffs文件系统: mkyaffsimage myroots myroots.img
! n* U; Y. u7 t' \4 u制作squashfs: mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI
( K/ p. d% Z3 S( I$ B2 [  u5 z6. BusyBox编译以及移植(根文件系统内命令的制作移植)2 ^7 Z7 S8 c$ u3 C" L4 d
建立目标板空根目录文件夹及根目录下的文件夹:
( M, k* r; E& G5 j[root@190 friendly-arm]# mkdir myroots/ M# G4 v6 T: e( \# f/ I) S0 P9 \
[root@190 friendly-arm]#pwd
0 R  ^7 _8 Q& w* O/friendly-arm/myroots& @+ ~" i, }! a* v2 U7 k- _0 d
[root@190 friendly-arm]#cd myroots. u3 b$ o" R" O3 }
[root@190 myroots]# mkdir bin sbin usr lib dev mnt opt root etc home proc tmp var
1 p, N: f7 m* h6 o0 N0 o3 t[root@190 myroots]# mkdir etc/init.d  S' C5 o; G: _: L! {6 N
进入etc/init.d目录下,建立一个脚本文件,并命名为rcS,用gedit打开,添加如下内容:1 m% }) ~8 m  p7 u) V0 R
#! /bin/sh
8 a: i- _3 R# P' _1 L6 PPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:0 m) D6 Z. v% d" X! m% b
runlevel=S& Q* k# H$ O- r- \$ I) v
prevlevel=N
  K) l2 e4 N. I/ P, E3 f! B5 ^umask 022
2 u& Y8 S  k# {. ]' n& }export PATH runlevel prevlevel; J8 X0 ^2 B  P: d, @8 ]  g- h5 H
#& ^" p' {% Q! g# f: G$ B6 g
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.) B1 @2 U8 t* y0 w0 i4 ]' y
#; w% @2 u$ l1 Q+ V
trap “:” INT QUIT TSTP
7 M& p! B" F1 z9 {; N创建 dev 中的节点5 A. X; C# n/ c! ?
如果使用“linux 2.6.xx”的内核,应该事先创建节点“console”、“null”。否则在系统启动时内容会提示以下错误:1 T! s" ?9 _3 Q
Warning: unable to open an initial console.Kernel panic - not syncing: Attempted to kill init!
1 T6 |) W  |# D创建节点的命令如下:, G: q& r2 \) `/ y4 g, p8 t5 q
# mknod dev/console c 5 1# mknod dev/null c 1 3
  g2 W/ _! }( t0 k9 I0 t移植Busybox:' K* O: H% {  C: [& O7 ~
进入到压缩文件存放的目录下,并解压。然后进入解压后的busybox目录文件夹,随后配置busybox 。* ?7 r* H5 a. ?5 K
[root@190 busybox-1.2.0]# make menuconfig
8 M. Y2 m+ f- J0 |% H2 C由于每个版本的配置选项组织有所不同。不管怎样,我们注意以下选项就行了:
1 N- R2 c% [) B3 y1) Support for devfs7 X# C" e7 R% k7 }- f$ |
2) Build BusyBox as a static binary ( no shared libs ) //将busybox编译成静态链接
9 d1 V9 d( U1 k! _% j. T) p: l3 a3) Do you want to build busybox with a Cross Compile?9 H+ n+ f3 s0 m: b. }4 O
(/usr/local/arm/3.3.2/bin/arm-linux-) Cross Compile prefix //指定交叉编译器
  W0 j: L3 \8 q  \, a4) init
, j6 U7 Q# G6 D7 ~0 f% Y' T* x9 O7 r5) Support reading an inittab file //支持init读取/etc/inittab 配置文件4 l3 L1 z0 V0 A3 X
6) (X) ash选中ash //建立的rcS脚本才能执行
7 Y0 P9 w6 a) v$ F6 J3 ?7)ash
6 I& n4 g6 b5 \1 U: [3 n3 H8)cp cat ls mkdir mv //可执行命令工具的选择,自己看着办吧,需要用到的就选上, z, O3 A( \- Z4 y! q0 k
9) mount
# N' O, z1 z3 s7 |10) umount
* G. `! a& o% |# Y4 D11) Support loopback mounts% l9 x" C4 X8 d2 j& U; X
12) Support for the old /etc/mtab file" l* m) |, ?5 [+ h
13) insmod
5 G% P9 i6 F' s( {4 ]  W9 R' R14) Support version 2.2.x to 2.4.x Linux kernels
+ {7 x+ O  E( U15) Support version 2.6.x Linux kernels
9 D) ]4 @' |2 e8 |/ [; I16) vi
6 \# T' W% F7 Y0 P7 |0 z17)don’t use user; }4 ]# G2 V. [  ]: h! F
以上内容必须选上,其他可按默认值;如果要支持其他功能,如网络支持等,可按需选择,英语不是很烂的话,这些都没有问题。. E4 I( D7 P# |5 r1 _
配置好之后,保存退出。然后对其编译和安装到刚才建立的根文件系统目录下:' b) {  y9 D+ ?* M! i) |3 I- ?
[root@190 busybox-1.2.0] make TARGET_ARCH=arm CROSS=arm-linux- \ PREFIX=/friendly-arm/myroots/ all install, \! e# y5 b; I- C! X  \
安装好之后,将相应的二进制文件拷贝到根文件系统相应的目录下:
0 S1 h3 x0 \1 k2 k5 G  O* 拷贝一些管理员控制程序到/sbin目录下,最重要的就是要包含一个init命令;
( v0 r: n0 L8 j1 Z+ ~: ]# P* 拷贝应用程序运行时所需要的库到/lib,库文件可以从PC机上的交叉编译工具安装目录下拷贝,如libc-2.2.2.so、libcryt-2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so等,为部分相应库建立快捷方式,提供一些应用程序按快捷方式名称调用。值得注意的是C库要采用C库的版本glibc, glibc位于/lib/libc.so.6
/ B/ v: j6 ^, F$ m- y* u5 T这儿(http://blog.chinaunix.net/u1/34474/showart_485837.html)有一篇写的比较好的博文可以借鉴。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-17 21:17 , Processed in 0.240242 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表