![7eff57c1e23657548193bf102a447c5b.png](https://i-blog.csdnimg.cn/blog_migrate/a8a8062d55478668369deba20f41f780.jpeg)
一、构思
在这里我们是通过在一台拥有两个盘的linux上运行自动化脚本(一个系统所在盘sda,一个空盘sdb),在其系统所在盘创建一个类linux根目录,和boot目录,并通过母linux系统,将其所需的grub,软件,服务等复制过去,然后将它挂载到sdb,最后新建一个linux用母系统的sdb盘作为系统盘.
二、所需文件
![74ae83b60384a91430c57b3696ef10c0.png](https://i-blog.csdnimg.cn/blog_migrate/dcba15cfc0cabea454506c4f1a2f7890.jpeg)
我的自动化脚本main.sh;另外我实现了用户登录验证,这里我是直接把login这个单独弄了出来,方便复制;还有一个名叫txt的文件,这里他是记录我们所需的命令,例如ls等,如果有其他需要可以在这里面继续添加,防止在给微型linux系统加命令是有不必要的麻烦
四、建立微型linux系统
将上述已经做好的盘,放到准备建立的新的linux系统下
启动服务/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf
![a2fe14f7f445426ef38de76ff16fafd2.png](https://i-blog.csdnimg.cn/blog_migrate/3bc2b7d67fdf417b80dc893ffd792778.jpeg)
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 "welcome to 033[31mMY033[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[32mOK033[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[32mOK033[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[32mOK033[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[32mOK033[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@hW]$'
" > /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
txt
mingetty
sync
sleep
reboot
init
bash
ifconfig
halt
hostname
netstat
ping
mkdir
mount
netstat
umount
vim
cat
touch
ls
rm
insmod
ps
kill
killall
chmod
cp
mv
grep
passwd
sysctl
q