天天看點

微型系統制作:具有IP位址、有虛拟終端、有主機名、能ssh遠端登入

微型系統制作:具有IP位址、有虛拟終端、有主機名、能ssh遠端登入;

首先是思路:

       Kernel + initrd(busybox制作,提供ext3檔案系統子產品) + ROOTFS (busybox制作)

       首先要提供一個核心kernel,提供一個initrd,以便它能夠加載根檔案系統,由busybox制作,其提供ext3檔案系統子產品.然後加載rootfs,其也是有busybox制作,

              PS:雖然busybox很小,但是其支援的指令很多。

大體思路步驟

       1、這裡隻編譯核心的核心

              #make arch/

       2、編譯完核心要将其核心複制出來

              如果是x86系列的,則其核心在/arch/x86/boot/bzImage将其複制到/mnt/boot/命名為linuz

                     這裡需要注意:不必要的硬體驅動不需要在這裡編入到initrd,如網卡驅動等、其由rc.sysinit來完成。是以其僅需要提供核心通路真正的根檔案系統所在裝置需要的驅動,儲存設備和檔案系統相關的子產品;系統初始化rc.sysinit: 初始其它硬體的驅動程式;

       3、制作ROOTFS

              如果想在其中使用bash,因為busybox沒有提供bash而隻有hush和ash,隻需要将bash移動過去。并且其中的init不支援運作級别,如果想支援,也需要複制init過去,另外/etc/inittab中的格式也不相同。是以如果移植了init那麼系統上的inittab也要符合這種格式。

       是以結合移植方式和busybox方式來組合微型linux。

前提:

       1、一個作為主控端的Linux;本文使用的是Redhat Enterprise Linux 5.8;

       2、在主控端上提供一塊額外的硬碟作為新系統的存儲盤,為了降低複雜度,這裡添加使用一塊IDE接口的新硬碟;

       3、Linux核心源碼,busybox源碼;本文使用的是目前最新版的linux-2.6.38.5和busybox-1.20.2。

一、為系統上的新硬碟建立分區,這裡根據需要先建立一個大小為100M的主分區作為建立系統的boot分區和一個512M的分區作為目标系統(即正在建構的新系統,後面将沿用此名稱)的根分區;100M的分區格式化後将其挂載至/mnt/boot目錄下;512M的分區格式化後将挂載至/mnt/sysroot目錄;

#mount /dev/hda1 /mnt/boot/  

#mount /dev/hda2 /mnt/sysroot/  

#mount -a  

二、編譯核心源代碼,為新系統提供一個所需的核心(本例中的源代碼包都位于/usr/src目錄中)

       1、編譯核心源代碼

# cd /usr/src  

# tar jxvf linux-2.6.38.5.tar.bz2   

# ln -sv linux-2.6.38.5 linux  

# cd linux  

<a href="http://blog.51cto.com/attachment/201303/160728682.jpg" target="_blank"></a>

在這裡要為其提供一個核心檔案.conf,

<a href="http://blog.51cto.com/attachment/201303/160755274.jpg" target="_blank"></a>

       然後到ftp下載下傳ftp://172.16.0.1/pub/Sources/kernel/kernel-2.6.38.1-i686.cfg至目前目錄中,并重命名為.config。

(因為本人不在ftp的網絡中,是以事先準備好的檔案在主目錄下,為了便于大家了解是以這個圖為在實驗室中的圖,這裡借用)

<a href="http://blog.51cto.com/attachment/201303/160918579.jpg" target="_blank"></a>

這裡複制這個檔案到linux檔案中改名.conf(2個步驟隻是用1個即可)

<a href="http://blog.51cto.com/attachment/201303/160958686.jpg" target="_blank"></a>

       # make menuconfig

根據您的實際和規劃選擇所需要的功能;本執行個體計劃制作一個具有網絡的功能的微型linux且不打算使用核心子產品,是以,這裡選擇把本機對應的網卡驅動直接編譯進了核心。作者使用的是vmware Workstation虛拟機,是以,所需的網上驅動是pcnet32的,其它的均可按需要進行選擇。選擇完成後需要儲存至目前目錄下.config檔案中。

              提示:為了實作後面的功能,請務必将檔案系統中的ext3和網卡的驅動程式直接編譯進核心;否則,就需要手動裝載這些相關檔案系統的子產品;

# make SUBDIR=arch/  

# cp arch/x86/boot/bzImage /mnt/boot  

# make menuconfig  

<a href="http://blog.51cto.com/attachment/201303/161102764.jpg" target="_blank"></a>

