运行于u盘的精简linux系统制作
1、裁剪linux内核
如何裁剪linux系统,主要是设置menuconfig,里面有很多设置,按照“金钟国”大神的教程,一步一步来就可了。这里不在赘述。
强调一下生成的文件格式,
vmlinuz的建立有两种方式。
一是编译内核时通过“make zImage”创建,手动拷贝到/boot目录下面。zImage适用于小内核的情况,它的存在是为了向后的兼容性。
二是内核编译时通过命令make bzImage创建,然后手动拷贝至/boot目录下。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的, bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个 640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
2、制作initrd
initrd.img主要有两种格式,一种是虚拟磁盘,使用dd命令创建一个文件,然后mkfs.ext2,mount -o loop,make busybox。另一种是cpio形式的,直接创建。
磁盘格式:
1 #!/bin/bash
2 dd if=/dev/zero of=./initrd.img bs=1024 count=32768
3 mkfs.ext2 ./initrd.img
4 mount -o loop ./initrd.img /mnt/initdisk
5 rm -rf /mnt/initdisk/*
6 cp -a ../busybox/_install/* /mnt/initdisk
7 umount /mnt/initdisk
8 gzip -9 ./initrd.img
cpio格式:
1 find . | cpio -o -H newc | gzip -9 > $target
下面讲一下busybox。
BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android系统的自带的shell。
使用make menuconfig配置选项 -> make编译 -> make install 主要目的是生成静态库busybox,然后拷贝到我们的rootfs目录下,至此busybox使用完成,但是我们的rootfs目录作为系统虚拟文件系统还有一些文件需要创建,例如/etc /lib /sbin /dev。。。
/etc目录下应该有inittab文件,
inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。
/etc/fstab文件是系统启动后自动挂在磁盘的记录文件,eg:
UUID=0db4ccd4-6685-46a7-ae8d-8169dc690853 none swap sw 0 0
/lib目录为系统库目录,应该至少存放最进本的库,eg:libc、libm、ld-linux。可使用cp -rf /lib/libc.* ./ and cp -rf /ilbc-* ./ 拷贝一个libc库,其他的库用同样的方法,为什么一个哭队两个文件?因为其中一个是软链接,至于why自行百度
/dev目录至少有两个文节点,一个mknod console c 5 1 , 另一个mknod dev/null c 1 3 等
3、制作u盘的启动项
理论基础:
使用grub程序制作u盘启动项,下面需要需要讲一下linux系统启动流程和硬盘的mbr
设备上电 -> 执行0xffff0中的BIOS代码,检测设备第一启动项 -> 探测到硬盘,读取硬盘前512字节的mbr到内存07c00 -> mbr自举到内存0x90000执行 -> mbr读取硬盘后2k数据到内存0x90200执行 -> 内核代码被读取到内存0x10000执行
硬盘的前512字节左右系统的引导程序,有必要分析一下他的内部结构:
512 = 446(mbr) + 4*16(dpt) + 0x55aa(end) 此512位于硬盘的0磁道,0柱面,1扇区(一个扇区512byte)
16(dpt) = 1(08激活,00未激活) +3(分区开始磁头,扇区,柱面) + 1(分区类型83 ext2) + 3(分区结束磁头,扇区,柱面) + 4(首扇区相对扇区号) + 4(总扇区数)
可以使用磁头柱面和扇区计算出磁盘的物理地址,方法有两种CHS和LBA,具体转换公式自行baidu。
真正的grub操作:
1、准备u盘,fdisk 命令进行分区格式化,将u盘分为两个分区,一个作为主分区,一个作为交换分区,主分区为活动分区,使用fdisk的a参数转换,交换分区使用fdisk的t参数转换为82 。然后格式化主分区mkfs.ext2
2、制作grub,首先挂在u盘到/mnt/uDisk,使用命令grub-install --root-directory=/mnt/uDisk /dev/uDev
3、拷贝/boot/grub/grub.cfg并修改
4、将裁剪后的initrd.img和vmlinx拷贝到你的rootfs下的boot目录
4、设置grub启动
在重启系统后会进入grub的选项,c进入编辑模式,主要执行以下几个步骤:
1、root (hd0, 1)
2、linux /boot/vmlinx root=/dev/sda1
3、initrd /boot/initrd
4、boot (重启)
配置可以写入到grub.cfg就不用每次都编辑了,至此裁剪后的系统启动完成,可能还需要设置系统后启动的一些脚本,这些就看个人发挥了,我也刚完成到这步,有新进展在更新吧。。。。。。。。