cramfs根檔案系統製作啟動總結
cramfs啟動根檔案系統
Cramfs:Compressed ROM File System
Cramfs是Linux的創始人 Linus Torvalds參與開發的一種只讀的壓縮檔案系統。它也基於MTD驅動程式。
cramfs擁有以下一些特性:
採用實時解壓縮方式,但解壓縮的時侯有延遲。
cramfs的資料都是經過處理、打包的,對其進先寫操作有一定困難。所以cramfs不支援寫操作,這個特性剛好適合嵌入式應用中使用Flash儲存檔案系統的場合。
在cramfs中,檔案最大不能超過16MB。
支援組標識(gid),但是mkcramfs只將gid的低8位儲存下來,因此只有這8位是有效的。
支援硬連結。但是cramfs並沒有完全處理好,硬連結的檔案屬性中,連結數仍然為1. cramfs的目錄中,沒有“.”和“..”這兩項。因此,cramfs中的目錄的連結數通常也僅有一個。
cramfs中,不會儲存檔案的時間戳(timestamps)資訊。當然,正在使用的檔案由於inode儲存在記憶體中,因此其時間可以暫時地變更為最新時間,但是不會儲存到cramfs檔案系統中去。
1、檔案系統的製作<各種檔案系統通用做法>
a)下載busybox 原始碼
[email protected]:/home/Tools#ls
arm-2009q3.tar.bz2 busybox-1.14.4.tar.bz2 genext2fs-1.4.1
[email protected]:/home/Tools#
b)最基本的根檔案系統目錄說明
嵌入式 Linux 中都需要構建根檔案系統,構建根檔案系統的規則在FHS(FilesystemHierarchy Standard)文件中,下面是根檔案系統頂層目錄。
目錄 內容
bin 存放所有使用者都可以使用的、基本的命令。
sbin 存放的是基本的系統命令,它們用於啟動系統、修復系統等。
usr 使用者檔案資訊。
proc 這是個空目錄,常作為proc 檔案系統的掛載點(核心與使用者的介面)。
dev 該目錄存放裝置檔案和其它特殊檔案。
etc 存放系統配置檔案,包括啟動檔案。
lib 存放共享庫
mnt 用於臨時掛接某個檔案系統的掛接點,通常是空目錄。也可以在裡面創 建空的子目錄。
sys 也是對應的一種檔案系統、匯流排、裝置、驅動模型。
tmp 存放臨時檔案,通常是空目錄。
var 存放可變的資料,如日誌等。
c)使用指令碼建立上面目錄
[email protected]:/home/ # vi creat_rootfs
#! /bin/sh
echo "creatintrootfs dir......"
mkdir /usr/local/rootfs
cd rootfs
echo "makingdir : bin dev etc lib proc sbin sys usr"
mkdir bin dev etc libproc sbin sys usr #
mkdir usr/bin usr/libusr/sbin lib/modules
# Don't use mknod,unless you run this Script as root !
mknod -m 600dev/console c 5 1
mknod -m 666 dev/null c1 3
echo "makingdir : mnt tmp var"
mkdir mnt tmp var
chmod 1777 tmp
mkdir mnt/etc mnt/jffs2mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lockvar/log var/run var/tmp
chmod 1777 var/tmp
儲存退出並修改許可權
[email protected]:/home/#chmod 777 creat_rootfs
[email protected]:/home# ./creat_rootfs
creatint rootfsdir......
making dir : bindev etc lib proc sbin sys usr
making dir : mnttmp var
[email protected]:/home#
d)配置、編譯、安裝busybox
[email protected]:/home/Tools#tar zxvfbusybox-1.14.4.tar.bz2
[email protected]:/home/Tools#cd busybox-1.14.4
[email protected]:/home/Tools/busybox-1.14.4#vim Makefile
第164行
CROSS_COMPILE ?= arm-none-Linux-gnueabi-
第190行
ARCH ?= arm
儲存退出、在原有的基礎上進行配置、列出注意的地方尚未說明的使用預設配置
[email protected]:/home/Tools/busybox-1.14.4#make menuconfig
││ BusyboxSettings --->
││ BuildOptions --->
│ │[ ] Build BusyBox as a static binary (no sharedlibs) //這裡使用動態庫
│ │[ ] Force NOMMUbuild
│ │[*] Buildwith Large File Support (for accessing files > 2GB)
│ │(arm-linux-) Cross Compiler prefix //交叉工具編譯鏈 按空格可以進行修改
│ │() Additional CFLAGS
││ Installation Options --->
│ │[*] Don'tuse/usr
│ │ Applets links (as soft-links) --->
│ │(/home/eilian/development/rootfs) BusyBox installation prefix //指定busybox的安裝路徑
││ Busybox Library Tuning --->
│ │(6) Minimum passwordlength
│ │(2) MD5: Trade Bytes forSpeed
│ │[*] Faster /proc scanning code (+100bytes)
│ │[*] Support for/etc/networks
│ │[*] Command lineediting
│ │(1024) Maximum length ofinput
│ │[*] vi-style lineeditingcommands │ │(15) Historysize │ │[*] Historysaving
│ │[*] Tab completion │ │[*] Usernamecompletion │ │[*] Fancy shellprompts
│ │[ ] Give more precise messages when copy fails (cp, mvetc)
│ │(4) Copy buffer size, in kilobytes
│ │[ ] Use clock_gettime(CLOCK_MONOTONIC)syscall
│ │[*] Use ioctl names rather than hex values in errormessages
│ │[*] Support infinibandHW
││ Linux Module Utilities --->
│ │[*]Simplifiedmodutils
│ │[*] Accept module options on modprobe commandline
│ │[*] Skip loading of already loadedmodules
│ │--- Options common to multiplemodutils
│ │(/lib/modules) Default directory containingmodules
│ │(modules.dep) Default name ofmodules.dep
││ Linux System Utilities ---> │ │[*] Support/etc/mdev.conf
│ │[*] Support command execution at deviceaddition/removal
││ Init Utilities --->
││[*] Support reading an inittab file
注意:
“Support reading an inittab file”應該選中,這樣可以根據自己編寫的inittab檔案初始化;
“Support running commands with a controlling-tty”應該選中,否則會提示非常困擾的“/bin/sh: can't access tty; job control turned off”的提示,儘管可以進入控制檯命令列。
上述配置完成後基本可以,配置完後儲存退出
----編譯busybox
[email protected]:/home/Tools/busybox-1.14.4#make
[email protected]:/home/Tools/busybox-1.14.4#make install
編譯安裝完成後在rootfs 目錄下會生成目錄bin、sbin、usr 和檔案linuxrc 的內容
-----檢視所需要的庫(因為選擇了動態庫)
[email protected]:/home/Tools/busybox-1.14.4# arm-linux-r
arm-linux-ranlib arm-linux-readelf
[email protected]:/home/Tools/busybox-1.14.4# arm-linux-readelf-d busybox
Dynamic section at offset 0xce00c contains 25 entries:
Tag Type Name/Value
0x00000001(NEEDED) Sharedlibrary: [libm.so.6]
0x00000001(NEEDED) Sharedlibrary: [libc.so.6]
0x0000000c(INIT) 0xc38c
0x0000000d(FINI) 0xb2c8c
0x00000019(INIT_ARRAY) 0xde000
0x0000001b(INIT_ARRAYSZ) 4 (bytes)
0x0000001a(FINI_ARRAY) 0xde004
0x0000001c(FINI_ARRAYSZ) 4 (bytes)
0x00000004(HASH) 0x8128
0x00000005(STRTAB) 0xa590
0x00000006(SYMTAB) 0x8bc0
0x0000000a(STRSZ) 3514 (bytes)
0x0000000b(SYMENT) 16 (bytes)
0x00000015(DEBUG) 0x0
0x00000003(PLTGOT) 0xde0fc
0x00000002(PLTRELSZ) 3160 (bytes)
0x00000014(PLTREL) REL
0x00000017(JMPREL) 0xb734
0x00000011(REL) 0xb6c4
0x00000012(RELSZ) 112 (bytes)
0x00000013(RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0xb684
0x6fffffff(VERNEEDNUM) 2
0x6ffffff0(VERSYM) 0xb34a
0x00000000(NULL) 0x0
[email protected]:/home/Tools/busybox-1.14.4#
拷貝庫檔案 直接拷貝交叉編譯器中的lib庫就OK
[email protected]:/usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib# ls
1. ld-2.10.1.so libgcc_s.so.1 libnss_nisplus-2.10.1.so
2. ld-linux.so.3 libm-2.10.1.so libnss_nisplus.so.2
3. libanl-2.10.1.so libmemusage.so libnss_nis.so.2
4. libanl.so.1 libm.so.6 libpcprofile.so
5. libBrokenLocale-2.10.1.so libnsl-2.10.1.so libpthread-2.10.1.so
6. libBrokenLocale.so.1 libnsl.so.1 libpthread.so.0
7. libc-2.10.1.so libnss_compat-2.10.1.so libresolv-2.10.1.so
8. libcidn-2.10.1.so libnss_compat.so.2 libresolv.so.2
9. libcidn.so.1 libnss_dns-2.10.1.so librt-2.10.1.so
10. libcrypt-2.10.1.so libnss_dns.so.2 librt.so.1
11. libcrypt.so.1 libnss_files-2.10.1.so libSegFault.so
12. libc.so.6 libnss_files.so.2 libthread_db-1.0.so
13. libdl-2.10.1.so libnss_hesiod-2.10.1.so libthread_db.so.1
14. libdl.so.2 libnss_hesiod.so.2 libutil-2.10.1.so
15. libgcc_s.so libnss_nis-2.10.1.so libutil.so.1
找到我們需要的直接拷貝到根檔案系統目錄下的lib目錄下即可(rootfs/lib),不過為了保險起見可以將上面這些庫檔案全部拷貝到rootfs/lib目錄下
cp /usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib/*/usr/local/rootfs/lib
------建立和修改一些必要的配置檔案
---------增加為shell匯入全域性變數的檔案/etc/profile
<span style="font-size:13px;">
#/etc/profile: system-wide .profile file for the Bourne shells
echo "Processing /etc/profile... "
#set search library path
echo "Set search library path in /etc/profile"
export LD_LIBRARY_PATH=/lib:/usr/lib
#set user path
echo "Set user path in /etc/profile"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
USER="id -un"
LOGNAME=$USER
PS1='\[email protected]\h#'
PATH = $PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH </span>
----------趕緊的profile中用的HOSTNAME檔案即主機名
----------在etc/目錄下面新建sysconfig目錄,在該目錄下新建HOSTNAME檔案,
<span style="font-size:13px;">
vi HOSTNAME
bootloader</span>
---------增加初始化檔案
[email protected]:/home/rootfs/etc#gedit inittab
<span style="font-size:13px;">#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
</span>
[email protected]:/home/rootfs/etc#chmod a+x inittab
--------新建etc/profile使用者環境配置檔案,
[email protected]:/home/rootfs/etc#gedit fstab
#device mount-point type option dump fsck order
proc /proc proc defaults 00
none /tmp ramfs defaults 00
sysfs /sys sysfs defaults 00
mdev /dev ramfs defaults 00
---------增加初始化指令碼
[email protected]:/home/rootfs/etc/init.d#gedit rcS
#!/bin/sh
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
echo "**************munt all************************"
mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
echo "***********************************************"
echo "**********booting for QT6410 ***************"
echo "Kernel version:linux-2.6.39"
echo "Author:eilian"
echo "Date:2011.12.13"
echo "***********************************************"
/bin/hostname -F /etc/sysconfig/HOSTNAME
[email protected]:/home/rootfs/etc/init.d#chmod a+x rcS
---------建立一個mdev.conf檔案(/rootfs/etc下),內容可有可無
[email protected]:/home/rootfs/etc#touch mdev.conf
這樣基本的檔案系統就這麼的搞定的
核心加入檔案系統的支援
││ File systems --->
││ [*] Miscellaneous filesystems --->
││ <*> Compressed ROM file system support(cramfs) #支援cramfs
<*> yaffs2 file systemsupport #支援yaffs2
│ │ -*- 512 byte / pagedevices
配置好後儲存退出
[email protected]:/home/Linux/linux-2.6.39#make uImage
[email protected]:/home/Linux/linux-2.6.39#make modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
安裝核心模組了
[email protected]:/home/Linux/linux-2.6.39#make modules_install ARCH=arm INSTALL_MOD_PATH=/home/rootfs
至此檔案系統已完善
2、將roots壓縮成cramfs
-------- 編譯cramfs製作工具
從http://sourceforge.Net/projects/cramfs/下載cramfs-1.1.tar.gz。
[email protected]loader:/home/Tools#tar zxvf cramfs-1.1.tar.gz
[email protected]:/home/Tools/cramfs-1.1#make
編譯完成之後,會生成mkcramfs和cramfsck兩個可執行檔案,其中mkcramfs工具是用來建立cramfs檔案系統的,而cramfsck工具則用來進行cramfs檔案系統的釋放以及檢查。將這兩個檔案拷貝到/usr/local/bin目錄下,方便使用.
[email protected]:/home/Tools/cramfs-1.1#cp mkcramfs cramfsck /usr/local/bin
---------mkcramfs的命令格式
mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile
mkcramfs的各個引數解釋如下:
-h: 顯示幫助資訊
-e edition:設定生成的檔案系統中的版本號
-i file: 將一個檔案映像插入這個檔案系統之中(只能在Linux2.4.0以後的核心版本中使用)
-n name: 設定cramfs檔案系統的名字
dirname: 指明需要被壓縮的整個目錄樹
outfile: 最終輸出的檔案
cramfsck的命令格式:
cramfsck [-hv] [-x dir] file
cramfsck的各個引數解釋如下:
-h: 顯示幫助資訊
-x dir: 釋放檔案到dir所指出的目錄中
-v: 輸出資訊更加詳細
file: 希望測試的目標檔案
--------壓縮rootfs根檔案系統生成cramfs
[email protected]:/home#mkcramfs ./rootfs ./cramfs
3、將cramfs燒寫到NANDFLASH中
當前,NandFlash分割槽情況如下:
-------------------------------------------------------------------------------------------------------------
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda(Samsung NAND 256MiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 256MiB 3,3V8-bit":
0x000000000000-0x000000100000 : "Bootloader"
0x000000100000-0x000000600000 : "Kernel"
0x000000600000-0x000007e00000 : "User"
0x000007e00000-0x000010000000 : "File System"
-------------------------------------------------------------------------------------------------------------
值得注意的事:修改uboot中啟動引數
setenv bootargs'root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200'
注意:啟動引數裡沒有寫上init=/linuxrc,所以啟動預設是按照busybox的配置檔案來進行的.