引言
linux
Linux一大亮点就是开源,相对于Windows咱们能够在Linux上发挥更大的想象力,来亲手打造拥有本身特点的Linux系统,前提是你必须对Linux运行元素有基本的了解,最起码要对Linux启动过程有所认识,有了这样的前提,才有可能打造属于本身风格的Linux系统。想了解启动过程的朋友可参阅本人博文,这里不在傲述,废话不说直入正题。(http://soulboy1990116.blog.51cto.com/4007306/1266162)shell
准备环境
vim
制做机系统为RHEL5.8,有两块硬盘,其中一块是IDE,这里为了便于读者区分,建立独立VM虚拟硬盘这里再也不掩饰过程,请确保如图:
bash
测试机只有一块IDE硬盘,此硬盘待制做机完成制做以后,便可当作本身的启动盘使用,如图:
服务器
自动化脚本分析网络
#!/bin/bash #This script can complete the creation of the Linux #Segment display function ###########create partition && file system ext3######### #根据用户输入,在其设备建立三个分区并格式化为ext3文件系统类型。 echo "Initial a disk..." echo -e "\033[31mWarning: \033[0m" fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]" read -p "your choice:" PARTDISK if [ $PARTDISK == 'quit' ]; then echo "quit" exit 5 fi until fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]" | grep "^Disk $PARTDISK" &> /dev/null;do read -p "Wrong option,Your choice aging:" PARTDISK done read -p "Will destroy all data,continue:" CHOICE until [ $CHOICE == 'y' -o $CHOICE == 'n' ]; do read -p "Will destroy all data,continue:" CHOICE done if [ $CHOICE == 'n' ]; then echo "Quit" exit 6 else for I in `mount | grep "$PARTDISK" | awk '{print $1}'`; do fuser -km $I umount $I echo "$I umount ok." done dd if=/dev/zero of=$PARTDISK bs=512 count=1 sync sleep 3 echo 'n p 1 +20M n p 2 +512M n p 3 +128M t 3 82 w' | fdisk $PARTDISK &> /dev/null partprobe $PARTDISK sync sleep 5 mke2fs -j ${PARTDISK}1 &> /dev/null mke2fs -j ${PARTDISK}2 &> /dev/null mkswap ${PARTDISK}3 &> /dev/null fi sync sleep 3 #############install grub && mount {boot,sysroot}################# #安装引导程序grub、挂载boot和ysroot目录 mkdir /mnt/{boot,sysroot} &> /dev/null mount ${PARTDISK}1 /mnt/boot/ mount ${PARTDISK}2 /mnt/sysroot/ grub-install --root-directory=/mnt /dev/hda sync sleep 2 ###################create grub.conf########################### #建立grub配置文件 echo -e "default=0\ntimeout=5\ntitle Test Linux (Soulboy)\n root (hd0,0)\n kernel /vmlinuz\n initrd /initrd.gz" > /mnt/boot/grub/grub.conf sync sleep 1 ##########################create kernel########################## #建立内核 cp /boot/vmlinuz-2.6* /mnt/boot/vmlinuz #########################create initrd.gz######################## #建立initrd.gz mkdir /mnt/iso -p &> /dev/null cd /mnt/iso zcat /boot/initrd-2.6* | cpio -id sed -i -e 's@^\(re.*\)@#\1@' -e "s@\(.*\)/dev/VolGroup00/LogVol00@\1$PARTDISK$22@" init sync sleep 2 find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz sync sleep 3 cd / ######################create directory###################### #建立基本目录结构 cd /mnt/sysroot/ mkdir proc sys dev etc/rc.d lib lib64 bin sbin boot home var/log usr/{bin,sbin} root tmp -pv cd / sync sleep 4 ####################copy init and bash##################### #复制init和bash cp /sbin/init /mnt/sysroot/sbin/ cp /bin/bash /mnt/sysroot/bin/ sync sleep 4 ###################copy /sbin/init library file############## #复制init和bash所依赖的库到相应位置 DEST=/mnt/sysroot libcp() { LIBPATH=${1%/*} [ ! -d $DEST$LIBPAT ] && mkdir -p $DEST$LIBPATH [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished" } bincp() { CMDPATH=${1%/*} [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH [ ! -e $DEST{1} ] && cp $1 $DEST$CMDPATH for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do libcp $LIB done } COMMAND=`which /sbin/init | grep -v "alias" | grep -o "[^[:space:]]\{1,\}"` bincp $COMMAND echo "copy $COMMAND finished." COMMAND=`which /bin/bash | grep -v "alias" | grep -o "[^[:space:]]\{1,\}"` bincp $COMMAND echo "copy $COMMAND finished." sync sleep 3 ########################create inittab file##################### #建立inittab文件 echo -e "id:3:initdefault:\nsi::sysinit:/etc/rc.d/rc.sysinit" > /mnt/sysroot/etc/inittab ######################create /etc/rc.d/rc.sysinit############# #建立rc.sysinit脚本 最后一个执行的脚本 echo -e '#!/bin/bash\necho -e Welcome to my linux\n/bin/bash' > /mnt/sysroot/etc/rc.d/rc.sysinit sync sleep 2 chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit echo "linux finished"
挂起制做机器ssh
启动测试机器(grub.conf生效)ide
Init进程启动Bash生效工具
注释:此时只有BASH的内置命令,如需外置命令需手动添加。测试
脚本添加外置命令(挂起测试机,切换制做机)
#!/bin/bash DEST=/mnt/sysroot libcp() { LIBPATH=${1%/*} [ ! -d $DEST$LIBPAT ] && mkdir -p $DEST$LIBPATH [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished" } libcp /lib/librt.so.1 bincp() { CMDPATH=${1%/*} [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH [ ! -e $DEST{1} ] && cp $1 $DEST$CMDPATH for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do libcp $LIB done } read -p "Your command:" CMD until [ $CMD == 'q' ]; do ! which $CMD && echo "Wrong command" && read -p "Input againe" CMD && continue COMMAND=`which $CMD | grep -v "alias" | grep -o "[^[:space:]]\{1,\}"` bincp $COMMAND echo "copy $COMMAND finished." read -p "Continue:" CMD done
运行脚本批量添加外置命令
挂起制做机,切换测机器重启
what is busybox?
BusyBox是一个集成了一百多个最经常使用linux命令和工具的软件。它包含了一些简单的工具,例如ls、cat、echo等等,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet。有些人将它称为Linux 工具里的瑞士×××。简单的说它就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了Android系统的自带的shell。
BusyBox将许多具备共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合能够替代大部分经常使用工具好比的GNU fileutils,shellutils等工具,它提供了一个比较完善的环境,能够适用于任何小的或嵌入式系统。
思路:
硬件
/dev/hda1 ext3 /boot
/dev/hda2 ext3 /sysroot
软件
内核 ----> RHEL5.8
initrd ----> busybox
rootfs ----> busybox
ssh ----> dropbear
1、编译安装busybox
tarxf busybox-1.20.2.tar.bz2 cdbusybox-1.20.2 makemenuconfig 请选择以静态方式编译,以下图:
因为最版busybox依赖新版内核的头文件,所以咱们必须为其提新版内核的文件,不然编译会出错:
tarxf linux-2.6.38.5.tar.bz2 -C /usr/src mkdirbusybox-1.20.2/include/mtd cp/usr/src/linux-2.6.38.5/include/mtd/ubi-user.h /busybox-1.20.2/include/mtd/ makeinstall
2、制做initrd
一、建立临时目录并复制ext3依赖的库文件
cp_install/ /tmp/busybox-a 穿件临时目录 cd/tmp/busybox/ rmlinuxrc modinfo ext3 查看依赖的库 modinfo jbd 查看依赖的库 cp/lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko lib/modules/ cp/lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko lib/modules/
二、创建根文件系统
mkdirproc sys etc dev lib/modulesmnt/sysroottmp -pv
三、建立两个必要的设备文件
mknoddev/consolec 5 1 mknoddev/nullc 1 3
四、为initrd制做init程序,主要任务是实现rootfs的切换
vim init #!/bin/sh # mount-t proc proc /proc mount-t sysfs sysfs /sys insmod /lib/modules/jbd.ko insmod /lib/modules/ext3.ko mdev -s mount-t ext3 /dev/hda2/mnt/sysroot execswitch_root /mnt/sysroot/sbin/init chmod+x init
五、生成initrd文件
find. | cpio -H newc --quiet -o | gzip-9 > /mnt/boot/initrd.gz
3、复制内核并安装grub
一、复制内核
cp/boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz
二、安装grub
grub-install--root-directory=/mnt/dev/hda
三、建立grub.conf文件
vim /mnt/boot/grub/grub.conf default=0 timeout=3 title SoulBoy Linux (2.6.18) root (hd0,0) kernel /vmlinuzro root=/dev/hda2 initrd /initrd.gz
4、准备sysroot
一、切换目录复制
cd/busybox-1.20.2 cp_install/* /mnt/sysroot/-a cd/mnt/sysroot/ rmlinuxrc
二、建立基本文件系统、inittab、fstab
mkdirproc sys dev tmp var/{log,lock,run} lib/modulesetc/rc.d/init.d root boot mnt media -pv vim etc/inittab ::sysinit:/etc/rc.d/rc.sysinit console::respawn:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount-a -r vim etc/fstab sysfs /syssysfs defaults 0 0 proc /procproc defaults 0 0 /dev/hda1/bootext3 defaults 0 0 /dev/hda2/ ext3 defaults 1 1
三、建立必要设备文件
mknoddev/consolec 5 1 mknoddev/nullc 1 3
四、建立rc.sysinit文件
vim etc/rc.d/rc.sysinit #!/bin/sh echo"Welcome to MiNi Linux" echo"Remounting the root filesystem...." mount-t proc proc /proc mount-t sysfs sysfs /sys mount-o remount,rw / echo"Creating the files of device...." mdev -s echo"Mounting the filesystem....." mount-a swapon -a chmod+x etc/rc.d/rc.sysinit
注意:请务必屡次sync同步写入,若是切换主机过可能会出现文件系统崩溃,若是文件系统崩溃可启用一下方式修复
cd/mnt/sysroot find. | cpio -H newc --quiet -o | gzip> /root/sysroot.gz 导出 umount/dev/hda2 fuser -km /mnt/sysroot umount/dev/hda2 e2fsck -f /dev/hda2检查修复或者格式化 yes mount/dev/hda2/mnt/sysroot cd/mnt/sysroot/ zcat /root/sysroot.gz | cpio -id导入
此时挂起宿主机查看测试机结果:
此时微型Linux没有bash、没有登陆提示、没有网络、没有ssh,当依然能够跑起来,并且busybox提供了足够丰富的命令
5、完善系统安装dropbear
Dropbear是一个相对较小的SSH服务器和客户端。它运行在一个基于POSIX的各类平台。 Dropbear是开源软件,在麻省理工学院式的许可证。 Dropbear是特别有用的“嵌入”式的Linux(或其余Unix)系统,如无线路由器。
一、编译安装dropbear
tarxf dropbear-2013.56.tar.bz2 cddropbear-2013.56 ./configure make makeinstall
二、移植bash
移植脚本以下: #!/bin/bash DEST=/mnt/sysroot libcp() { LIBPATH=${1%/*} [ ! -d $DEST$LIBPATH ] && mkdir-pv $DEST$LIBPATH [ ! -e $DEST${1} ] && cp$1 $DEST$LIBPATH && echo"copy lib $1 finished" } bincp() { CMDPATH=${1%/*} [ ! -d $DEST$CMDPATH ] && mkdir-p $DEST$CMDPATH [ ! -e $DEST{1} ] && cp$1 $DEST$CMDPATH forLIB in`ldd $1 | grep-o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do libcp $LIB done } read-p "Your command:"CMD until[ $CMD == 'q']; do ! which$CMD && echo"Wrong command"&& read-p "Input againe"CMD && continue COMMAND=`which$CMD | grep-v"alias"| grep-o "[^[:space:]]\{1,\}"` bincp $COMMAND echo"copy $COMMAND finished." read-p "Continue:"CMD done
三、为系统提供登陆凭证
grep-E "^root:"/etc/passwd> /mnt/sysroot/etc/passwd grep-E "^root:"/etc/shadow> /mnt/sysroot/etc/shadow grep-E "^root:"/etc/group> /mnt/sysroot/etc/group 修改/mnt/sysroot/etc/inittab为以下: vim /mnt/sysroot/etc/inittab ::sysinit:/etc/rc.d/rc.sysinit ::respawn:/sbin/getty9600 tty1 ::respawn:/sbin/getty9600 tty2 ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount-a
四、提供为文件系统
vim etc/fstab sysfs /syssysfs defaults 0 0 proc /procproc defaults 0 0 devpts /dev/ptsdevpts mode=620 0 0 /dev/hda1/bootext3 defaults 0 0 /dev/hda2/ ext3 defaults 1 1
五、建立所须要目录和文件
cd/mnt/sysroot/ mkdirdev/pts mkdiretc/dropbear mkdirusr/lib vim etc/shells提供默认shell文件 /bin/sh /bin/bash /bin/ash /bin/hash vim /mnt/sysroot/etc/nsswitch.conf 提供nsswitch配置文件 passwd: files shadow: files group: files hosts: files dns 建立秘钥文件 dropbearkey -t rsa -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key-s 2048 dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key cp-d /lib/libnss_files* /mnt/sysroot/lib cp-d /usr/lib/libnss3.so /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/ cp/etc/nsswitch.conf /mnt/sysroot/etc/
屡次sync以后开始测试主机验证结果:
此时登陆须要凭证、默认为bash、网络功能可用。
开启dropbear,用其余机器尝试登陆
至此试验结束,欢迎各大虾指正试验中的错误。