进行分区,来放置虚拟小linux系统,并通知内核进行读取
格式化文进系统,格式化为ext3文件系统,
- [root@localhost ~]# mke2fs -j /dev/hda1
- [root@localhost ~]# mke2fs -j /dev/hda2
建立boot和sysroot目录,进行挂载,作为小系统的boot分区和 "/"分区,并且进行挂载
拷贝内核的配置文件,作为小系统的内核配置文件
接下来,我们来制作initrd文件,为系统提供开机时所需要的基本驱动。建立一个目录,用来制作新的initrd文件,展开initrd到这个目录,vim init 注释掉不用的语句,删除掉不用的模块来减小initrd的大小,方便运行
进行打包,送到/mnt/boot/下为initrd.gz,
我们可以查看一下/mnt/boot/
安装grub
查看/mnt/boot/是否有grub,编辑grub配置文件grub.conf
这样boot下的文件等就ok啦。
下来就是我们经常使用的根目录/mnt/sysroot/是作为根目录,创建各个子目录。例如
- mkdir -pv proc sys etc/init.d tmp dev sysroot var/{log,lock,run} home root boot
编辑/etc/inittab
- id:3:initdefault:
- si::sysinit:/etc/rc.d/rc.sysinit
- l0:0:wait:/etc/rc.d/rc 0
- l3:3:wait:/etc/rc.d/rc 3
- l6:6:wait:/etc/rc.d/rc 6
- 1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1
- 2:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2
这个过程是为了实现系统初始化,每个级别所执行的脚本,还有远程登录
编辑/mnt/sysroot/etc/rc.d/init.d/rc.sysinit脚本,这个脚本来进行系统初始化,并给文件增加权限
- #!/bin/bash
- #
- echo -e "\tWelcome to \033[34mMageEdu\033[0m Linux"
- echo "Remount rootfs..."
- mount -n -o remount,rw /
- echo "Set the hostname..."
- [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
- [ -z $HOSTNAME -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost
- /bin/hostname $HOSTNAME
- echo "Initializing network device..."
- /sbin/insmod /lib/modules/mii.ko
- /sbin/insmod /lib/modules/pcnet32.k
- chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
建立个级别所执行的脚本文件,以达到各个级别的执行
- /etc/rc.d/init.d/functions脚本,可用于控制服务脚本的信息显示:
- #!/bin/bash
- SCREEN=`stty -F /dev/console size 2>/dev/null`
- COLUMNS=${SCREEN#* }
- [ -z $COLUMNS ] && COLUMNS=80
- SPA_COL=$[$COLUMNS-14]
- RED='\033[31m'
- GREEN='\033[32m'
- YELLOW='\033[33m'
- BLUE='\033\34m'
- NORMAL='\033[0m'
- success() {
- string=$1
- RT_SPA=$[$SPA_COL-${#string}]
- echo -n "$string"
- for I in `seq 1 $RT_SPA`;do
- echo -n " "
- done
- echo -e "[ ${GREEN}OK${NORMAL} ]"
- }
- failure() {
- string=$1
- RT_SPA=$[$SPA_COL-${#string}]
- echo -n "$string"
- for I in `seq 1 $RT_SPA`;do
- echo -n " "
- done
- echo -e "[ ${RED}FAILED${NORMAL} ]"
- }
/etc/rc.d/init.d/tserver脚本,测试SysV服务的定义格式
- #!/bin/bash
- #
- # chkconfig: 35 66 33
- # description: test service script
- #
- . /etc/rc.d/init.d/functions
- prog=tserver
- lockfile=/var/lock/subsys/$prog
- start() {
- touch $lockfile
- [ $? -eq 0 ] && success "Starting $prog" || failure "Staring $prog"
- }
- stop() {
- rm -f $lockfile
- [ $? -eq 0 ] && success "Stopping $prog" || failure "Stopping $prog"
- }
- status() {
- if [ -f $lockfile ]; then
- echo "Running..."
- else
- echo "Stopped..."
- fi
- }
- usage() {
- echo "Usage: $prog {start|stop|status|restart}"
- }
- case $1 in
- start)
- start ;;
- stop)
- stop ;;
- restart)
- stop
- start
- ;;
- status)
- status
- ;;
- *)
- usage
- exit 1
- ;;
- esac
编辑/mnt/sysroot /etc/rc.d/rc.实现关机和重启
建立连接文件
让根文件系统进行读写挂载 /etc/fstab
- /etc/fstab文件示例:
- /dev/hda2 / ext3 defaults 0 0
- /dev/hda1 /boot ext3 defaults 0 0
- proc /proc proc defaults 0 0
- sysfs /sys sysfs defaults 0 0
- 启动网络服务,需要移植模块
- vim etc/rc.d/init.d/network
- #!/bin/bash
- #
- # chkconfig: 35 09 90
- # description:network
- prog=network
- ./etc/rc.d/init.d/functions
- CONF=/etc/sysconfig/network-script/ifcfg-eth0
- . $CONF
- NETMASK=16
- start() {
- ifconfig eth0 $IPADDR/$NETMASK up
- [ -z $GATEWAY ]&& route add default gw $GATEWAY
- }
- stop() {
- ifconfig eth0 down
- }
- status() {
- ifconfig eth0
- }
- ifconfig eth0 $IPADDR/$NETMASK up
- [ -z $GATEWAY ]&& route add default gw $GATEWAY
- }
- stop() {
- ifconfig eth0 down
- }
- status() {
- ifconfig eth0
- }
- usage() {
- echo "$prog: {start|stop|restart|status}"
- }
- case $1 in
- start)
- start
- success "Config network card eth0"
- ;;
- stop)
- stop
- success "Stop network card eth0"
- ;;
- restart)
- stop
- start
- success "Restart network card eth0"
- ;;
- status)
- status
- ;;
- *)
- usage
- exit 1
- ;;
- esac
编辑/mnt/sysroot/etc/sysconfig/network-scripts/ifcfg-eth0
这样小系统就好啦。可以使用终端登录,还有地址,不过需要拷贝一些基本命令,这些基本命令大家视情况而定,这个步骤拷贝起来很麻烦,这里为大家提供一个脚本轻松实现,仅供参考:
- #!/bin/bash
- #
- DEST=/mnt/sysroot
- libcp() {
- LIBPATH=${1%/*}
- [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
- [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished."
- }
- bincp() {
- CMDPATH=${1%/*}
- [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
- [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH
- for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
- libcp $LIB
- done
- }
- read -p "Your command: " CMD
- until [ $CMD == 'q' ]; do
- ! which $CMD &> /dev/null && echo "Wrong command" && read -p "Input again:" CMD && continue
- COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
- bincp $COMMAND
- echo "copy $COMMAND finished."
- read -p "Continue: " CMD
- done
ok啦,希望对各位有所帮助。