提示:敲入指令screen,會建立一個跑着shell的單一視窗,這裡面,你可以跑你所需要的程式,然後Ctrl+a d退出剛建立的視窗(回到進入screen前的環境),然後再敲入指令screen建立新的終端視窗,就這樣,你可以建立多個有shell的視窗(這些視窗裡都可以跑你自己的應用),這樣就是你退出遠端管理視窗(進入screen的環境),你的screen窗間的視窗都不會關閉,裡面跑得應用自然也不會當掉,用screen -ls可以看所有的screen sessions,用screen -r sessionid可以進sessionid指定的特定的screen session,最後screen session不再使用的時候,screen -r sessionid進去,exit退出即可

       2、安裝grub

<a href="http://blog.51cto.com/attachment/201303/161134967.jpg" target="_blank"></a>

# grub-install --root-directory=/mnt /dev/hda  

              接下來為grub建立配置檔案:

              # vim /mnt/boot/grub/grub.conf

              添加類似如下内容:

default        0  

timeout        3  

color    light-green/black light-magenta/black  

title    MageEdu Linux (2.6.38.5)  

       root (hd0,0)  

       kernel /bzImage ro root=/dev/hda2 quiet  

       initrd /initrd.gz  

三、編譯busybox

# tar -jxvf busybox-1.20.2.tar.bz2  

# cd busybox-1.20.2  

# mkdir include/mtd   

# cp /usr/src/linux/include/mtd/ubi-user.h include/mtd/  

<a href="http://blog.51cto.com/attachment/201303/161204293.jpg" target="_blank"></a>

              說明:

              1、此處需要選擇 Busybox Settings --&gt; Build Options --&gt; Build BusyBox as a static binary (no shared libs),這樣可以把Busybox編譯成一個不使用共享庫的靜态二進制檔案,進而避免了對主控端的共享庫産生依賴;但你也可以不選擇此項,而完成編譯後把其依賴的共享庫複制至目标系統上的/lib目錄中即可;這裡采用後一種辦法。

              2、修改安裝位置為/mnt/sysroot;方法為:Busybox Settings --&gt; Installation Options --&gt; (./_install) BusyBox installation prefix,修改其值為/mnt/sysroot。

四、制作initrd

#mkdir /tmp/initrd  

#cp _install/* /tmp/initrd/ -a  

# cd /tmp/initrd/  

       1、建立rootfs:

# mkdir -pv proc sys etc/init.d tmp dev mnt/sysroot  

<a href="http://blog.51cto.com/attachment/201303/161235374.jpg" target="_blank"></a>

       2、建立兩個必要的裝置檔案:

# mknod dev/console c 5 1  

# mknod dev/null c 1 3  

<a href="http://blog.51cto.com/attachment/201303/161258818.jpg" target="_blank"></a>

       3、為initrd制作init程式,此程式的主要任務是實作rootfs的切換,是以,可以以腳本的方式來實作它:

# rm linuxrc  

# 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  

exec switch_root /mnt/sysroot /sbin/init  

              給此腳本執行權限:

              chmod +x init

       4、制作initrd

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

<a href="http://blog.51cto.com/attachment/201303/161339353.jpg" target="_blank"></a>

              # find . | cpio --quiet -H newc -o | gzip -9 -n &gt; /mnt/boot/initrd.gz

五、建立真正的根檔案系統

              # cd /mnt/sysroot

# mkdir -pv proc sys etc/rc.d/init.d tmp dev/pts boot var/log usr/lib  

       3、建立系統初始化腳本檔案

# vim etc/rc.d/rc.sysinit  

                     添加如下内容:

  echo -e "\tWelcome to \033[31mMageEdu\033[0m Linux"  

  echo -e "Remounting the root filesystem ..."  

  mount -t sysfs sysfs /sys  

  mount -o remount,rw /   

  echo -e "Creating the files of device ..."  

  mdev -s   

  echo -e "Mounting the filesystem ..."  

  mount -a  

  swapon -a  

  echo -e "Starting the log daemon ..."  

  syslogd  

  klogd  

  echo -e "Configuring loopback interface ..."  

  ifconfig lo 127.0.0.1/24  

  ifconfig eth0 172.16.100.9/16  

              而後讓此腳本具有執行權限:

chmod +x etc/init.d/rc.sysinit  

       4、配置init及其所需要inittab檔案

#cd /mnt/sysroot  

# rm -f linuxrc  

為init程序提供配置檔案:  

# vim etc/inittab  

添加如下内容:  

::sysinit:/etc/rc.d/rc.sysinit  

console::respawn:-/bin/sh  

::ctrlaltdel:/sbin/reboot  

::shutdown:/bin/umount -a -r  

       5、為系統準備一個“檔案系統表”配置檔案/etc/fstab

# vim etc/fstab  

       添加如下内容:  

sysfs                   /sys                    sysfs   defaults        0 0  

proc                    /proc                   proc    defaults        0 0  

/dev/hda1               /boot                   ext3    defaults        0 0  

