本文接上篇,假设mini linux挂载在宿主机的/mnt/boot和/mnt/sysroot下,本文的一些脚本都是简化的,只求达到我们的目的,linux的工作流程比想象中复杂的多
现在我们有一个可用的mini linux,让我们对它进行一些扩展
- 重新挂载根文件系统为读写
首先给minlinux提供个fstab配置文件,内容如下:
在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这个父进程不会自己结束,不能完全关机。
脚本内容如下:
[[email protected] 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"
效果如下图:
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再执行,自己手动会有错),最终效果如下:
注:
如果启动过程包device no found 看看是否有挂载网卡,这个network脚本是stop不了的,模块无法卸载会报modprobe: FATAL: Could not load /lib/modules/2.6.8.custem/modules.deb的错,具体原因有待研究