歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 一步步手動構建小於10M的類嵌入式Linux系統

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

日期:2017/2/28 15:59:25   编辑: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