前言
隨着接觸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
到這里了、如果我們的第二塊硬盤上再有個可執行程序是不是就可以運行了呢、那我們不仿移植一些程序到我們的第二塊硬盤上去、我們之前寫了一個移植可執行程序的腳本、包括程序所依賴的庫文件也一並移植過去了、代碼如下:
#!/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
#!/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;
好了、我們把已經運行的虛擬機都掛載起,運行我們剛才創建好的那個有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要寫得更好自己后期再慢慢改吧、加慢判斷和顯示顏色什么的等等:
結語:
好像東西很多的樣子、其實也不是很多了、可能我比較啰嗦、噼里啪啦的寫了一大堆吧、其實操作也不多、就是要理清步驟就很清晰了、不是嗎、好吧、就到此結束吧、人無完人、有錯或有什么不妥還望大神指點哦!