引言
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,用其餘機器嘗試登陸
至此試驗結束,歡迎各大蝦指正試驗中的錯誤。