從頭構建本身的Linux系統

2012-09-10
 
     在博文「Linux系統啓動過程分析」中咱們瞭解了linux系統的啓動流程,今天咱們就來手動一步一步從頭來構建一個最小的linux系統,而後用模擬器將其加載起來。常見的模擬器有Qemu、Bochs、VMWare、VPC、Virtual Box和Xen等,以及特殊的模擬UML(User-Mode-Linux),這裏咱們選擇用VMWare。
咱們製做的Linux系統有shell功能,支持Web Server,telnet等服務,以及ifconfig,vi等常見工具。準備工做:
在http://www.kernel.org/ 下載內核源代碼 linux-2.6.21.tar.bz2;
在http://www.busybox.org/ 下載busybox源碼 busybox-1.14.4.tar.bz2。
在本地新建一個目錄,例如/home/DIY,固然你能夠隨便選擇,而後將下載的內核源碼和busybox源碼包拷貝到/home/DIY目錄下;
 
A)、構造根文件系統
咱們都知道標準的發行版linux其目錄結構通常是以下這個樣子:
 
咱們製做的linux運行起來以後固然也應該有個相似的目錄結構。這裏咱們只選擇一些必須的目錄,由於咱們構建的是「最小」的Linux系統。
在/home/DIY目錄下依次執行以下命令:
 
在rootfs/etc目錄下分別創建以下各個文件group、inittab、profile、protocols、
rcS和services:
點擊(此處)摺疊或打開
###################### /etc/group ###################### from here
root:x:0:
ftp:x:800:
nogroup:x:65534:
 
######################/etc/inittab ###################### from here
::sysinit:/etc/rcS
tty1::askfirst:-/bin/sh --login
tty2::askfirst:-/bin/sh --login
tty3::askfirst:-/bin/sh --login
 
######################/etc/profile ###################### from here
#!/bin/sh
 
cat <<EOF
 
Welcome to  DIY 
 
EOF
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
 
######################/etc/protocols ###################### from here
# Internet (IP) protocols
#
ip    0    IP
icmp    1    ICMP
igmp    2    IGMP
ggp    3    GGP    
ipencap    4    IP-ENCAP
st    5    ST
tcp    6    TCP
egp    8    EGP
igp    9    IGP
pup    12    PUP
udp    17    UDP
hmp    20    HMP
xns-idp    22    XNS-IDP
rdp    27    RDP
iso-tp4    29    ISO-TP4
xtp    36    XTP    
ddp    37    DDP    
idpr-cmtp 38    IDPR-CMTP
idrp    45    IDRP
rsvp    46    RSVP
gre    47    GRE    
esp    50    IPSEC-ESP
ah    51    IPSEC-AH
skip    57    SKIP
rspf    73    RSPF CPHB
vmtp    81    VMTP
eigrp    88    EIGRP
ospf    89    OSPFIGP
ax.25    93    AX.25
ipip    94    IPIP
etherip    97    ETHERIP
encap    98    ENCAP
pim    103    PIM    
ipcomp    108    IPCOMP
vrrp    112    VRRP
l2tp    115    L2TP
isis    124    ISIS
sctp    132    SCTP
fc    133    FC
 
######################/etc/rcS ###################### from here
#!/bin/sh
 
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs tmpfs /dev -o size=512K,mode=0755
echo DIY > /proc/sys/kernel/hostname
 
mkdir -p /var/run /var/log /var/lock /var/state \
         /var/tmp /var/mnt /dev/pts /dev/shm
mount devpts /dev/pts -t devpts
 
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
 
ifconfig lo 127.0.0.1 up
ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up
 
telnetd -l /bin/sh
httpd -h /www
 
###################/etc/services ################# from here
ssh    22/tcp
ssh    22/udp
telnet    23/tcp
telnet    23/udp
http    80/tcp    www www-http
http    80/udp    www www-http
login    513/tcp
shell    514/tcp    cmd
再在rootfs/www目錄下創建一個index.html文件,內容以下:
點擊(此處)摺疊或打開
<h1>Success!</h1>
<p>Welcome to DIY linux!</p>
最後rootfs目錄的組織結構以下:
 
    其餘的命令行工具由接下來的busybox生成。
