如何在根linux使用的文件系统统中使用modprobe

查看: 1427|回复: 3
基于 SquashFS 构建 Linux 可读写文件系统
论坛徽章:349
[size=0.76em]嵌入式 Linux 启动过程[size=0.76em]本文所描述的的 Linux Image 由 BootLoader、kernel、initrd、rootfs 组成,它们共同存在于一个可以启动的存储设备中(本文以 USB 为例)。组成架构如下:
图 1. 可启动 linux 镜像文件结构
[size=0.76em]各个模块的作用如下:Boot Loader:由 BIOS 加载,用于将后续的 Kernel 和 initrd 的装载到内存中kernel:为 initrd 运行提供基础的运行环境initrd:检测并加载各种驱动程序rootfs:根文件系统,用户的各种操作都是基于这个被最后加载的文件系统
[size=0.76em]其调用顺序是 Boot Loader-&kernel-&initrd-&rootfs。[size=0.76em]当机器上电时首先 BIOS 会启动,然后装载 USB 设备中的 Boot Loader、kernel,、nitrd 到内存中,由于这些文件大小总和小于 10M,所以我们直接拷贝到内存中再执行不会有问题。[size=0.76em]最后要加载的 rootfs 是用户最终进行读写操作的文件系统。在非嵌入式系统中,这部分文件通常储存在可直接读写的硬盘上,因此直接挂载到根目录后(例如:mount /dev/sda1 /mnt)就可以进行读写操作。在嵌入式系统中,它是一个压缩的文件系统,大小通常是好几百兆,解压后的大小都超过 1G,如果直接 mount 到系统目录,那么系统目录是只读的,不可进行写入操作。而如果把它加压到内存中可以实现读写的操作,但是这么大的文件直接解压到内存中对于嵌入式设备来说是不可接受的。因此我们需要找到一种不拷贝 rootfs 到内存中,同时又可以对最终的根文件系统进行读写的方法。
[size=0.76em]只读式压缩文件系统介绍[size=0.76em]在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用 RAMDISK(把内存当作 disk)方式来使用文件系统,那么在系统运行之后,首先要把外存 (Flash) 上的映像文件解压缩到内存中,构造起 RAMDISK 环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在外存中占据了空间 ( 以压缩后的形式存在 ),而且还在内存中占用了更大的空间 ( 以解压缩之后的形式存在 ),这违背了嵌入式环境下尽量节省资源的要求。以下两种方案的诞生就是为了解决这个问题:[size=0.76em]CramFS[size=0.76em]CramFS 文件系统是专门针对闪存设计的只读压缩的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时侯,马上计算出该数据在 CramFS 中的位置,将其实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS 中的解压缩以及解压缩之后的内存中数据存放位置都是由 CramFS 文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。[size=0.76em]SquashFS[size=0.76em]SquashFS 也是一个只读的文件系统,它可以将整个文件系统压缩在一起,存放在某个设备,某个分区或者普通的文件中。如果您将其压缩到一个设备中,那么您可以将其直接 mount 起来使用,而如果它仅仅是个文件的话,您可以将其当为一个 loopback 设备使用。[size=0.76em]更多信息请参考“”和“”。[size=0.76em]本文主要介绍基于 SquashFS 的可读写文件系统构建。
论坛徽章:349
Squash 压缩文件系统的创建
&下载并安装 Squash 工具&
步骤 1:创建空的根文件系统,文件系统的大小为 65536 × /G。接下来我们会在这个空的根文件系统中存放文件。
dd: 读取源文件的内容并创建一个新文件,if 指定源文件内容,of 指定新文件名字,bs 和 count 指定新文件的大小
mke2fs: 将新创建的 rootfs 格式化为 Linux 可识别的文件系统
清单 1. 创建空的根文件系统
& & & & & & & & & & & & & & & &
dd if=/dev/zero of=rootfs bs=65536 count=24000
mke2fs -F rootfs
步骤 2:挂载空的根文件系统,将 1.5G 的文件系统挂载在 mnt 目录下,然后通过 mnt 目录将内容写入根文件系统。
清单 2. 挂载空的根文件系统
& & & & & & & & & & & & & & & &
mount rootfs mnt -o loop
步骤 3:拷贝根文件目录的内容到文件系统
清单 3. 拷贝根文件目录统
& & & & & & & & & & & & & & & &
cp -rp yourRootDir mnt
umount mnt
拷贝完后根文件系统的内容,如图 2 所示:
图 2. 根文件系统内容
步骤 4:完成根文件系统的创建,这时的 rootfs 没有被压缩,接下来我们用工具将其压缩成 Squash 格式的文件系统
mksquashfs-4.1 是在安装 Squash 工具的过程中生成的命令,用于将一个文件夹下的内容打包并压缩成一个文件系统。其后第一个参数为文件夹,第二个参数为生成的文件系统。
清单 4. 创建根文件系统
& & & & & & & & & & & & & & & &
mkdir squashfs-dir
mv rootfs squshfs-dir
mksquashfs-4.1 squashfs-dir squashRootfs
到这里我们就完成了 Squash 压缩文件系统的创建。接下来我们将讨论如何在 Linux 启动的过程中加载这个压缩文件系统。
论坛徽章:349
[size=0.76em]加载 Squash 压缩文件系统[size=0.76em]可读写文件系统原理如图 3 所示:
图 3. 可读写文件系统原理
[size=0.76em]squashRootfs 里面存储了我们原始的根文件系统,我们在根文件系统中所有的写操作会直接写入 cowfile.out(cow:copy-on-write), 当我们读取根文件系统时,如果读取的内容没有变化,将直接从 squashRootfs 中读取,如果读取的内容被更新过,将从 cowfile.out 中读取。cowfile.out 文件的大小一般要比 squshRootfs 小,如果 cowfile.out 被写满,根文件系统的读写操作将会出错,因此有必要给 cowfile.out 设置一个合理的大小以防止被写满。[size=0.76em]由于 rootfs 是被 initrd 加载的,因此我们需要在 initrd 里面加入装载 rootfs 的代码。initrd 整个的执行过程是调用 /sbin/init 这个脚本文件,因此我们在这个脚本的最后加入以下代码逻辑即可。注释:[size=0.76em]
1. dm-mirror 为 device mapper 工作所需要的驱动
2. mknod: 创建一些设备文件,参数 1:设备文件名 参数 2:设备类型 参数 3:主设备号 参数 4:次设备号
3. 将 squashRootfs 通过 loop 设备的形式挂载在目录 /realroot/mnt/ 下
4. 将 /realroot/mnt/rootfs 设置为 loop 设备,并和 /dev/loop1 绑定
5. &|&之前的部分是构建 dmsetup 的参数,其中 $(blockdev --getsize /dev/loop1) 表示创建镜像文件的大小,/dev/loop1 /dev/loop2 表示镜像文件是以 /realroot/mnt/rootfs 和 /realroot/mnt/cowfile.out 为蓝本进行创建的(在前面的操作中 loop1 和 loop2 分别进行了绑定操作)
清单 5. 构建可读写文件系统脚本
& & & & & & & & & & & & & & & && & # 加载驱动 ,参见注释 1& &modprobe dm-mirror& && & # 创建设备 ,参见注释 2& &mknod /dev/zero c 1 5& & mknod /dev/loop0 b 7 0& & mknod /dev/loop1 b 7 1& & mknod /dev/loop2 b 7 2& & mkdir /dev/cow& & mknod /dev/cow/ctl b 241 255& & mknod /dev/cow/0 b 241 0& && & # 挂载 squash 根文件系统,挂载完后您可以在 /realroot/mnt/ 下找到 rootfs 文件 ,参见注释 3& &mount /realroot/mnt/squashRootfs /realroot/mnt/ -o loop& && & # 设置 rootfs 为 loop 设备 ,参见注释 4& &losetup /dev/loop1 /realroot/mnt/rootfs& && & # 创建 cowfile.out 并挂载为 loop 设备,我们将来的写操作都会写入 cowfile.out& & dd if=/dev/zero of=/realroot/mnt/cowfile.out bs=2K count=137500& & losetup /dev/loop2 /realroot/mnt/cowfile.out& && & # 将 /realroot/mnt/rootfs 和 /realroot/mnt/cowfile.out 结合起来创建一个逻辑根文件设备,& &# 设备文件为 /dev/mapper/root_fs,,参见注释 5& &echo &0 $(blockdev --getsize /dev/loop1) snapshot /dev/loop1 /dev/loop2 p 64& |& & dmsetup create root_fs& && & # 将上面创建的逻辑根文件设备 /dev/mapper/root_fs 挂载就可以看到一个可读写的根文件系统& &mount /dev/mapper/root_fs /realroot/mnt/Image& && & # 切换到最终可读写的根文件系统& &cd /realroot/mnt/Image& & chroot ./sbin/init -i
[size=0.76em]加下来您就可以看到 rootfs 的所有内容,如图 4 所示:
图 4. 被挂载的根文件系统内容
[size=0.76em]还可以在这个文件系统中进行写操作,如图 5 所示:
图 5. 根文件系统的写操作
[size=0.76em]最重要的是 rootfs 没有被拷贝到内存中。
论坛徽章:349
由于篇幅的限制,本文只给出了基本的描述。希望有更一步了解的读者可以通过对以下 linux 命令的学习来深入了解。
构建 Squash 压缩文件系统构所使用的主要命令:
mksquashfs:创建 Squash 压缩文件系统
使用 Squash 压缩文件系统构所使用的主要命令:
mknod:创建 Squash 压缩文件系统
losetup:设置并控制 Loop 设备
chroot:改变根目录
dmsetup:低水平逻辑卷管理
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 84, 距离下一级还需 116 积分
论坛徽章:0
不知道哪位仁兄遇到过此问题
最近升级内核,并做些栽剪,使系统效率更高些
我在VM虚拟机和PC机上测试,都正常,到了真实服务器(DELL 1750)上就不行了,
启动加载内核文件时出现错误并挂起:request_module:runaway loop modprobe binfmt-464c
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 0, 距离下一级还需 200 积分
论坛徽章:0
编译新的busybox,必须在Makefile中指定ARCH=arm,如果只是在编译的时候指定
make CROSS_COMPILE=arm-linux- ARCH=arm
那么make install的时候会重新编译,得到的busybox是i386架构的,从而导致cp生成的cmd到rootfs处时,系统启动时候会提示: request_module: runaway loop modprobe binfmt-464
白手起家, 积分 2, 距离下一级还需 198 积分
论坛徽章:0
request_module: runaway loop modprobe binfmt-464
我的开发板cpu 是ARM9,在编译时make CROSS_COMPILE=arm-linux- ARCH=arm
在加载JFFS2根文件系统的时候出现如下错误:request_module: runaway loop modprobe binfmt-464
大富大贵, 积分 10160, 距离下一级还需 9840 积分
论坛徽章:0
路过帮顶。
我也想学习一下到底是为什么。
binfmt-464是什么模块?
白手起家, 积分 12, 距离下一级还需 188 积分
论坛徽章:0
hanyunsheng_198 发表于
我的开发板cpu 是ARM9,在编译时make CROSS_COMPILE=arm-linux- ARCH=arm
在加载JFFS2根文件系统的时候 ...
有没有解决的方法啊??
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处您的位置: >
AUFS 联合文件系统 - 基于USB接口的微型桌面Linux系统设计
日 11:13 来源:本站整理 作者:秩名 (0)
  3.4 AUFS 联合文件系统
  AUFS( Another UnionFS 的缩写), 是一个与UnionFS 类似的可堆叠联合文件系统,它将多个目录整合成单一的目录,是Linux 文件系统联合挂载的实现。
  SquashFS 压缩系统是只读的,从而避免了对磁盘不必要的擦写,但同时也造成了修改数据不能保存的问题。
  AUFS 的出现正好解决了上述问题,它管理一个基本文件系统(即本文中的系统Squashfs 镜像,保持原只读状态)和一个读写存储文件系统(必须具有读写权限)。通过AUFS,用户可以虚拟地修改基本文件系统上的文件,但修改后的结果却保存在读写存储文件系统中,从而实现了数据的透明修改。
  3.5 Initrd 初始化内存盘
  Initrd(boot loader Initialized RAM Disk 的缩写),由boot loader 初始化。本系统使用的boot loader 为GNU GRUB 0.97.如果Grub 已配置Initrd,Linux 内核在启动前,会把存储设备中的Initrd 文件加载到内存,作为一个临时根文件系统;内核启动时通过先执行Initrd 中的init 文件,完成设备驱动模块和squashsf、aufs 文件系统模块的加载,并完成真正的根文件系统的挂载,然后执行系统中的/sbin/init 进程。
  与普通IDE、SATA 硬盘相比,USB 接口存储设备从驱动模块加载到设备可用,比较慢,需要几秒钟。
  因此内核在挂载USB 存储设备时,会出现:USB 设备没有初始化完成,真正根文件系统挂载失败的问题。为了解决此问题,笔者在Initrd 中修改init 可执行文件,当加载USB 驱动后,系统将休眠5 秒,让USB 设备初始化完成后再挂载USB 存储设备中的根文件系统。本系统的init 文件配置如下:
  本系统Initrd 中的最小化根文件系统由BusyBox创建,包含bin、dev、etc、lib、mnt、proc、sbin、sys这些必须的目录和相关文件。由于 BusyBox 生成的modprobe 命令不能正常执行,所以需要复制宿主系统中的modprobe 命令并替换Initrd 中的sbin 目录中的同名文件,同时通过ldd 查看modprobe 依赖的库文件,并复制到Initrd 中的lib 目录。
  最后在宿主机器上通过命令:
  find 。 | cpio &o &H newc | gzip 》 /boot/initrd.img-2.6.27.27 制作Initrd 镜像文件。
  3.6 Grub 启动引导器
  GNU GRUB (GNU GRand Unified Bootloader 的缩写),是GNU 项目中一个多操作系统启动引导程序,也是Linux 系统中最常用引导工具之一。为了让系统从USB 设备启动,必须将GRUB 程序安装在USB 存储设备的主引导记录(MBR)中。
  以GRUB 0.9X 的安装步骤如下:
  安装grub 程序在U 盘的/boot/grub 目录下,确保其目录存在menu.lst,stage1,stage2 三个文件。
  进入grub 命令窗口,运行以下命令安装到U 盘的MBR:
  grub》root(hd1,0) #假定Linux 系统所在盘符为第二块硬盘的第一个分区
  grub》setup(hd1)
  实际操作时根据硬盘分区不同作相应修改。
  修改/boot/grub/menu.lst 文件,本文的menu.lst 如下:
  3.7 Xfce 桌面环境
  Xfce 是一款适用于多种*NIX 系统上运行的轻量级桌面环境,它的设计目的是在节省系统资源的情况下能够快速加载并执行应用程序。与Gnome 和KDE等比较臃肿的桌面环境相比,Xfce 占用的系统资源少,同时它拥有很小的依赖性和很好的模块性。本系统所用的Xfce 4.6.2 主要由实用工具libxfce4util、微件库libxfcegui4、扩展库exo、菜单库libxfce4menu、窗口管理xfwm4、桌面管理 xfdesktop、面板xfce4-panel、会话管理xfce4-session、设置管理xfce4-settings、配置管理xfconf、文件管理thunar、实用程序xfce-utils、应用程序查找xfce4-appfinder 等部件构成。
