前言
隨着接觸Linux的慢慢深刻、對Linux也有了一個基本認識了吧,慢慢的接觸系統內核、系統配置文件、在瞭解Linux的系統啓動流程後,如今來總結一下一個簡單的Linux系統的裁減方法和步驟,一個只有內核文件和幾個簡單的命令的小Linux系統,如今就開始如下裁減:
正文
首先在一個虛擬機上新增一塊硬盤、這樣等裁減好了以後能夠把這塊硬盤掛載到別的虛擬機上去、運行自已裁減的那個Linux系統;linux
添加完硬盤後就啓動虛擬機了; shell
查找一下剛纔添加的硬盤:
# fdisk -l /dev/sd[a-z]vim
添加完硬盤以後就應該分區格式化硬盤了;
# fdisk /dev/sdbwindows
這裏就本身分區好了、很簡單的、比windows簡單多了!!!
分區完後就給這兩個分區格式化了;
格式化指定文件系統類型爲ext4
# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb2bash
格式化完了以後就看到剛纔分的兩個分區列表了;
然後在/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
然後就往sdb上安裝grub;
建立的boot在哪就指定到哪一個路徑下去,而後再指定安裝在哪塊硬盤上,grub安裝完以後就會生成/mnt/boot/grub/目錄、grub目錄下就會生成相關的文件
# grub-install --root-directory=/mnt /dev/sdbui
如今咱們把宿主機裏的內核文件給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
完整的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
到這裏了、若是咱們的第二塊硬盤上再有個可執行程序是否是就能夠運行了呢、那咱們不仿移植一些程序到咱們的第二塊硬盤上去、咱們以前寫了一個移植可執行程序的腳本、包括程序所依賴的庫文件也一併移植過去了、代碼以下:
#!/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要寫得更好本身後期再慢慢改吧、加慢判斷和顯示顏色什麼的等等:
結語: 好像東西不少的樣子、其實也不是不少了、可能我比較囉嗦、噼裏啪啦的寫了一大堆吧、其實操做也很少、就是要理清步驟就很清晰了、不是嗎、好吧、就到此結束吧、人無完人、有錯或有什麼不妥還望大神指點哦!