制作根文件系統需要有如下目錄:/dev、/bin、/usr、/sbin、/lib、/etc、/proc 和/sys。下面分別簡單介紹各個目錄中存放的文件。
(1)/dev 目錄下存放的是設備文件,用于訪問系統資源或設備,如串口、U 盤、硬盤、系統內存等。在 Linux 中所有的設備都被抽象成了文件,用戶訪問設備就像訪問普通文件一樣。在/dev 目錄下,每個文件可用 mknod 建立。/dev 目錄下主要的設備文件包括以下幾個。
(2)/bin、/usr/bin、/usr/sbin、/sbin 存放的是二進制可執行文件,這部分內容通常通過編譯 busybox 獲得。
(3)/lib 用于存放動態鏈接庫。
(4)/etc 是用來存放初始化腳本和其他配置文件的。啟動腳本位于/etc/rc.d/init.d 中,系統最先運行的服務是那些放在/etc/rc.d 目錄下的文件,運行級別在文件/etc/inittab 中指定。
(5)/proc 是用來掛載存放系統信息虛擬文件的系統,不保存在系統硬盤中,是內存映射。它包含一些和系統相關的信息,如 CPU 的信息。
(6)/sys 該目錄下安裝了 2.6 內核中新出現的 sysfs 文件系統,sysfs 集成了 3 種文件系統的信息:針對進程信息的 proc 文件系統、針對設備的 devfs 文件系統及針對偽終端的devpts 文件系統。sysfs 是內核設備樹的一個直觀反映。當一個內核對象被創建時,會在內核對象子系統中創建對應的文件和目錄。
下面將詳細介紹 Ramdisk 的制作過程。
1.建立根文件目錄
前面提到過根文件目錄主要包括/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 可以得到絕大多數目錄和工具,可以簡化設計和開發時間。在下載和使 用 busybox 時,注意要使用穩定版本(stable)。例如,Busybox 1.21.1 是穩定版本,而 Busybox 1.21.0 是非穩定版本,建議讀者在初學時使用穩定版本。編譯 Busybox 前必須對需要的工具進行配置,通過圖形界面選擇工具,選擇的原則是 盡量選擇必要的工具。下面是解壓和進入配置界面命令:
#tar jxvf busybox-1.21.1.tar.bz2
#cd busybox-1.21.1
#make menuconfig
(1)進入配置界面后,依次選擇 Busybox Settings-->Build Options--->,在該窗口中設置將 Busybox 編譯成靜態庫,選擇交叉編譯器,
(2)配置安裝選項,依次選擇 Busybox Settings-->Installation Options--->,進入 Installation Options 窗口后設置 busybox 的安裝目錄為/usr/local/rootfs,即前面創建的根文件 目錄,
(3)配置關于檔案工具選項(Archival Utilities),該窗口中有常用的壓縮(bzip2)、 解壓(bunzip2)和安裝軟件包工具(rpm)等??梢赃x擇常用的工具,也可以按照默認的 選擇進行配置,
(4)配置核心工具選項(Coreutils),該窗口中包括打印日歷(cal)、修改權限(chmod)、 復制(cp)、移動文件(mv)等,可以選擇常用的工具,也可以按照默認的選擇進行配置,
(5)配置控制臺工具(Console Utilities),該窗口中的工具在實際中用的比較少,常用的有清除控制臺(clear)、重置(reset)控制臺等,可以根據需要選擇
(6)Debian Utilities 和 Mail Utilities,這兩項工具在嵌入式系統中基本沒有用到,可以不用配置這兩個選項。
(7)配置 Editors 時,可以只選 VI 和 diff 工具。
(8)必須配置初始化工具(Init Utilities),并且在該窗口中一定要選擇 Support reading an inittab file,支持 init 讀取/etc/inittab 配置文件,
(9)必須配置網絡工具(Networking Utilities),要與開發板進行通信,或者上傳文件 到開發板上時,需要通過網絡進行傳輸。因此,需要設置 IP 工具(ifconfig)、文件傳輸 工具(FTP)等,可以不用支持 IPv6、ARP 等工具
(10)必須配置 Shell 工具,選擇命令 Shell 進入 Shell 窗口,選擇 ash,
(11)保存配置,選擇 Save Configuration to an Alternate File,退出配置窗口后執行下 面的命令進行編譯安裝busybox 到/usr/local/rootfs 目錄下
#make install
3.將交叉編譯器庫復制到 rootfs/lib下
(1)將交叉編譯器目錄下庫文件復制到 rootfs/lib 中時,注意查看所復制的目錄下是否 有 libm、libpthread 等常用庫。進入/usr/local/arm/4.4.3/arm-none-linux-gnueabi/libc/lib 下, 查看目錄下的庫文件,是否存在需要的庫文件。
#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)執行庫文件的復制過程。復制完成后進入/usr/local/rootfs/lib 查看是否復制了需要的庫文件。
#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.建立所需設備文件
需要的設備文件結點包括控制臺 console、內存 mem 等。建立各個設備結點的參數包括設備類型、主設備號和次設備號。建立結點命令如下:
# 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
注意:符號` `并非鍵盤上的單引號,而是鍵盤左上方的波浪號對應的鍵。建立完成后可以查看在/usr/local/rootfs/dev 目錄下建立的設備結點有:
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.建立文件系統映像文件
準備目標系統啟動所需要的文件 rcS、inittab 和 fstab。這 3 個文件是制作文件系統最
重要的文件。下面給出各個文件的內容。
(1)/etc/init.d/rcS:掛載/etc/fstab 指定的文件系統。
#! /bin/sh
/bin/mount –a
(2)/etc/inittab:init 進程的配置文件。
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/bash
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount –a –r
(3)/etc/fstab:指定需要掛載的文件系統。
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.建立文件系統映像文件
建立根文件系統掛載點:
# mkdir /mnt/ramdisk
建立大小為 8192 的根文件系統:
# mke2fs -vm0 /dev/ram 8192
細節中打印的細節信息中包括塊的個數、塊的大小、結點個數等信息。
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.
掛載根文件系統:
# mount -t ext2 /dev/ram /mnt/ramdisk
對文件系統進行操作,將制作的文件系統復制到掛載點:
# cp -af /usr/local/rootfs/* /mnt/ramdisk
退出/mnt/ramdisk 目錄才能進行卸載:
# cd /
卸載文件:
# umount /mnt/ramdisk
文件系統生成:
# dd if=/dev/ram of=ramdisk bs=1k count=8192
制作文件系統映像:
# gzip -v9 ramdisk
生成的映像文件為 ramdisk,壓縮后為 ramdisk.gz。
7.內核中支持RAM文件系統的初始化
在編譯內核時,在 General setup 窗口中選擇[*] Initial RAM filesystem and RAM disk
(initramfs/initrd) support ,同時在 Initramfs source 中傳遞初始化參數:
initrd=0x21100000,8000000 root=/dev/ram rw init=linuxrc console=ttyS0, 115200, mem=32M
本文摘自《linux系統移植(第2版)》,文章僅供于學習交流。