自動化打造我的Linux

                          引言
linux

   Linux一大亮點就是開源,相對於Windows咱們能夠在Linux上發揮更大的想象力,來親手打造擁有本身特點的Linux系統,前提是你必須對Linux運行元素有基本的瞭解,最起碼要對Linux啓動過程有所認識,有了這樣的前提,纔有可能打造屬於本身風格的Linux系統。想了解啓動過程的朋友可參閱本人博文,這裏不在傲述,廢話不說直入正題。http://soulboy1990116.blog.51cto.com/4007306/1266162shell

準備環境
vim

製做機系統爲RHEL5.8,有兩塊硬盤,其中一塊是IDE,這裏爲了便於讀者區分,建立獨立VM虛擬硬盤這裏再也不掩飾過程,請確保如圖:
bash

035635984.png


測試機只有一塊IDE硬盤,此硬盤待制做機完成製做以後,便可當作本身的啓動盤使用,如圖:
服務器

035937109.png


動化腳本分析網絡

#!/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

041712923.png


啓動測試機器(grub.conf生效)ide

041838617.png


Init進程啓動Bash生效工具

042231650.png

註釋:此時只有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

運行腳本批量添加外置命令

043514924.png


掛起製做機,切換測機器重啓

044157685.png


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
請選擇以靜態方式編譯,以下圖:

142357113.png

因爲最版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導入

此時掛起宿主機查看測試機結果:

145238654.png


145300109.png

此時微型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

150432700.png

三、爲系統提供登陸憑證

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以後開始測試主機驗證結果:

151533305.png

此時登陸須要憑證、默認爲bash、網絡功能可用。

開啓dropbear,用其餘機器嘗試登陸

151855982.png

至此試驗結束,歡迎各大蝦指正試驗中的錯誤。

相關文章
相關標籤/搜索