一、构思
在这里我们是通过在一台拥有两个盘的linux上运行自动化脚本(一个系统所在盘sda,一个空盘sdb),在其系统所在盘创建一个类linux根目录,和boot目录,并通过母linux系统,将其所需的grub,软件,服务等复制过去,然后将它挂载到sdb,最后新建一个linux用母系统的sdb盘作为系统盘.
二、所需文件
我的自动化脚本main.sh;另外我实现了用户登录验证,这里我是直接把login这个单独弄了出来,方便复制;还有一个名叫txt的文件,这里他是记录我们所需的命令,例如ls等,如果有其他需要可以在这里面继续添加,防止在给微型linux系统加命令是有不必要的麻烦
四、建立微型linux系统
将上述已经做好的盘,放到准备建立的新的linux系统下
启动服务/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf
main.sh
#!/bin/bash
#
alias rm=rm
SYSROOT=/mnt/sysroot
BOOT=/mnt/boot
read -p "please input which dev you want to run :" WHDEV
umountall()
{
for PART in `fdisk -l $1 | grep -o "^${1}[0-9]\{1,\}"`;do
fuser -km $PART &> /dev/null
umount $PART
done
}
umountall $WHDEV
sync
sync
sleep 2
sync
sync
fdinput()
{
read -p "would you want to do this :y/n" PANDUAN
if [ "$PANDUAN" = "y" ];then
dd if=/dev/zero of=$1 bs=512 count=1 &> /dev/null
sync
sync
sync
sync
sync
sleep 20
sync
sync
sync
sync
sync
[ $? -eq 0 ] || return 67
echo '
n
p
1
+100M
n
p
2
+1G
n
p
3
+128M
t
3
82
w ' | fdisk $1 &> /dev/null
[ $? -eq 0 ] || return 68
sync
partprobe $1
sync
echo "please wait 5 seconds"
sync
sync
sleep 5
sync
sync
mkfs -t ext3 ${1}1
[ $? -eq 0 ] || return 69
mkfs -t ext3 ${1}2
[ $? -eq 0 ] || return 69
mkswap ${1}3
[ $? -eq 0 ] || return 69
return 0
else
exit
fi
}
fdinput $WHDEV
case $? in
67)
echo "qingkong dev failed"
;;
68)
echo "create main dev failed"
;;
69)
echo "mkfs dev failed"
;;
0)
echo "successful"
;;
*)
echo "unknow fault"
;;
esac
sync
sync
sleep 2
sync
sync
mountall()
{
[ -d $BOOT ] || mkdir -p $BOOT
[ -d $SYSROOT ] || mkdir -p $SYSROOT
mount ${1}1 $BOOT
mount ${1}2 $SYSROOT
}
mountall $WHDEV
sync
sync
sleep 2
sync
sync
installgrub()
{
grub-install --root-directory=/mnt /dev/sdb $1 &> /dev/null
}
installgrub $WHDEV
sync
sync
sleep 2
sync
sync
mkrootfs()
{
mkdir -p $SYSROOT/{proc,boot,sys,dev,tmp,lib,bin,sbin,root,home.opt,mnt,media,misc}
mkdir -p $SYSROOT/usr/{share/{man,doc},bin,sbin,local/sbin,src,lib}
mkdir -p $SYSROOT/etc/{rc.d,sysconfig}
mkdir -p $SYSROOT/var/{lock,tmp,spool,run,log}
}
mkrootfs
sync
sync
sleep 2
sync
sync
bcp()
{
COMMAND=`which $1 | grep -o "/.*"`
CMDPATH=${COMMAND%/*}
[ -d $SYSROOT$CMDPATH ] || mkdir -p $SYSROOT$CMDPATHI
[ -e $SYSROOT$COMMAND ] || cp $COMMAND $SYSROOT$CMDPATH
for LIB in `ldd $COMMAND | grep -o "/.*lib[^[:space:]]*"`;do
LIBPATH=${LIB%/*}
[ -d $SYSROOT$LIBPATH ] || mkdir -p $SYSROOT$LIBPATH
[ -e $SYSROOT$LIB ] || cp $LIB $SYSROOT$LIBPATH
done
}
for COMD in `cat txt`;do
case $COMD in
q|Q)
break
;;
*)
! which $COMD &> /dev/null && echo "wrond command ,please input again." && continue
bcp $COMD
;;
esac
done
#copy kernel
sync
sync
sleep 2
sync
sync
cpker()
{
cp /boot/vmlinuz-2.6.18-308.el5 $BOOT/vmlinuz
cd /tmp
mkdir myroot
cd myroot/
zcat /boot/initrd-2.6.18-308.el5.img | cpio -id
sed -i '93,97d' init
sed -i 's@/dev/vo10/root@/dev/sda2@' init
find . | cpio -o -H newc --quiet | gzip -9 > $BOOT/initrd.gz
cd /tmp
rm -r myroot/
}
cpker
sync
sync
sleep 2
sync
sync
#conf
cconf()
{
cd $BOOT
cd grub
touch grub.conf
echo "
default=0
timeout=3
title MY Linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 quiet
initrd /initrd.gz
" > grub.conf
sync
sync
sync
cd $SYSROOT/bin
ln -s bash sh
cd $SYSROOT
cd etc/
touch inittab
echo "
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc.sysdone
l1:1:wait:/sbin/init -t 1 S
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
" > inittab
sync
sync
touch rc.d/rc.sysinit
chmod +x rc.d/rc.sysinit
echo "
#!/bin/bash
#
echo -e "\twelcome to \033[31mMY\033[0m Linux"
#set hostname
[ -f /etc/sysconfig/network ] && source /etc/sysconfig/network
if [ -z $HOSTNAME -o $HOSTNAME='(none)' ];then
/bin/hostname localhost
else
/bin/hostname $HOSTNAME
fi
if [ $? -eq 0 ];then
echo -n "Set the hostname"
echo -e "\033[60G[ \033[32mOK\033[0m ]"
fi
#initial net device
/sbin/insmod /lib/modules/mii.ko &> /dev/null
/sbin/insmod /lib/modules/pcnet32.ko &> /dev/null
if [ $? -eq 0 ];then
echo -n "Initial nercard driver"
echo -e "\033[60G[ \033[32mOK\033[0m ]"
fi
#set kernel para
/sbin/sysctl -p &>/dev/null
#remount rootfs
/bin/mount -n -o remount,rw /dev/sda2 / &> /dev/null
if [ $? -eq 0 ];then
echo -n "Rmount rootfs"
echo -e "\033[60G[ \033[32mOK\033[0m ]"
fi
# Set IPADDR
/sbin/ifconfig lo 127.0.0.1/8 &> /dev/null
/sbin/ifconfig eth0 172.16.128.1/16 &> /dev/null
if [ $? -eq 0 ];then
echo -n "Set IPADDR"
echo -e "\033[60G[ \033[32mOK\033[0m ]"
fi
" > rc.d/rc.sysinit
touch rc.d/rc.sysdone
chmod +x rc.d/rc.sysdone
echo "
#!/bin/bash
#
exec /sbin/halt -p
" > rc.d/rc.sysdone
touch sysconfig/network
echo "
HOSTNAME=qinqin
" > sysconfig/network
}
cconf
sync
sync
sleep 2
sync
sync
#copy modules lib
cpmo()
{
CPGREP=`modinfo $1 | grep "filename"`
CPCOM=/${CPGREP#*/}
CPMPATH=${CPCOM%/*}
[ -d $SYSROOT$CPMPATH ] || mkdir -p $SYSROOT$CPMPATH
[ -e $SYSROOT$CPCOM ] || cp $COMMAND $SYSROOT$CPCOM
}
while true;do
read -p "please input the modules which you want to copy the lib:" CPMODU
case $CPMODU in
q|Q)
echo "the system will be exit"
break
;;
*)
modinfo $CPMODU &> /dev/null || echo "wrong words ."
cpmo $CPMODU
;;
esac
done
sync
sync
sleep 2
sync
sync
####
cd /mnt/sysroot
find . | cpio -o -H newc --quiet | gzip > /root/sysroot.1
touch /etc/profile
echo "
#!/bin/bash
#
export PS1='\[\u@\h\W\]\$'
" > /etc/profile
cd
#login
cp login /mnt/sysroot/bin/
chmod +x /mnt/sysroot/bin/login
cp -d /lib/libnss_* $SYSROOT/lib/
cp -d /usr/lib/libnss* $SYSROOT/usr/lib/
cp /etc/nsswitch.conf $SYSROOT/etc/
sed -i '39,$d' $SYSROOT/etc/nsswitch.conf
sync
sync
sleep 2
sync
sync
cp -p /etc/passwd /etc/shadow /etc/group $SYSROOT/etc/
sync
sync
sleep 2
sync
sync
tar xf vsftpd-2.3.5.tar.gz
cd vsftpd-2.3.5
sed -i 's/#define VSF_BUILD_PAM/#undef VSF_BUILD_PAM/g' builddefs.h
make
make install
sync
sleep 2
sync
cd
bcp vsftpd
mkdir $SYSROOT/usr/share/empty
mkdir $SYSROOT/etc/vsftpd
chmod 555 $SYSROOT/usr/share/empty
mkdir -pv $SYSROOT/var/ftp/pub
cd vsftpd-2.3.5
cp vsftpd.conf $SYSROOT/etc/vsftpd
sync
sync
sleep 2
sync
sync
cd
rm -r vsftpd-2.3.5