大家都知道linux Red Hat Enterprise Linux 5官方光盘有2.8G左右,安装之后操作系统大概有3G左右,看着很庞大,其实是可以裁减的,裁剪成我们自己需要的功能,把那些不需要的功能给移除了,这样其实可以实现只有几十Mlinux系统了。

但要想制作小linux,则必须了解linux的开机过程。

当计算机打开电源时,计算机里的 BIOS首先会加电自检,自检通过了就从选择的启动次序启动,否则就会找寻硬盘的 MBR Master Boot Record ),并且执行记录在 MBR 上的开机载入程序( Boot Loader )进行开机。

不管是从光盘启动开机也好,还是从硬盘启动开机也罢,首先整个操作系统的 loader会载入 Linux Kernel ,而 Kernel 一启动的第一件事就是进入保护模式( protected mode ),所有的硬件交由 Kernel 来控制。

一旦 Kernel 载入完毕之后,开始初始化系统所有硬件设备。当所有的硬件初始化完成之后,接着系统将尝试挂载root filesystem root filesystem 就是被挂上当作” / ”目录的文件系统 Kernel 必须知道从哪里可以找到 root filesystem      

root filesystem 成功 的载之后,就会去执行 init 这个程序,init 就会开始检查 /etc/inittab ,找出该档中标明 sysinit 这一行,并执行该行的rc.script,而 rc.sysinit 会进行系统的初始化动作。

rc.sysinit 执行完毕之后,控制权立即转回到 init 的手中,接下来马上进入默认启动级别(runlevel) 。若内定的 runlevel 3 的话, init 就执行 /sbin/mingetty 激活 virtual console 并且以 : ” login 提示让使用者登入,完成开机。登入后系统会提供一个 shell 给使用者,就可以使用 Linux 。若 runlevel 5 的话,则在开启 virtual console 之后,init 会再执行 xdm 激活 X window system ,让使用者以图形界面登录。

所以我们现在来自己制作linux(在VMware虚拟机下实现),需要以下几步:

1.分区格式化

2.安装grub

3.准备内核和initrd

4.准备/etc/inittab,/etc/rc.d/rc.sysinit,创建系统所需要的目录

5.复制各二进制文件和库文件

6.支持单用户模式

7.能够实现开启六个虚拟终端

8.实现用户登录

 

具体配置:

首先在宿主机上添加一块大小为2Gsingle存储的SCSI硬盘:





并把名字命名为little linux.vmdk ,路径在桌面


点击“finished”完成。之后重启宿主机。

注意:以下操作都在宿主机下操作,有特殊说明的按特殊说明要求

1.对刚刚添加的硬盘sdb进行分区格式化

