本例用红帽5.8在虚拟机中进行…
1、准备工作
首先为虚拟机增加一块硬盘(这里硬盘名为hda),对硬盘进行分区,一个作为boot分区一个作为root分区。
格式化并创建文件系统
# mke2fs -j /dev/hda1
# mke2fs -j /dev/hda2 # 为hda磁盘创建ext3的文件系统
挂载
新建两个目录,一个挂载boot分区一个挂载root分区
# mkdir -pv linux/{boot,root} # 创建目录
# mount /dev/hda1 linux/boot # 挂载hda1到linux/boot下
# mount /dev/hda2 linux/root # 挂载hda2到linux/root下
2、开始创建
我们首先要做的是安装grub和内核以及ini
# grub-install --root-directory=linux /dev/hda # 安装grub到linux下,它会自动安装到boot目录下
# cd linux/boot # 切换到boot目录下
# cp /boot/vmlinuz-2.6.18-308.el5 ./ # 复制内核到当前目录下
# cd / # 切换到根目录下
# mkdir initdd # 创建目录initdd
# cd initdd # 切换到initdd目录下
# zcat /boot/initrd-2.6.18-308.el5.img ./ | cpio -id # 将boot目录下的initrd*文件展开到当前目录下
# vim init # 编辑init文件使之适应自己的磁盘和文件系统
# find . | cpio -o -H newc --quiet | gzip -9 > /root/linux/boot/initrd.gz # 归档复制并压缩当前目录下的所有内容保存至linux下的boot目录中,并命名为initrd.gz
# cd /root/linux/boot # 切换到linux下的boot目录下
# vim grub/grub.conf # 在grub目录下创建grub.conf文件并编辑,下面是文件内容
default=0
timeout=3
title Redhat Linux Welcome
root (hd0,0)
kernel /vmlinuz-2.6.18-308.el5
initrd /initrd.gz
# cd ../root # 切换到linux下的root目录下
# mkdir -pv 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 opt boot # 为系统根目录创建系统运行必须的目录
# vim etc/inittab # 创建并编辑inittab文件,下面是内容
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
# vim etc/rc.d/rc.sysinit # 在etc下rc.d下创建并编辑rc.sysinit文件
#!/bin/bash
#
echo " "
/bin/bash
# chmod +x etc/rc.d/rc.sysinit # 给rc.sysinit文件赋予执行权限
# cp /sbin/init sbin/ # 复制init到对应的目录下
# cp /bin/bash bin/ # 复制bash到对应目录下
# ldd /sbin/init # 查看init的依赖文件
将init和bash的依赖文件依次复制过来,这样一个初具雏形的linux就已经出来了。保存好文件将此磁盘放到别的主机上就可以启动了,只不过现在没有什么服务,也没有什么命令可以执行……
下面是一个复制命令及其相关文件的脚本,只需输入要复制的命令即可,复制好后小linux就可以执行了。
#!/bin/bash
#
# cp command go smallLinux
#
DEST=/root/linux/root
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 && 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