天天看點

總結之:CentOS 6.4系統裁減詳解及裝載網卡步驟

前言

   随着接觸Linux的慢慢深入、對Linux也有了一個基本認識了吧,慢慢的接觸系統核心、系統配置檔案、在了解Linux的系統啟動流程後,現在來總結一下一個簡單的Linux系統的裁減方法和步驟,一個隻有核心檔案和幾個簡單的指令的小Linux系統,現在就開始以下裁減:

正文 

   首先在一個虛拟機上新增一塊硬碟、這樣等裁減好了之後可以把這塊硬碟挂載到别的虛拟機上去、運作自已裁減的那個Linux系統;

<a href="http://s3.51cto.com/wyfs02/M00/1C/61/wKioL1MW6cOB-EHAAAGPeEDJ9iQ811.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/1C/61/wKioL1MW6cejrXyuAAIgtdPsFkM192.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/1C/60/wKiom1MW6e-B2P3OAAF9-XUwsEc625.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/1C/61/wKioL1MW6c6Ss1qjAAEZKYfTnis903.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/1C/61/wKioL1MW6duSTyg1AAEumrbayV0149.jpg" target="_blank"></a>

   添加完硬碟後就啟動虛拟機了;    

   查找一下剛才添加的硬碟:

   # fdisk -l /dev/sd[a-z]

<a href="http://s3.51cto.com/wyfs02/M00/1C/62/wKioL1MW6mzz2W_CAAD0OCsStpg036.jpg" target="_blank"></a>

   添加完硬碟之後就應該分區格式化硬碟了;

   # fdisk /dev/sdb

   這裡就自己分區好了、很簡單的、比windows簡單多了!!!

   分區完後就給這兩個分區格式化了;

   格式化指定檔案系統類型為ext4

   # mke2fs -t ext4 /dev/sdb1

   # mke2fs -t ext4 /dev/sdb2

<a href="http://s3.51cto.com/wyfs02/M00/1C/62/wKioL1MW6xyAIpb_AAB97b2jK_Y110.jpg" target="_blank"></a>

   格式化完了之後就看到剛才分的兩個分區清單了;

   而後在/mnt目錄下建立兩個目錄分别挂載到剛分好的那兩個分區上去:

   # mkdir -pv /mnt/{boot,sysroot}

   挂載目錄/mnt/boot到/dev/sdb1分區上去;

   挂載目錄/mnt/sysroot到/dev/sdb2分區上去;

   # mount /dev/sdb1 /mnt/boot/

   # mount /dev/sdb2 /mnt/sysroot/

<a href="http://s3.51cto.com/wyfs02/M01/1C/62/wKiom1MW64viHnRKAAEdUcbC910790.jpg" target="_blank"></a>

   而後就往sdb上安裝grub;

   建立的boot在哪就指定到哪個路徑下去,然後再指定安裝在哪塊硬碟上,grub安裝完之後就會生成/mnt/boot/grub/目錄、grub目錄下就會生成相關的檔案

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

<a href="http://s3.51cto.com/wyfs02/M01/1C/62/wKiom1MW67_RaaJFAAE0HARIVEs807.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/1C/62/wKiom1MW7DbCm7Z-AADhvPLKxe8781.jpg" target="_blank"></a>

   現在我們把主控端裡的核心檔案給sdb拷貝一份到/mnt/boot/目錄下,名字我們就叫mvlinuz、版本号我們就不帶了、init檔案也拷貝一份到/mnt/boot/目錄下,名字就簡單的改為initramfs.img

   # cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz

   # cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img

<a href="http://s3.51cto.com/wyfs02/M02/1C/62/wKiom1MW7FXwj2gKAADiJhm3tYc730.jpg" target="_blank"></a>

   完整的linux有哪些目錄呢、那我們就得來建立一下這些個目錄了;之前我們挂載的那個sysroot的目錄都沒有到、那我們就在這個目錄下建立這些目錄、切換到/mnt/sysroot/下:

   # mkdir -pv /etc/rc.d root boot dev proc sys tmp var usr srv lib lib64 bin sbin home mnt media

<a href="http://s3.51cto.com/wyfs02/M01/1C/62/wKiom1MW7KXhuVHdAABPNoOCSS4284.jpg" target="_blank"></a>

   到這裡了、如果我們的第二塊硬碟上再有個可執行程式是不是就可以運作了呢、那我們不仿移植一些程式到我們的第二塊硬碟上去、我們之前寫了一個移植可執行程式的腳本、包括程式所依賴的庫檔案也一并移植過去了、代碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

<code>#!/bin/bash</code>

<code>#</code>

<code>#定義目标目錄、也就是要拷貝到的那個目錄</code>

