linux扩容脚本,脚本自动创建一个小于10M的Linux系统

自动创建一个小于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<

#!/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<

#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<

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<

#!/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<

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<

Ro.minilinux.org

EOF

#the yum.conf files

mkdir -p  /mnt/$1/etc/yum.repos.d/

touch yum.repo

cat >>yum.repo<

[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<

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 sh0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值