歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

一步步手動構建小於10M的類嵌入式Linux系統

前提:
1、一個作為宿主機的Linux;本文使用的是RedHat Enterprise Linux 5.4;
2、在宿主機上提供一塊額外的硬盤作為新系統的存儲盤,為了降低復雜度,這裡添加使用一塊IDE接口的新硬盤;
3、Linux內核源碼,busybox源碼;本文使用的是目前最新版的linux-2.6.34.1和busybox-1.16.1。

說明:本文是一個step by step的實做指南;

一、為系統上的新硬盤建立分區,這裡根據需要先建立一個大小為100M的主分區作為新建系統的boot分區和一個512M的分區作為目標系統(即正在構建的新系統,後面將沿用此名稱)的根分區;100M的分區格式化後將其掛載至/mnt/boot目錄下;512M的分區格式化後將掛載至/mnt/sysroot目錄;

說明:
1、此處的boot和sysroot的掛載點目錄名稱盡量不要修改,尤其是boot目錄,否則您必須保證後面的許多步驟都做了相應的改動;
2、新建系統的boot目錄也可以跟根目錄在同一個分區,這種方式比獨立分區還要簡單些,因此這裡將不對此種方法再做出說明;

二、編譯內核源代碼,為新系統提供一個所需的內核(本例中的源代碼包都位於/usr/src目錄中)

# cd  /usr/src
# tar jxvf linux-2.6.34.1.tar.bz2
# ln  -sv  linux-2.6.34.1  linux
# cd linux

# make menuconfig

根據您的實際和規劃選擇所需要的功能;本實例計劃制作一個具有網絡的功能的tiny linux且不打算使用內核模塊,因此,這裡選擇把本機對應的網卡驅動直接編譯進了內核。作者使用的是vmware Workstation虛擬機,所以,所需的網上驅動是pcnet32的,其它的均按需要選擇。選擇完成後需要保存至當前目錄下.config文件中。

# make  SUBDIR=arch/
# cp arch/x86/boot/bzImage  /mnt/boot

# make menuconfig

提示:為了實現後面的功能,請務必將文件系統中的ext3和網卡的驅動程序直接編譯進內核;

三、編譯busybox

# cd /usr/src
# tar  -jxvf  busybox-1.16.1.tar.bz2
# cd  busybox-1.16.1

# make menuconfig

說明:
1、此處需要選擇 Busybox Settings --> Build Options -->  Build BusyBox as a static binary (no shared libs),這樣可以把Busybox編譯成一個不使用共享庫的靜態二進制文件,從而避免了對宿主機的共享庫產生依賴;但你也可以不選擇此項,而完成編譯後把其依賴的共享庫復制至目標系統上的/lib目錄中即可;這裡采用後一種辦法。
2、修改安裝位置為/mnt/root;方法為:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,修改其值為/mnt/sysroot。

# make  install

安裝後的文件均位於/mnt/sysroot目錄中;但為了創建initrd,並實現讓其啟動以後將真正的文件系統切換至目標系統分區上的rootfs,您還需要復制一份剛安裝在/mnt/sysroot下的busybox至另一個目錄,以實現與真正的根文件系統分開制作。我們這裡選擇使用/mnt/temp目錄;

# mkdir -pv /mnt/temp
# cp -r /mnt/sysroot/*  /mnt/temp

四、制作initrd

# cd  /mnt/temp

1、建立rootfs:
# mkdir -pv  proc  sys  etc/init.d  tmp  dev  mnt/sysroot

2、創建兩個必要的設備文件:
# mknod  dev/console  c  5  1
# mknod  dev/null  c  1  3

3、為initrd制作init程序,此程序的主要任務是實現rootfs的切換,因此,www.linuxidc.com可以以腳本的方式來實現它:

# rm  linuxrc
# vim  init
添加如下內容:
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
mount -t ext3 /dev/hda2  /mnt/sysroot
exec  switch_root  /mnt/sysroot  /init

給此腳本執行權限:
chmod  +x  init

4、制作initrd
# find  .  | cpio  --quiet  -H newc  -o  | gzip  -9 -n > /mnt/boot/initrd.gz

五、建立真正的根文件系統

# cd  /mnt/sysroot

1、建立rootfs:
# mkdir -pv  proc  sys  etc/init.d  tmp  dev  boot  var/log

2、創建兩個必要的設備文件:
# mknod  dev/console  c  5  1
# mknod  dev/null  c  1  3

3、建立系統初始化腳本文件

# vim  etc/init.d/rcS

添加如下內容:
 
#!/bin/sh
echo -e "            Welcome to  \033[31mToyLinux\033[0m                 "

echo -e "Mounting the filesystem .................[  \033[32mOK\033[0m  ]"
mount -a

echo -e "Creating the files of device ............[  \033[32mOK\033[0m  ]"
mdev -s

echo -e "Remounting the root filesystem ..........[  \033[32mOK\033[0m  ]"
mount  -o  remount,rw  /

echo -e "Starting the log daemon .................[  \033[32mOK\033[0m  ]"
syslogd
klogd

echo -e "Configuring loopback interface ..........[  \033[32mOK\033[0m  ]"
ifconfig  lo  127.0.0.1/24

# END

而後讓此腳本具有執行權限:
chmod +x  etc/init.d/rcS

4、配置init及其所需要inittab文件

# cd  /mnt/sysroot
# mv  linuxrc  init

# vim  etc/inittab

添加如下內容:

::sysinit:/etc/init.d/rcS
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

5、為系統准備一個“文件系統表”配置文件/etc/fstab
# vim  etc/fstab

添加如下內容:
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/hda1               /boot                   ext3    defaults        0 0
/dev/hda2               /                       ext3    defaults        1 1

6、由於在rcS文件中啟動了日志進程,因此系統在運行中會產生大量日志並將其顯示於控制台;這將會經常性的打斷正在進行的工作,為了避免這種情況,www.linuxidc.com我們這裡為日志進程建立配置文件,為其指定將日志發送至/var/log/messages文件;

# vim  etc/syslog.conf

添加如下一行:
*.info    /var/log/messages

Copyright © Linux教程網 All Rights Reserved