从零构建属于自己的小linux

本文讲述的是利用一个宿主机一步步根据自己喜好构建属于自己的一个小型linux系统。

直接切入正题开始构建属于自己的linux系统。

准备工作:

本次制是在VMware 9 上实现的

宿主机:redhat5.8 ; 内核2.6.18-308.el5

一块10G大小IDE硬盘,10G 已经完全足够

业务不是很熟练在, 在做裁剪linux  有写错或者使用不当的地方希望各位技术达人和博友 批评指正,也希望此博文能给大家带来帮助,更希望达人们给予指导。
                              !!!!在此先谢过!!!!

制作过程:

 
  
  1. 制作过程:  
  2. 1,添加两块磁盘格式化并挂载  
  3.     #mkdir -pv /mnt/{boot,sysroot}  
  4.     #mke2fs -j /dev/hda1  
  5.     #mke2fs -j /dev/hda2  
  6.     #mount /dev/hda1 /mnt/boot/  
  7.     #mount /dev/hda2 /mnt/sysroot/  
  8. ################# 添加内核和grub阶段##################  
  9.  
  10. 2,#cp /boot/vmlinuz-2.6.18-308.el5  /mnt/boot/vmlinuz   
  11. 3, #mkdir test  
  12. 4, #cd test/  
  13. 5, #zcat /boot/initrd-2.6.18-308.el5.img | cpio -id                   #展开initrd 文件  
  14. 6, #vim init  
  15.    找到: mkrootdev -t ext3 -o defaults,ro /dev/vol0/root  
  16.      改为 mkrootdev -t ext3 -o defaults,ro /dev/hda2                  #  
  17. 7, #cd test/lib/    
  18.     rm -f dm-*  
  19. 8, #cd ..  
  20. 9, #find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz   #把当前目录下所有东西打包压缩  
  21. 10, #grub-instasll -root-directory=/mnt /dev/hda                       #生成grub目录  
  22. 11, #ls /mnt/boot  
  23. 12, #vim /mnt/boot/grub/grub.conf                                      #手动配置grub引导内核和initrd  
  24.     default=0  
  25.     timeout=3  
  26.     title mageedu linux(2.6.18)  
  27.          root(hd0,0)  
  28.          kernel /vmlinuz  
  29.          initrd /initrd.gz  
  30. 14, #cd /mnt/sysroot  
  31. 15, #mkdir etc/{rc.d/init.d} bin sbin proc sys dev lib root mnt media  var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmp home boot opt -pv  
  32. 16, #vim /etc/inittab                                                 #创建系统启动等级 和初始化环境执行脚本  
  33.        id:3:initdefault:  
  34.        si::sysinit:/etc/rc.d/rc.sysinit  
  35. 17, #vim /etc/rc.d/rc.sysinit                                         #配置系统初始化内容 和脚本  
  36.             #!/bin/bash  
  37.             echo -e "\tWelcome to \033[34mMageEdu\033[0m linux" 
  38.             /bin/bash  
  39. 18, #chmod +x /etc/rc.d/rc.sysinit  
  40. 19, #cd  
  41.   ############################# 此脚本作用是拷贝小linux上所用到的各种系统命令和依赖包##################  
  42. 20, 新建 bincp.sh 脚本  复制命令  
  43.  #!/bin/bash  
  44.  #  
  45.  DEST=/mnt/sysroot  
  46.  libcp() {  
  47.  LIBPATH=${1%/*}  
  48.  [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH  
  49.  [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished." 
  50.  }  
  51.  
  52.  bincp() {  
  53.  CMDPATH=${1%/*}  
  54.  [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH  
  55.  [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH  
  56.  
  57.  for LIB in  `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do  
  58.  libcp $LIB  
  59.  done  
  60.  }  
  61.  
  62.  read -p "Your command: " CMD  
  63.  until [ $CMD == 'q' ]; do  
  64.  ! which $CMD && echo "Wrong command" && read -p "Input againe" CMD && continue 
  65.  COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`  
  66.  bincp $COMMAND  
  67.  echo "copy $COMMAND finished." 
  68.  read -p "Continue: " CMD  
  69.  done  
  70. 21, 运行 ./bincp.sh 复制 init  bash ls   
  71. 22, #sync  
  72. 21, # chroot /mnt/sysroot                     #切换到小linux上测试一下利用脚本复制的命令  
  73. 22,创建一个新的虚拟机 测试一下  
  74. 23,运行 bincp.sh 拷贝命令  
  75. 24,#mkdir rm mv cp cat mount umount vi vim chmod chown ping ifconfig insmod modprobe rmmod route halt reboot shutdown hostname   
  76.                                               #以上就是添加小linux所用的到的命令  
  77. 25, #sync   
  78. 26, 重新切换到小系统 测试 cp过来的命令 这里的切换时把宿主机挂起,添加一个新的虚拟机,在把硬盘挂载上去  
  79. 27,#mount -n -o remount,rw /               #重新以读写方式挂载 根文件系统  
  80. 28,切换到宿主机  
  81. ###################################### 添加关机功能################################  
  82. 29,#cd /mnt/sysroot/  
  83. 30, #vim etc/rc.d/rc.sysdone                 #添加关机功能脚本  
  84.      #!/bin/bash  
  85.      sync  
  86.      sleep 2  
  87.      exec /sbin/halt -p  
  88. 31, #chmod + etc/rc.d/rc.sysdone  
  89. 31, # ./bincp.sh  启动脚本拷贝 sync 命令  
  90. 32,#cd /mnt/sysroot/  
  91. 33, #vim etc/inittab                         #指定切换到0级别下的关机动作  
  92.    添加: l0:0:wait:/etc/rc.d/rc.sysdone    
  93. 34, #sync                                    #同步一下数据  
  94. 35, 切换到小系统上测试 是否可以正常关机 (切换的时候先把宿主机挂起)  
  95. 36, #init 0  或者 halt   
  96. 37, 关闭小linux  切换到宿主机 添加重启功能  
  97. ##################################添加重启功能#####################  
  98. 38, #cd /mnt/sysroot  
  99. 39, #vim etc/inittab                         #添加6级别下重启脚本   
  100.      l6:6:wait:/etc/rc.d/rc.reboot    
  101. 40, #vim etc/rc.d/rc.reboot  定义重启脚本  
  102.      #!/bin/bash  
  103.       sync  
  104.       sleep 1  
  105.       sync  
  106.       exec /sbin/reboot  
  107. 41, #chmod +x etc/rc.d/rc.reboot  
  108. 42, #sync  
  109. 43, #cd  
  110. 44, 挂起宿主机 切换到小linux  
  111. 45, #init 6   测试重启  
  112. 46, 关闭小linux  切换到 宿主机   
  113. 47, 规范小linux的关机和重启功能,把init 0 和init 6 整合到一起  
  114.  #################, 规范小linux的关机和重启功能,把init 0 和init 6 整合到一起############  
  115.    
  116. 48, #cd /mnt/sysroot  
  117. 49, #vim /etc/rc.d/init.d/halt  整合关机和重启脚本  
  118.      #!/bin/bsha  
  119.       case $0 in 
  120.        *reboot)   
  121.          COMMAND='/sbin/reboot' ;;  
  122.        *halt)  
  123.          COMMAND='/sbin/halt -p' ;;  
  124.        esac  
  125.  
  126.        case $1 in 
  127.          start)  
  128.           ;;  
  129.          stop)  
  130.           ;;  
  131.           *)  
  132.            echo "Usage: `basename $0` {start|stop}" 
  133.         esac  
  134.  
  135.         exec $COMMAND    
  136. 50, #chmod +x etc/rc.d/init.d/halt  
  137. 51,  创建符号链接 方便使用脚本里的 *reboot  *halt  调用  
  138. 52, #cd etc/rc.d/  
  139. 53, #mkdir rc0.d rc6.d  
  140. 54, # cd rc0.d/  
  141. 55, # ln -sv ../init.d/halt  S99halt  
  142. 56, # ll 查看一下链接是否创建  
  143. 57, # cd ..  
  144. 58, # cd rc6.d/  
  145. 59, # ln -sv ../init.d/halt S99reboot  
  146. 60, # cd ..  
  147. 61, # rm -rf rc.reboot rc.sysdone                       #删除这两个脚本现在已经不需要了  
  148. 62,  创建rc 脚本 功能是把所有 S开头的开启  把所有K 开头的都关闭  
  149. 63, # vim rc  
  150.        #!/bin/bash  
  151.        RUNLEVEL=$1  
  152.        for I in /etc/rc.d/rc$RUNLEVEL.d/K*;do  
  153.         $I stop  
  154.        done  
  155.         
  156.        for I in /etc/rc.d/rc.$RUNLEVEL.d/S*;do  
  157.         $I start  
  158.        done  
  159. 64, # chmod +x rc  
  160. 65, # cd ..  
  161. 66, # vim inittab                                       #修改启动参数  
  162.       l0:0:wait:/etc/rc.d/rc 0  
  163.       l6:6:wait:/etc/rc.d/rc 6  
  164. 67, # sync  
  165. 68,  挂起宿主机 切换到小linux  测试  
  166. 69, # init 0    
  167. 70, # init 6  
  168. 80,  切换回宿主机  
  169. 90,  添加 init 3 级别  
  170. 91, # cd /mnt/sysroot  
  171. 92, # vim etc/inittab   添加:  
  172.        l3::wait:/etc/rc.d/rc 3  
  173. 93, # cd  etc/rc.d/  
  174. 94, # mkdir rc3.d  
  175. 95, # vim init.d/tserver  
  176.       #!/bin/bash  
  177.       # chkconfig: 35 66 33  
  178.       # description: test service script  
  179.       prog=`basename $0`  
  180.       lockfile=/var/lock/subsys/$prog  
  181.        
  182.       start(){  
  183.        echo "starting $prog..." 
  184.        touch $lockfile  
  185.       }  
  186.        
  187.       stop() {  
  188.        echo "stopping $prog..." 
  189.        rm -f $loclfile  
  190.       }  
  191.        
  192.       status(){  
  193.        if [ -f $lockfile ]; then 
  194.         echo "Running..." 
  195.        else 
  196.         echo"Stopped..." 
  197.       fi  
  198.       }  
  199.        
  200.       usage() {  
  201.         echo "Usage:$prog {start|stop|status|restart}" 
  202.       }            
  203.       case $1 in 
  204.       start)  
  205.       start ;;  
  206.       stop)  
  207.       stop ;;  
  208.       restart)  
  209.        stop  
  210.        start  
  211.         ;;  
  212.      status)  
  213.       status  
  214.       ;;  
  215.       *)  
  216.       usage  
  217.       exit 1  
  218.       ;;  
  219.       esac  
  220. 96, # chmod +x init.d/tserver  
  221. 97, # init.d/tserver start                       测试脚本  
  222. 98, # ls /var/lock/subsys                        查看此目录下是否有 tserver 文件  
  223. 99, # init.d/tserver stop                        查看是否删除 tserver 文件  
  224. 100,# cd rc3.d/  
  225. 101,# ln -sv ../init.d/tserver S66tserver  
  226. 102,# cd ..  
  227. 103,# cd rc0.d/  
  228. 104,# ln -sv ../init.d/tserver K33tserver  
  229. 105,# sync  
  230.     此处加一步如下:  
  231.       1, cd   
  232.       2,  stty -F /dev/console speed  查看屋里终端速率  
  233.  ##################实现tty终端########    
  234. 106,# cd /mnt/sysroot/etc/  
  235. 107,# vim inittab  
  236.       1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1  
  237.       1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2  
  238. 108,# vim rc.d/rc.sysinit  
  239.       #!/bin/bash  
  240.        echo -e "\tWelcome to \033[34mMageEdu\033[0m linux" 
  241.        /bin/bash   ## 去掉此行  
  242. 109,# cd  
  243. 110,# ./bincp.sh   移植 agetty  basename  seq  stty  
  244. 111,# syuc  
  245. 112,# cd /mnt/sysroot         
  246. 113,# ln -sv bash sh  
  247. 114,# sync  
  248. 115, 挂起 宿主机 开启小linux   测试  
  249.   如果文件系统错乱 修复方法如下:  
  250.   切换到宿主机上   
  251.   1,# cd /mnt/sysroot/  
  252.   2,# find . | cpio -H newc --quiet -o | gzip > /root/sysroot.gz  
  253.   3,# cd   
  254.   4,# umount /dec/hda2  
  255.   5,# fuser -km /dev/hda2  
  256.   6,# umount /dev/hda2  
  257.   7,# mke2fs -j /dev/hda2  或者用 e2fsck -f /dev/hda2  
  258.   8,# mount /dev/hda2 /mnt/sysroot  
  259.   9,# cd /mnt/sysroot  
  260.   10,# zcat /root/sysroot.gz |cpio -id   
  261.   11,# sync  
  262.  
  263. 116,  ###################实现让根文件系统能自动挂载#############  
  264. 117,# cd /mnt/sysroot  
  265. 118,# vim etc/fstab  创建fstab 文件  
  266.       /dev/hda2   /         ext3     defaults  0 0  
  267.       /dev/hda1   /boot     ext3     defaults  0 0  
  268.       proc        /proc     ext3     defaults  0 0  
  269.       sysfs       /sys      sysfs    defaults  0 0   
  270. 119,# mkdir etc/sysconfig  
  271.  ####################### 添加主机名###############  
  272. 120,# vim etc/sysconfig/network     设置主机名  
  273.       HOSTNAME=minilinux.magedu.com  
  274. 121,# vim etc/rc.d/rc.sysinit   让开机以读写方式挂载根文件系统,并设置主机名  
  275.       echo "Remount rootfs" 
  276.       mount -n -o  remount,rw  /  
  277.        
  278.       echo "set the hostname..." 
  279.       [ -f /etc/sysconfig/network ] && /etc/sysconfig/network  
  280.       [ -z $HOSTNAME -o  "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost  
  281.       /bin/hostname  $HOSTNAME  
  282. 122,# sync   
  283. 123,# 切换到 小linux 测试    
  284. 124,# 切换到宿主机  添加系统启动时 显示的 绿色OK 和 红色报错  
  285.  ###################添加系统启动时 显示的 绿色OK 和 红色报错#############################  
  286. 125,# cd /mnt/sysroot  
  287. 126,# vim  etc/rc.d/init.d/functions              #定义启动时候的绿色 [ OK ]  和红色 [FAILED]  
  288.        
  289.        SCREEN=`stty -F /dev/console size 2> /dev/null`  
  290.        COLUMNS=${SCREEN#*}  
  291.        [ -z $COLUMNS ] && COLUMNS=80  
  292.        SPA_COL=$[COLUMNS-14]  
  293.        
  294.        RED='\033[31m' 
  295.        GREEN='\033[32m' 
  296.        YELLOW='\033[33m' 
  297.        BLUE='\033\34m' 
  298.        NORMAL='\033[0m' 
  299.        
  300.        success() {  
  301.         string=$1  
  302.         RT_SPA=$[$SPA_COL-${#string}]  
  303.         echo -n "$string" 
  304.       for I in `seq 1 $RT_SPA`;do  
  305.         echo -n " " 
  306.       done  
  307.         echo -e "[   ${GREEN}OK${NORMAL}   ]" 
  308.        }  
  309.         
  310.       failure() {  
  311.         string=$1  
  312.         RT_SPA=$[$SPA_COL-${#string}]  
  313.         echo -n "$string" 
  314.        for I in `seq 1 $RT_SPA`;do  
  315.         echo -n " " 
  316.        done  
  317.         echo -e "[ $[RED]FAILED${NORMAL}]" 
  318.        }  
  319.          
  320. 127,# vim etc/rc.d/init.d/tserver  修改成如下内容:  
  321.        
  322.       #!/bin/bash  
  323.       # chkconfig: 35 66 33  
  324.       # description: test service script  
  325.       . /etc/rc.d/init.d/functions  
  326.        
  327.       prog=tserver  
  328.       lockfile=/var/lock/subsys/$prog  
  329.        
  330.       start(){  
  331.        touch $lockfile  
  332.        [ $? -eq 0 ] && success "Starting $prog" || failure "Staring $prog" 
  333.       }  
  334.        
  335.      stop() {  
  336.        rm -f $loclfile  
  337.        [ $? -eq 0 ] && success "Stoppting $prog" || failure "Stopping $prog" 
  338.       }  
  339.        
  340.       status(){  
  341.        if [ -f $lockfile ]; then 
  342.        echo "Running..." 
  343.       else 
  344.        echo"Stopped..." 
  345.       fi  
  346.       }  
  347.        
  348.       usage() {  
  349.         echo "Usage:$prog {start|stop|status|restart}" 
  350.       }            
  351.       case $1 in 
  352.        start)  
  353.         start ;;  
  354.        stop)  
  355.         stop ;;  
  356.       restart)  
  357.        stop  
  358.        start  
  359.         ;;  
  360.       status)  
  361.        status  
  362.        ;;  
  363.       *)  
  364.        usage  
  365.        exit 1  
  366.        ;;  
  367.       esac  
  368.        
  369. 128,# sync  
  370. 129, 切换到下linux 下测试 启动信息是否 显示 绿色 [ OK ]  
  371. 130, 切换到 宿主机  添加 ip地址功能  
  372.  #########################实现网卡功能#####################  
  373. 131,# cd /mnt/sysroot  
  374. 132,# mkdir lib/modules  
  375. 133,# modinfo pcnet32   查看网卡模块都有那些依赖块  
  376. 134,# cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko /mnt/sysroot/lib/modules  
  377. 135,# modinfo mii  
  378. 136,# cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/mii.ko /mnt/sysroot/lib/modules  
  379. 137,#  vim etc/rc.d/rc.sysinit  让系统启动自动装载网卡模块  
  380.         echo "Initializing network device..." 
  381.        /sbin/insmod  /lib/modules/mii.ko  
  382.        /sbin/insmod  /lib/modeles/pcnet32.ko  
  383. 138,# mkdir etc/sysconfig/network-scripts  创建网卡目录  
  384. 139,# vim etc/sysconfig/network-scripts/ifcfg-eth0  
  385.       DEVICE=eth0  
  386.       BOOTPROTO=static 
  387.       IPADDR=172.16.100.5  
  388.       NETMASK=255.255.0.0  
  389.       GATEWAY=172.16.0.1  
  390.       ONBOOT=yes  
  391. 140,# vim etc/rc.d/init.d/network   让ip能在服务启动脚本自动启动  
  392.        #!/bin/bash  
  393.        # chkconfig: 35 09 90  
  394.         prog=network  
  395.         . /etc/rc.d/init.d/functions  
  396.         CONF=/etc/sysconfig/network-scripts/ifcfg-eth0    
  397.         . $CONF  
  398.           
  399.         NETMASK=16  
  400.          start() {  
  401.           ifconfig eth0 $IPADDR/$NETMASK up  
  402.           [ -z $GATEWAY ] && route add default gw $GATEWAY  
  403.          }    
  404.            
  405.          stop() {  
  406.           ifconfig eth0 down  
  407.          }  
  408.            
  409.          status() {  
  410.           ifconfig eth0  
  411.          }  
  412.            
  413.          usage() {  
  414.           echo "$prog: {start|stop|restart|status}" 
  415.          }  
  416.            
  417.          case $1 in   
  418.          start)  
  419.           start   
  420.           success "Config network eth0" 
  421.           ;;  
  422.          stop)  
  423.           stop  
  424.           success "Config network card eth0" 
  425.           ;;  
  426.          restart)  
  427.           stop  
  428.           start  
  429.           success "Restart network card eth0" 
  430.           ;;  
  431.          status)  
  432.           status  
  433.           return 0  
  434.           ;;  
  435.          *)  
  436.           usage  
  437.           exit 1  
  438.           ;;  
  439.          esac  
  440. 141,# chmod +x etc/rc.d/init.d/network    
  441. 142, 让网卡能在级别3 开启  级别6 和 0 关闭          
  442. 143,# cd et/rc.d/rc0.d/  
  443. 144,# ln -sv ../init.d/network K90network  
  444. 145,# cd ../rc6.d  
  445. 146,# ln -sv ../init.d/network K90network  
  446. 147,# cd ../rc3.d  
  447. 148,# ln -sv ../init.d/network S09network  
  448. 149,# sync  
  449. 150, 测试一下网卡是否可以启动  
  450. 151,# chroot /mnt/sysroot   在宿主机上切换到小linux  
  451. 152,# /etc/rc.d/init.d/network start  
  452.  
  453. 到此为止 以个简小的linux 制作完成。 由于初次做裁剪linux  有写错或者使用不当的地方希望各位技术达人和博友 批评指正。  
  454.      !!!!在此先谢过!!!!  
  455.  
  456.