安裝環境: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