打造我的專屬的微型linux--具體實現篇

離上一篇啓動原理間隔了這麼多天,讓你們久等了。這期間在製做過程當中我的也遇到了些許問題,因此斷斷續續的才把此篇寫完。linux

問題是在initrd階段識別不到磁盤設備,掛載不了rootfs,谷歌了查了不少資料都沒獲得解決。剛開始用的是centos6.2的內核,6.2更新了initrd,裏面的init腳本和之前有很大的不一樣,因而我換到5.8的內核,仍是不行,又切換到5.4的內核,問題依然存在。火大,又本身去官網下載了2.6.18的內核源代碼,基於安裝的centos5.4的config從新編譯了一次(編譯太耗時間),問題依舊存在。。。那時候真的是特別無語。最後仍是找馬哥交流了下,在這裏還要多謝馬哥的指導,找到了問題的關鍵所在。你們有什麼問題也能夠在馬哥的羣裏一塊兒探討,羣號在馬哥的博客,地址在個人博客連接中vim

 

在開始以前說說我的的近況。值得高興的是pass了國家軟考網絡工程師,對於這個證書,我的以爲之後在國企或者政府單位工做仍是有點用處的,通常在私企和外企做用不是很大。不過老是比沒有的好。centos

網工過了,下半年的計劃就是把CCNA給過了,這個已經耽擱了好久了。主要是對本身的en很不自信。。。呵呵。。對於CCIE。。。仍是算了,網絡這塊,折騰到CCNP也就差很少了。。。bash

 

好了,有點囉嗦了,接下來進入正題網絡

 

總結在上一篇的linux啓動原理,咱們知道要啓動一個linux所必須的有的東西有如下幾個ide

1.bootloader:系統引導程序GRUBui

2.kernel:系統內核this

3.initrd:引導內核的ramdiskblog

4.init:系統第一個進程接口

5.用戶接口bash

5.init,bash等程序所依賴的庫文件和腳本

 

爲了不各位看官看的迷糊,首先先說下大概的一個流程

整個實驗的流程:安裝bootloader--複製kernel到硬盤--提供initrd--配置GRUB--提供init,bash,等必須的軟件和庫文件

 

由以上流程羅列出如下所須要的一些配置文件,程序等元素

 

配置文件 /etc/inittab /boot/grub/grub.conf

腳本 /etc/rc.d/rc.sysinit

必須的程序

kernel

/sbin/init

/bin/bash

庫文件:用ldd查看具體須要哪些庫文件

 

知道了以上所須要的東西,接下來,就能夠開始動手在一塊硬盤中一步步的打造一個微型的linux了

具體思路是在一個安裝好的linux宿主機中添加一塊新硬盤,在這塊硬盤上安裝一個微型的linux,再用另一臺虛擬機加載那塊硬盤啓動微型linux

 

OK,just do it !

 

ps:如下都在虛擬機中實現

 

 

step1:

首先添加一塊硬盤

