Linux裁剪概述


前言 
   隨着接觸Linux的慢慢深入、對Linux也有了一個基本認識了吧,慢慢的接觸系統內核、系統配置文件、在了解Linux的系統啟動流程后,現在來總結一下一個簡單的Linux系統的裁減方法和步驟,一個只有內核文件和幾個簡單的命令的小Linux系統,現在就開始以下裁減: 
正文 
   首先在一個虛擬機上新增一塊硬盤、這樣等裁減好了之后可以把這塊硬盤掛載到別的虛擬機上去、運行自已裁減的那個Linux系統;

wKioL1MW6cOB-EHAAAGPeEDJ9iQ811[1]

wKioL1MW6cejrXyuAAIgtdPsFkM192[1]

wKiom1MW6e-B2P3OAAF9-XUwsEc625[1]

wKioL1MW6c6Ss1qjAAEZKYfTnis903[1]

wKioL1MW6duSTyg1AAEumrbayV0149[1]

   添加完硬盤后就啟動虛擬機了;   

   查找一下剛才添加的硬盤: 
   # fdisk -l /dev/sd[a-z]

wKioL1MW6mzz2W_CAAD0OCsStpg036[1]

   添加完硬盤之后就應該分區格式化硬盤了; 
   # fdisk /dev/sdb

   這里就自己分區好了、很簡單的、比windows簡單多了!!! 
   分區完后就給這兩個分區格式化了; 
   格式化指定文件系統類型為ext4 
   # mke2fs -t ext4 /dev/sdb1 
   # mke2fs -t ext4 /dev/sdb2

wKioL1MW6xyAIpb_AAB97b2jK_Y110[1]

   格式化完了之后就看到剛才分的兩個分區列表了; 
   而后在/mnt目錄下創建兩個目錄分別掛載到剛分好的那兩個分區上去: 
   # mkdir -pv /mnt/{boot,sysroot}

   掛載目錄/mnt/boot到/dev/sdb1分區上去; 
   掛載目錄/mnt/sysroot到/dev/sdb2分區上去; 
   # mount /dev/sdb1 /mnt/boot/ 
   # mount /dev/sdb2 /mnt/sysroot/

wKiom1MW64viHnRKAAEdUcbC910790[1]

   而后就往sdb上安裝grub; 
   創建的boot在哪就指定到哪個路徑下去,然后再指定安裝在哪塊硬盤上,grub安裝完之后就會生成/mnt/boot/grub/目錄、grub目錄下就會生成相關的文件 
   # grub-install --root-directory=/mnt /dev/sdb

wKiom1MW67_RaaJFAAE0HARIVEs807[1]

wKiom1MW7DbCm7Z-AADhvPLKxe8781[1]

   現在我們把宿主機里的內核文件給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

wKiom1MW7FXwj2gKAADiJhm3tYc730[1]

   完整的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

wKiom1MW7KXhuVHdAABPNoOCSS4284[1]

   到這里了、如果我們的第二塊硬盤上再有個可執行程序是不是就可以運行了呢、那我們不仿移植一些程序到我們的第二塊硬盤上去、我們之前寫了一個移植可執行程序的腳本、包括程序所依賴的庫文件也一並移植過去了、代碼如下:

#!/bin/bash

#

#定義目標目錄、也就是要拷貝到的那個目錄

target=/mnt/sysroot

#聲明清理命令的方法

clearCmd() {

#判斷命令是否存在、如果不存在就提示沒有找到命令

if which $cmd &> /dev/nullthen

#獲取命令的路徑

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 truedo

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

wKioL1MW77zCBKyQAAFBsoEDZCE400[1]

wKioL1MW8B-SiUDtAACmR-uljKg736[1]

   接着切換到/mnt/sysroot/bin/目錄下、給bash創建一個軟鏈接、因為系統默認找shell都是找sh 
   # ln -sv bash sh     
   現在我們切換到/mnt/sysroot/目錄試一下看就知道了: 
   # chroot /mnt/sysroot/

wKiom1MW8L3gz8-gAACRqZOTlL8973[1]

   看、我們的小根可以用了     
   這里我們再提供一個init腳本給這個小系統,在/sbin/目錄下,這個init要通過調用/etc/inittab這個配置文件,然后再去執行/etc/rc.d/rc.sysinit下的初始化腳本、這樣的話那我們就把初始化腳本的內容拿到init里來執行; 
   這個腳本到底要做哪些操作呢: 
   # vim /mnt/sysroot/sbin/init

#!/bin/bash

#

#打印歡迎信息

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

#掛載兩個偽文件系統;-t后面跟文件系統類型

mount -n -t proc proc /proc

mount -n -t sysfs sysfs /sys

#啟動后再以讀寫方式重新掛載/dev/sda2上,這樣的話就要把宿主機關機再后再新運行這個小系統了

mount -n -o remount,rw /dev/sda2 /

#運行bin下的bash

/bin/bash

   保存退出后給init一個可執行權限: 
   chmod +x /mnt/sysroot/sbin/init 
   此時我們就要給這塊硬盤上的小系統提供一個grub的配置文件了,如果不寫這個配置文件也可以啟動、但一進入就會進到grub小shell中讓你配置系統的grub信息; 
   # vim /mnt/boot/grub/grub.conf

default=0

timeout=5

title Mini Linux OS

root(hd0,0)

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

initrd /initramfs.img

   OK,保存退出!         
   同步一下到對應的磁盤上: 
   # sync     
   經過以上的操作、下面我們就來創建一個新的虛擬機、然后選擇虛擬機使用我們剛才裝小系統的那塊硬盤、CentOS_SecondSCSI.vmdk;

wKioL1MW8-CD_ojRAAH2able-f0277[1] 
   好了、我們把已經運行的虛擬機都掛載起,運行我們剛才創建好的那個有CentOS_SecondSCSI.vmdk磁盤的虛擬機,到這里我們就看到我們裁減的小系統跑起來了、看到我們自己定義的Min Linux-2.6 OS了!    wKioL1MW9GLQHBi0AABl_cHytmI133[1]

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

wKiom1MXATDhooQGAABLZHNpUzs579[1]

   接下來我們要在小系統里裝載網卡、但是要確保被裝載的網卡驅動沒有使用、我們可以用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 
wKioL1MXAfLx2_ZuAAFwEvAOYU4644[1]

wKiom1MXA0LRw9JvAADu3n6P1sw699[1]

wKioL1MXAxzjKk7rAAFg5pXqsEk919[1]

   好了、到這里我們就基本完成了小系統的裁減了、要想裝載更多的功能、后面可以自己再添加、想裝什么就裝什么、要想系統啟動就有網絡那可以在init中設置一下、在init中加上ifconfig eth0 176.16.251.100/16就可以了、init要寫得更好自己后期再慢慢改吧、加慢判斷和顯示顏色什么的等等: 
結語: 
   好像東西很多的樣子、其實也不是很多了、可能我比較啰嗦、噼里啪啦的寫了一大堆吧、其實操作也不多、就是要理清步驟就很清晰了、不是嗎、好吧、就到此結束吧、人無完人、有錯或有什么不妥還望大神指點哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM