114网址导航服务***:400-702-1168 ()
您好,访客
||||||||||
详细解析:如何制作嵌入式Linux文件系统【转载】
发布时间: 18:58:00&&来源:
ChinaUnix博客 &&作者:
ChinaUnix博客 &&点击:363
一、什么是文件系统 (Filesystem)
A directory structure contained within a disk drive or disk area.
The total available disk space can be composed of one or more
filesystems. A filesystem must be mounted before it can be accessed. To
mount a filesystem, you must specify a directory to act as the mount
point. Once mounted, any access to the mount point directory or its
subdirectories will access the separate filesystem.
文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它
设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。
二、主要嵌入式采用的文件系统
* Linux 中,rootfs 是必不可少的。PC 上主要实现有 ramdisk 和直接挂载 HD(Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从 HD 启动,而是从
启动,最简单的方法是将 rootfs load 到 RAM 的 RAMDisk,稍复杂的就是 直接从
读取的 Cramfs,更复杂的是在
上分区,并构建 JFFS2 等文件系统。
* RAMDisk 将制作好的 rootfs 压缩后写入 Flash,启动的时候由 Bootloader load
到RAM,解压缩,然后挂载到 /。这种方法操作简单,但是在 RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。
ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk通常使用磁盘文件系统的压缩存放在flash中,在系统初始化时,解压缩到SDRAM并挂载根文件系统, 在
系统中,ramdisk有二种,一种就是可以格式化并加载,在
内核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下面(最省事的做法);或者使用mknod来自己建所需要的device,我自己用的如下:
crw-rw-rw- 1 root root 5, 1
13:12 console
crw-rw-rw- 1 root root 5, 64
13:12 cua0
crw-rw-rw- 1 root root 63, 0
crw-rw-rw- 1 root root 63, 1
drwxr-xr-x 2 root root 40Array6
13:12 flash
brw-rw-rw- 1 root root 3, 0
crw-rw-rw- 1 root root 36, 10
13:12 ipsec
crw-rw-rw- 1 root root 241, 0
13:12 ixNpe
crw-rw-rw- 1 root root 1, 2
13:12 kmem
crw-rw-rw- 1 root root 126, 0
13:12 ledman
lrwxrwxrwx 1 root root 16 2007-0Array-1Array 14:08 log -& /tmp/var/log/log
crw-rw-rw- 1 root root 1, 1
crw-rw-rw- 1 root root Array0, 0
13:12 mtd0
brw-rw-rw- 1 root root 31, 0
13:12 mtdblock0
brw-rw-rw- 1 root root 31, 1
13:12 mtdblock1
brw-rw-rw- 1 root root 31, 2
13:12 mtdblock2
brw-rw-rw- 1 root root 31, 3
13:12 mtdblock3
brw-rw-rw- 1 root root 31, 4
13:12 mtdblock4
brw-rw-rw- 1 root root 31, 5
13:12 mtdblock5
brw-rw-rw- 1 root root 31, 6
13:12 mtdblock6
crw-rw-rw- 1 root root Array0, 1
13:12 mtdr0
crw-rw-rw- 1 root root 1, 3
13:12 null
crw-rw-rw- 1 root root 108, 0
crw-r??r?? 1 root root 5, 2 Array 15:56 ptmx
drwxr-xr-x 2 root root 40Array6 Array 15:56 pts
crw-rw-rw- 1 root root 2, 0
13:12 ptyp0
brw-rw-rw- 1 root root 1, 0
13:12 ram0
crw-rw-rw- 1 root root 1, 8
13:12 random
crw-rw-rw- 1 root root 5, 0
crw-rw-rw- 1 root root 4, 0
13:12 tty0
crw-rw-rw- 1 root root 3, 0
13:12 ttyp0
crw-rw-rw- 1 root root 4, 64
13:12 ttyS0
crw-rw-rw- 1 root root 1, Array
13:12 urandom
crw-rw-rw- 1 root root 1, 5
13:12 zero
举例: mknod console c 5 1 这样 crw-rw-rw- 1 root root 5, 1
13:12 console
5。将编译好的busybox拷贝到/bin下面,除了busybox外,所有其他的命令都是他的link
ash chgrp clear dd echo fgrep gzip ip ls modprobe mv ping pwd sed
stty tar true zcat busybox chmod cp df egrep grep hostname kill mkdir
more netstat ping2file rm sh sync tftp umount cat chown date dmesg
false gunzip ifconfig ln mknod mount pidof ps rmdir sleep sysinfo touch
所有的命令你可以在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下面放着所有编译完的可执行文件,具体就不多说了
Array。非常重要之/lib,务必重视
找到你编译环境的target目录,把需要的lib文件先用strip压?(非target目录下的,而已编译环境提供的strip),先把最基本的libc, ld等等,必须同样做跟target/lib里面一样的link。
然后根据特定的应用加相应的lib,不要把不用的加进去,lib比较占空间。
10。在/etc下面加上需要的配置文件,最最重要的是rcS
#!/bin/sh
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/scripts
UTC=yes
mount -n -t proc proc /proc
mount -n -t ramfs ramfs /tmp
mount -n -t devpts devpts /dev/pts
# build var directories
/bin/mkdir -m 0777 /tmp/var
/bin/mkdir -m 0777 /var/lock
/bin/mkdir -m 0777 /var/log
/bin/mkdir -m 0777 /var/run
/bin/mkdir -m 0777 /var/tmp
#/bin/mkdir -m 0777 /tmp/etc
#/bin/cp -a /usr/etc/* /etc
#/bin/cp -a /usr/dev/* /dev/
# loads the NPE ethernet modules into the kernel.
insmod /lib/modules/2.6.13.2/intel/ixp400.ko
# Firmware code for NPE Engine.
cat /etc/IxNpeMicrocode.dat & /dev/ixNpe
insmod /lib/modules/2.6.13.2/intel/ixp400_eth.ko netdev_max_backlog=500
insmod /lib/modules/led.ko
insmod /lib/modules/push_button.ko
下面的具体应用没有再举例加上了,这个是系统init必须的。
其他的情况类似如此了,下面里面给了一个lunksys的GPL项目的target。
四、生成一个ramdisk
#!/bin/sh
MODULE_NAME=ramdisk
RAMPATH=`pwd`
TMPPATH=${RAMPATH}/tmp
SOURCE=${RAMPATH}/……/target
if [ ! -d ${TMPPATH} ]
mkdir ${TMPPATH}
if [ `whoami` != ’root’ ]
then {
echo &You should run the shell as root, Please rerun as a root.&
echo &Aborting.&
exit 1
# Clear in tmp path
rm -rf ${TMPPATH}/tmpmnt
rm -rf ${TMPPATH}/ramrootfs
mkdir ${TMPPATH}/tmpmnt
# Clear the old ramdisk
rm -f ${RAMPATH}/$MODULE_NAME
# Make a temp file which size is suitable
dd if=/dev/zero of=${TMPPATH}/ramrootfs bs=1k count=6144
# Create a ext2 filesystem
mke2fs -F -m 0 -i 2000 ${TMPPATH}/ramrootfs
# Mount it to tmpmnt/
mount -o loop -t ext2 ${TMPPATH}/ramrootfs ${TMPPATH}/tmpmnt
# Copy everything from kernel to this.
cd ${TMPPATH}/tmpmnt
echo ${SOURCE}
cp -av ${SOURCE}/* .
cd ${TMPPATH}
# Unmount it the ext2 filesystem
umount ${TMPPATH}/tmpmnt
cat ${TMPPATH}/ramrootfs | gzip -Array & /${RAMPATH}/ramdisk
echo Copying ramdisk image to ${RAMPATH}
这里给出一个自动生成脚本!
五、生成一个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方面,请大家多注意这两方面。
& & & & & & & &
& & & & & & & &
& & & & & & & &
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/554Array3/showart_445417.html
以上内容由
搜集整理,如转载请注明原文出处,并保留这一部分内容。
“华夏名网”
是成都飞数科技有限公司的网络服务品牌,专业经营虚拟主机,域名注册,VPS,服务器租用业务。公司创建于2002年,经过6年的高速发展,“华夏名网”已经成为我国一家知名的互联网服务提供商,被国外权威机构评价为十大IDC服务商之一。
华夏名网网址导航:
上一篇:下一篇:
(4915次点击) (2767次点击) (4157次点击) (2792次点击) (2365次点击) (3724次点击) (3565次点击) (2358次点击) (2528次点击) (2437次点击)
(3413次点击) (3231次点击) (3242次点击) (3988次点击) (2403次点击) (2318次点击) (3208次点击) (3615次点击) (2348次点击) (2331次点击)
&2002- 飞数科技 版权所有
***总机:028-91 94
公司地址:四川省成都市青龙街51号倍特康派大厦10楼5号lilin9105 的BLOG
用户名:lilin9105
文章数:105
评论数:118
访问量:145718
注册日期:
阅读量:5863
阅读量:12276
阅读量:328457
阅读量:1036456
51CTO推荐博文
本文参考《嵌入式linux应用开发完全手册》部分内容mdev是udev的简化版本,它也是通过读取内核信息来创建设备文件一、mdev的用途: & 1、 初始化/dev目录、动态更新 & & & &1.1、动态更新不仅是更新/dev目录,还支持热插拔,即支持接入卸下设备时执行某些动作,insmod自动创建/dev/***(class_create,class_device_create要自动创建设备必须依赖udev或mdev)二、配置init脚本自动运行命令1、busybox文件目录中/doc/mdev.txt中写到Here's a typical code snippet from the init script:/*/etc/init.d//rcS*/
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev & /proc/sys/kernel/hotplug
[3] mdev -s
Of course, a more "full" setup would entail executing this before the previous
code snippet:
[4] mount -t tmpfs mdev /dev
[5] mkdir /dev/pts
[6] mount -t devpts devpts /dev/pts & &所以在/etc/init.d/rcS 配置如下#!/bin/sh
ifconfig eth0 192.168.1.17
mkdir /dev/pts
#使用内存文件系统,减少对flash的读写
mount -t devpts devpts /devpts
#/dev/pts用来支持外部网络链接(telnet:远程访问摄像头)的虚拟终端
echo /sbin/mdev & /proc/sys/kernel/hotplug
#设置内核,当有设备插拔时调用/bin/mdev程序
mdev -s #在/dev目录下生成内核支持的所有设备的节点2、在busybox文件目录中/doc/mdev.txt还有如下关键说明The simple explanation here is that
[1] you need to have /sys mounted before executing mdev.
[4] make sure /dev is a tmpfs filesystem (assuming you're running out of flash).
Then you want to [5] create the /dev/pts mount point and finally [6] mount the devpts filesystem on it & &所以要修改/etc/fstab来自动挂载文件系统,修改etc/init.d/rcS加入要自动运行的命令。/etc/fstab
mount-point
fsck order
0三、s3c2410、s3c2440的串口名是s3c_2410_serial0、s3c_2410_serial1、s3c_2410_serial2,而不是ttySAC0、ttySAC1、ttySAC2。需要修改/etc/inittab文件# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r扩展1: & &1、linux有几种虚拟的文件系统类型(只存在于内核,在物理内存不存在,不过我们可以用挂载的方式将它在物理内存上进行映射,如mount-t proc proc /将cpu,mem等信息挂载在硬盘中),比如proc,sysfs,tmpfs,root & &2、proc是内核用的文件系统,用于显示内核信息及改变内核参数; & &3、sysfs文件系统用来管理和显示各种设备的运行参数及设备的层次结构。//能减少对flash的对写 & &4、tmpfs:能解决临时的设备(/dev)或文件(/tmp)访问速度慢的缺点。//由于原来/dev的是devfs文件系统 & & & &4.1、是一种虚拟内存文件系统 & & & &4.2、最大的特点就是它的存储空间在VM(virtual memory)里面 & & & &4.3、VM由RM+Swap两部分组成,因此tmpfs最大的存储空间可达(The size of RM + The size of Swap) & & & &4.4、对于tmpfs本身而言,它并不知道自己使用的空间是RM还是Swap,这一切都是由内核的vm子系统管理的 & & & &4.5、tmpfs默认的大小是RM的一半,假如你的物理内存是128M,那么tmpfs默认的大小就是64M & & &4.6、使用:mount -t tmpfs -o size=20m tmpfs /mnt/tmp & & &4.7、断电或者你卸载它之后,数据就会立即丢失 & & &4.8、tmpfs使用的是VM,因此它比硬盘的速度肯定要快,由于没有挂载之前/tmp目录下的文件也许正在被使用,因此挂载之后系统也许有的程序不能正常工作。没有关系,只要在/etc/fstab里面加上下面的语句:tmpfs /tmp tmpfs size=2m 0 0;重启电脑之后就一切OK了。扩展2:/etc/fstab 的用途/etc/fstab 是设定分割区分 mount 目录相关的档案,开机时会依这个档案的內容 mount 档案系統,mount 档案系統的命令为: & &linux# mount -av & &会依 /etc/fstab 的內容 mount 进"除了 root 以外的所有档案系統"。 & &root 是在开机时由核心所 mount 进來的。root 先由核心 mount 成 read-only,然后由使用者手动 remount 成 read-write。扩展3:init根据/etc/inittab配置文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络; & &init 是在核心 mount 进 root 后,第一個执行的程式 (第一个 process),init 所负责的工作包括: 执行 /etc/rc.d/rc?.d 里的 scripts & &将系统由开机状态 (boot-up state) 切换至多使用者状态 (multiuser state) & &负责进入 tty (本地端) 的 login shell & &负责开机与关机的程序 (procedure)。扩展4:开机的执行上述文件的过程:1、开机==&mount -t root root /root (此句内核自动执行)==& /etc/fstab ==& /etc/inittab ==& 执行/etc/rc.d/目录下的脚本(包括/etc/init.d/rcS) 2、linuxrc文件的作用 & &2.1、在嵌入式Linux中,init进程的执行程序通常是二选其一.这两个执行程序分别是/sbin/init程序,或者是Busybox生成的linuxrc程序.init进程的作用即这个程序的功能.init进程具体运行哪个程序,则由uboot的环境变量bootargs决定,即init=/linuxrc.通常采用命令行参数"init=xxxx"指定某个程序作为init进程运行.比如,init=linuxrc.可以说,linuxrc程序的作用就是init进程的作用. & &2.2linuxrc是一个程序,它的执行流程如下所示.其中,如何解析inittab文件可以由用户设定,其它两个一般都不会修改. & & &2.2.1、设置信号处理函数. & & &2.2.2、初始化控制台. & & 2.2.3、解析inittab文件.扩展5:细说/etc/fstab1、 /etc/fatab & &1.1、文件fstab包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件 & &1.2、这个文件的全路径是/etc/fstab,fsck、mount、umount的等命令都利用该程序 & &1.3、用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等2、/ect/fstab参数解释1.1、&type& 指挂载设备或分区为何种文件系统类型 & & & & & &典型 的名字包括这些:ext2, ext3, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap和auto,
'auto' 不是一个文件系统,而是让mount命令自动判断文件类型,特别对于可移动设备,软盘,DVD驱动器,这样做是很有必要的,因为可能每次挂载的文件 & & & & & &类型不一致。2.2、&options&,选项,这部分是最有用的设置!!! & &它能使你所挂载的设备在开机时自动加载、使中文显示不出现乱码、限制对挂载分区读写权限。它是与mount命令的用法相关的 & & & &推荐参数 & & & & & & noatime & 关闭atime特性,提高性能,这是一个很老的特性,放心关闭,还能减少loadcycle & & & &默认设置 defaults &使用默认设置。等于rw,suid,dev,exec,auto,nouser,async,具体含义看下面的解释。 & & & & 自动与手动挂载 auto &在启动或在终端中输入mount -a时自动挂载 & & & & & &noauto 设备(分区)只能手动挂载 The file system can be mounted only explicitly. & & & &IO编码设置
& & & & & &iocharset=?;在=号后面加入你的本地编码,似乎在这个设备(分区)中做文件IO的时候就会自动做编码的格式转换。 & & & & & &例如:你的某个分区是编码是utf8,而设备中文件的编码是gb2312,当是复制你设备中的文件到你的这个分区时,它将自动做编码转换 & & & &读写权限 & & & & & umask= & 这是关于读写权限的,好像比下面的ro,rw选项更管用!!! & & & & & 例如:umask=000或0222,使得挂载时option中有default,普通用户仍然能读写挂载设备中的东西。 & & & & & & & ro &挂载为只读权限 & & & & & & & rw & 挂载为读写权限 & & & &可执行 & & & & & & & exec & & 是一个默认设置项,它使在那个分区中的可执行的二进制文件能够执行。 & & & & & & & & & noexec &二进制文件不允许执行。千万不要在你的root分区中用这个选项!!! & & & & I/O同步 & & & & & & & sync & & &所有的I/O将以同步方式进行 & & & & & & & & & async &所有的I/O将以非同步方式进行 & & & &用户挂载权限 & & & & & & & user &允许任何用户挂载设备。 Implies noexec,nosuid,nodev unless overridden. & & & & & & & nouser &只允许root用户挂载。这是默认设置。 & & & & & & & & & suid & & Permit the operation of suid, and sgid bits. They are mostly used to allow users on a computer system to execute
& & & & & & & & & &binary executables with temporarily elevated privileges in order to perform a specific task. & & & & & & & & & nosuid & Blocks the operation of suid, and sgid bits.本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》新手园地& & & 硬件问题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
& |& & |& & |& & |& 
白手起家, 积分 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根文件系统的时候 ...
有没有解决的方法啊??下次自动登录
现在的位置:
& 综合 & 正文
如何在根文件系统中使用modprobe
这 几天在做4020的快速启动,本来想将网络模块化这样,能够将内核大概缩小0.5M(这个还是zImage),这样无论在uboot阶段搬运,还是在 zImage段的解压缩,还是在最后的启动都可以大大减少linux的启动时间,然而这中间有个很重要的问题是怎样在nfs中实现modprobe的命
令,我在原来的busybox1.10.4中敲入modprobe命令出现如下错误:
/quick_start # modprobe sep_mci.ko
modprobe: cannot parse modules.dep
否则会出现这个错误,因为没有生成这个文件
/quick_start # depmod
-/bin/sh: depmod: not found
这个可能是由于我在编译buxybox的时候没有将这几个命令放进去,现在也不准备重新编译了,直接拿了个1.13.3的buxybox来用,要想用起modprobe需要如下步骤:
(1)在这里我是将linux的SD卡的驱动编译成模块ko形式,这样会在内核的/driver.mmc/目录下面生成三个文件:
mmc_block.ko
mmc_core.ko
sep_mci.ko
把这保存起来,等会会用;
(2)启动了uboot,内核,加载buxybox1.13.3文件系统,然后我们需要在/lib/下面创建modules,然后进 modules下面创建2.6.16这个文件夹,接着把上面的3个ko文件通过虚拟机上挂载的网络文件系统拷贝到/nfs/lib/modules /2.6.16下面,然后我们就可以使用modprobe命令了,但使用modprobe命令之间需要先用depmod命令分析下各个模块的依赖关系,具 体操作如下:
/lib # mkdir modules
/lib # cd modules/
/lib/modules # ls
/lib/modules # uname -r
/lib/modules # mkdir 2.6.16
/lib/modules # cd /quick_start/
/quick_start # cd /
/ # depmod
/ # cat /lib/modules/2.6.16/modules.dep .bb
mmc_core.ko symbol:mmc_request_done symbol:mmc_detect_change symbol:mmc_release_host symbol:mmc_remove_host symbol:mmc_free_host symbol:mmc_wait_for_cmd symbol:mmc_start_request symbol:__mmc_claim_host symbol:mmc_wait_for_app_cmd symbol:mmc_alloc_host symbol:mmc_add_host
symbol:mmc_wait_for_req symbol:mmc_init_queue symbol:mmc_queue_suspend symbol:mmc_cleanup_queue symbol:mmc_queue_resume symbol:mmc_register_driver symbol:mmc_unregister_driver symbol:mmc_free_host symbol:mmc_remove_host symbol:mmc_add_host symbol:mmc_alloc_host
symbol:mmc_detect_change symbol:mmc_release_host symbol:__mmc_claim_host symbol:mmc_wait_for_app_cmd symbol:mmc_wait_for_cmd symbol:mmc_wait_for_req symbol:mmc_start_request symbol:mmc_request_done symbol:mmc_queue_resume symbol:mmc_queue_suspend symbol:mmc_cleanup_queue
symbol:mmc_init_queue symbol:mmc_unregister_driver symbol:mmc_register_driver
mmc_block.ko
sep_mci.ko
/ # modprobe sep_mci
sep_mci 5952 0 - Live 0xbf006000
mmc_core 18160 1 sep_mci, Live 0xbf000000
这样我们就能成功的加载 sep_mci这个模块,并且会自带着加载mmc_core这个依赖的KO文件了
用这个方法解决libertas(sdio)的模块加载问题。
原文地址:
modules.dep,modprobe,depmod,mkinitrd之间的关系
分类: 字号
modules.dep文件记录了内核模块间的依赖关系,此文件是使用module-init-tools套件中的depmod命令时自动生成的。每个内核版本都有一个对应的modules.dep文件,存放在/lib/modules/kernel-version目录下。此文件中内核的依赖关系使用
"filename:
[filename]*" 这样的形式描述。空行和"#"开头的行会被忽略掉。整个文件中的依赖关系是降序描述的,举例来说:假如模块/lib/modules/2.5.53/kernel/a.ko依赖于同目录下的b.ko和c.ko,而c.ko又依赖于b.ko,那么这三者的依赖关系描述就是如下这样:# "#"号开头行是注释/lib/modules/2.5.53/kernel/a.ko: /lib/modules/2.5.53/kernel/c.ko /lib/modules/2.5.53/kernel/b.ko/lib/modules/2.5.53/kernel/b.ko:/lib/modules/2.5.53/kernel/c.ko: /lib/modules/2.5.53/kernel/b.komodprobe命令就是依照这个顺序来载入模块的。下图是我画的一个大概示意图。
modprobe与depmod
1.modprobe
modprobe - program to add and remove modules from the Linux Kernel
modprobe和insmod类似,是用来动态加载模块的,区别在于
modprobe可以解决load module时的依赖关系,它是通过/lib/modules/&kernel-version&/modules.dep(.bb)文件来查找依赖关系的;而insmod不能解决依赖问题。
如有2个模块g_file_storage.ko和udc.ko,g_file_storage.ko依赖于udc.ko,在加载g_file_storage.ko前必须先加载udc.ko,如果使用insmod加载,必须按顺序一个一个加载:
insmod udc.ko
insmode g_file_storage.ko file=/dev/mtdblock3
如果使用modprobe加载则执行:
modprobe g_file_storage file=/dev/mtdblock3/*此处的加载对象写为g_file_storage,非g_file_storage.ko*/
PS:modules.dep(.bb)文件内容如下:
g_file_storage.ko
udc.ko symbol:usb_gadget_unregister_driver symbol:usb_gadget_register_driver
depmod - program to generate modules.dep and map files
当把模块文件放到/lib/module/`uname -r`/目录下,运行depmod,则会在/lib/modules/&kernel-version&/目录下生成modules.dep(.bb)文件,表明了模块的依赖关系
3. 对于在使用"modprobe xxx"动态加载过程中出现“modprobe XXX not found”
若出现此问题,需确认:
1. modules.dep(.bb)文件是否生成,若没有,则可以运行depmod,生成此依赖关系文件
2. 若有依赖关系文件,仍出现此问题,把modprobe xxx.ko改为执行modprobe xxx
&&&&推荐文章:
【上篇】【下篇】