安装环境:centos6.8,kernel:2.6.32-642.4.2.el6.x86_64
目标主机:最小化的自制的linux主机
宿主机:在那台linux主机中制作的自制最小化的linux主机,以下皆在宿主机中进行
新添加的磁盘配置信息如下:
1、在虚拟机中新添加一个硬盘,并且记住该硬盘存放位置,以便待会使用,分两个区,分别用于boot和/
# echo -n"
n
p
1
+500M
n
p
2
+5G
w"|fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
2、挂载分区,挂载位置没有应先创建
# mount /dev/sdb1 /mnt/boot
# mount /dev/sdb2 /mnt/sysroot
3、复制linux内核,和initramfs.img至/mnt/boot/下
# cp /boot/vmlinuz-`uname -r`/mnt/boot/vmlinuz
# cp /boot/initramfs-`uname -r`.img /mnt/boot/initramfs.img
4、安装grub至/dev/sdb中
# grub-install --root-directory=/mnt /dev/sdb
注:因为这里是挂载至/mnt目录下,所以将mnt当成grub的根
5、复制一些命令至裁剪的系统中,通过bincp.sh脚本
# bash /root/scripts/bincp.sh
bash
mount
insmod
cat
vim
ls
cd
ifconfig
mkdir
touch
umount
ping
tree
quit
6、将网卡驱动复制过去
查看所有驱动,e1000则是网卡驱动
# lsmod
查看e1000驱动的详细信息,查看该驱动文件位置
# modinfo e1000
# mkdir /mnt/sysroot/lib/modules/ -pv
# cp /lib/modules/`uname -r`/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/
注:lib/modules文件夹没有应事先创建
7、创建目标主机根下相应目录
# mkdir -pv /mnt/sysroot/{etc,etc/rc.d,boot,dev,bin,lib,sbin,home,root,var,usr,tmp,mnt,media,proc,sys}
8、为目标主机建立grub配置文件,让系统能够引导
# vim /mnt/boot/grub/grub.conf
default=0
timeout=3
title siyu
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/sbin/init
initrd initramfs.img
注:这里initrd指令和kernel的值应该与第4步的文件名相同,因为这里init值是/sbin/init,所以需要创建/sbin/init文件并添加相应系统初始化命令,如果不想使用init文件,则改为init=/bin/bash即可,但无法实现网络功能
9、初始化系统文件init,并且赋予执行权限
# vim /mnt/sysroot/sbin/init
#!/bin/bash
echo -e "\t \033[34m linux \033[3m"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
insmod /lib/modules/e1000.ko
ifconfig eth0 192.168.1.4/24
ifconfig lo 127.0.0.0/8
mount -n -t remount,rw /dev/sda2 /
/bin/bash
# chmod +x /mnt/sysroot/sbin/init
10、将sdb硬盘移植进入别的虚拟机中测试
新建一个虚拟机,结果如下,磁盘文件要与host主机新添加的磁盘相同
11、使用init配置文件并且网络配置成功
使用脚本一键执行
这里使用的宿主机根目录为sysroot,挂载至mnt下;boot分区为boot,挂载至/mnt/boot
# vim createsys.sh
#!/bin/bash
disk() {
echo -n ‘
n
p
1
+500M
n
p
2
+5G
wq‘| fdisk "$1"
sleep 3
kpartx -l "$1"
kpartx -af "$1"
partx -a "$1"
dmsetup remove_all
mke2fs -t ext4 "$1"1
mke2fs -t ext4 "$1"2
}
mounts() {
[ -d /mnt/boot/ ] || mkdir /mnt/boot
[ -d /mnt/sysroot/ ] || mkdir /mnt/sysroot
mount "$disk"1 /mnt/boot
mount "$disk"2 /mnt/sysroot
}
cpkernel() {
cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz
cp /boot/initramfs-`uname -r`.img /mnt/boot/initramfs.img
grub-install --root-directory=/mnt /dev/sdb
}
cpcmd() {
bash /root/scripts/bincp.sh #bincp.sh In the /root/scripts/ Next
}
cpnetwork() {
[ -d /mnt/sysroot/lib/modules/ ] || mkdir /mnt/sysroot/lib/modules/ -pv
cp /lib/modules/`uname -r`/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/e1000.ko
}
mkdirs() {
mkdir -pv /mnt/sysroot/{etc,etc/rc.d,boot,dev,bin,lib,sbin,home,root,var,usr,tmp,mnt,media,proc,sys}
}
creategrub() {
echo "
default=0
timeout=3
title siyu
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/sbin/init
initrd /initramfs.img" >> /mnt/boot/grub/grub.conf
}
inits(){
cat >> /mnt/sysroot/sbin/init << EOF
#!/bin/bash
echo -e "\t \033[34m linux \033[0m"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
insmod /lib/modules/e1000.ko
ifconfig eth0 $1
ifconfig lo 127.0.0.0/8
mount -n -t remount,rw /dev/sda2 /
/bin/bash
EOF
chmod +x /mnt/sysroot/sbin/init
}
read -p "input a disk : " disk
disk "$disk"
mounts
cpkernel
cpcmd
mkdirs
cpnetwork
creategrub
read -p "input a ip/netmask: " network
inits "$network"
bincp脚本如下:
#!/bin/bash
#copy command and need so ---> /mnt/sysroot
target=/mnt/sysroot
main() {
if which $1 &> /dev/null ; then
echo "command such "
else
echo "no such command"
return 4
fi
}
bincommand() {
cmdpath=`which --skip-alias $1`
dirpath=`dirname $cmdpath`
[ -d $target ] || mkdir -p $target
[ -d ${target}${dirpath} ] || mkdir -p ${target}${dirpath}
[ -f ${target}${cmdpath} ] || cp $cmdpath ${target}${dirpath}
}
binlib() {
for i in `ldd $cmdpath | grep -o "/[^[:space:]]\{1,\}"` ; do
libdir=`dirname $i`
[ -d ${target}${libdir} ] || mkdir -p ${target}${libdir}
[ -f ${target}${i} ] || cp $i ${target}${libdir}
done
}
while true ; do
read -p "input a command: " cmd
if [[ "$cmd" == ‘quit‘ ]]; then
echo "quitting"
exit 0
fi
if [ $? -ne 0 ] ; then
echo "worng command"
continue
fi
main $cmd
bincommand $cmd
binlib
done