制作根文件系統(tǒng)需要有如下目錄:/dev、/bin、/usr、/sbin、/lib、/etc、/proc 和/sys。下面分別簡(jiǎn)單介紹各個(gè)目錄中存放的文件。
(1)/dev 目錄下存放的是設(shè)備文件,用于訪問(wèn)系統(tǒng)資源或設(shè)備,如串口、U 盤、硬盤、系統(tǒng)內(nèi)存等。在 Linux 中所有的設(shè)備都被抽象成了文件,用戶訪問(wèn)設(shè)備就像訪問(wèn)普通文件一樣。在/dev 目錄下,每個(gè)文件可用 mknod 建立。/dev 目錄下主要的設(shè)備文件包括以下幾個(gè)。
(2)/bin、/usr/bin、/usr/sbin、/sbin 存放的是二進(jìn)制可執(zhí)行文件,這部分內(nèi)容通常通過(guò)編譯 busybox 獲得。
(3)/lib 用于存放動(dòng)態(tài)鏈接庫(kù)。
(4)/etc 是用來(lái)存放初始化腳本和其他配置文件的。啟動(dòng)腳本位于/etc/rc.d/init.d 中,系統(tǒng)最先運(yùn)行的服務(wù)是那些放在/etc/rc.d 目錄下的文件,運(yùn)行級(jí)別在文件/etc/inittab 中指定。
(5)/proc 是用來(lái)掛載存放系統(tǒng)信息虛擬文件的系統(tǒng),不保存在系統(tǒng)硬盤中,是內(nèi)存映射。它包含一些和系統(tǒng)相關(guān)的信息,如 CPU 的信息。
(6)/sys 該目錄下安裝了 2.6 內(nèi)核中新出現(xiàn)的 sysfs 文件系統(tǒng),sysfs 集成了 3 種文件系統(tǒng)的信息:針對(duì)進(jìn)程信息的 proc 文件系統(tǒng)、針對(duì)設(shè)備的 devfs 文件系統(tǒng)及針對(duì)偽終端的devpts 文件系統(tǒng)。sysfs 是內(nèi)核設(shè)備樹的一個(gè)直觀反映。當(dāng)一個(gè)內(nèi)核對(duì)象被創(chuàng)建時(shí),會(huì)在內(nèi)核對(duì)象子系統(tǒng)中創(chuàng)建對(duì)應(yīng)的文件和目錄。
下面將詳細(xì)介紹 Ramdisk 的制作過(guò)程。
1.建立根文件目錄
前面提到過(guò)根文件目錄主要包括/dev、/bin、/usr、/sbin、/lib、/etc、/proc、/sys、/var
和/tmp。下面給出建立根文件目錄的命令:
#cd /usr/local
#mkdir rootfs
#cd rootfs
#mkdir bin dev etc lib proc sbin tmp usr var sys
#chmod 777 tmp
#mkdir usr/bin usr/lib usr/sbin
#mkdir var/lib var/lock var/log var/run var/tmp
#chmod 777 var/tmp
2.編譯Busybox
編譯 Busybox 可以得到絕大多數(shù)目錄和工具,可以簡(jiǎn)化設(shè)計(jì)和開發(fā)時(shí)間。在下載和使 用 busybox 時(shí),注意要使用穩(wěn)定版本(stable)。例如,Busybox 1.21.1 是穩(wěn)定版本,而 Busybox 1.21.0 是非穩(wěn)定版本,建議讀者在初學(xué)時(shí)使用穩(wěn)定版本。編譯 Busybox 前必須對(duì)需要的工具進(jìn)行配置,通過(guò)圖形界面選擇工具,選擇的原則是 盡量選擇必要的工具。下面是解壓和進(jìn)入配置界面命令:
#tar jxvf busybox-1.21.1.tar.bz2
#cd busybox-1.21.1
#make menuconfig
(1)進(jìn)入配置界面后,依次選擇 Busybox Settings-->Build Options--->,在該窗口中設(shè)置將 Busybox 編譯成靜態(tài)庫(kù),選擇交叉編譯器,
(2)配置安裝選項(xiàng),依次選擇 Busybox Settings-->Installation Options--->,進(jìn)入 Installation Options 窗口后設(shè)置 busybox 的安裝目錄為/usr/local/rootfs,即前面創(chuàng)建的根文件 目錄,
(3)配置關(guān)于檔案工具選項(xiàng)(Archival Utilities),該窗口中有常用的壓縮(bzip2)、 解壓(bunzip2)和安裝軟件包工具(rpm)等??梢赃x擇常用的工具,也可以按照默認(rèn)的 選擇進(jìn)行配置,
(4)配置核心工具選項(xiàng)(Coreutils),該窗口中包括打印日歷(cal)、修改權(quán)限(chmod)、 復(fù)制(cp)、移動(dòng)文件(mv)等,可以選擇常用的工具,也可以按照默認(rèn)的選擇進(jìn)行配置,
(5)配置控制臺(tái)工具(Console Utilities),該窗口中的工具在實(shí)際中用的比較少,常用的有清除控制臺(tái)(clear)、重置(reset)控制臺(tái)等,可以根據(jù)需要選擇
(6)Debian Utilities 和 Mail Utilities,這兩項(xiàng)工具在嵌入式系統(tǒng)中基本沒(méi)有用到,可以不用配置這兩個(gè)選項(xiàng)。
(7)配置 Editors 時(shí),可以只選 VI 和 diff 工具。
(8)必須配置初始化工具(Init Utilities),并且在該窗口中一定要選擇 Support reading an inittab file,支持 init 讀取/etc/inittab 配置文件,
(9)必須配置網(wǎng)絡(luò)工具(Networking Utilities),要與開發(fā)板進(jìn)行通信,或者上傳文件 到開發(fā)板上時(shí),需要通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸。因此,需要設(shè)置 IP 工具(ifconfig)、文件傳輸 工具(FTP)等,可以不用支持 IPv6、ARP 等工具
(10)必須配置 Shell 工具,選擇命令 Shell 進(jìn)入 Shell 窗口,選擇 ash,
(11)保存配置,選擇 Save Configuration to an Alternate File,退出配置窗口后執(zhí)行下 面的命令進(jìn)行編譯安裝busybox 到/usr/local/rootfs 目錄下
#make install
3.將交叉編譯器庫(kù)復(fù)制到 rootfs/lib下
(1)將交叉編譯器目錄下庫(kù)文件復(fù)制到 rootfs/lib 中時(shí),注意查看所復(fù)制的目錄下是否 有 libm、libpthread 等常用庫(kù)。進(jìn)入/usr/local/arm/4.4.3/arm-none-linux-gnueabi/libc/lib 下, 查看目錄下的庫(kù)文件,是否存在需要的庫(kù)文件。
#cd /usr/local/arm/4.4.3/arm-none-linux-gnueabi/libc/lib
#ls
ld-2.9.so libmudflap.a libresolv-2.9.so
ld-linux.so.3 libmudflap.la libresolv.so.2
libanl-2.9.so libmudflap.so librt-2.9.so
libanl.so.1 libmudflap.so.0 librt.so.1
libBrokenLocale-2.9.so libmudflap.so.0.0.0 libSegFault.so
libBrokenLocale.so.1 libmudflapth.a libssp.a
libc-2.9.so libmudflapth.la libssp.la
libcrypt-2.9.so libmudflapth.so libssp_nonshared.a
libcrypt.so.1 libmudflapth.so.0 libssp_nonshared.la
libc.so.6 libmudflapth.so.0.0.0 libssp.so
libdl-2.9.so libnsl-2.9.so libssp.so.0
libdl.so.2 libnsl.so.1 libssp.so.0.0.0
libgcc_s.so libnss_compat-2.9.so libstdc++.a
libgcc_s.so.1 libnss_compat.so.2 libstdc++.la
libgomp.a libnss_dns-2.9.so libstdc++_pic.a
libgomp.la libnss_dns.so.2 libstdc++.so
libgomp.so libnss_files-2.9.so libstdc++.so.6
libgomp.so.1 libnss_files.so.2 libstdc++.so.6.0.13
libgomp.so.1.0.0 libnss_hesiod-2.9.so libsupc++.a
libgomp.spec libnss_hesiod.so.2 libsupc++.la
libiberty.a libnss_nis-2.9.so libthread_db-1.0.so
libid3tag.so libnss_nisplus-2.9.so libthread_db.so.1
libid3tag.so.0 libnss_nisplus.so.2 libts-0.0.so.0
libid3tag.so.0.3.0 libnss_nis.so.2 libts-0.0.so.0.1.1
libjpeg.so libpcprofile.so libts.so
libjpeg.so.62 libpng12.so libutil-2.9.so
libjpeg.so.62.0.0 libpng12.so.0 libutil.so.1
libm-2.9.so libpng12.so.0.35.0 libuuid.so
libmad.so libpng.so libuuid.so.1
libmad.so.0 libpng.so.3 libuuid.so.1.2
libmad.so.0.2.1 libpng.so.3.35.0 libz.a
libmemusage.so libpthread-2.9.so
libm.so.6 libpthread.so.0
(2)執(zhí)行庫(kù)文件的復(fù)制過(guò)程。復(fù)制完成后進(jìn)入/usr/local/rootfs/lib 查看是否復(fù)制了需要的庫(kù)文件。
#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib
#for file in libc libcrypt libdl libm libpthread libresolv libutil
>do
>cp $file-*.so /usr/local/rootfs/lib
>cp -d $file.so.[*0-9] /usr/local/rootfs/lib
>done
#cp -d ld*.so* /usr/local/rootfs/lib
#cd /usr/local/rootfs/lib
#ls
ld-2.9.so libcrypt.so.1 libm-2.9.so libresolv-2.9.so
ld-linux.so.3 libc.so.6 libm.so.6 libresolv.so.2
libc-2.9.so libdl-2.9.so libpthread-2.9.so libutil-2.9.so
libcrypt-2.9.so libdl.so.2 libpthread.so.0 libutil.so.1
4.建立所需設(shè)備文件
需要的設(shè)備文件結(jié)點(diǎn)包括控制臺(tái) console、內(nèi)存 mem 等。建立各個(gè)設(shè)備結(jié)點(diǎn)的參數(shù)包括設(shè)備類型、主設(shè)備號(hào)和次設(shè)備號(hào)。建立結(jié)點(diǎn)命令如下:
# cd /usr/local/rootfs/dev
# mknod console c 5 1
# mknod full c 1 7
# mknod kmem c 1 2
# mknod mem c 1 1
# mknod null c 1 3
# mknod port c 1 4
# mknod random c 1 8
# mknod urandom c 1 9
# mknod zero c 1 5
# for i in `seq 0 7`; do mknod loop$i b 7 $i; done
# for i in `seq 0 9`; do mknod ram$i b 1 $i; done
# ln -s ram1 ram
# mknod tty c 5 0
# for i in `seq 0 9`; do mknod tty$i c 4 $i; done
# for i in `seq 0 9`; do mknod vcs$i b 7 $i; done
# ln -s vcs0 vcs
# for i in `seq 0 9`; do mknod vcsa$i b 7 $i; done
# ln -s vcsa0 vcsa
注意:符號(hào)` `并非鍵盤上的單引號(hào),而是鍵盤左上方的波浪號(hào)對(duì)應(yīng)的鍵。建立完成后可以查看在/usr/local/rootfs/dev 目錄下建立的設(shè)備結(jié)點(diǎn)有:
console loop3 null ram3 ram9 tty3 tty9 vcs3 vcs9 vcsa4 zero
full loop4 port ram4 random tty4 urandom vcs4 vcsa vcsa5
kmem loop5 ram ram5 tty tty5 vcs vcs5 vcsa0 vcsa6
loop0 loop6 ram0 ram6 tty0 tty6 vcs0 vcs6 vcsa1 vcsa7
loop1 loop7 ram1 ram7 tty1 tty7 vcs1 vcs7 vcsa2 vcsa8
loop2 mem ram2 ram8 tty2 tty8 vcs2 vcs8 vcsa3 vcsa9
5.建立文件系統(tǒng)映像文件
準(zhǔn)備目標(biāo)系統(tǒng)啟動(dòng)所需要的文件 rcS、inittab 和 fstab。這 3 個(gè)文件是制作文件系統(tǒng)最
重要的文件。下面給出各個(gè)文件的內(nèi)容。
(1)/etc/init.d/rcS:掛載/etc/fstab 指定的文件系統(tǒng)。
#! /bin/sh
/bin/mount –a
(2)/etc/inittab:init 進(jìn)程的配置文件。
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/bash
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount –a –r
(3)/etc/fstab:指定需要掛載的文件系統(tǒng)。
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
6.建立文件系統(tǒng)映像文件
建立根文件系統(tǒng)掛載點(diǎn):
# mkdir /mnt/ramdisk
建立大小為 8192 的根文件系統(tǒng):
# mke2fs -vm0 /dev/ram 8192
細(xì)節(jié)中打印的細(xì)節(jié)信息中包括塊的個(gè)數(shù)、塊的大小、結(jié)點(diǎn)個(gè)數(shù)等信息。
mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 2048 inodes, 2048 blocks 0 blocks (0.00%) reserved for the super user First data block=0 1 block group 32768 blocks per group, 32768 fragments per group 2048 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 30 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
掛載根文件系統(tǒng):
# mount -t ext2 /dev/ram /mnt/ramdisk
對(duì)文件系統(tǒng)進(jìn)行操作,將制作的文件系統(tǒng)復(fù)制到掛載點(diǎn):
# cp -af /usr/local/rootfs/* /mnt/ramdisk
退出/mnt/ramdisk 目錄才能進(jìn)行卸載:
# cd /
卸載文件:
# umount /mnt/ramdisk
文件系統(tǒng)生成:
# dd if=/dev/ram of=ramdisk bs=1k count=8192
制作文件系統(tǒng)映像:
# gzip -v9 ramdisk
生成的映像文件為 ramdisk,壓縮后為 ramdisk.gz。
7.內(nèi)核中支持RAM文件系統(tǒng)的初始化
在編譯內(nèi)核時(shí),在 General setup 窗口中選擇[*] Initial RAM filesystem and RAM disk
(initramfs/initrd) support ,同時(shí)在 Initramfs source 中傳遞初始化參數(shù):
initrd=0x21100000,8000000 root=/dev/ram rw init=linuxrc console=ttyS0, 115200, mem=32M
本文摘自《linux系統(tǒng)移植(第2版)》,文章僅供于學(xué)習(xí)交流。