B)、編譯busybox
在Linux系統中經常使用的工具,如 bash、grep命令、sed 命令、telnetd等,這裏爲了方便省事,我就用busybox來代替了。如今的busybox擁有很是多的工具,真正成爲一個「Busy」的box。後面的例子將嘗試只使用 busybox來充當全部應用層所須要的工具集。包括Shell,網絡配置,web服務器,telnet等。而busybox也由此獲得一個稱號「嵌入式世界的瑞士軍刀」。
 
將修改後的「 busybox.config.txt   」複製到busybox-1.14.4目錄下重命名爲「.config」,注意文件名前面的點「.」絕對不能省略。
 
以後彈出以下界面:
 
在配置界面下,咱們依次選擇:Busybox Settings => Build Options 而後選中(按空格鍵),這裏咱們將編譯生成靜態庫的busybox,以下圖中所示選項:
 
配置busybox的安裝目錄,依次選擇:Busybox Settings => Installation Options ,以下:
 
保存配置後執行編譯命令make:
 
編譯完成後執行make install:
 
這樣咱們編譯的busybox工具就安裝到前面咱們建立的rootfs目錄中了,此時rootfs目錄下的組織結構就變成了以下這個樣子:
 
無論是bin,sbin,usr/bin仍是usr/sbin目錄下的命令都是到/bin/busybox應用程序的軟鏈接。目前rootfs這個目錄結構和咱們常見的linux發行版的目錄結構仍是有些差別,因此咱們繼續往rootfs中增長dev,proc,tmp,var,lib,root和sys目錄:
 
這樣子就更像一個「標準」linux發行版的樣子了。接下來咱們來製做一個ramdisk的初始化文件,名爲initrd。Linux內置支持以RAM磁盤的形式來啓動。關於Linux系統的啓動流程請參見博文「Linux系統啓動過程分析」裏的詳細描述。
C)、製做initrd文件
 
D)、編譯Linux內核源碼
解壓內核源碼,而後將我修改後的內核配置文件「 linux.config.txt   」拷貝到linux-2.6.21目錄下,重命名爲「.config」,以下:
 
執行make menuconfig能夠查看哪些配置項已經被選上:
 
執行make命令開始編譯內核:
 
咱們提供的內核配置文件linux.conf將模塊已經靜態編譯到內核中去了,這樣就會形成內核比較大,若是是採用動態加載模塊的話,須要將全部模塊安裝到前面製做的ramdisk裏。編譯好的內核鏡像,通常位於:
<!--[if !supportLists]-->?    <!--[endif]-->對於x86平臺,壓縮後的核心是 arch/x86/boot/bzImage;
<!--[if !supportLists]-->?    <!--[endif]-->對於MIPS平臺,壓縮後的核心是 arch/powerpc/boot/zImage;
<!--[if !supportLists]-->?    <!--[endif]-->對於arm平臺,壓縮後的核心是 arch/arm/boot/zImage
……
E)、用VMWare加載內核
將arch/x86/boot/bzImage和/home/DIY/initrd文件拷貝到linux系統的/boot目錄下,而後修改/boot/grub/menu.lst,在其中添加以下一項:
點擊(此處)摺疊或打開
title DIY Your OS
   root (hd0,0)
   kernel /bzImage rw root=/dev/ram rootfs_size=8M
   initrd /initrd
   PS:由於咱們製做的initrd文件大小就是8M,因此rootfs_size=8M。
重啓VMware,在啓動界面咱們本身built的linux系統:
 
啓動後效果以下:
 
咱們能夠看到eth0接口已經up了,其IP地址默認爲192.168.1.1,由於我虛擬機的IP地址池是192.168.6.*網段的,因此手動將eth0的接口IP設置爲192.168.6.135:
 
而後經過web和telnet訪問咱們本身作的系統,最終的訪問結果以下:
 
 
小結:經過今天的學習相信你們對Linux系統的運行原理和啓動流程的認識又上了一個新的臺階,更重要的是學會了如何手動構建一個「最小」的Linux「發行版」系統。那麼,如今回過頭來再看那些商業版的Linux系統,其實本質和咱們今天作工做的差很少,因此,若是有條件咱們也能夠發行一個本身的系統了:)。
相關文章
相關標籤/搜索