文章目录
#1从零开始由busybox 建立文件系统
##1.1文件系统在LINUX 中的结构图
##1.2编译好kernel
编译linux kernel的具体操作在之前文章讲过,下面简要提示一下。
修改编译器PATH,指定寻找路径。
cd kernel-2.6.13 (进入内核目录)
cp config_n35 .config
make (编译内核,假设已经设置好了)
cd arch/arm/boot (进入生成的zImage 目录)
mkimage.sh (产生有uboot 可以引导的uImage 内核文件)
##1.3Uboot 状态下显示的环境设置信息
setenv bootcmd "tftp 30008000 uimage;bootm"
setenv ipaddr 192.168.1.244
setenv serverip 192.168.1.112
setenv gatewayip 192.168.1.1
setenv bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.1.113:/home/wu-being/linux/my_nfs ip=192.168.1.244:192.168.1.114:192.168.1.1:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M
我们启用NFS 方式装载文件系统,首先启动PC 上的NFS 服务器
vi /etc/exports (添加你要装载的文件系统目录)
/home/wu-being/linux/my_nfs 192.168.*.*(rw,sync,no_root_squash)
/etc/rc.d/init.d/portmap restart
/etc/rc.d/init.d/nfs restart
然后启动内核,查看结果??
##1.4开始busybox 生成文件系统
Busybox 是很多标准Linux 工具的单一可执行实现,它说明了一个问题,
很多标准的linux 工具可以共享很多共同的元素。
-
第1步:从www.busybox.net 下载最新的版本busybox1.18.4.
-
第2步:解压并打补丁
tar –jxvf busybox-1.18.4.tar.bz2
wu-being@ubuntu:~/linux/bosybox$ l
busybox-1.18.4/ busybox-1.18.4-hush.patch*
busybox-1.18.4-buildsys.patch* busybox-1.18.4.tar.bz2*
busybox-1.18.4-fuser.patch*
wu-being@ubuntu:~/linux/bosybox$ patch -p0 <./busybox-1.18.4-buildsys.patch
wu-being@ubuntu:~/linux/bosybox$ patch -p0 <./busybox-1.18.4-fuser.patch
wu-being@ubuntu:~/linux/bosybox$ patch -p0 <./busybox-1.18.4-hush.patch
- 第3步:配制编译器路径,注意这个编译器版本要和编译Kernel的编译器版本同样。
wu-being@ubuntu:~/linux/bosybox/busybox-1.18.4$ l /home/wu-being/linux/3.4.1/bin/
arm-linux-addr2line* arm-linux-gcc* arm-linux-objcopy*
arm-linux-ar* arm-linux-gcc-3.4.1* arm-linux-objdump*
arm-linux-as* arm-linux-gccbug* arm-linux-ranlib*
arm-linux-c++* arm-linux-gcov* arm-linux-readelf*
arm-linux-c++filt* arm-linux-gprof* arm-linux-size*
arm-linux-cpp* arm-linux-ld* arm-linux-strings*
arm-linux-g++* arm-linux-nm* arm-linux-strip*
wu-being@ubuntu:~/linux/bosybox/busybox-1.18.4$ export PATH=$PATH:/home/wu-being/linux/3.4.1/bin/
wu-being@ubuntu:~/linux/bosybox/busybox-1.18.4$ arm-linux-gcc(TAB)
arm-linux-gcc arm-linux-gcc-4.4.3
arm-linux-gcc-3.4.1 arm-linux-gccbug
wu-being@ubuntu:~/linux/bosybox/busybox-1.18.4$ arm-linux-gcc
- 第4步:进入目录
busybox-1.18.4/
执行命令make defconfig
(default config) - 第5步:指定构架和编译工具编译和安装busybox
(1).先执行编译命令:make ARCH=arm CROSS_COMPILE=arm-linux-
如果在32位Linux系统中编译,没修改下面三个问题可能不会报错,但也要修改后编译!
如果没有定义ARPHRD_INFINIBAND,定义之
vi networking/interface.c
#define INFINIABAND_ALEN 20
#define ARPHRD_INFINIBAND 20 //++
如果没有定义IFLA_OPERSTATE,屏蔽它
vi networking/libiproute/ipaddress.c
#ifdef IFLA_OPERSTATE //++
if (tb[IFLA_OPERSTATE]) {
static const char operstate_labels[] ALIGN1 =
"UNKNOWN\0""NOTPRESENT\0""DOWN\0""LOWERLAYERDOWN\0"
"TESTING\0""DORMANT\0""UP\0";
printf("state %s ", nth_string(operstate_labels,
*(uint8_t*)RTA_DATA(tb[IFLA_OPERSTATE])));
}
#endif //++
如果编译mkfs_ext2 工具错误,去掉它。
make menuconfig --> Linux System Utilites --> mkfs_ext2 (disable) --->
save and quit
(2).命令编译成功后,执行安装命令:
make ARCH=arm CROSS_COMPILE=arm-linux- install
-
第6步:拷贝文件系统到NFS 能输出的目录
mkdir /home/wu-being/linux/my_nfs
cp -rf _INSTALL/* /home/wu-being/linux/my_nfs -
第7步:修改nfs 配置
vi /etc/exports and append "/home/wu-being/linux/my_nfs 192.168..(rw,sync,no_root_squash)
"
/etc/init.d/nfs-kernel-server restart -
第8步:下载内核到目标板运行看结果
配制板子文件系统目录,并保存。
setenv bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.1.113:/home/wu-being/linux/my_nfs ip=192.168.1.244:192.168.1.114:192.168.1.1:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M
saveenv
应该会看到文件系统已经Mount 成功,但是现实console 错误,应该是没有这个设备。
VFS: Mounted root (nfs filesystem).
mount_devfs_fs(): unable to mount devfs, err: -2
Freeing init memory: 144K
Warning: unable to open an initial console.
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
- 第9步:建立串口设备
建立dev和lib目录,并在文件系统的dev目录创建主设备号为5次设备号为1的console
字符设备:mknod console c 5 1
(不一定要创建这个console,文件系统启动后自动创建,当dev目录一定要建立来挂载) - 第10步:下载并启动内核显示如下
VFS: Mounted root (nfs filesystem).
Mounted devfs on /dev
Freeing init memory: 172K
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
看来init 不存在或不能运行.
- 第11步:指定init
ln -sf bin/busybox init
(不一定要,只是缺少相关的lib文件) - 第12步:再启动内核
init 还是不能运行,也许就是busybox 不能运行,用文件形式打开busybox发现是要一些库文件。
从原来挂载成功的文件系统目录的Lib下拷贝所需库
最后结果