前言
? ?隨著接觸Linux的慢慢深入、對Linux也有了一個基本認識了吧,慢慢的接觸系統內核、系統配置文件、在了解Linux的系統啟動流程后,現在來總結一下一個簡單的Linux系統的裁減方法和步驟,一個只有內核文件和幾個簡單的命令的小Linux系統,現在就開始以下裁減:
正文?
? ?首先在一個虛擬機上新增一塊硬盤、這樣等裁減好了之后可以把這塊硬盤掛載到別的虛擬機上去、運行自已裁減的那個Linux系統;
? ?添加完硬盤后就啟動虛擬機了; ? ?
? ?查找一下剛才添加的硬盤:
? ?# fdisk -l /dev/sd[a-z]
? ?添加完硬盤之后就應該分區格式化硬盤了;
? ?# fdisk /dev/sdb
? ?這里就自己分區好了、很簡單的、比windows簡單多了!!!
? ?分區完后就給這兩個分區格式化了;
? ?格式化指定文件系統類型為ext4
? ?# mke2fs -t ext4 /dev/sdb1
? ?# mke2fs -t ext4 /dev/sdb2
? ?格式化完了之后就看到剛才分的兩個分區列表了;
? ?而后在/mnt目錄下創建兩個目錄分別掛載到剛分好的那兩個分區上去:
? ?# mkdir -pv /mnt/{boot,sysroot}
? ?掛載目錄/mnt/boot到/dev/sdb1分區上去;
? ?掛載目錄/mnt/sysroot到/dev/sdb2分區上去;
? ?# mount /dev/sdb1 /mnt/boot/
? ?# mount /dev/sdb2 /mnt/sysroot/
? ?而后就往sdb上安裝grub;
? ?創建的boot在哪就指定到哪個路徑下去,然后再指定安裝在哪塊硬盤上,grub安裝完之后就會生成/mnt/boot/grub/目錄、grub目錄下就會生成相關的文件
? ?# grub-install --root-directory=/mnt /dev/sdb
? ?現在我們把宿主機里的內核文件給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
? ?完整的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
? ?到這里了、如果我們的第二塊硬盤上再有個可執行程序是不是就可以運行了呢、那我們不仿移植一些程序到我們的第二塊硬盤上去、我們之前寫了一個移植可執行程序的腳本、包括程序所依賴的庫文件也一并移植過去了、代碼如下:
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 | #!/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 |
? ?接著切換到/mnt/sysroot/bin/目錄下、給bash創建一個軟鏈接、因為系統默認找shell都是找sh
? ?# ln -sv bash sh ? ?
? ?現在我們切換到/mnt/sysroot/目錄試一下看就知道了:
? ?# chroot /mnt/sysroot/
? ?看、我們的小根可以用了 ? ?
? ?這里我們再提供一個init腳本給這個小系統,在/sbin/目錄下,這個init要通過調用/etc/inittab這個配置文件,然后再去執行/etc/rc.d/rc.sysinit下的初始化腳本、這樣的話那我們就把初始化腳本的內容拿到init里來執行;
? ?這個腳本到底要做哪些操作呢:
? ?# vim /mnt/sysroot/sbin/init
1 2 3 4 5 6 7 8 9 10 11 | #!/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
1 2 3 4 5 6 | 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;
? ?好了、我們把已經運行的虛擬機都掛載起,運行我們剛才創建好的那個有CentOS_SecondSCSI.vmdk磁盤的虛擬機,到這里我們就看到我們裁減的小系統跑起來了、看到我們自己定義的Min Linux-2.6 OS了! ? ?
進到我們的小系統里去了:
? ?接下來我們要在小系統里裝載網卡、但是要確保被裝載的網卡驅動沒有使用、我們可以用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
? ?好了、到這里我們就基本完成了小系統的裁減了、要想裝載更多的功能、后面可以自己再添加、想裝什么就裝什么、要想系統啟動就有網絡那可以在init中設置一下、在init中加上ifconfig eth0 176.16.251.100/16就可以了、init要寫得更好自己后期再慢慢改吧、加慢判斷和顯示顏色什么的等等:
結語:
? ?好像東西很多的樣子、其實也不是很多了、可能我比較啰嗦、噼里啪啦的寫了一大堆吧、其實操作也不多、就是要理清步驟就很清晰了、不是嗎、好吧、就到此結束吧、人無完人、有錯或有什么不妥還望大神指點哦!