引言
Linux一大亮点就是开源,相对于Windows我们可以在Linux上发挥更大的想象力,来亲手打造拥有自己特色的Linux系统,前提是你必须对Linux运行元素有基本的了解,最起码要对Linux启动过程有所认识,有了这样的前提,才有可能打造属于自己风格的Linux系统。想了解启动过程的朋友可参阅本人博文,这里不在傲述,废话不说直入正题。(http://soulboy1990116.blog.51cto.com/4007306/1266162)
准备环境
制作机系统为RHEL5.8,有两块硬盘,其中一块是IDE,这里为了便于读者区分,创建独立VM虚拟硬盘这里不再掩饰过程,请确保如图:
测试机只有一块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"
挂起制作机器
启动测试机器(grub.conf生效)
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
一、编译安装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
二、制作initrd
1、创建临时目录并复制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/
2、建立根文件系统
mkdirproc sys etc dev lib/modulesmnt/sysroottmp -pv
3、创建两个必要的设备文件
mknoddev/consolec 5 1 mknoddev/nullc 1 3
4、为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
5、生成initrd文件
find. | cpio -H newc --quiet -o | gzip-9 > /mnt/boot/initrd.gz
三、复制内核并安装grub
1、复制内核
cp/boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz
2、安装grub
grub-install--root-directory=/mnt/dev/hda
3、创建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
四、准备sysroot
1、切换目录复制
cd/busybox-1.20.2 cp_install/* /mnt/sysroot/-a cd/mnt/sysroot/ rmlinuxrc
2、创建基本文件系统、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
3、创建必要设备文件
mknoddev/consolec 5 1 mknoddev/nullc 1 3
4、创建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提供了足够丰富的命令
五、完善系统安装dropbear
Dropbear是一个相对较小的SSH服务器和客户端。它运行在一个基于POSIX的各种平台。 Dropbear是开源软件,在麻省理工学院式的许可证。 Dropbear是特别有用的“嵌入”式的Linux(或其他Unix)系统,如无线路由器。
1、编译安装dropbear
tarxf dropbear-2013.56.tar.bz2 cddropbear-2013.56 ./configure make makeinstall
2、移植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
3、为系统提供登录凭证
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
4、提供为文件系统
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
5、创建所需要目录和文件
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,用其他机器尝试登录
至此试验结束,欢迎各大虾指正试验中的错误。
本文出自 “星矢” 博客,转载请与作者联系!