运行于u盘的精简linux系统制作

运行于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初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。

# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
      /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就不用每次都编辑了,至此裁剪后的系统启动完成,可能还需要设置系统后启动的一些脚本,这些就看个人发挥了,我也刚完成到这步,有新进展在更新吧。。。。。。。。


你可能感兴趣的:(嵌入式基础知识,linux使用,linux,linux,kernel,u盘)