/dev/hda2               /                       ext3    defaults        1 1  

       6、由于在rc.sysinit檔案中啟動了日志程序,是以系統在運作中會産生大量日志并将其顯示于控制台;這将會經常性的打斷正在進行的工作,為了避免這種情況,我們這裡為日志程序建立配置檔案,為其指定将日志發送至/var/log/messages檔案;

# vim etc/syslog.conf  

*.info    /var/log/messages   

# cd /mnt/sysroot  

## cp busybox-1.20.2/_install/* /mnt/sysroot/ -a  

3、配置init及其所需要inittab檔案

              # rm -f linuxrc  

              為init程序提供配置檔案:  

              # vim etc/inittab  

              添加如下内容:  

              ::sysinit:/etc/rc.d/rc.sysinit  

              ::ctrlaltdel:/sbin/reboot  

              ::shutdown:/bin/umount -a -r   

4、建立系統初始化腳本檔案

echo -e "\tWelcome to \033[31mMageEdu\033[0m Linux"  

echo -e "Remounting the root filesystem ..."  

mount -o remount,rw /   

echo -e "Creating the files of device ..."  

mdev -s   

echo -e "Mounting the filesystem ..."  

mount -a  

swapon -a  

echo -e "Starting the log daemon ..."  

syslogd  

klogd  

echo -e "Configuring loopback interface ..."  

ifconfig lo 127.0.0.1/24  

ifconfig eth0 172.16.100.9/16  

        添加如下内容:  

 sysfs                   /sys                    sysfs   defaults        0 0  

 proc                    /proc                   proc    defaults        0 0  

 /dev/hda1               /boot                   ext3    defaults        0 0  

 /dev/hda2               /                       ext3    defaults        1 1  

       6、将bash指令拷貝過來

       回到主控端執行腳本bincp.sh(此指令為事先編譯好的複制指令的腳本)

<a href="http://blog.51cto.com/attachment/201303/161441567.jpg" target="_blank"></a>

六、為新建構的ToyLinux啟用虛拟控制台

              這個可以通過主控端來實作,也可以直接啟動剛建構成功的小Linux進行配置。我們這裡采用通過主控端的方式(重新啟動主控端):

将 etc/inittab檔案改為如下内容:  

::sysinit:/etc/init.d/rc.sysinit  

tty1::askfirst:/bin/sh  

tty2::askfirst:/bin/sh  

tty3::askfirst:/bin/sh  

tty4::askfirst:/bin/sh  

tty5::askfirst:/bin/sh  

tty6::askfirst:/bin/sh  

                     好了,接下來就可以測試驗正六個虛拟控制台的使用了。

七、盡管上述第七步已經實作了虛拟控制台,但其仍是直接進入系統,且系統沒有使用者帳号等安全設施,這将不利于系統的安全性。是以,接下來的這步實作為系統添加使用者帳号(這裡仍然基于主控端實作)。

1、為目标主機建立passwd帳号檔案  

       # cd /mnt/sysroot  

       # vim etc/passwd  

       root:x:0:0::/root:/bin/sh  

       而後為root使用者建立“家”目錄:  

       # mkdir root  

2、為目标主機建立group帳号檔案  

       # vim etc/group  

       root:x:0:  

3、為目标主機建立shadow影子密碼檔案,這裡采用直接複制主控端的shadow檔案中關于root密碼行的行來實作  

       # grep "^root" /etc/shadow &gt; etc/shadow  

<a href="http://blog.51cto.com/attachment/201303/161509827.jpg" target="_blank"></a>

                     注:等目标主機啟動時,root使用者的密碼也是主控端的root使用者的密碼。您可以在目标主機啟動以後再動手更改root使用者的密碼。

       4、将 etc/inittab檔案改為如下内容:

::respawn:/sbin/getty 9600 tty1  

::respawn:/sbin/getty 9600 tty2  

::respawn:/sbin/getty 9600 tty3  

::respawn:/sbin/getty 9600 tty4  

::respawn:/sbin/getty 9600 tty5  

::respawn:/sbin/getty 9600 tty6  

              好了,接下來就可以重新啟動目标主機進行驗正了。

建立主機名:

# vim /mnt/sysroot/etc/hostname

# vim /mnt/sysroot/etc/rc.d/rc.sysinit

       在其中加入

八、在系統登入時提供banner資訊

              這個可以通過主控端來實作,也可以直接在目标主機上進行配置。這裡采用直接在目标主機上配置的方式:

# vi /etc/issue  

