在宿主机上添加一个磁盘,
分区格式化该磁盘,把这个磁盘分为
3
个分区:根分区,
swap
分区和内核所在的
boot
分区。
[root@localhost ~]# fdisk /dev/sdb
#
分区新磁盘
磁盘分区为如下所示:
Device Boot Start End Blocks Id System
/dev/sdb1
1 13 104391 83 Linux
/dev/sdb2
14 45 257040 82 Linux swap / Solaris
/dev/sdb3
46 168 987997+ 83 Linux
格式化
sdb1
和
sdb3
:
[root@localhost ~]# mke2fs -j /dev/sdb1
[root@localhost ~]# mke2fs -j /dev/sdb3
格式化
sdb2
:
[root@localhost ~]# mkswap /dev/sdb2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
安装
grub
:
准备工作:把磁盘挂载到指定目录:
[root@localhost ~]# mkdir /mnt/{boot,sysroot}
#
准备两个挂载目录
[root@localhost ~]# mount /dev/sdb1 /mnt/boot/
#
为微
linux
准备
boot
[root@localhost ~]# mount /dev/sdb3 /mnt/sysroot/
#
为微
linux
准备跟
安装
grub
:
[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb
注意:安装成功后,
/dev/sdb
被识别成了
hd1
[root@localhost ~]# ls /mnt/boot/grub/
#
查看
grub
是否安装成功
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
准备内核和
initrd
:
[root@localhost ~]# cd /mnt/boot/
[root@localhost boot]# cp /boot/vmlinuz- 2.6.18 -164.el5 ./vmlinuz
#
把宿主主机上的内核复制到
/mnt/boot
下,为微
linux
准备内核,并命名为
vmlinuz
initrd
的制作比较麻烦,最好切换到临时目录
/tmp
下制作,并新建一个目录,这里就把此新建目录命名为
linux
:
[root@localhost boot]# cd /tmp/
[root@localhost tmp]# mkdir linux
开始制作
initrd
:
[root@localhost tmp]# cd linux
/
[root@localhost linux]# zcat /boot/initrd- 2.6.18 -164.el5.img | cpio �Cid
#
把宿主主机上的
initrd
复制并展开到当前
目录下
编辑当前目录下的
init
文件把文件后面的一行“
mkrootdev -t ext3 -o defaults,ro /dev/vol0/root
”
改为“
mkrootdev -t ext3 -o defaults,ro /dev/sda3
”
注释:当
sdb
这个磁盘被放到微
linux
当做系统磁盘使用时,它就是
sda
[root@localhost linux]# find . | cpio -o -H newc --quiet | gzip -9 > /mnt/boot/initrd.gz
#
封装并强力压缩当前所有然后把它输送到
/mnt/boot/
下
好了,准备好了
grub
,内核和
initrd
,就可以把小磁盘放到微
linux
上实现启动了,不过要编辑
grub
的配置文件使它实现自动启动。
准备
grub
的配置文件:
[root@localhost linux]# cd /mnt/boot/
#
切换到
boot
目录
[root@localhost boot]# vim grub/grub.conf
default=0
#
指定默认启动内核
timeout=3
#
设定等待时间
title lhf_linux
#
命名
root (hd0,0)
#
指定
root
kernel /vmlinuz ro root=/dev/sda3 quiet
#
指定内核
initrd /initrd.gz
#
指定
initrd
此时如果启动微
linux
,虽然能够启动成功,但不能执行任何除了系统自带的命令,接下来。为微
linux
准备一些系统常用目录。
[root@localhost boot]# cd /mnt/sysroot/
[root@localhost sysroot]# mkdir -pv ./{etc/rc.d,bin,sbin,dev,usr,home,root,lib,proc,
sys,mnt,media,var,tmp,opt}
++++++++++++++++++++++++++++++++++++++++++++++++++++++
准备配置文件
/etc/inittab,/etc/rc.d/rc.sysinit
:
[root@localhost sysroot]# cd etc/
[root@localhost etc]# vim inittab
id:3:initdefault:
#
指定默认启动级别
si::sysinit:/etc/rc.d/rc.sysinit
#
系统初始化
l0:0:wait:/etc/rc.d/rc.sysdone
#
当进入级别
0
时,执行关机脚本
1:2345:respawn:/sbin/mingetty tty1
#
启动
6
个虚拟终端
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
注意:启动虚拟终端需要
mingetty
命令,在下面复制命令时不要忘记添加
准备系统初始化文件:
[root@localhost etc]# vim rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to lhf_linux"
echo "insert pcnet32 module..."
#
模块初始化
insmod /lib/modules/mii.ko
#
载入
mii
模块,它被
pcnet32
模块所依赖
insmod /lib/modules/pcnet32.ko
#
载入网卡的驱动模块并指定模块存放路径
ifconfig lo 127.0.0.1/8
#
设定本地回环地址
[root@localhost etc]# chmod +x rc.d/rc.sysinit
#
给此文件一个执行权限
接下来需要复制
pcnet32
的模块,而
pcnet32
模块又依赖于
mii
模块,所以都要复制过来。
[root@localhost etc]# modinfo pcnet32
#
查看此模块的详细信息,包括路径和所依赖的模块
复制之前,新建一个目录:
[root@localhost sysroot]# mkdir lib/modules
复制
pcnet32
模块和它所依赖的
mii
模块:
[root@localhost sysroot]# cp /lib/modules/ 2.6.18 -164.el5/kernel/drivers/net/mii.ko lib/modules/
[root@localhost sysroot]# cp /lib/modules/ 2.6.18 -164.el5/kernel/drivers/net/pcnet32.ko lib/modules/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
接下来就需要复制各种常用的命令和文件了:
对于一些常用的命令的使用,如:
init,bash,insert,ifconfig,ping,mount,ls,vim,hostname,halt,reboot,sync,sleep,mingetty
,,它们各自依赖于不止一个的库文件,所以,把命令复制响应的目录下后,还需把它所需的库文件全部复制过来。“
which command
”命令查看
command
所在位置,然后把它复制到微
linux
的响应位置;“
ldd command
”
命令可以查看这个命令所依赖的库文件。例如:
[root@localhost sysroot]# which ls
#
查看
ls
命令所在位置
alias ls='ls --color=tty'
#
输出的别名信息
/bin/ls
#
显示
ls
命令所在位置
[root@localhost sysroot]# cp /bin/ls bin/
#
把宿主机上的
ls
复制到微
linux
但是此时
ls
命令不能用,还需复制它所依赖的库文件。
[root@localhost sysroot]# ldd /bin/ls
#
查看
ls
命令所依赖的库文件
linux-gate.so.1 => (0x0027f000)
librt.so.1 => /lib/librt.so.1 (0x00c71000)
libacl.so.1 => /lib/libacl.so.1 (0x00c7c000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00818000)
libc.so.6 => /lib/libc.so.6 (0x00ae1000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00c58000)
/lib/ld-linux.so.2 (0x00abe000)
libattr.so.1 => /lib/libattr.so.1 (0x008d8000)
libdl.so.2 => /lib/libdl.so.2 (0x00c29000)
libsepol.so.1 => /lib/libsepol.so.1 (0x00832000)
上面输出的所有库文件都要复制到微
linux
上,例如:
[root@localhost sysroot]# cp /lib/librt.so.1 lib/
显然这样做的速度会很慢,下面就提供了一个脚本,脚本执行时,它会提示你输入你想要复制的命令,它会把命令及其所依赖的库文件复制到相应路径下,当输入“
q
“时则退出脚本执行,脚本内容如下:
#!/bin/bash
#
function BCP {
TARGET=/mnt/sysroot
COMMAND=`which $1 | grep -o "/.*"`
CMDPATH=${COMMAND%/*}
[ -d $TARGET$CMDPATH ] || mkdir -p $TARGET$CMDPATH
[ -e $TARGET$COMMAND ] || cp $COMMAND $TARGET$CMDPATH
for LIBFILE in `ldd $COMMAND | grep -o "/.*lib[^[:space:]]*"`; do
LIBPATH=${LIBFILE%/*}
[ -d $TARGET$LIBPATH ] || mkdir -p $TARGET$LIBPATH
[ -e $TARGET$LIBFILE ] || cp $LIBFILE $TARGET$LIBPATH
done
}
while true; do
read -p "A Command: " MYCMD
case $MYCMD in
q|Q)
echo "Quit..."
exit 0
;;
*)
! which $MYCMD &> /dev/null && echo "Wrong command..." && continue
BCP $MYCMD
;;
esac
done
执行脚本如下:
[root@localhost sysroot]# bash bcp.sh
A Command: vim
A Command: hostname
A Command: reboot
A Command: q
Quit...
[root@localhost sysroot]#sync
#
使同步生效
编辑关键脚本:
[root@localhost sysroot]# vim etc/rc.d/rc.sysdone
#
命名为
rc.sysdone
#!/bin/bash
#
sync
#
执行同步命令
sleep 3
#
睡眠
3
秒钟
sync
exec /sbin/halt �Cp
#
执行关闭电源命令
[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysdone
#
给此脚本一个执行权限
多次执行
sync
命令,注意一定要在宿主机的根目录下执行同步命令,如下:
[root@localhost ~]# sync
新建一个虚拟机,让它使用一个已存在的磁盘,也就是刚才准备的宿主机上的
sdb,
。启动测试。
本文出自 “小李的学习之旅” 博客,谢绝转载!