- UID
- 852722
|
分类:
宿主机:
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
首先可以先恢复一下默认配置
然后,配置busybox可以采用如下命令:
或
配置内容参考
《 使用busybox-1.9.2制作根文件系统 》
《 使用Busybox制作CRAMFS文件系统成功 》
4. 编译busybox
如若成功,会有如下信息:
--------------------------------------------------
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文件,这个文件将在后面重新被创建,这里先删除
然后将剩下的三个文件夹打包起来
$ 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
内容:
#!/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 |
更改其所有权:
b. rcS
内容:
#!/bin/sh
# mount all filesystem defined in "fstab"
echo "#mount all......."
/bin/mount -a
|
更改其所有权:
$ chmod 775 etc/init.d/rcS |
c. 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 |
|
|