自动创建一个小于10M的Linux系统,脚本使用说明:需要在宿主机上装两个硬盘,在测试的时候,只需要把第二块硬盘放到新的虚拟机中,然后启动就行了。
#!/bin/bash
#:Title:
#:Synopsis:
#:Data:
#:Version:1.0
#:Author:ro
#:Options:
#fdisk and fail the device
DISK(){ //封装磁盘分区格式化的函数
read -p "choice a disk[/dev/sdb]:" CHOICE
NUM=`fdisk -l | grep $CHOICE |wc -l &>/dev/null`
if [ "$NUM" -gt '0' ];then
fdisk -l $CHOICE
MOUNT=`mount -l | grep "^$CHOICE" &>/dev/null`
MOUNTDISK=`echo $MOUNT`
for I in $MOUNTDISK ;do
if mount | grep "$I" &>/dev/null ;then
mount | grep "$I"
else
echo "$I is not mounted."
fi
done
fi
}
FAILDISK() {
dd if=/dev/zero of=/dev/sdb bs=512 count=1
sleep .1
return 1
}
#create partions
CREATEDISK() {
echo '
n
p
1
+50M
n
p
2
+512M
n
p
3
+256M
t
3
82
w' | fdisk $CHOICE &>/dev/null
partprobe $CHOICE
sleep .1
mkfs.ext3 ${CHOICE}1 &>/dev/null
mkfs.ext3 ${CHOICE}2 &>/dev/null
mkswap -f ${CHOICE}3 &>/dev/null
#mkfs
}
#mount the fdisk //挂载磁盘分区
MOUNT(){
if [ -d /mnt/$1 ];then
if mount | grep "/mnt/$1";then
umount /mnt/$1
mount $CHOICE$2 /mnt/$1
else
mount $CHOICE$2 /mnt/$1
fi
else
mkdir /mnt/$1
mount $CHOICE$2 /mnt/$1
fi
}
# make the root and make directories in sysboot //创建root目录和sysboot目录
ROOTFS(){
cd /mnt/$1
mkdir {boot,proc,sys,dev,home,root,etc/{rc.d,sysconfig,init.d},bin,sbin,lib,usr/{bin,sbin,lib,include},var/{log,run},tmp,mnt,opt,media} -pv &>/dev/null //创建基本的目录
chmod 777 tmp
#the script for init 0 to shutdown the system
cd /mnt/$1/etc/rc.d
touch shutdown.sh
cat >>shutdown.sh<<EOF
#!/bin/bash
sync
sleep 2
sync
sync
umount /dev/sda1
umount /dev/sda2
exec /sbin/halt -p
EOF
chmod +x shutdown.sh
#the /sysroot/etc/inittab file and creat it
touch /mnt/$1/etc/inittab
cd /mnt/$1/etc
cat >>inittab<<EOF
#default level.
id:3:initdefault:
#--->rc.sysinit.
si::sysinit:/etc/rc.d/rc.sysinit
#----->init 0 to shutdown.
l0:0:wait:/etc/rc.d/shutdown.sh
#----->single user mode.
l1:1:wait:/sbin/init -t1 S
#----->the terminals of the minilinux
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
EOF
#cp the INTERNET CARD module to the minilinux
cd /mnt/$1/lib
mkdir -p modules
cd modules
cp /lib/modules/2.6.18-164.el5/kernel/drivers/net/mii.ko ./
cp /lib/modules/2.6.18-164.el5/kernel/drivers/net/pcnet32.ko ./
#the /etc/sysctl.conf file
cd /mnt/$1/etc
touch sysctl.conf
cat >>sysctl.conf<<EOF
net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
EOF
#the /etc/rc.d/rc.sysinit file
cd /mnt/$1/etc/rc.d
touch rc.sysinit
cat >>rc.sysinit<<EOF
#!/bin/bash
echo -e "\t\tWelcome to \033[31;1mLittle\033[0m Linux..."
##the network modules an set IP address to the minilinux##
if [[ -x /sbin/sysctl && -r /etc/syctl.conf ]];then
echo $"configuring kernel paremeters"
/sbin/sysctl -p /etc/sysctl.conf
echo $"....kernel parameters done."
fi
[ -e /lib/modules/mii.ko ] && /sbin/insmod /lib/modules/mii.ko
[ -e /lib/modules/pcnet32.ko ] && /sbin/insmod /lib/modules/pcnet32.ko
echo "load the eth cart drivers ok.."
echo "set ip "
/sbin/ifconfig lo 127.0.0.1/8
/sbin/ifconfig eth0 192.168.0.133/24
##the network modules an set IP address to the minilinux##
###########The hostname for the minilinux
[ -f /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z $HOSTNAME ] && HOSTNAME=RoQi
echo $HOSTNAME > /proc/sys/kernel/hostname
##########hostname for the systerm
mount -n -o remount,rw /
mount -n -a
EOF
chmod +x rc.sysinit
#the fstab file
cd /mnt/$1/etc/
touch fstab
echo "/dev/sda2 / ext3 defaults 0 0" >fstab
echo "/dev/sda1 /boot ext3 defaults 0 0" >>fstab
echo "sysfs /sys sysfs defaults 0 0" >>fstab
echo "proc /proc proc defaults 0 0" >>fstab
#the issue file to show the login infomation
cd /mnt/$1/etc/
touch issue
cat >>issue<<EOF
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel \r on an \m
*************************
*welcome to Ro's minilinux*
*login:root;passwd: RedHat*
*************************
EOF
##the /proc/sys/kernel file
mkdir -p /mnt/sysroot/proc/sys/kernel/
touch hostname
cat >>hostname<<EOF
Ro.minilinux.org
EOF
#the yum.conf files
mkdir -p /mnt/$1/etc/yum.repos.d/
touch yum.repo
cat >>yum.repo<<EOF
[base]
name=Instructor Server Repository
baseurl=ftp://192.168.0.254/pub/Server
gpgcheck=0
[VT]
name=Instructor VT Repository
baseurl=ftp://192.168.0.254/pub/VT
gpgcheck=0
[Cluster]
name=Instructor Cluster Repository
baseurl=ftp://192.168.0.254/pub/Cluster
gpgcheck=0
[ClusterStorage]
name=Instructor ClusterStorage Repository
baseurl=ftp://192.168.0.254/pub/ClusterStorage
gpgcheck=0
EOF
cd /mnt/$1/root/
touch .bash_profile
echo "PS1='[\u@\h \W]\$'">.bash_profile
}
#this function use to cp files from normal machine to the minilinux
CPLIB(){
#cp the "login" file
cp /tmp/myscript/login /mnt/sysroot/bin
chmod +x /mnt/sysroot/bin/login
#CP libnss files
cp /usr/lib/libnss3.so /mnt/sysroot/usr/lib/
cp /usr/lib/libnssckbi.so /mnt/sysroot/usr/lib/
cp /usr/lib/libnssutil3.so /mnt/sysroot/usr/bin/
cp -d /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/
cp -d /usr/lib/libnss_compat.so /mnt/sysroot/usr/lib/
cp -d /lib/libnss_files* /mnt/sysroot/lib/
cp -d /lib/libnss_compat* /mnt/sysroot/lib/
#cp login files
cp -d /lib/libcrypt.so.1 /mnt/sysroot/lib/
cp -d /lib/libcrypt-2.5.so /mnt/sysroot/lib/
cp /lib/libm.so.6 /mnt/sysroot/lib/
#cp -d /lib/libcrypt-2.5.so /mnt/sysroot/lib/
#cp user and passwd files
cp /etc/passwd /mnt/sysroot/etc/
cp /etc/shadow /mnt/sysroot/etc/
cp /etc/group /mnt/sysroot/etc/
cp /etc/gshadow /mnt/sysroot/etc/
#cp nsswitch.conf file
cp /etc/nsswitch.conf /mnt/sysroot/etc/
}
#the script use to cp the /bin to /mnt/sysroot/bin
BINCP(){
if which $1 &>/dev/null;then
DR=`which $1 | grep -o "/.*" | sed -n 's/\(.*\)\/.*/\1/p'`
FR=`which $1 | grep -o "/.*"`
[ -d ${2}$DR ] || mkdir -pv ${2}$DR &> /dev/null
[ -e ${2}$FR ]|| cp $FR ${2}$DR
LIB=`ldd $FR | sed -n 's/.*\/lib\/\(.*\)/\1/gp' | awk '{print $1}'`
for I in $LIB;do
LDR=`ldd $FR | grep -o '/.*' | awk '{print $1}' | sed -n 's@\(/.*\)/'"$I"'@\1@gp'`
[ -d ${2}$LDR ] || mkdir -pv ${2}$LDR &> /dev/null
[ ! -e ${2}"$LDR"/"$LIB" ] && cp -f "$LDR"/"$I" ${2}$LDR
done
else
echo "$1 is not exit."
fi
}
#change the initrd. file
INIT(){
TMPDIR=`mktemp -d /tmp/little.XX`
cd $TMPDIR
zcat /boot/initrd-2.6.18-164.el5.img | cpio -id
sed -i 's/echo Scanning and configuring dmraid supported devices/#&/g' $TMPDIR/init
sed -i 's/echo Scanning logical volumes/#&/g' $TMPDIR/init
sed -i 's/lvm vgscan --ignorelockingfailure/#&/g' $TMPDIR/init
sed -i 's/echo Activating logical volumes/#&/g' $TMPDIR/init
sed -i 's/lvm vgchange -ay --ignorelockingfailure vol0/#&/g' $TMPDIR/init
sed -i 's/resume LABEL=SWAP-sda3/#&/g' $TMPDIR/init
sed -i 's@mkrootdev -t ext3 -o defaults,ro /dev/vol0/root/@mkrootdev -t ext3 -o defaults,ro sda2@g' $TMPDIR/init
find . | cpio -H newc -o --quiet | gzip -9 > $1/initrd.gz
# cp /boot/vmlinuz-2.6.18-164.el5 $1/vmlinuz
cp /boot/vmlinuz-2.6.28.10-myminilinux /mnt/boot/vmlinuz-2.6.28.10-myminilinux
}
###the grub file
GRUB(){
# install grub
grub-install --root-directory=/mnt $CHOICE &>/dev/null
#the context of grub file
cd /mnt/boot/grub
touch grub.conf
cat >>grub.conf<<EOF
default=0
timeout=10
title Welcome to Ro_Qi minilinux
root (hd0,0)
kernel /vmlinuz-2.6.28.10-myminilinux ro root=/dev/sda2
initrd /initrd.gz
EOF
}
#the main function
HELPWORD(){
echo "./mknewlinux.sh -a:make a new linux."
echo "./mknewlinux.sh -d DEVICE_NAME:make a new fdisk."
echo "./mknewlinux.sh -m:mount the filesystem."
echo "./mknewlinux.sh -r:Initialize the rootfs."
echo "./mknewlinux.sh -b:copy the lib and command."
echo "./mknewlinux.sh -k:edit the interd file."
echo "./mknewlinux.sh -g:make grub.conf."
echo "./mknewlinux.sh -h:help files."
}
while getopts "ad:mrbkgh" OPTS;do
case $OPTS in
a)
DISK
FAILDISK
CREATEDISK
MOUNT boot 1
MOUNT sysroot 2
ROOTFS sysroot
CPLIB
for I in ls ifconfig ping vim useradd userdel usermod yum lsmod modprobe touch insmod mkdir mingetty hostname mv rm vi runlevel sync halt chmod swapoff swapon sysctl umount cp cat init bash ;do
BINCP $I /mnt/sysroot
done
ln -sv bash sh &>/dev/null
INIT /mnt/boot
rm -rf $TMPDIR
GRUB
sync
sync
sleep 2
;;
d)
DISK $OPTARG
FAILDISK $OPTARG
CREATEDISK $OPTARG
;;
m)
MOUNT boot 1
MOUNT sysroot 2
;;
r)
ROOTFS sysroot
;;
b)
CPLIB
for I in pwd ls ifconfig ping useradd userdel usermod yum lsmod modprobe touch insmod mkdir mingetty hostname mv rm vi runlevel sync halt chmod swapoff swapon sysctl umount cp cat init bash ;do
BINCP $I /mnt/sysroot
done
ln -sv bash sh &>/dev/null
;;
k)
NIT /mnt/boot
rm -rf $TMPDIR
;;
g)
GRUB
sync
sync
sleep 2
;;
h)
HELPWORD
;;
*)
HELPWORD
;;
esac
done
#cp -d /lib/libcrypt-2.5.so /mnt/sysroot/lib/
#ln -s bash sh