手動裁剪製作小linux系統

 

 

不要被題目所嚇到,其實裁剪或者說手動做一個小的linux並沒有想象中的那麼難,那麼高大上。{本文都是基於虛擬機實現的}

想要製作或者裁剪一個小的linux,你所需要的是清楚的知道linux的啓動過程,以及啓動後會去哪些路徑執行哪些程序,知道這些就相當的好辦了,linux啓動需要什麼,我們就給他什麼,這樣就可以啓動了。那麼下來就先來看看linux的啓動流程和需要執行的程序。

linux啓動和windows啓動方面還有有些類似的。

首先是①開機自檢(POST,power on self test),接下來就是②BIOS中讀取用戶的硬件的相關設定,其中最重要的就是設置啓動次序(我們這裏肯定是從磁盤啓動了),接下來③讀取MBR中的分區信息了,當系統讀取了到了bootloader,然後硬件工作就交給了操作系統,操作系統④根據GRUB(之前是LILO)引導/boot目錄下根據grub.conf的配置信息從而加載內核信息到物理內存中去,當然/boot中不僅有內核文件,還有系統驅動模塊,當讀取內核後讀入系統驅動模塊,當一切加載完成後,⑤下來進去用戶空間中,進去用戶空間中執行的第一個程序就是/sbin/init,這個配置文件裏面有系統自動運行的程序,如果你需要讓系統開機自動運行什麼程序的話,你就可以將命令或者程序寫入到這個配置文件中。⑥init進程首先讀取/etc/inittab(運行級別的設置文件)當我們打開/etc/inittab文件後,忽略上面的註釋,看到的第一行的內容如下所示:wKiom1MiaO_TDp3oAAAi1n-nPBw459.jpg

id:表示操作的id。

3:表示運行級別爲3.

default:表示設置默認運行級別,無需定義級別。

當然系統運行級別除了3,還有0,1,2,4,5,6總共7個運行級別。

0級別:表示關機。

1級別:單用戶模式,直接以root用戶登錄

2級別:多用戶模式。

3級別:完全多用戶模式,文本模式

4級別:預留級別

5級別:完全多用戶模式,圖形模式

6級別:重啓

每種模式下都對應了很多當下模式所啓動的服務或者程序,他們都位於/etc/rc.d/下。

wKioL1Mia7vTVYqdAABRxHaAPSg707.jpg

其中打開當前處於3級別中的文件,如下:有很多在相應運行級別中運行的程序。

wKiom1Mia-LyFYAnAAGmDqJfFUs521.jpg

  •  這個話題先說到這裏,我們去手動製作linux。

如上所說,我們都是基於 VMware虛擬機完成的。

首先手動爲linux額外掛載一個SCSI硬盤,如圖:

wKioL1MicHjhGFB6AADcfIxzOC4527.jpg

接下來就是給這個硬盤分區。

wKiom1MicsvTA3lNAACf9OCoWY0226.jpg

創建兩個分區。一個用來做/boot,一個用來做/sysroot

格式化分區:mke2fs -t  ext4 /dev/sdb1

                   mke2fs -t  ext4 /dev/sdb2

完成後,建立兩個目錄用來掛載兩個分區

創建目錄:mkdir -pv /mnt/{boot,sysroot} 

掛載分區:mount  /dev/sdb1 /mnt/boot

                mount  /dev/sdb2 /mnt/sysroot

wKiom1Midbah3qjHAAAwrPqZ6O4361.jpg

掛載完成之後就要給小linux安裝GRUB引導程序了,具體命令如下:

    grub-install --root-directory=/mnt /dev/sdb -->意味着把GRUB安裝進我們的小linux(sdb中)

wKioL1Mid3LyEnU9AADF6NeADbI557.jpg

安裝成功後,就要給我們配置文件對應的/boot分區中放置配置文件要加載的系統內核和設備驅動程序了。我們爲了方便,直接基於本機,直接講本機的系統內核和設備驅動程序放置過去。本機的系統內核和設備驅動程序也在/boot目錄中放置,我們可以直接複製進我們的小linux。

wKioL1MieNCigOyPAADf2DkJ-hM160.jpg

如圖,上面兩個爲本linux下的內核和設備驅動程序。

現在就來複制這兩個進我們的小linux下的/boot中。我們在複製的過程中,爲其改下名字,方便一會我們寫grub.conf的配置文件。

wKioL1MiebCD1foDAACgIIf3slc358.jpg

上面爲複製和改名命令,下來查看下結果:

wKiom1MikpTAwxaUAADs0lVnm14457.jpg

下來就要爲GRUB寫配置文件了,好讓GRUB去引導和加載他,不是嗎?配置文件要寫在/grub目錄下,名字爲grub.conf,下面就讓我們去編輯它。

wKioL1Mikorg_LL6AABxP_uEWpw787.jpg

 這樣,GRUB的配置基本結束了。下來就要對/sysroot目錄進行了。

首先,要爲其創建應有的目錄。

wKioL1MilhbQ5LziAAK56lYgbwo322.jpg

大家已經知道系統第一個執行的是:init,我們自己做小linux,那我們直接讓他開機運行shell程序。那既然要這樣,那麼我們就需要把bash拷進我們的bin中了

我們寫一個腳本,用來複制這些命令和其依賴的文件到我們剛建立的目錄中去,在次這個腳本也貼出來:

#!/bin/bash
#
target=/mnt/sysroot

clearCmd() {
  if which $cmd &> /dev/null; then
        cmdPath=`which --skip-alias $cmd`
  else
        echo "No such command"
        return 5
  fi
}

cmdCopy() {
        cmdDir=`dirname $1`
        [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}

libCopy() {
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
        done
}

while true; do
  read -p "Enter a command: " cmd
  if [ "$cmd" == 'quit' ] ;then
        echo "quit"
        exit 0
  fi
  clearCmd $cmd
  [ $? -eq 5 ] && continue

  cmdCopy $cmdPath
  libCopy $cmdPath
done

這個是腳本內容,我給這個腳本起名爲:copy.sh,一會運行這個腳本把自己想要用到的命令一併都加進去。

wKiom1MimYTBZvPtAADiBH_jZZU742.jpg

bash在啓動的時候,不是直接啓動bash的,也是啓動bash的鏈接文件,所以我們需要爲bash創建一個鏈接文件,所以我們要進入到/bin/bash中爲其添加一個鏈接文件。

wKiom1MimjSQiiqKAABf7PBEL1o832.jpg

當然不能忘記給grub.conf一個執行權限,所以 chmod +x /mnt/boot/grub/grub.conf

這些做完,一個簡陋的linux就可以啓動了,當然不要忘記同步磁盤,爲剛寫入的那些東西通通寫入到磁盤中,使用命令 sync

啓動成功畫面。。。。。。。。。。。。。。。

wKiom1MinVyAViGhAAJpVx8JSCI036.jpg

當然這樣的不算完,或者他可以更加的優化一點。剛開始不是說init啓動用戶進程嗎,我們剛直接讓他運行的bash,那此刻,我們可以給他運行更多的東西,讓這個小系統看起來更像那麼一回事豈不是更好,我們可以給他也開機加載。查看客戶機有那些加載文件。使用mount查看:如下:

wKiom1MinqPwRF-FAAGCqw1-vxU132.jpg

那此刻,我們就可以自己寫init文件來讓系統開機自動加載了。

我們在給/sbin/init中寫入開機自己運行的程序的時候,可以自定義添加一些信息,好讓我們知道系統啓動的過程。我們可以在init中加入一句話:the system is running。

具體看腳本文件:

 

wKioL1MipEyhW9lZAACK6wOFuB8822.jpg

然後給執行權限:chmod +x /mnt/sysroot/sbin/init

當然,還需要將/grub/grub.conf中的init=/bin/bash改成init=/sbin/init.

wKioL1Mio3HDQFA6AAB0jSAPERE288.jpg

將改過的系統再開啓來試試效果。

wKiom1MipZTBFKyaAAEmi03Qhlk135.jpg

當然這樣的情況下,算是已經完成了。不過我們還可以更加完善點,我們可以給他加入網卡驅動的話,那不是我們就可以遠程來訪問他了。哈哈,不妨來試一試。

首先,我們需要的是網卡驅動,當然還需要裝載網卡的命令,還有查看硬件信息的命令。網卡驅動就有本機模擬的網卡。

wKioL1Mipx6h2iBBAABqCK1v4zE612.jpg複製網卡到小LINUX上。

複製安裝網卡和查看網卡類的命令進小linux中:如。ifocnfig modprobe。

    使用insmod安裝: insmod /lib/modules/e1000.ko

wKioL1MirACij2byAAGMkscwxQI648.jpg

好了,到此結束,以後會完善一些更好的功能的,目前就先這樣。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章