<code>target=</code><code>/mnt/sysroot</code>

<code>#聲明清理指令的方法</code>

<code>clearCmd() {</code>

<code>  </code><code>#判斷指令是否存在、如果不存在就提示沒有找到指令</code>

<code>  </code><code>if</code> <code>which</code> <code>$cmd &amp;&gt; </code><code>/dev/null</code><code>; </code><code>then</code>

<code>        </code><code>#擷取指令的路徑</code>

<code>        </code><code>cmdPath=`</code><code>which</code> <code>--skip-</code><code>alias</code> <code>$cmd`</code>

<code>  </code><code>else</code>

<code>        </code><code>echo</code> <code>"No such command"</code>

<code>        </code><code>return</code> <code>5</code>

<code>  </code><code>fi</code>

<code>}</code>

<code>#定義拷貝指令的方法</code>

<code>cmdCopy() {</code>

<code>        </code><code>#擷取指令路徑、隻取目錄部分</code>

<code>        </code><code>cmdDir=`</code><code>dirname</code> <code>$1`</code>

<code>        </code><code>#判斷目錄是否存在、不否在就建立</code>

<code>        </code><code>[ -d ${target}${cmdDir} ] || </code><code>mkdir</code> <code>-p ${target}${cmdDir}</code>

<code>        </code><code>#判斷要拷貝的指令否存在在、不存在就拷貝</code>

<code>        </code><code>[ -f ${target}${1} ] || </code><code>cp</code> <code>$1 ${target}${cmdDir}</code>

<code>#定義拷貝庫檔案的方法</code>

<code>libCopy() {</code>

<code>        </code><code>#循環所有獲得的指令所依賴的所有庫檔案</code>

<code>        </code><code>for</code> <code>lib </code><code>in</code> <code>`ldd $1 | </code><code>grep</code> <code>-o </code><code>"/[^[:space:]]\{1,\}"</code><code>`; </code><code>do</code>

<code>                </code><code>#取得庫檔案的目錄</code>

<code>                </code><code>libDir=`</code><code>dirname</code> <code>$lib`</code>

<code>                </code><code>#判斷庫檔案的目錄是否存在、不存在則建立</code>

<code>                </code><code>[ -d ${target}${libDir} ] || </code><code>mkdir</code> <code>-p ${target}${libDir}</code>

<code>                </code><code>#判斷庫檔案是否已經存在、不存在就拷貝</code>

<code>                </code><code>[ -f ${target}${lib} ] || </code><code>cp</code> <code>$lib ${target}${libDir}</code>

<code>        </code><code>done</code>

<code>#循環讓使用者輸入要拷貝的指令</code>

<code>while</code> <code>true</code><code>; </code><code>do</code>

<code>  </code><code>read</code> <code>-p </code><code>"Enter a command: "</code> <code>cmd</code>

<code>  </code><code>if</code> <code>[ </code><code>"$cmd"</code> <code>== </code><code>'quit'</code> <code>] ;</code><code>then</code>

<code>        </code><code>echo</code> <code>"quit"</code>

<code>        </code><code>exit</code> <code>0</code>

<code>  </code><code>#調用清理指令方法</code>

<code>  </code><code>clearCmd $cmd</code>

<code>  </code><code>[ $? -</code><code>eq</code> <code>5 ] &amp;&amp; </code><code>continue</code>

<code>  </code><code>#調用拷貝指令和庫檔案的方法</code>

<code>  </code><code>cmdCopy $cmdPath</code>

<code>  </code><code>libCopy $cmdPath</code>

<code>done</code>

<a href="http://s3.51cto.com/wyfs02/M01/1C/66/wKioL1MW77zCBKyQAAFBsoEDZCE400.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/1C/66/wKioL1MW8B-SiUDtAACmR-uljKg736.jpg" target="_blank"></a>

   接着切換到/mnt/sysroot/bin/目錄下、給bash建立一個軟連結、因為系統預設找shell都是找sh

   # ln -sv bash sh    

   現在我們切換到/mnt/sysroot/目錄試一下看就知道了:

   # chroot /mnt/sysroot/

<a href="http://s3.51cto.com/wyfs02/M02/1C/66/wKiom1MW8L3gz8-gAACRqZOTlL8973.jpg" target="_blank"></a>

   看、我們的小根可以用了    

   這裡我們再提供一個init腳本給這個小系統,在/sbin/目錄下,這個init要通過調用/etc/inittab這個配置檔案,然後再去執行/etc/rc.d/rc.sysinit下的初始化腳本、這樣的話那我們就把初始化腳本的内容拿到init裡來執行;

   這個腳本到底要做哪些操作呢:

   # vim /mnt/sysroot/sbin/init

<code>#列印歡迎資訊</code>

<code>echo</code> <code>-e </code><code>"\tWecome to \033[34m Mini Linux-2.6 OS\033[0m"</code>

<code>#挂載兩個僞檔案系統;-t後面跟檔案系統類型</code>

<code>mount</code> <code>-n -t proc proc </code><code>/proc</code>

<code>mount</code> <code>-n -t sysfs sysfs </code><code>/sys</code>

<code> </code><code>#啟動後再以讀寫方式重新挂載/dev/sda2上,這樣的話就要把主控端關機再後再新運作這個小系統了</code>

<code>mount</code> <code>-n -o remount,rw </code><code>/dev/sda2</code> <code>/</code>

<code>#運作bin下的bash</code>

<code>/bin/bash</code>

   儲存退出後給init一個可執行權限:

   chmod +x /mnt/sysroot/sbin/init

   此時我們就要給這塊硬碟上的小系統提供一個grub的配置檔案了,如果不寫這個配置檔案也可以啟動、但一進入就會進到grub小shell中讓你配置系統的grub資訊;

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

<code>default=0</code>

<code>timeout=5</code>

<code>title Mini Linux OS</code>

<code>    </code><code>root(hd0,0)</code>

<code>    </code><code>kernel </code><code>/vmlinuz</code> <code>ro root=</code><code>/dev/sda2</code> <code>selinux=0 init=</code><code>/sbin/init</code>

<code>    </code><code>initrd </code><code>/initramfs</code><code>.img</code>

   OK,儲存退出!        

   同步一下到對應的磁盤上:

   # sync    

   經過以上的操作、下面我們就來建立一個新的虛拟機、然後選擇虛拟機使用我們剛才裝小系統的那塊硬碟、CentOS_SecondSCSI.vmdk;

<a href="http://s3.51cto.com/wyfs02/M02/1C/69/wKioL1MW8-CD_ojRAAH2able-f0277.jpg" target="_blank"></a>

進到我們的小系統裡去了:

<a href="http://s3.51cto.com/wyfs02/M01/1C/72/wKiom1MXATDhooQGAABLZHNpUzs579.jpg" target="_blank"></a>

   接下來我們要在小系統裡裝載網卡、但是要確定被裝載的網卡驅動沒有使用、我們可以用lsmod這個指令檢視一下:這裡以e1000為例來說明問題、我這裡的虛拟機上已經裝有了、那我就先解除安裝了再裝載上去:

   在主控端上檢視目前核心裝載的子產品資訊:

   # lsmod

   解除安裝e1000網卡驅動:

   # modprobe -r e1000

   要裝載的話用下面指令即可:

   # modprobe e1000

   那怎麼樣把e1000的核心子產品拷貝到我們的小系統裡面裡、讓他裝上去、并且啟用網絡功能呢、首先確定我們系統中的piv4沒有做成子產品,這裡我們的ipv4沒有做成子產品、那就去移植這個子產品吧:

   首先給他建立一個目錄、切換到/mnt/sysroot/lib目錄中:

   # mkdir modules

   再拷貝我們系統上的核心子產品到這個目錄裡去

   # cp /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/

   再移植一些所需要用到的指令:insmod、rmmod、ifconfig、ip、ping

   OK、同步一下我們就可以重新啟動小系統了

   # sync

   進到小系統裡、敲指令吧;

   # insmod /lib/modules/e1000.ko

   # ifocnfig eth0 176.16.251.100/16

   # ping -c 3 176.16.251.100

<a href="http://s3.51cto.com/wyfs02/M02/1C/73/wKioL1MXAfLx2_ZuAAFwEvAOYU4644.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/1C/73/wKiom1MXA0LRw9JvAADu3n6P1sw699.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/1C/74/wKioL1MXAxzjKk7rAAFg5pXqsEk919.jpg" target="_blank"></a>

   好了、到這裡我們就基本完成了小系統的裁減了、要想裝載更多的功能、後面可以自己再添加、想裝什麼就裝什麼、要想系統啟動就有網絡那可以在init中設定一下、在init中加上ifconfig eth0 176.16.251.100/16就可以了、init要寫得更好自己後期再慢慢改吧、加慢判斷和顯示顔色什麼的等等:

結語:

   好像東西很多的樣子、其實也不是很多了、可能我比較啰嗦、噼裡啪啦的寫了一大堆吧、其實操作也不多、就是要理清步驟就很清晰了、不是嗎、好吧、就到此結束吧、人無完人、有錯或有什麼不妥還望大神指點哦!

本文轉自 wei0164 51CTO部落格,原文連結:http://blog.51cto.com/tanxw/1368801,如需轉載請自行聯系原作者

繼續閱讀