#!/bin/bash
#:Title: construction.sh
#:Path:/tmp/myscript/mklinux
#:Synopsis:
#:DateTime:2011-08-04 16:24:51
#:Version:Unknow
#:Author: redhat_hu
#:Option:None
read -p "please input the disk name:" DISKNAME
#提示用户指定要操作的磁盘;

if fdisk -l $DISKNAME | grep "^$DISKNAME" &> /dev/null;then
                fdisk -l $DISKNAME | grep "^$DISKNAME"
                Adisk=`fdisk -l $DISKNAME | grep "^$DISKNAME" | awk '{print $1}'`
                for I in $Adisk ;do
                if mount | grep "$I" &> /dev/null;then
                                mount | grep "$I"
                else
                                echo "$I was not mounted."
                fi
                done
fi
#如果此硬盘中有新区,显示分区信息,并判断此中分区是否仍然处于挂载状态;如果是,则显示分区和对应的挂载点;否则,则说明分区没有挂载;

function FRESH {
read -p "Continue(y/N)?" CHOISE     #提示用户接下来操作会破坏硬盘上的所有数据,并询问用户是否继续进行;
case $CHOISE in
y|Y)
for I in $Adisk;do
                if mount | grep "$I" >/dev/null;then
                fuser -km $I
                umount $I
                fi
done
dd if=/dev/zero of=$DISKNAME bs=512 count=1 &> /dev/null     #如果用户选择继续,则抹除此硬盘上的所有分区信息(如果是仍处理挂载状态的分区,则需要先卸载);否则退出;
echo '        #将此硬盘分为三个主分区:第一个主分区,50M,ext3文件系统;第二个主分区,512M,ext3;文件系统第三个主分区,256M,swap文件系统;
n
p
1

+50m
n
p
2

+512m
n
p
3

+256m
t
3
82
w' |fdisk $DISKNAME &> /dev/null
partprobe $DISKNAME
sleep 1

mke2fs -j ${DISKNAME}1 &> /dev/null
mke2fs -j ${DISKNAME}2 &> /dev/null
mke2fs -j ${DISKNAME}3 &> /dev/null
return 0
;;
n|N)
return 1
;;
*)
return 2
;;
esac
}
    
function MOUNT {
                if find /mnt/boot &> /dev/null ;then
                umount /mnt/boot &> /dev/null
                mount $1 /mnt/boot
                else
                mkdir /mnt/boot
                umount /mnt/boot &> /dev/null
                mount $1 /mnt/boot
                fi
                if find /mnt/sysroot &> /dev/null ;then
                umount /mnt/sysroot &> /dev/null
                mount $2 /mnt/sysroot
                else
                mkdir /mnt/sysroot
                umount /mnt/sysroot &> /dev/null
                mount $2 /mnt/sysroot
                fi
}
#挂载到对应的文件目录

function INIT {
if find [/mnt/sysroot &> /dev/null || mount|grep "/mnt/sysroot" &> /dev/null];then
                cd /mnt/sysroot
                mkdir -p    {boot,proc/sys/kernel,sys,dev,home,root,etc/{rc.d,sysconfig,init.d},bin,sbin,lib,usr/{bin,sbin,lib/modules,include},var/{log,run},tmp,mnt,opt,media}    
                chmod -R 1777 /mnt/sysroot/tmp
                touch /mnt/sysroot/etc/inittab
  touch /mnt/sysroot/proc/sys/kernel/hostname
  chmod -R 1777 /mnt/sysroot/proc/sys/kernel/hostname

cat > /mnt/sysroot/etc/inittab <<EOF #创建inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit                
l1:1:wait:/sbin/init -t1 S
l0:0:wait:/etc/rc.d/rc.shutdown



#add terminal 1-6
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5


EOF

#add hostname for MyLinux  设置系统名为MyLinux
echo "HOSTNAME=alex.mylinux.org" > /mnt/sysroot/etc/sysconfig/network

cat > /mnt/sysroot/etc/rc.d/rc.sysinit << EOF #创建rc.sysinit
#!/bin/bash
echo -e "\t\tWelcome to \033[31;1mMyLinux\033[0m ..."

swapon -a        
mount -n -o remount,rw /  #以读写权限重新挂载根目录
mount -n -a

#/bin/bash
EOF

chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
#add hostname
echo '. /etc/sysconfig/network' >> /mnt/sysroot/etc/rc.d/rc.sysinit

echo 'echo $HOSTNAME > /proc/sys/kernel/hostname' >> /mnt/sysroot/etc/rc.d/rc.sysinit    #写入主机名


#add rc.shutdown for ini0 shutdown  添加关机命令
cat > /mnt/sysroot/etc/rc.d/rc.shutdown << EOF
#!/bin/bash
#
sync
sleep 1
umount /dev/sda1
umount /dev/sda2
swapoff -a
exec /sbin/halt -p
EOF
chmod +x /mnt/sysroot/etc/rc.d/rc.shutdown

# add root user's information  添加生成新系统的用户
head -1 /etc/passwd > /mnt/sysroot/etc/passwd
head -1 /etc/shadow > /mnt/sysroot/etc/shadow
head -1 /etc/group > /mnt/sysroot/etc/group
head -1 /etc/gshadow > /mnt/sysroot/etc/gshadow



#add the login words
cat > /mnt/sysroot/etc/issue <<EOF
Welcome to mylinux !
EOF

#add PS1  定义PS1
cat > /mnt/sysroot/root/.bash_profile <<EOF
PS1='[\u@\h \W]\$'
EOF
                touch /mnt/sysroot/etc/fstab    #创建fstab
cat > /mnt/sysroot/etc/fstab << EOF
/dev/sda2                                /                                            ext3        defaults                0 0
/dev/sda1                             /boot                                     ext3        defaults                0 0
sysfs                                     /sys                                        sysfs     defaults                0 0
proc                                        /proc                                     proc        defaults                0 0

EOF

else
                echo "error!"
fi
}