129GALZOPGZ`MJM$V[B]7UA

 

]$YG5YEW)$U~1Z%G@]C)R@A

 

step2:

啓動宿主linux系統,對新添加的硬盤進行分區。這裏分一個boot分區,一個根分區和一個swap分區

~}7RGVM04{R98G2[FW6C(FY

能夠看到,boot分區用了100MB,根分區我只使用了512MB。從中能夠看出這是一個極其精簡的linux。SWAP分區用了128MB,因此下面我將只會使用64MB的內存來啓動這個linux。

分區完成後進行格式化,命令以下

[root@localhost ~]# partprobe /dev/sdb

[root@localhost ~]# mkfs.ext2 /dev/sdb1

[root@localhost ~]# mkfs.ext3 /dev/sdb2

[root@localhost ~]# mkswap /dev/sdb3

 

step3:

在宿主機上掛在boot分區和根分區

[root@localhost ~]# mkdir /mnt/{boot,sysroot} –p

[root@localhost mnt]# mount /dev/sdb1 /mnt/boot/
[root@localhost mnt]# mount /dev/sdb2 /mnt/sysroot/

下面會將宿主系統的內核,程序等須要的文件移植到這2個目錄

 

step4:

安裝bootloader,這裏用比較經常使用的grub做爲引導程序

[root@localhost mnt]# grub-install --root-directory=/mnt /dev/sdb #這裏指定root目錄時,會自動搜尋此目錄下的boot目錄,此命令就直接將grub所有安裝完成,包括第一段的MBR和第二段放置在boot目錄下的grub程序


Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(fd0)    /dev/fd0
(hd0)    /dev/sda
(hd1)    /dev/sdb

安裝好grub後,等放置好內核後再回來配置grub

 

step5:

在根目錄下移植系統必須的一些基本的程序

首先建立根目錄下所必須的目錄

[root@localhost sysroot]# mkdir -p root home proc sys dev etc/rc.d bin sbin lib var tmp opt boot misc mnt media usr

而後先移植init這個系統父進程,這個進程的配置文件爲/etc/inittab,加載配置文件後會執行/etc/rc.d/rc.sysinit這個系統初始化腳原本對系統進行一系列的操做

注意移植的時候要移植到相對應的目錄

[root@localhost sysroot]# cp /sbin/init /mnt/sysroot/sbin/

除了主程序,還要移植相應的庫文件,init所依賴的庫文件可使用ldd命令來查看

[root@localhost sysroot]# ldd /sbin/init
    linux-gate.so.1 =>  (0x00ca5000)
    libnih.so.1 => /lib/libnih.so.1 (0x00514000)
    libnih-dbus.so.1 => /lib/libnih-dbus.so.1 (0x00a1e000)
    libdbus-1.so.3 => /lib/libdbus-1.so.3 (0x006a9000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00d92000)
    librt.so.1 => /lib/librt.so.1 (0x0020e000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x005e1000)
    libc.so.6 => /lib/libc.so.6 (0x00217000)
    /lib/ld-linux.so.2 (0x0080c000)

查詢到所需的庫文件後,將這些庫文件移植到對應的目錄。

[root@localhost sysroot]# cp /lib/libnih.so.1 /lib/libnih-dbus.so.1 /lib/libdbus-1.so.3 /lib/libpthread.so.0 /lib/librt.so.1 /lib/libgcc_s.so.1 /lib/libc.so.6 /mnt/sysroot/lib/

 

用一樣的方法再移植bash

[root@localhost sysroot]# cp /bin/bash /mnt/sysroot/bin/

[root@localhost bin]# ln -s bash sh #不要忘了爲bash建立連接文件

[root@localhost sysroot]# ldd /bin/bash
    linux-gate.so.1 =>  (0x004c4000)
    libtinfo.so.5 => /lib/libtinfo.so.5 (0x00e05000)
    libdl.so.2 => /lib/libdl.so.2 (0x00c1d000)
    libc.so.6 => /lib/libc.so.6 (0x00110000)
    /lib/ld-linux.so.2 (0x00954000)

[root@localhost sysroot]# cp /lib/libtinfo.so.5 /lib/libdl.so.2 /lib/ld-linux.so.2 /mnt/sysroot/lib/

/lib/libc.so.6這個庫文件是init和bash都須要使用到的,以前移植init時已經cp過去了,此次就不用重複cp了

其它須要用到的程序均可以使用這種方法進行移植,這裏只提供了最基本的bash,其它程序能夠按照本身的須要進行移植

這裏我再移植了一個ls命令,步驟這裏就再也不羅列出了,等製做好後登陸到這個微型linux後,出了bash內置的命令外,我將只能在bash下使用ls命令

 

以前移植了init後,尚未建立init的配置文件,接下來就先建立init配置文件inittab

[root@localhost bin]# vim /mnt/sysroot/etc/inittab

寫入下面2行

id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit

表示默認啓動的運行級別爲3,和系統開機時初始化腳本的位置

建立系統初始化腳本

[root@localhost bin]# vim /mnt/sysroot/etc/rc.d/rc.sysinit

#!/bin/bash
#
echo -e "\t hello world ,welcome to the mini linux by lustlost"
/bin/bash

 

[root@localhost bin]# chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit #不要忘了給腳本加上執行權限

 

step6:

[root@localhost dev]# yum groupinstall "Development Libraries" -y
[root@localhost dev]# yum groupinstall "Development Tools" -y

好了,程序都移植好了,下面就能夠移植內核和initrd了

咱們直接使用宿主機上的內核(以前忘了說了,宿主機是最新的centos6.2 minimal版本,使用的是內核版本是2.6.32-220.el6.i686)

[root@localhost ~]# cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz #內核的移植很簡單,直接cp就好了

接下來要移植引導內核的initrd.img了。若是宿主機和要移植的微型linux的分區不同的話,解包initrd編輯一下里面的init修改這一行

mkrootdev -t ext3 -o defaults,ro /dev/sda2

確保這一行指定的根文件系統是對應的,而後從新打包

[root@localhost ~]# zcat /boot/initrd-2.6.18-164.el5.img | cpio –id #解包命令

[root@localhost tmp]# find . | cpio -o -H newc --quiet | gzip > /mnt/boot/initrd.gz #從新打包命令

而後繼續移植。。。我這裏宿主機和微型linux分區是同樣的,因此就從新打包演示了

 

[root@localhost tmp]# cp /boot/initrd-2.6.18-308.el5.img /mnt/boot/initrd.img

 

 

step7:

移植好內核和initrd,就能夠配置grub的引導配置文件了

[root@localhost ~]# vi /mnt/boot/grub/grub.conf

VP[UPM$P[(1]HK92%`}CDO5

 

