简单的Linux系统包含:文件系统和Linux 内核,然后根据需要添加必要的系统与应用功能。一.制作Linux内核镜像文件 下载内核源码linux-2.6.35.tar.bz2,默认配置编译,也可通过menuconfig选择编译,编译出内核镜像文件bzImage。- cd /usr/src
- tar jxvf linux-2.6.35.tar.bz2
- ln -s linux-2.6.35 linux
- cd linux
- make O=/home/name/build/kernel defconfig
- make O=/home/name/build/kernel menuconfig
- make O=/home/name/build/kernel
二.制作RAM文件系统1.编译安装Busybox Busybox是集合了许多Linux命令的工具,主要是用于有限制硬盘与内核大小的系统中,如嵌入式系统中。把Busybox集成到文件系统中,以支持系统的命令操作。- wget busybox.net/downloads/busybox-1.20.0.tar.bz2
- tar jxvf busybox-1.20.0.tar.bz2
- cd busybox-1.20.0
- make menuconfig
编译选项配置静态编译,这个是为了制作的系统上使用时不依赖动态库;若动态编译时,需要将必须的动态库制作进去。系统中一般没有安装glibc的静态库,需要先安装,否则编译链接crypt,m库时失败。
Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)
在该版本在fedora15 上静态编译时inetd链接不过,可以配置menuconfig去掉inetd支持。
Networking Utilities ---> [ ] inetd 2.制作initrd镜像 Initrd:boot loader initialized RAM disak, 表示启动初始化的内存盘。在linux内核启动前,boot loader会将initrd加载到内存中,因此在访问真正的根文件系统回访问内存的initrd文件系统。
Initrd 的用途主要有以下四种:
1). linux 发行版的必要部件;
2). livecd 的必备部件;
3). linux usb启动盘使用;
4). linuxrc脚本中可以方便定制bootsplash。
a.安装busybox到镜像文件
- mkdir image
- make install CONFIG_PREFIX=./image
- cd image
b.若是动态编译,复制必要的动态链接库
- mkdir lib
- cp /lib/ld-linux.so.2 lib
- cp /lib/libc.so.6 lib
- cp /lib/libcrypt.so.1 lib
- cp /lib/libm.so.6 lib
c.在image下创建必要的目录和设备文件
- mkdir proc sys etc mnt
- mknod -m 600 dev/null c 1 3
- mknod -m 600 dev/console c 5 1
d.在image目录下写一个init脚本
编辑内容
- #!/bin/sh
- mount -t proc proc /proc
- mount -t sysfs sysfs /sys
- mdev -s #自动装配/dev下面设备文件
相关处理
- chmod +x init # 添加执行权限
- touch etc/mdev.conf # 避免mdev出错
e.在image中写etc/inittab脚本
- cd image
- mv init etc/init.d/rcS
- mv linuxrc init
- touch etc/fstab #reboot命令访问
文件内容
- ::sysinit:/etc/init.d/rcS
- tty1::askfirst:/bin/sh
- tty2::askfirst:/bin/sh
- tty3::askfirst:/bin/sh
- tty4::askfirst:/bin/sh
- tty5::askfirst:/bin/sh
- tty6::askfirst:/bin/sh
- ::restart:/sbin/init
- ::ctrlaltdel:/sbin/reboot
- ::shutdown:/bin/umount -a -r
文件格式说明:
::: : id代表的是这个语句中process执行所在的tty设备,内容就是/dev目录中tty设备的文件名。
: busybox不支持runlevel,所以此字段完全被忽略。 : sysinit, respawn, askfirst, wait,once, restart, ctrlaltdel, shutdown
其含义与通常的inittab的定义相同。特别提一下askfirst,它的含义与respawn相同,只是在运行process前,会打出一句话
“please press Enter to active this console”,然后等用户在终端上敲入回车键后才运行process。
: 指定要运行的process的命令行。
f.创建initrd镜像
- find . | cpio --quiet -H newc -o | gzip -9 -n > ../initrd.gz
cpio命令说明(cpio - copy files to and from archives);
-o : copy-out mode,cpio copies files into an archive;
-H : 指定打包文件的具体格式,要生成initramfs,只能用newc 格式;
-i : copy-i mode,cpio copies files out of an archive or lists the ar‐
chive contents;
-F : 指定的文件名;
-t : 查看包文件中的文件类似ls -l;
zcat initrd.gz | cpio -t 3.测试镜像文件 启动调试bzImage的命令,默认端口是gdb端口1234;
- qemu-system-i386 -kernel bzImage -append "root=/dev/ram0" -initrd initrd.gz -s -S
-s enables the gdb stub
-S instructs Qemu to stop after system restart, Wait for gdb to connect.
4.其他
可以制作一个rootfs镜像文件
- dd if=/dev/zero of=rootfs.img bs=1024k count=5
- mkfs.ext2 -i 1024 -F rootfs.img
- mkdir rootfs
- mount -o loop rootfs.img rootfs
- rsync -a image rootfs/
- chownR root:root rootfs
- sync
测试
- qemu -32 –hda rootfs.img -kernel bzImage –append “root=/dev/hda clock=pit”
参考文档
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/
http://blog.chinaunix.net/uid-26061689-id-3032291.html
阅读(1222) | 评论(0) | 转发(0) |