前言
随着接觸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 &> </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 ] && </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,如需轉載請自行聯系原作者