最近在学习linux了,为了了解linux系统的机制,花了一个月时间研究,走了很多弯路,看了很多老资料终于做成功了,现在看起来真简单的一个东西竟然花了那么长时间去做真是浪费生命啊!闲话少说,为了继承linux系统的精神,让我纯手打记录一下制作过程,供后来者参考吧!!
主机环境:ubuntu 11.04 (我用XP下的的虚拟机)
u盘:      金士顿 2G   (用不了那么多,U盘现在都大)
下载内容:最新内核linux-3.3
         最新制作内核文件工具: busybox-1.9.2

过程如下:

1.u盘分区
1)将优盘分成3个区,两个主分区,一个扩展分区。
用到的终端命令是fdisk 
fdisk  /dev/sdb 进入u盘操作
                      -p查看分区
                      -d删除分区
                      -n创建分区
                      -a激活分区
                      -w保存分区表并退出
                      -q退出不保存分区表
这些都是我用到的命令。
至于分区的大小,就随意了,你看着那个block自己划分吧,错了也没关系,回到上面继续改就是了。
2)格式化分区
先卸载u盘上的所有分区才能格式化的。
mkfs.ext2 /dev/sdb1 格式化你的主分区
mkfs.vfat /dev/sdb3 格式化你的扩展分区
你可也用df -lh查看你的mount关系。
2.grub/grub2安装
先要把安装的分区挂载在一个地方才能安装成功的,这是我试了好多次,失败了好多次才知道的。
mount /dev/sdb1 /tmp
grub-install --root-directory=/tmp/boot /dev/sdb
将grub安装到/dev/sdb u盘的mbr上 
这个时候你会发现在你的/dev/sdb1分区下出现一个boot目录,里面有grub目录和很多文件。
3)在系统根目录下/boot/grub/下将grub.cfg拷贝到你的U盘分区/boot/grub下面吧,进去修改grub.cfg就可以启动u盘了。
只修改两个地方就行了,一个是UUID,一个是root。
至于uuid你把u盘插拔一下,用df查看你的分区挂载在哪个上面的uuid,复制下来修改。
至于root,你用u盘启动,进入grub命令行,用ls命令查看一下,哪个盘符下面有个boot目录,哪个盘符就是你的分区,记住它,出去改一下root里面的名字就行了。
我的是(hd0,msdos1),记住进grub命令行查看时后面要加/的,不然报错。
3.制作kernel内核
网上其实有很多,每个版本大体都相同。
下载后,用tar jxvf 命令解压。tar jxvf linux3.3 tar.bz2
进入linux-3.3 然后执行4部曲;
   1是make mrproper
   2是make menuconfig  进入菜单选择两项,
    一个是General Setup –> Initial RAM filesystem and RAM disk support
    另一个是 Device Drivers –> Block Devices –> RAM block device  support
     其他默认就好。
     3是make.
     4是make modules
完了后进入linux-3.3/arch/X86/boot/bzImage ,拷贝bzImage 到你的boot目录下。
4.制作文件系统initrd.img
1)解压文件制作工具tar jxvf busybox-1.9.2.tar.bz2
进入解压文件目录busybox-1.9.2.跟kernel差不多,就少第壹步。
    1.make menuconfig  与kernel编译一样也有要注意的两项:第一个是
Busybox Settings –> Build Options –> Build Busybox as a static binary第二个是Installation Options–>Don't use /usr 其他默认就好。
   2.make
   3.make install
编译好的文件放在_install 中。
2) 创建目录文件
  mkdir rootfs
将_install目录里面的文件全部拷入rootfs里面。然后在rootfs下 mkdir etc,proc dev目录,随意创建几个tmp ,var,home目录就好了。
  拷贝系统根目录/dev下的 这几个文件,console,null,zero,tty也可以将ram和tty系列都拷过来。
  建立etc目录下的文件。直接从编译好的busybox文件里面拷贝到你的rootfs里面的etc中去,cp -r busybox-1.9.2/examples/bootfloopy/etc/*  ~/rootfs/etc
3)文件修改
要修改的文件时etc下面的,inittab,fstab,init.d/rcS, profile这几个文件。
修改inittab文件:
::sysinit:/etc/init.d/rcS
::respawn:/bin/sh


修改fstab 文件 :
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0

修改/init/rcS文件:
#! /bin/sh
echo "*********************************************************"
echo " linux u pan  system "
echo " Love Linux ! "
echo "********************************************************"
修改 profile文件:
# Set user path
echo "Set user path in /etc/profile"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# Set PS1
echo "Set PS1 in /etc/profile"
export PS1="[\u@\h \W]# "
echo "Done"
echo
怎么修改不要我说了吧,sudo  gedit ~~~!!
4)制作initrd.img
在rootfs目录上,
dd if=/dev/zero of=/tmp/disk bs=1M count=10
mkfs.ext2 -m0 /tmp/disk
mkdir /mnt/ram
mount -o loop /tmp/disk /mnt/ram
cp -R rootfs/* /mnt/ram
umount /mnt/ram
dd if=/tmp/disk of=initrd.img
这样在rootfs目录边上是不是有个initrd.img文件了。
然后把initrd.img拷贝到你的boot目录下。
4,总结,到此,整个系统已经做好了,在你的u盘分区上boot目录下有grub bzImage initrd.img。好了,重启系统,从优盘进入,发现是不是已经进入了你的最小系统了,哈哈,忘了说了,把你grub.cfg上面那些多余的启动项删除就不用手动进你的系统了。
好累啊,终于码完了。感谢我吧!
如果还有任何疑问可以问我,当然你可以百度 ,goole。