相关技术文章:
相关资料下载:
技术交流、我要发言
发表评论,获取积分! 请遵守相关规定!提 交
Linux系统业界动态
Linux系统技术应用
Linux系统资料下载
移动存储设备技术应用下次自动登录
现在的位置:
& 综合 & 正文
在linux的PC上挂载jffs2根文件系统映像
我们在调试硬件板时,经常需要做多个jffs2的根文件系统映像,有时也要对比其他途径得到的可用的jffs2根文件系统映像。
但jffs2的文件系统映像不象光盘的映像文件一样可以通过loop设备来挂载,总不可能一个个烧录到硬件板去看吧。
后来到网上google了一把,左翻右翻之后总算找到了一个方法。因为jffs2是构建于MTD设备上的文件系统,所以无法
通过loop设备来挂载,但是可以通过mtdram设备来挂载。mtdram是在用RAM实现的MTD设备,可以通过mtdblock
设备来访问。使用mtdram设备很简单,只要加载mtdram和mtdblock两个内核模块即可。这两个内核模块一般的linux
内核发行版都有编译好的,直接用modprobe命令加载。
下面是在Fedora core 6环境下使用mtdram设备挂载jffs2根文件系统映像的具体步骤:
1.加载mtdblock内核模块
[root@localhost ~]# modprobe mtdblock
2.加载mtdram内核模块,将该设备的大小指定为jffs2根文件系统映像的大小,块擦除大小(即flash的块大小)指定为制作该jffs2根文件系
统时“-e”参数指定的大小,缺省为64KB。下面两个参数的单位都是KB。
[root@localhost ~]# modprobe mtdram total_size=49152 erase_size=128
3.这时将出现MTD设备/dev/mtdblock0,使用dd命令将jffs2根文件系统拷贝到/dev/mtdblock0设备中。
[root@localhost prebuilt_bin]# dd if=rootfs.jffs2_zylonite_qvga of=/dev/mtdblock0
98304+0 records in
98304+0 records out
bytes (50 MB) copied, 1.98391 seconds, 25.4 MB/s
4.将保存了jffs2根文件系统的MTD设备挂载到指定的目录上。
[root@localhost prebuilt_bin]# mount -t jffs2 /dev/mtdblock0 /mnt/mtd
这之后就可以到/mnt/mtd目录查看、修改挂载的jffs2根文件系统了,修改后的jffs2根文件系统可以通过dd命令拷贝为一个jffs2的映像文件。
本文来自ChinaUnix博客,如果查看原文请点:
&a href="URL"&&/a&
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 使用iso文件安装系统 的文章

 

随机推荐