至少准备三个分区:根分区(1G),swap分区(256M),/boot分区 (100M

  1. # fdisk /dev/sdb 
  2.  
  3.  
  4.  
  5.  
  6.   
  7.  
  8. +100M 
  9.  
  10.  
  11.  
  12.  
  13.   
  14.  
  15. +256M 
  16.  
  17.  
  18.  
  19.  
  20.   
  21.  
  22. +1G 
  23.  
  24.  
  25.  
  26. 82 
  27.  
  28.  
  29.  
  30. # partprobe /dev/sdb 
  31.  
  32. # cat /proc/partitions 
  33.  
  34. # mke2fs -j /dev/sdb1  
  35.  
  36. # mke2fs -j /dev/sdb3 
  37.  
  38. # mkswap /dev/sdb2 

2.安装grub

  1. # mkdir /mnt/{boot,sysroot} –v   
  2.  
  3. # mount /dev/sdb1 /mnt/boot  
  4.  
  5. # mount /dev/sdb3 /mnt/sysroot 
  6.  
  7. # grub-install --root-directory=/mnt /dev/sdb 

# ls /mnt/boot/grub  查看是否安装成功grub

3.准备内核和initrd

  1. # cd /mnt/boot 
  2.  
  3. # cp /boot/vmlinuz-2.6.18-164.e15 ./vmlinuz 
  4.  
  5. # cd /tmp 
  6.  
  7. # mkdir linux 
  8.  
  9. # cd linux 
  10.  
  11. # zcat /boot/initrd-2.6.18-164.e15.img | cpio -id 
  12.  
  13. # ls 

# vim init

"mkrootdev -t ext3 -o defaults,ro /dev/vol0/root"改为"mkrootdev -t ext3 -o defaults,ro /dev/sda3"

  1. # find . | cpio -o -H newc --quiet | gzip -9 > /mnt/boot/initrd.gz 
  2.  
  3. # cd /mnt/boot/ 
  4.  
  5. # vim grub/grub.conf 
  6.  
  7. default=0 
  8.  
  9. timeout=10 
  10.  
  11. title lihuan_linux 
  12.  
  13.     root (hd0,0) 
  14.  
  15.     kernel /vmlinuz ro root=/dev/sda3 quiet 
  16.  
  17.     initrd /initrd.gz 
  18.  
  19. # chmod 600 grub/grub.conf 
  20.  
  21. #cd /mnt/sysroot/ 
  22.  
  23. # mkdir -pv ./{etc/rc.d,bin,sbin,dev,usr,home,root,lib,proc,sys,mnt,media,var,tmp,opt} 
  24.  
  25. # ls 

4.准备/etc/inittab,/etc/rc.d/rc.sysinit

  1. # cd etc 
  2.  
  3. # vim inittab 
  4.  
  5. id:3:initdefault: 
  6.  
  7. si::sysinit:/etc/rc.d/rc.sysinit 
  8.  
  9.   
  10.  
  11. l0:0:wait:/etc/rc.d/rc.sysdone 
  12.  
  13.   
  14.  
  15. l1:1:wait:/sbin/init -t1 S 
  16.  
  17.   
  18.  
  19. # vim rc.d/rc.sysinit 
  20.  
  21. #!/bin/bash 
  22.  
  23.  
  24. echo -e "\tWelcome to lihuan_linux!" 
  25.  
  26. echo "insert pcnet32 module..." 
  27.  
  28. insmod /lib/modules/mii.ko 
  29.  
  30. insmod /lib/modules/pcnet32.ko 
  31.  
  32. ifconfig lo 127.0.0.1/8 
  33.  
  34. # chmod +x rc.d/rc.sysinit 
  35.  
  36. # cd .. 
  37.  
  38. # modinfo pcnet32 
  39.  
  40. # modinfo mii 
  41.  
  42. # mkdir lib/modules 
  43.  
  44. # cp /lib/modules/2.6.18-164.e15/kernel/drives/net/mii.ko lib/modules/ 
  45.  
  46. # cp /lib/modules/2.6.18-164.e15/kernel/drives/net/pcnet32.ko lib/modules/ 
  47.  
  48. # cd 

5.复制各二进制文件和库文件

使用bcp脚本实现复制各二进制文件和库文件(bcp.sh文件在附件中,下载到/root下)

# vim bcp.sh  脚本内容如下:

  1. #!/bin/bash 
  2.  
  3.  
  4. function BCP { 
  5.  
  6.   TARGET=/mnt/sysroot  
  7.  
  8.   
  9.  
  10.   COMMAND=`which $1 | grep -o "/.*"
  11.  
  12.   CMDPATH=${COMMAND%/*} 
  13.  
  14.   
  15.  
  16.   [ -d $TARGET$CMDPATH ] || mkdir -p $TARGET$CMDPATH 
  17.  
  18.   [ -e $TARGET$COMMAND ] || cp $COMMAND $TARGET$CMDPATH 
  19.  
  20.   
  21.  
  22.   for LIBFILE in `ldd $COMMAND | grep -o "/.*lib[^[:space:]]*"`; do 
  23.  
  24.     LIBPATH=${LIBFILE%/*} 
  25.  
  26.     [ -d $TARGET$LIBPATH ] || mkdir -p $TARGET$LIBPATH 
  27.  
  28.     [ -e $TARGET$LIBFILE ] || cp $LIBFILE $TARGET$LIBPATH 
  29.  
  30.   done 
  31.  
  32.  
  33.   
  34.  
  35. while true; do 
  36.  
  37.   read -p "A Command: " MYCMD 
  38.  
  39.   case $MYCMD in 
  40.  
  41.   q|Q) 
  42.  
  43.      echo "Quit..." 
  44.  
  45.      exit 0 
  46.  
  47.      ;; 
  48.  
  49.   *) 
  50.  
  51.     ! which $MYCMD &> /dev/null && echo "Wrong command..." && continue 
  52.  
  53.     BCP $MYCMD 
  54.  
  55.     ;; 
  56.  
  57.   esac 
  58.  
  59. done 

# bash -n bcp.sh   执行bcp脚本,复制一些常用命令

  1. # bash bcp.sh 
  2.  
  3. A Command:init 
  4.  
  5. A Command:bash 
  6.  
  7. A Command:insmod 
  8.  
  9. A Command:ifconfig 
  10.  
  11. A Command:ping 
  12.  
  13. A Command:mount 
  14.  
  15. A Command:ls 
  16.  
  17. A Command:vim 
  18.  
  19. A Command:hostname 
  20.  
  21. A Command:halt 
  22.  
  23. A Command:reboot 
  24.  
  25. A Command:sync 
  26.  
  27. A Command:sleep 
  28.  
  29. A Command:mingetty 
  30.  
  31. A Command:yum 
  32.  
  33. A Command:logout 
  34.  
  35. A Command:passwd 
  36.  
  37. A Command:sysctl 
  38.  
  39. A Command:q 
  40.  
  41. # sync 
  42.  
  43. # sync 

# cd /mnt/sysroot

# vim etc/rc.d/rc.sysdone   关机脚本

  1. #!/bin/bash 
  2.  
  3.  
  4. /bin/sync 
  5.  
  6. /bin/sleep 3 
  7.  
  8. /bin/sync 
  9.  
  10. exec /sbin/halt -p 

# chmod +x /mnt/sysroot/etc/rc.d/rc.sysdone  让这个脚本有执行权限

# cd

# tree /mnt/sysroot/  看一下所需目录及文件是否都有

  1. # sync 
  2.  
  3. # sync 
  4.  

6.支持单用户模式

在宿主机中:

  1. # cp /bin/sh /mnt/sysroot/bin/ 
  2.  
  3. # cd /mnt/sysroot/bin/ 
  4.  
  5. # ln -sv sh bash 

# vim /mnt/sysroot/etc/inittab 加上一句:

l1:1:wait:/sbin/init -t1 S

保存退出。

  1. # sync 
  2.  
  3. # sync 

回到宿主机再次修改

7.能够实现开启六个虚拟终端

# vim /mnt/sysroot/etc/inittab 加上下面六句:

  1. 1:2345:respawn:/sbin/mingetty tty1 
  2.  
  3. 2:2345:respawn:/sbin/mingetty tty2 
  4.  
  5. 3:2345:respawn:/sbin/mingetty tty3 
  6.  
  7. 4:2345:respawn:/sbin/mingetty tty4 
  8.  
  9. 5:2345:respawn:/sbin/mingetty tty5 
  10.  
  11. 6:2345:respawn:/sbin/mingetty tty6 

保存退出

# sync 把内存数据同步到磁盘。

8.实现用户登录

# 下载login到本地(文件在附件中,下载到/root下)

# chmod +x login login文件的权限改成可执行权限

# ldd login 查看login依赖哪些库文件

# tree /mnt/sysroot/lib/  发现login依赖的库文件都已经准备好

# cp login /mnt/sysroot/bin/  此时只是提示用户登录,却不能真正实现登录,还需要存放用户,组以及密码的文件

  1. # cd /mnt/sysroot 
  2.  
  3. # head -1 /etc/passwd 
  4.  
  5. # head -1 /etc/passwd > etc/passwd 
  6.  
  7. # head -1 /etc/group 
  8.  
  9. # head -1 /etc/group > etc/group 
  10.  
  11. # head -1 /etc/shadow 
  12.  
  13. # head -1 /etc/shadow > etc/shadow  
  14.  
  15. # chmod 400 etc/shadow 

login登录依赖于nsswitch.conf信息库配置文件

  1. # cd 
  2.  
  3. # cd /usr/lib 
  4.  
  5. # ls | grep libnss     
  6.  
  7. # cp -a libnss_files.so /mnt/sysroot/usr/lib/  
  8.  
  9. # ls /mnt/sysroot/usr/lib 
  10.  
  11. # cp -a libnss3.so libnssckbi.so libnss_dns.so libnssutil3.so libnss_compat.so libnss_db.so /mnt/sysroot/usr/lib/ 
  12.  
  13. # ls /mnt/sysroot/usr/lib 
  14.  
  15. # cd /lib 
  16.  
  17. # ll | grep libnss 
  18.  
  19. # cp -a libnss_compat* libnss_db* libnss_dns* libnss_files* /mnt/sysroot/lib 
  20.  
  21. # ls /mnt/sysroot/usr/lib/ 
  22.  
  23. # ls /mnt/sysroot/lib/ 
  24.  
  25. # cat /etc/nsswitch.conf 
  26.  
  27. # vim /mnt/sysroot/etc/nsswitch.conf 
  28.  
  29. passwd:    files 
  30.  
  31. shadow:    files 
  32.  
  33. group:     files 
  34.  
  35. hosts:     files dns 
  36.  
  37. # sync 
  38.  
  39. # sync 

重新启动测试一下

新建一个虚拟机

 

此时启动目标主机,一个简单的linux实现好了。

再来看看进入单用户模式的结果吧