OK ,歷經千辛萬苦,有工做所有就緒,咱們開始新建一個虛擬機加載製做好的微型linux的硬盤,看看能不能啓動起來

建立自定義虛擬機,使用剛剛在宿主機上製做的,上面放置着微型linux的硬盤

7JX5Z3Q}MM~U2ONKK_Q@O)3

D{IU}M7A9M0R$_G16TM_JZH

B03LMSLYE{$(PL}V}CKWO$1

看到了麼?一個配置極其猥瑣和寒酸的虛擬機,只搭載了64MB的內存,其他的配置能刪的都刪了。

 

step8:

好了,開始啓動一下這個微型linux

開機grub啓動菜單

I8)NTCU9_QKH]RDHRAP}VM3

初始化各類硬件

$DJR4PI)_~DLX9F{5X8{L`4

成功進入系統

J{B0@`6NC{@[7X]}C1AZ]NT

使用一下ls命令

KO[O1VW)QPQMXYDU8Q4$IFG

進入到bin目錄下,只有bash和ls這2個程序,想要移植其它程序按照上面的方法進行移植就好了

RR[MJO0KLDVJ]BVWV`HIUS9

 

至此,一個微型的linux的建立成功,只有64MB的內存就啓動起來了,各類擴展功能就能夠按照本身的需求自由定製了

 

最後說下開篇說的我遇到的問題,其實很SB的一個問題,由於宿主機是centos6.2的系統,因爲6.2中使用了比較新的initramfs,裏面的腳本和之前的大不同,因而後來使用了5.8的內核,但以前建立的minilinux的虛擬機是依照redhat 6建立的,因此作好系統後一直啓動不了。後來在馬哥的提醒下從新建立了redhat 5的虛擬機,成功啓動了。。。

 

這裏我想說的是,有時候一個疏漏的小細節會致使整個系統的失敗。之後工做中要切記不要遺漏細節。。。細節決定成敗。。。

 

好吧 。。。我又囉嗦了。。。

 

The End。。。。。

相關文章
相關標籤/搜索