1.開始的話
友善之臂沒有給出詳細的mini6410和tiny6410開發板的根檔案系統的製作方法及步驟,於是自己根據《mini2440 Linux移植開發實戰指南》做了一遍MINI6410的根檔案系統。本次製作過程中使用的工具及源碼包均來自於友善的官方光碟片,其中有:
(1)核心:linux2.6.38-20111116.tgz
(2)根檔案系統:rootfs_qtopia_qt4-20111103.tgz
(3)busybox:busybox-1.17.2-20101120.tgz
(4)交叉編譯器:arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz
(5)檔案系統鏡像製作工具:mktools-20110720.tar.gz
2.搭建開發環境
開發環境(主要指linux、虛擬機器的安裝和交叉編譯環境的搭建)完全按照mini6410使用者手冊4.3節操作,在此不再贅述。
3.根檔案系統的目錄說明
根檔案系統是Linux啟動的時候使用的第一個檔案系統,沒有它系統將無法正常的啟動,然而在這個根檔案系統中又包含了一系列的目錄,接下來對這些目錄做一個簡單的介紹。
4.建立根檔案系統的目錄
進入到自己要放置檔案系統的目錄,採用《mini2440 Linux移植開發實戰指南》,新根檔案系統目錄的指令檔create_rootfs_bash,使用命令chmod +x create_rootfs_bash ,改變檔案的可執行許可權,執行“./create_rootfs_bash ”運行指令碼,就完成了根檔案系統目錄的建立。指令碼create_rootfs_bash檔案的內容為:
#!/bin/shecho "------Create rootfs directons start...--------"mkdir rootfscd rootfsecho "--------Create root,dev....----------"mkdir root dev etc boot tmp var sys proc lib usr mnt homemkdir etc/init.d etc/rc.d etc/sysconfigmkdir usr/sbin usr/bin usr/lib usr/modulesecho "make node in dev/console dev/null"mknod -m 600 dev/console c 5 1mknod -m 600 dev/null c 1 3mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/tempmkdir var/lib var/lock var/run var/tmpchmod 1777 tmpchmod 1777 var/tmpecho "-------make direction done---------"
在指令碼中改變了tmp 目錄的使用權,讓它開啟sticky 位,為tmp 目錄的使用權開啟此位,可確保tmp 目錄底下建立的檔案,只有建立它的使用者有權刪除。儘管嵌入式系統多半是單使用者,不過有些嵌入式應用不一定用root 的許可權來執行,因此需要遵照根檔案系統許可權位的基本規定來設計。
5.建立動態連結程式庫(即lib目錄)
動態連結程式庫直接用友善之臂的,先解壓友善之臂的根檔案包,拷貝lib的內容到建立的根檔案目錄lib內。
cp -rfd /opt/FriendlyARM/mini6410/rootfs_qtopia_qt4 /opt/FriendlyARM/mini6410/rootfs/lib
6.交叉編譯busybox(即根檔案系統內bin,sbin等目錄)
Busybox 是一個遵循GPL v2 協議的開源項目,它在編寫過程總對檔案大小進行最佳化,並考慮了系統資源有限(比如記憶體等)的情況,使用Busybox 可以自動產生根檔案系統所需的bin、sbin、usr 目錄和linuxrc 檔案。具體介紹可以參考韋東山完全手冊的346頁。
(1)、解壓busybox
cd /opt/FriendlyARM
tar –zxvf busybox-1.17.2-20101120.tgz
(2)、進入源碼,修改Makefile 檔案:(這個地方是很重要的一步,必須做,有的教程或者文章參考核心的配置與編譯,即在make menuconfig和make後面添加ARCH、CROSS_COMPILE等,而對此不做修改,將可能會導致“request_module: runaway loop modprobe binfmt-464c”等錯誤出現)
cd /opt/studyarm/busybox-1.17.2
修改:
CROSS_COMPILE ?=arm-linux- //第164 行
ARCH ?=arm //第189 行
(3)、配置busybox
提示:友善之臂已經在光碟片中提供了busybox 的原始碼包,在光碟片\linux 目錄中,busybox-1.17.2-20101120.tgz解壓后里麵包含了友善之臂提供的預設設定檔:fa_config (輸入命令“cp fa.config .config”可以調用該配置),一般使用者直接使用預設檔案就可以了,這樣產生的busybox 和root_qtopia_qt4 中的是完全一致的。但為了對它的配置瞭解 更多一些,可以參考 《mini2440 Linux移植開發實戰指南》 的如下步驟:
輸入 make menuconfig進行配置
下面的配置和busybox1.17.2的配置基本一樣,部分地方不太一樣。
Busybox Settings---> General Configuration---> [*] Show verbose applet usage messages //這個是現實程式的詳細資料吧 [*] Store applet usage messages in compressed form [*] Support –install [-s] to install applet links at runtime [*] Enable locale support(system needs locale for this to work) [*] Support for –long-options [*] Use the devpts filesystem for unix98 PTYs [*] Support writing pidfiles [*] Runtime SUID/SGID configuration via /etc/busybox.config [*] Suppress warning message if /etc/busybox.conf is not readable//這個配置是如果/etc/busybox.conf is是不可讀的話則會給使用者提示警告資訊Build Options--->//我主要關注這個就是編譯選項 [*] Build BusyBox as a static binary(no shared libs) //靜態連結,如果你要使用靜態連結庫的話那麼這個選項一定要選上了 一定<這裡的話隨意反正我用動態庫> [*] Build with Large File Support(for accessing files>2GB)Installation Options->//安裝配置 [*]Don’t use /usr //選上它防止把編譯進系統中的/usr下以便破壞宿主系統 Applets links (as soft-links) ---> //安裝配置 使用軟連結 (./_install) BusyBox installation prefixBusybox Library Tuning ---> //調用那些庫呢?這個真不知道怎麼解釋。。。 (6)Minimum password legth (2)MD5:Trade Bytes for Speed [*]Fsater /proc scanning code(+100bytes) [*]Command line editing (1024)Maximum length of input [*] vi-style line editing commands (15) History size [*] History saving [*] Tab completion [*]Fancy shell prompts (4) Copy buffer size ,in kilobytes [*]Use ioctl names rather than hex values in error messages[*]Support infiniband HW
Linux Module Utilities---> //這個就是lib/modules的設定 (/lib/modules)Default directory containing modules //預設核心模組安裝到該目錄下 (modules.dep)Default name of modules.dep[*] insmod //這些都是支援的命令[*] rmmod[*] lsmod[*] modprobe-----options common to multiple modutils [ ] support version 2.2/2.4 Linux kernels[*]Support tainted module checking with new kernels[*]Support for module .aliases file[*] support for modules.symbols file
7.dev裝置檔案的製作
裝置檔案較多,而且比較繁雜,因此其製作一般包括兩個部分:靜態建立裝置檔案和使用mdev建立裝置檔案
(1).靜態建立裝置檔案
其實在剛開始製作檔案系統的目錄裡已經靜態製作建立了兩個必須的裝置的裝置檔案:console和null,核心在引導時這兩個裝置節點必須存在。
mknod -m 600 dev/console c 5 1mknod -m 600 dev/null c 1 3
(2).用mdev建立裝置檔案
udev:它是個使用者程式,能根據系統中硬體裝置的狀態動態更新裝置檔案,包括裝置檔案的建立、刪除等。它的操作相對複雜,但靈活性很高。
mdev是busybox內建的一個簡化版的udev,適合於嵌入式的應用埸合。其具有使用簡單的特點。它的作用,就是在系統啟動和熱插拔或動態載入驅動程式時,自動產生驅動 程式所需的節點檔案。在以busybox為基礎構建嵌入式linux的根檔案系統時,使用它是最優的選擇。在busybox的配置中,下面的選項將增加對mdev的支援。
Linux System Utilities ---> [*]Support /etc/mdev.conf [*]Support command execution at device addition/removal
8.編譯、安裝busybox
在6,7兩步的配置結束後,就可以編譯並安裝busybox。
編譯:make ARCH=arm CROSS_COMPILE=arm-linux,其實僅執行make即可,我在這裡添加了ARCH和CROSS_COMPILE,其實沒什麼作用,只是為了保險。因為如果編譯的不是ARM版的busybox,系統時無法啟動並執行。
安裝:make install CONFIG_PREFIX=/opt/FriendlyARM/mini6410/rootfs/。CONFIG_PREFIX中安裝的位置也可以在配置的時候設定,具體位置為:
Busybox Settings-> Installation Options-> (/***/***)Busybox Installation Prefix
9.編譯、安裝核心模組。
在第5步中,安裝動態連結程式庫後,lib/modules目錄下已經有核心模組了,但是這個核心模組和我採用的核心不是一個版本,因此重新編譯安裝。
進入核心的目錄,在編譯安裝核心模組之前必須保證核心已經正確無誤的配置及編譯過一次。在這裡假設還沒有編譯過。
(1)我們要使得Linux-2.6.38的預設目標平台成為ARM 的平台。
修改總目錄下的Makefile
原
export KBUILD_BUILDHOST := $(SUBARCH)ARCH ?= $(SUBARCH)CROSS_COMPILE ?=
改為
export KBUILD_BUILDHOST := $(SUBARCH)ARCH ?= armCROSS_COMPILE ?= arm-linux-
其中,ARCH 是指定目標平台為arm,CROSS_COMPILE 是指定交叉編譯器,這裡指定的是系統預設的交叉編譯器,如要使用其它的,則要把編譯器的全路徑在這裡寫出。
(2)配置、編譯核心模組
在此不具體說明怎麼配置,可以將核心裡友善內建的設定檔拷貝。然後執行:
make menuconfigmake zImage
(3)編譯核心模組
make modules ARCH=arm CROSS_COMPILE=arm-linux-
(4)安裝核心模組
make modules_install ARCH=arm INSTALL_MOD_PATH=/opt/FriendlyARM/mini6410/rootfs
10.建立etc目錄下的設定檔<這些配置資訊都是一些基本不需要改動的東西所以直接從主機或者友善內建檔案系統拷貝>
a、建立etc/mdev.conf檔案,內容為空白。
b、拷貝主機etc目錄下的passwd、group、shadow檔案到rootfs/etc目錄下。
c、etc/sysconfig目錄下建立檔案HOSTNAME,內容寫自己喜歡的名字。
d、etc/inittab檔案:
#etc/inittab::sysinit:/etc/init.d/rcS::askfirst:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a –r
e、etc/init.d/rcS檔案:
#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask 022export PATH runlevel prevlevelecho "----------munt all----------------"mount -aecho /sbin/mdev>/proc/sys/kernel/hotplugmdev -secho "***********************************************echo "****************Studying ARM*********************"echo "Kernel version:linux-2.6.38"echo "Student"echo "Date:2012.05.08"echo "***********************************************"/bin/hostname -F /etc/sysconfig/HOSTNAME
使用以下命令改變rcS的執行許可權:
Chmod +x rcS
f、etc/fstab檔案:
#device mount-point type option dump fsck orderproc /proc proc defaults 0 0none /tmp ramfs defaults 0 0sysfs /sys sysfs defaults 0 0mdev /dev ramfs defaults 0 0
g、 etc/profile檔案:
#Ash profile#vim:syntax=sh#No core file by defaults#ulimit -S -c 0>/dev/null 2>&1USER="id -un"LOGNAME=$USERPS1='[\u@\h=W]#'PATH=$PATHHOSTNAME='/bin/hostname'export USER LOGNAME PS1 PATH
到此,根檔案系統的構建就完成了,下面將其製作成ubi鏡像檔案並燒寫。
11.製作根檔案系統鏡像
執行以下命令:
tar zxvf mktools-20110720.tar.gz -C /
注意:C為大寫,C後面有個空格,C是改變解壓安裝目錄的意思。
這將會在/usr/sbin目錄下建立產生相應的工具集
然後執行
mkubimage-slc rootfs rootfs.ubi
將ubi鏡像檔案燒寫至開發板運行即可。