Welcome to MageEdu Linux(http://www.magedu.com)...  

Kernel \r  

              注:這裡的内容可以根據你的需要進行修改。

      九、在系統啟動時為系統提供主機名稱:

       1、建立儲存主機名稱的配置檔案

# mkdir /etc/sysconfig  

# vi /etc/sysconfig/network  

HOSTNAME=marion.example.com  

       2、編輯系統初始化腳本,實作開機過程中設定主機名稱

# vi /etc/init.d/rc.sysinit  

在檔案尾部添加如下行:  

HOSTNAME=  

[ -e /etc/sysconfig/network &amp;&amp; -r /etc/sysconfig/network ] &amp;&amp; source /etc/sysconfig/network  

[ -z ${HOSTNAME} ] &amp;&amp; HOSTNAME="localhost" 

/bin/hostname ${HOSTNAME}  

十一、通過dropbear為系統提供ssh遠端連接配接服務

              注:以下過程在主控端上實作。

       1、編譯安裝dropbear

# tar xf dropbear-2013.56.tar.bz2   

# cd dropbear-2013.56  

# ./configure   

# make  

# make install  

       2、移植dropbear至目标系統

              移植二進制程式及其依賴的庫檔案,方能實作其在目标系統上正常運作。建議使用腳本進行(這裡将其儲存為bincp.sh),其會自動移植指定的指令及依賴的庫檔案。

#!/bin/bash  

#  

read -t 30 -p "Target System Directory[/mnt/sysroot]: " DEST  

DEST=${DEST:-/mnt/sysroot}  

libcp() {  

       LIBPATH=${1%/*}  

       [ ! -d $DEST$LIBPATH ] &amp;&amp; mkdir -p $DEST$LIBPATH  

       [ ! -e $DEST${1} ] &amp;&amp; cp $1 $DEST$LIBPATH &amp;&amp; echo "copy lib $1 finished."  

}  

bincp() {  

       CMDPATH=${1%/*}  

       [ ! -d $DEST$CMDPATH ] &amp;&amp; mkdir -p $DEST$CMDPATH  

       [ ! -e $DEST${1} ] &amp;&amp; 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 &amp;&amp; echo "Wrong command" &amp;&amp; read -p "Input again:" CMD &amp;&amp; continue  

       COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`  

bincp $COMMAND  

       echo "copy $COMMAND finished."  

       read -p "Continue: " CMD  

              接下來運作此腳本,分别輸入dropbear、dropbearkey和dbclient即可;這些指令會被存儲于目标系統的/usr/local/sbin或/usr/local/bin目錄中。

       3、為遠端登入的使用者提供僞終端裝置檔案

編輯/mnt/sysroot/etc/fstab,添加如下一行:  

devpts            /dev/pts          devpts     mode=620      0 0  

建立所需要的目錄:  

# mkdir /mnt/sysroot/dev/pts  

       4、為目标系統的dropbear生成主機密鑰

              預設情況下,dropbear到/etc/dropbear目錄中查找使用的rsa格式主機密鑰(預設名稱為dropbear_rsa_host_key)和dss格式的主機密鑰(預設名稱為dropbear_dss_host_key)。其中,rsa格式可使用不同長度的密鑰,但dss格式隻使用1024位的密鑰。

# mkdir /mnt/sysroot/etc/dropbear  

# dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048  

# dropbearkey -t rsa -f /etc/dropbear/dropbear_dss_host_key  

              在生成rsa格式的key時,其長度指定部分-s 2048可以省略,也可以為其指定為其它長度,但長度需要為8的整數倍。

              說明:此步驟也可以在目标主機上進行,但路徑要做相應的修改。

       5、定義安全shell

              安全起見,dropbear預設情況下僅允許其預設shell出現在/etc/shells檔案中的使用者遠端登入,是以,這裡還需要建立/etc/shells檔案,并添加所有允許的shell。

# cat &gt;&gt; /mnt/sysroot/etc/shells &lt;&lt; EOF 

/bin/sh  

/bin/ash  

/bin/hush  

/bin/bash  

EOF  

       6、為目标主機提供網絡服務轉換機制

              在主控端上使用預設選項編譯的dropbear将依賴nsswitch實作使用者名稱解析,是以,還需要為目标主機提供nss相關的庫檔案及配置檔案。

# cat &gt;&gt; /mnt/sysroot/etc/nsswitch.conf &lt;&lt; EOF 

passwd:     files  

shadow:     files  

group:      files  

hosts:      files dns  

複制所需要的庫檔案:  

# cp -d /lib/libnss_files* /mnt/sysroot/lib/  

# cp -d /usr/lib/libnss3.so /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/  

       7、測試

              啟動目标主機,設定好網絡屬性後,使用如下指令啟動dropbear服務即可。

              # /usr/local/sbin/dropbear

              接下來就可以遠端進行連接配接測試了。

本文轉自 陳延宗 51CTO部落格,原文連結:http://blog.51cto.com/407711169/1167936,如需轉載請自行聯系原作者

繼續閱讀