这是我前几天在马哥的带领下写的6个脚本,他们串起来就可以实现(一)篇一所有的功能,很方便吧我们以后要通过不断倒腾这个小linux,来由浅入深的学习linux的系统构架和调优,最后实现编译内核,真正意义上打造自己的Linux,如果你有兴趣,那我一起学习吧
强烈建议自己动手写出这六个脚本,对脚本的学习帮助非常大。
这六个脚本其实就是(一)篇的几个步骤组合起来,它们连在一起就可以完全实现(一)篇的目的,六个脚本如下:
一、写一个脚本,实现将一个硬盘中原有分区信息全部删除,并重新将其分为三个区:
1、提示用户指定要操作的磁盘;如果此硬盘中有新区,显示分区信息,并判断此中分区是否仍然处于挂载状态;
如果是,则显示分区和对应的挂载点;否则,则说明分区没有挂载;
2、提示用户接下来操作会破坏硬盘上的所有数据,并询问用户是否继续进行;形如:Continue(y/N)?
如果用户选择继续,则抹除此硬盘上的所有分区信息(如果是仍处理挂载状态的分区,则需要先卸载);否则退出;
3、将此硬盘分为三个主分区:
第一个主分区,50M,ext3文件系统
第二个主分区,512M,ext3文件系统
第三个主分区,256M,swap文件系统
要求:上面第2和第3步要求用函数实现;函数执行结束要有返回值;
#!/bin/bash #the script:rmdisk3.sh function CH { #题目要求的第二个功能 read -p "WARMING!The next action will clean the DISK!COTINUE?(Y|y.other for quite)" CH if [ $CH == 'Y' -o $CH == 'y' ];then MOUNT=`mount | grep $1` #通过grep来抓取mount里的指定磁盘,看是否被挂载 for i in $MOUNT;do #用for循环列表来一个一个卸载掉挂载的分区 i=`mount | grep /dev/sdb | awk '{print $1}'` fuser -km $i #这个命令用于剔除分区里的活动用户保证卸载 umount $i return 0 done else exit fi } function FDISK { #格式化所选磁盘为3个分区 dd if=/dev/zero of=$1 bs=512 count=1 #dd命令比较特殊它是一种特殊的复制 /dev/zero是一个特殊设备用于吐出0,它们组合起来 partprobe $1 #意思就是给指定磁盘的第0个块输出512个字节0,等于破坏掉他的bootloader和分区信息 echo ' #使用partprobe命令重读下分区,确保格式化顺利进行 n p 1 +50M n p 2 +512M n p 3 +256M t 3 82 w' | fdisk $1 &> /dev/null partprobe $1 sleep 1 #这里要睡1秒,等待系统将分区信息读入 mke2fs -j ${1}1 &> /dev/null #格式化三个分区 mke2fs -j ${1}2 &> /dev/null mkswap ${1}3 &> /dev/null } read -p "Chose a disk:" DISK #下面的是提醒用户的信息 fdisk -l $DISK | grep ^/dev for I in `fdisk -l $DISK | grep ^/dev |awk '{print $1}'`;do mount | grep "$I" if [ $? -ne 0 ];then echo "The $I is not mounted." else echo "The $I is mounted" fi done read -p "Countinue?(y|n)" P if [ $P == 'Y' -o $P == 'y' ];then CH $DISK FDISK $DISK echo -e "\033[32mThe action is suceess!\033[0m" else exit fi
#!/bin/bash # source /root/LX/1 #这条命令用于连接第一个脚本,可以引用它的变量,路径一定要对,/root/LX/1是我的存放路径 #目录/mnt/boot是否存在,如果不存在,创建,并挂载上磁盘。如果存在,踢掉里面的活动人员,卸载挂载的磁盘,挂载上刚格式化的分区1 function MOUNT { [ -d $A ] &> /dev/null || mkdir $A && fuser $A | umount $A &> /dev/null | mount ${DISK}1 $A sleep 1 [ -d $B ] &> /dev/null || mkdir $B && fuser $B | umount $B &> /dev/null | mount ${DISK}2 $B } A=/mnt/boot B=/mnt/sysroot MOUNT $A $B三、写一个脚本,初始化rootfs
#!/bin/bash # source /root/LX/2 function ROOTFS { [ -d $B ] && ( mount | grep "$B" &> /dev/null ) || echo "ERRO!The $B is not mounted" | read -p "Countinue?(y|n)" INPUT if [ "$INPUT" == 'n' ];then #这是一个判断函数,防止意外情况发生 exit fi cd $B #创建目录 mkdir -p 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 chmod 1777 tmp cat >> etc/inittab << EOF #创建题目要求的几个文件 id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit EOF cat >> etc/rc.d/rc.sysinit << EOF #!/bin/bash echo -e "\t\tWelcome to \033[31m;1mLittle\033[0m Linux..." mount -n -o remount,rw / mount -n -a /bin/bash EOF chmod 755 etc/rc.d/rc.sysinit cat >> 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 } ROOTFS $B
#!/bin/bash # function LDD { which $1 &> /dev/null || echo "It is not exist" | retrun 5 #这里也是一个判断 DIR=`which $1 | grep -o "/.*"` #防止有别名的命令导致截取错误的路径 DIR1=`echo $DIR | sed "s@\(.*\)$1@\1@g"` [ -d $B$DIR1 ] || mkdir $B$DIR1 #如果要复制的目录不存在,创建它 [ -e $B$DIR ] || cp $DIR $B$DIR1 #如果文件不存在才复制它 for I in `ldd $DIR | grep -o "/[^[:space:]]*"`;do #这里使用ldd命令指定命令的执行文件存放路径,并通过for循环来复制它的库文件 DIR1=`echo $I | sed "s@\(.*\)/[^/]*@\1@g"` [ -d $B$DIR1 ] || mkdir $B$DIR1 #这里的判断同上 [ -e $B$I ] || cp $I $B$DIR1 << End n End done } B=/mnt/sysroot read -p "Which command you want add:" COM LDD $COM
#!/bin/bash # source /root/LX/3 KERNEL=vmlinuz INITRD=initrd.gz function BOOT { #这个函数解开initrd文件,并写入信息后重新归档封装 DIR=`mktemp -d /tmp/litte.XX` #创建临时目录 cd $DIR zcat /boot/initrd-`uname -r`.img | cpio -id #释放initrd到一个临时目录 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.* \).*@\1${DISK}2@g" init find . | cpio -H newc -o --quiet | gzip -9 > $1/initrd.gz #再次归档压缩 CP /Boot/vmlinuz-`uname -r` $1/vmlinuz #复制修改并归档后的initrd文件到我们的小linux /boot里 rm -rf $DIR #要养成删临时文件的好习惯 } BOOT $A
#!/bin/bash # source /root/LX/5 function GRUB { [ `basename $2` != boot ] && echo "The mounted dir is wrong!Modiy it!" && exit #判断,防止出错 grub-install --root-directory=/mnt/ $1 &> /dev/null #安装grub cat >> $2/grub/grub.conf << EOF #创建grub.conf文件 default=0 timeout=10 title Little Linux root (hd0,0) kernel /$3 ro root=${DISK}2 quite initrd /$4 EOF } GRUB $DISK $A $KERNEL $INITRD
好了,就是这6个脚本~写出来后对自己的帮助非常大!
下篇预告:打造自己的专属Linux(三):给小linux添加网络模块,实现关机重启,登录界面