COPYCOMMAND() {
if which $B ;then
                COMMAND=`which $B | grep -o "/.*"`
                PTH=`which $B | grep -o "/.*" |sed "s@\(/[[:alpha:]]*\)/[[:alpha:]]*@\1@g"`
                if find /mnt/sysroot$PTH &> /dev/null;then
                cp $COMMAND /mnt/sysroot$PTH
                else
                mkdir -p /mnt/sysroot$PTH
                cp $COMMAND /mnt/sysroot$PTH
                fi
else
echo "wrong command"
fi

LIBS=`ldd $COMMAND | grep -o "/.*" | awk '{print $1}'`
for I in $LIBS;do
                [ ! -e /mnt/sysroot$I ] && cp $I /mnt/sysroot$I


done

}
#将输入的指令以及相关库文件,从宿主机复制到对应子系统目录中

COPYNSS () {
#copy    Name Nervice Switch files and links to MyLinux's lib
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/lib
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_file* /mnt/sysroot/lib
cp -d /lib/libnss_compat* /mnt/sysroot/lib

cp /etc/nsswitch.conf /mnt/sysroot/etc

cp /lib/libpam.so.0 /mnt/sysroot/lib
cp /lib/libpam_misc.so.0 /mnt/sysroot/lib
cp /lib/libaudit.so.0    /mnt/sysroot/lib


#copy command 'login' and its lib files
cp /lib/libcrypt-2.5.so /mnt/sysroot/lib
cp /lib/libm.so.6 /mnt/sysroot/lib
cp -d /lib/libcrypt.so.1 /mnt/sysroot/lib
cp /root/login /mnt/sysroot/bin

#make symbolic link between bash and sh for runlevel 1
cd /mnt/sysroot/bin
ln -s bash sh

}
#复制nsswitch相关库文件

function KERNEL {
TMPDIR=`mktemp -d /tmp/mylinux`  #创建一个临时文件用于存放解压后的initrd

cd $TMPDIR
zcat /boot/initrd-`uname -r`.img | cpio -id

sed -i 's@echo Scanning and configuring dmraid supported devices@#&@g' init
sed -i 's@echo Scanning logical volumes@#&@g' init
sed -i 's@lvm vgscan --ignorelockingfailure@#&@g' init
sed -i 's@echo Activating logical volumes@#&@g' init
sed -i 's@lvm vgchange -ay --ignorelockingfailure    vol0@#&@g' init
sed -i 's@resume LABEL=SWAP-sda3@#&@g' init

sed -i "s@\(mkrootdev.* \)/.*@\1sda2@g" init
find . | cpio -H newc -o --quiet | gzip -9 > /mnt/boot/initrd.gz  #从新使用cpio封装修改后的initrd
cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz
}
#修改内核以及initrd部分参数和内容

function GRUB {
MOUNTPOINT=`basename $2`
until [ "$MOUNTPOINT" == "boot" ];do
                read -p "please modify the mountpoint." MOUNTPOINT
done

grub-install --root-directory=/mnt $1  #安装grub的位置

cat > $2/grub/grub.conf << EOF  #创建grub.conf
default=0
timeout=10
title mylinux
                                root (hd0,0)
                                kernel /$3 ro root=/dev/sda2
                                initrd /$4
EOF

}
#安装grub


FRESH    
MOUNT ${DISKNAME}1 ${DISKNAME}2
INIT

for B in mingetty init bash mount umount halt shutdown poweroff halt reboot vi ls cat clear sync chmod runlevel swapoff hostname insmod rmmod swapon ;do
COPYCOMMAND
done  #将以上命令全部加入mini linux中

COPYNSS
#下列注释代码可实现从宿主机向mini linux命令的按需复制
#read -p "input the command,'c' for skip:" B
#until [ "$B" == "c" ];do

#COPYCOMMAND
#read -p "input the command,'c' for skip:" B
#done

KERNEL
GRUB $DISKNAME /mnt/boot vmlinuz initrd.gz
rm -rf $TMPDIR  #删除临时文件

sync
sync
sync