首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

制作cramfs文件系统 (1)

制作cramfs文件系统 (1)

分类:

                                                    
                                   宿主机:
Kubuntu 8.04 (linux-2.6.24-19)
gcc-4.2.3

目标机:
s3c2440
linux-2.6.26
cramfs

交叉编译器(由crosstool-0.43制作):
arm-linux-gcc-4.1.0

工具:
busybox-1.9.2

目标:
进入console操作

问题伊始:
VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 124K
cramfs: bad compressed blocksize 989432407
cramfs: bad compressed blocksize 4274059297
Failed to execute /linuxrc.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.

怀疑可能是文件系统的问题导致上面红色部分的错误,因此参考网上文章做一个cramfs文件系统。
-------------------------------------------------------------
参考资料:
BusyBox——嵌入式Linux中的瑞士军刀
使用busybox-1.9.2制作根文件系统
使用Busybox制作CRAMFS文件系统成功
-------------------------------------------------------------
1. 修改Makefile
#ARCH        ?= $(SUBARCH)
#CROSS_COMPILE    ?=
ARCH        := arm
CROSS_COMPILE    := $HOME/toolchain/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux-gnu/bin/arm-linux-gnu-

2. 修改applets/applets.c中的警告信息
//#if ENABLE_STATIC && defined(__GLIBC__) && !defined(__UCLIBC__)
#if 0
#warning Static linking against glibc produces buggy executables
#warning (glibc does not cope well with ld --gc-sections).
#warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
#warning Note that glibc is unsuitable for static linking anyway.
#warning If you still want to do it, remove -Wl,--gc-sections
#warning from scripts/trylink and remove this warning.
#error Aborting compilation.
#endif

这段警告的意思是告诉你最好用uclibc编译,而不是用glibc因为glibc比较大,busybox在寸土寸金的嵌入式系统中运用比较多,所以会有这样的要求。
如果没有注释掉这段警告或者没有采用uclibc的话,在make install的时候则会出现如下的错误:
applets/applets.c:15:2: warning: #warning Static linking against glibc produces buggy executables
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:17:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.
applets/applets.c:21:2: #error Aborting compilation.
make[1]: *** [applets/applets.o] 错误 1
make: *** [applets] 错误 2

3. 配置busybox
首先可以先恢复一下默认配置
$ make defconfig

然后,配置busybox可以采用如下命令:
$ make menuconfig

$ make xconfig

配置内容参考
使用busybox-1.9.2制作根文件系统
使用Busybox制作CRAMFS文件系统成功

4. 编译busybox
$ make install

如若成功,会有如下信息:
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
并在busybox/_install 目录下会生成下列文件:
drwxr-xr-x  5 wang wang 4096 2008-09-10 17:32 .
drwxr-xr-x 32 wang wang 4096 2008-09-10 17:32 ..
drwxr-xr-x  2 wang wang 4096 2008-09-10 17:32 bin
lrwxrwxrwx  1 wang wang   11 2008-09-10 17:32 linuxrc -> bin/busybox
drwxr-xr-x  2 wang wang 4096 2008-09-10 17:32 sbin
drwxr-xr-x  4 wang wang 4096 2008-09-10 17:32 usr

5. 修改_install/bin/busybox的属性
$ chmod 4755 ./_install/bin/busybox

必须要要修改属性,否则在busybox中很多命令会受限制

6. 打包_install文件夹的内容
首先要删除_install/linuxrc文件,这个文件将在后面重新被创建,这里先删除
$ rm ./_install/linuxrc

然后将剩下的三个文件夹打包起来
$ tar cvf 1.tar ./install/

7. 创建cramfs所需的一些目录
   首先创建一个文件夹,作为暂时存放cramfs的临时目录,以方便在其下建立文件系统。所有命令如下
$ mkdir /opt/rootfs
$ cd /opt/rootfs
$ mkdir bin dev etc home lib mnt proc sbin sys tmp  var usr
$ mkdir etc/init.d


(其中假设你的普通用户已经取得/opt的操作所有权或者也可以放在用户目录下完成; 总之,对于rootfs及其以下目录,当前用户必须拥有读、写和执行的所有权)

8. 准备启动所需的文件:linuxrc、rcS、inittab、fstab四个文件
(以下均假定当前路径在/opt/rootfs)
a. linuxrc
$ vim linuxrc

内容:
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /
/bin/mount -t ramfs ramfs /var
/bin/mkdir -p /var/tmp
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mkdir -p /var/lock
/bin/mkdir -p /var/empty
#/bin/mount -t usbdevfs none /proc/bus/usb

exec /sbin/init

更改其所有权:
$ chmod 775 linuxrc


b. rcS
$ vim etc/init.d/rcS

内容:
#!/bin/sh

# mount all filesystem defined in "fstab"
echo "#mount all......."
/bin/mount -a


更改其所有权:
$ chmod 775 etc/init.d/rcS

c. inittab
$ vim etc/inittab

内容:
# This is run first except when booting
::sysinit:/etc/init.d/rcS

# Start an "askfirst" shell on the console
#::askfirst:-/bin/bash
::askfirst:-/bin/sh

# Stuff to do when restarting the init process
::restart:/sbin/init

# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
返回列表