本身的linux系統

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

wKioL1MW6cOB-EHAAAGPeEDJ9iQ811[1]

wKioL1MW6cejrXyuAAIgtdPsFkM192[1]

wKiom1MW6e-B2P3OAAF9-XUwsEc625[1]

wKioL1MW6c6Ss1qjAAEZKYfTnis903[1]

wKioL1MW6duSTyg1AAEumrbayV0149[1]

   添加完硬盤後就啓動虛擬機了;    shell

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

wKioL1MW6mzz2W_CAAD0OCsStpg036[1]

   添加完硬盤以後就應該分區格式化硬盤了;
   # fdisk /dev/sdbwindows

   這裏就本身分區好了、很簡單的、比windows簡單多了!!!
   分區完後就給這兩個分區格式化了;
   格式化指定文件系統類型爲ext4
   # mke2fs -t ext4 /dev/sdb1
   # mke2fs -t ext4 /dev/sdb2bash

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/ide

wKiom1MW64viHnRKAAEdUcbC910790[1]

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

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.imgspa

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 media3d

wKiom1MW7KXhuVHdAABPNoOCSS4284[1]

   到這裏了、若是咱們的第二塊硬盤上再有個可執行程序是否是就能夠運行了呢、那咱們不仿移植一些程序到咱們的第二塊硬盤上去、咱們以前寫了一個移植可執行程序的腳本、包括程序所依賴的庫文件也一併移植過去了、代碼以下:

#!/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

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要寫得更好本身後期再慢慢改吧、加慢判斷和顯示顏色什麼的等等:
結語:    好像東西不少的樣子、其實也不是不少了、可能我比較囉嗦、噼裏啪啦的寫了一大堆吧、其實操做也很少、就是要理清步驟就很清晰了、不是嗎、好吧、就到此結束吧、人無完人、有錯或有什麼不妥還望大神指點哦!

相關文章
相關標籤/搜索