本文接上篇,假设mini linux挂载在宿主机的/mnt/boot和/mnt/sysroot下,本文的一些脚本都是简化的,只求达到我们的目的,linux的工作流程比想象中复杂的多


现在我们有一个可用的mini linux,让我们对它进行一些扩展

  1. 重新挂载根文件系统为读写

    首先给minlinux提供个fstab配置文件,内容如下:

    wKiom1eLJ8_RsolJAACDw4M-VWo164.png-wh_50

    在rc.sysinit里面添加mount -o remount,rw /

    如果此时mini linux 的etc目录下没有mstab文件,则使用 mount -o -n remount,rw /命令,否则报错


2.设定主机名

    <1>移植hostname命令,并给mini linux 提供个配置文件

    echo "HOSTNAME=mylinux" > /mnt/sysroot/etc/sysconfig/network

    <2>在rc.sysinit中添加以下内容


echo -e "set up HOSTNAME..."

if [ -f /etc/sysconfig/network ]; then

    . /etc/sysconfig/network

fi

if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then

    HOSTNAME=localhost

fi

hostname  $HOSTNAME


3.关机和重启

    首先编辑级别服务脚本,(linux关机重启halt、reboot等命令会跳到对应启动级别去执行服务脚本)必须在对应级别下执行关机重启命令,否则无法执行成功。   这里还需要用到一个内建命令exec,bash执行某个命令的时候,会fork一个子进程去执行,使用exec命令后,直接替换父进程去执行。简单地讲,不用exec时候,halt 关机的子进程结束后,bash这个父进程不会自己结束,不能完全关机。

    脚本内容如下:

    

[root@test sysroot]# cat etc/rc.d/init.d/halt 

#!/bin/bash

case $0  in

*halt)

COMMAND="halt -p";;

*reboot)

COMMAND="reboot";;

*)

esac

exec $COMMAND


创建软连接:

 ln /mnt/sysroot/etc/rc.d/init.d/halt   /mnt/sysroot/etc/rc0.d/K99halt  -sv

 ln /mnt/sysroot/etc/rc.d/init.d/halt   /mnt/sysroot/etc/rc6.d/K99reboot  -sv


编辑etc/rc.d/下的rc和配置文件inittab

rc 内容如下:

#!/bin/bash

RUNLEVEL=$1

for i  in /etc/rc${RUNLEVEL}.d/K*

do

$i stop;

done


for i  in /etc/rc${RUNLEVEL}.d/S*

do

$i start;

done


inittab追加下面几行:

l0:0:wait:/etc/rc.d/rc 0

l3:3:wait:/etc/rc.d/rc 3

l6:6:wait:/etc/rc.d/rc 6

    服务脚本和rc都要授予执行权限,到这里就可以在mini linux中使用init 0和init 6关机重启了。


4.各级别服务脚本

    服务脚本格式参考linux启动流程篇。


5.启动终端

    这里系统默认的mingetty不能只指定bash,它会一直调用login程序,而且也依赖/bin/sh,所以这里采用agetty替代。

    移植agetty,并在inittab里面追加以下两行:    

1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1

2:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2

    -n 要与-l 一起用,-n指不使用用户名登陆,-l指使用的shell 38400指的是屏幕显示速率可以用

stty -F /dev/console speed得出


6.定义function函数

    这里只定义两个函数,为的是使开机流程看起来更像centos,内容如下:


success(){

STRING=$1

OK="[ \033[32m  ok \033[0m  ]"

ALL=`stty -F /dev/console size|awk '{print $2}'`

SPA=$[$ALL-${#STRING}-${#OK}]

echo -n "$STRING"

for i  in `seq 1 $SPA`

do

echo  -n " " 

done

echo  -e  "$OK"

}


failed(){

STRING=$1

FAILED="[\033[31m failed \033[0m]"

ALL=`stty -F /dev/console size|awk '{print $2}'`

SPA=$[$ALL-${#STRING}-${#FAILED}]

echo -n "$STRING"

for i  in `seq 1 $SPA`

do

echo  -n " " 

done

echo  -e  "$FAILED"

}

err_check(){

if [ $? -eq 0 ];then

success $1

else

failed $1

fi

}


修改rc.sysinit如下:

#!/bin/bash

. /etc/init.d/functions

echo "remount  /  ..."

mount -o remount,rw  /

err_check "remount  / ..."

echo -e "set up HOSTNAME..."

if [ -f /etc/sysconfig/network ]; then

    . /etc/sysconfig/network

fi

if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then

    HOSTNAME=localhost

fi

hostname  $HOSTNAME

err_check "set up HOSTNAME..."

echo -e "Welcome to \033[31m linzb\033[0m's mini linux"


效果如下图:

wKioL1eMp8GT2MFkAAAm3CPokHc369.png-wh_50


6. 给mini linux配置网络功能

    首先要装载网卡驱动模块,因为实在虚拟机操作的,网卡类型为pcnet32,pcnet32又依赖于mii模块(可以用modinfo pcnet32查看),所以要装载两个模块

    编辑/mnt/sysroot/etc/sysconfig/network-scripts/ifcfg-eth0 文件内容如下:


DEVICE=eth0

BOOTPROTO=static

HWADDR=00:0C:29:5B:58:99

ONBOOT=yes

IPADDR=192.168.2.224

GATEWAY=192.168.2.1

NETMASK=255.255.255.0


    编辑启动脚本/mnt/sysroot/etc/init.d/network,内容如下:


#!/bin/bash

#chkconfig:3 20 79

#description:network config

#

. /etc/init.d/functions

. /etc/sysconfig/network-scripts/ifcfg-eth0

LOCK_FILE=/var/lock/subsys/network

start(){

echo "starting  network  config ... "

touch $LOCK_FILE

insmod  /lib/modules/mii.ko

insmod  /lib/modules/pcnet32.ko

ifconfig $DEVICE $IPADDR  netmask $NETMASK up

route add default gw $GATEWAY

err_check "network starting.."

}

stop(){

echo "stopping network ...."

rm  $LOCK_FILE

modprobe -r pcnet32.ko

modprobe -r mii.ko

err_check "network stopping.."

}

status(){

if [ -f $LOCK_FILE ] ;then

echo  "network working ..."

else

echo  "network stopped.."

fi

}

case $1 in

start)

start ;;

stop)

stop ;;

restart)

stop

start;;

status)

status;;

*)

echo "Usage: $0 [start|stop|status|restart]";;

esac


    chmod +x给network执行权限,并用chkconfig创建启动级别软连接(这个要chroot 到/mnt/sysroot再执行,自己手动会有错),最终效果如下:

    wKioL1eN8zDwzHpiAABFPiG92dc756.png-wh_50

注:

    如果启动过程包device no found 看看是否有挂载网卡,这个network脚本是stop不了的,模块无法卸载会报modprobe: FATAL: Could not load /lib/modules/2.6.8.custem/modules.deb的错,把modprobe -r改成rmmod命令后成功解决
















本文转自biao007h51CTO博客,原文链接: http://blog.51cto.com/linzb/1827840,如需转载请自行联系原作者