构建自己的小linux

 
在构建linux之前我们先了解linux系统启动的过程,分以下四个阶段:
第一阶段:BIOS启动引导
    在该过程中实现硬件的初始化以及查找可启动的介质,从MBR中装载引导管理器(GRUB)并运行该启动管理器
第二阶段:GRUB启动引导
    装载stage1,装载stage1_5,装载stage2,读取/boot/grub/grub.conf,装载所选的kernel和initrd到内存
第三阶段:内核
    运行内核启动参数、解压initrd文件并挂载initrd文件系统,装载核心驱动、挂载根文件系统
第四阶段:SysV init初始化
    启动/sbin/init、读取/etc/inittab文件、运行/etc/rc.d/rc.sysinit脚本、运行在/etc/rc.d/rcN.d中定义的不同runlevel的服务初始化脚本、打开字符终端1-6控制台,打开图形显示管理的7号控制台
从以上Linux系统的启动过程可知,构建基本的Linux需要:1)基本的物理硬件 2)安装启动引导程序 3)Kernel和initrd 4)/sbin/init程序,有了这些我们就可以构建最基本的Linux了,构建过程如下:
1、在宿主机上面创建两个主分区并创建ext3的文件系统
 
  1. # echo ' 
  2. >n 
  3. >p 
  4. >1 
  5. >+100M 
  6. >w' | fdisk /dev/sdb &> /dev/null 
  7. # echo ' 
  8. >n 
  9. >p 
  10. >2 
  11. >+512M 
  12. >w' | fdisk /dev/sdb &> /dev/null 
 
PS:sdb是宿主机上面的第二块硬盘,注意别写错,否则后果不堪设想
用fdisk -l 查看创建分区是否成功,成功之后为上面两个分区创建ext3文件系统
 
  1. # mkfs -t ext3 /dev/sdb1 
  2. # mkfs -t ext3 /dev/sdb2 
 
检验是否成功创建ext3文件系统
 
  1. # blkid /dev/sdb{1,2}  
挂载/dev/sdb{1,2}分别到/mnt/boot和/mnt/sysroot
 
  1. # mkdir /mnt/{boot,sysroot} 
  2. # mount /dev/sdb1 /mnt/boot 
  3. # mount /dev/sdb2 /mnt/sysroot 
 
告诉Kernel重新加载磁盘
  1. # partprobe /dev/sdb 
2、安装启动引导程序GRUB(有两种方法)
  1. 1)grub-install --root-directory /mnt /dev/sdb 
  2. 2)# mkdir /mnt/boot/grub 
  3. # cp /usr/share/grub/i386-redhat/* /mnt/boot/grub 
  4. # grub 
  5. >root (hd1,0) 
  6. >setup (hd1) 
  7. >quit  
3、复制内核并提供initrd
 
  1. # cp /boot/vmlinuz-$(uname -r) /mnt/boot/vmlinuz 
  2. # mkdir /tmp/initrd 
  3. # cp /boot/initrd-$(uname -r).img /tmp/initrd 
  4. # cd /tmp/initrd 
  5. # file initrd-$(uname -r).img  
  6. # mv initrd-$(uname -r).img ./initrd 
  7. # gzip -d initrd 
  8. # cpio -id < initrd 
  9. # sed -i "s@/dev/vol0/root@/dev/sda2@g" init 
  10. # rm -rf initrd 
  11. # find . | cpio -o -H newc --quiet | gzip -9 > /mnt/boot/initrd.gz  
4、提供grub.conf文件
  1. # vim /mnt/boot/grub/grub.conf 
  2.     default=0 
  3.     timeout=10 
  4.     title  My Min Linux 
  5.          root (hd0,0) 
  6.          kernel /vmlinuz ro root=/dev/sda2 rhgb quiet 
  7.          initrd /initrd 
 
5、提供根文件系统
  1. # cd /mnt/sysroot 
  2. # mkdir -pv ./{bin,sbin,etc,dev,sys,proc,var,home,tmp,lib,mnt,media,misc,opt} 
  3. # cp /sbin/init sbin/ 
  4. # cp /bin/{bash,ls,hostname}  bin/ 
 
   init,bash,ls,hostname运行需要用到库文件,用#ldd {/sbin/init,/bin/{bash,ls,hostname}}查看并复制到对应的目录下
 
  1. #ldd {/sbin/init,/bin/bash} 
  2.    /sbin/init: 
  3.     linux-gate.so.1 =>  (0x0055a000) 
  4.     libsepol.so.1 => /lib/libsepol.so.1 (0x00573000) 
  5.     libselinux.so.1 => /lib/libselinux.so.1 (0x00110000) 
  6.     libc.so.6 => /lib/libc.so.6 (0x00825000) 
  7.     libdl.so.2 => /lib/libdl.so.2 (0x0096d000) 
  8.     /lib/ld-linux.so.2 (0x00802000) 
  9.    /bin/bash: 
  10.     linux-gate.so.1 =>  (0x0067e000) 
  11.     libtermcap.so.2 => /lib/libtermcap.so.2 (0x0099c000) 
  12.     libdl.so.2 => /lib/libdl.so.2 (0x0096d000) 
  13.     libc.so.6 => /lib/libc.so.6 (0x00825000) 
  14.     /lib/ld-linux.so.2 (0x00802000) 
  15.    /bin/ls: 
  16.     linux-gate.so.1 =>  (0x003cf000) 
  17.     librt.so.1 => /lib/librt.so.1 (0x009b5000) 
  18.     libacl.so.1 => /lib/libacl.so.1 (0x009c0000) 
  19.     libselinux.so.1 => /lib/libselinux.so.1 (0x00559000) 
  20.     libc.so.6 => /lib/libc.so.6 (0x00825000) 
  21.     libpthread.so.0 => /lib/libpthread.so.0 (0x0099c000) 
  22.     /lib/ld-linux.so.2 (0x00802000) 
  23.     libattr.so.1 => /lib/libattr.so.1 (0x0060e000) 
  24.     libdl.so.2 => /lib/libdl.so.2 (0x0096d000) 
  25.     libsepol.so.1 => /lib/libsepol.so.1 (0x00573000) 
  26.    /bin/hostname: 
  27.     linux-gate.so.1 =>  (0x00c83000) 
  28.     libselinux.so.1 => /lib/libselinux.so.1 (0x00559000) 
  29.     libc.so.6 => /lib/libc.so.6 (0x00825000) 
  30.     libdl.so.2 => /lib/libdl.so.2 (0x0096d000) 
  31.     libsepol.so.1 => /lib/libsepol.so.1 (0x00573000) 
  32.     /lib/ld-linux.so.2 (0x00802000)  
  33. # cp /lib/{libsepol.so.1,libselinux.so.1,libc.so.6,libdl.so.2,ld-linux.so.2,libtermcap.so.2} lib/ 
  34. # cp /lib/{librt.so.1,libacl.so.1,libpthread.so.0,libattr.so.1} lib/ 
  35.   
 
6、提供配置文件:
  1. # vim etc/inittab 
  2.      id:3:initdefault: 
  3.      si::sysinit:/etc/rc.d/rc.sysinit 
  4. # vim etc/rc.d/rc.sysinit 
  5.      #!/bin/bash 
  6.      echo -e "\t Welcom to My Min Linux" 
  7.      /bin/bash 
  8. # chmod +x  etc/rc.d/rc.sysinit 
 
到此自己的Min Linux 构造完成,该Linux只支持ls,hostname外部命令