閱讀570 返回首頁    go 阿裏雲 go 技術社區[雲棲]


TI Davinci DM6446開發攻略——根文件係統的裁剪和移植

一、補充文件係統知識
Linux根文件係統是存放tool軟件、lib文件、script(腳本)、配置文件、其他特殊文件、自己開發的應用程序的地方。嵌入式linux的根文件係統rootfs就像windows操作係統的C、D盤這種概念機製,FLASH對應硬盤。但linux是掛載點的概念,根文件係統是一個整體,組織到一個樹狀的目錄結構中。這種文件組織遵守文件係統科學分類標準FHS,一種國際標準。運行、維護係統所必須的各種
在開發、測試階段,基本上都是使用NFS(網絡文件係統),NFS文件係統是在你的開發主機HOST裏,不是在你的板子裏。製作嵌入式產品根文件係統,就是要把NFS指向的文件係統文件夾裏所有的內容,通過其他少數幾種的Linux文件係統打包生產一個2進製鏡像文件,然後以某種方式燒寫到FLASH芯片內。開發階段,特別是應用程序開發、動態加載的驅動模塊開發,使用NFS,可以省去麻煩的根文件係統鏡像文件的下載和燒寫過程,便可以在自己板子上運行這些開發的程序和模塊。
 
Linux支持超過50種文件係統,但是隻有少數幾種在嵌入式OS中常用,見下圖。linux嵌入式產品的根文件係統是需要燒寫到Flash芯片裏。
 

Cramfs文件係統:(Compressed ROM File System)是個簡單,壓縮的,隻讀的文件係統。除了可以用於MTD下隻讀並且極少更新img的NOR/NAND,IDE的CF,FTL/NFTL的NOR/NAND,可作為RAM disk的IMG存儲。由於簡單,Cramfs有一些限製,例如最大支持16M(?256M),沒有當前(.)和父(..)目錄,頁大小固定為4096,gid(8位)最大為255,所有的鏈接文件計數都是1等等。在cramfs文件係統中,每一頁(4KB)被單獨壓縮,可以隨機頁訪問,其壓縮比高達2:1,為嵌入式係統節省大量的Flash存儲空間,使係統可通過更低容量的FLASH存儲相同的文件,從而降低係統成本。Cramfs文件係統以壓縮方式存儲,在運行時解壓縮,所以不支持應用程序以XIP方式運行,所有的應用程序要求被拷到RAM裏去運行,但這並不代表比Ramfs需求的RAM空間要大一點,因為Cramfs是采用分頁壓縮的方式存放檔案,在讀取檔案時,不會一下子就耗用過多的內存空間,隻針對目前實際讀取的部分分配內存,尚沒有讀取的部分不分配內存空間,當我們讀取的檔案不在內存時,Cramfs文件係統自動計算壓縮後的資料所存的位置,再即時解壓縮到RAM中。另外,它的速度快,效率高,其隻讀的特點有利於保護文件係統免受破壞,提高了係統的可靠性。由於以上特性,Cramfs在嵌入式係統中應用廣泛。但是它的隻讀屬性同時又是它的一大缺陷,使得用戶無法對其內容對進擴充。
製作Cramfs根文件係統命令如下:
#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:希望測試的目標文件
例子:#mkcramfs rootfs rootfs.cramfs生成rootfs.cramfs文件係統鏡像.其中rootfs是你調試的根文件係統的文件夾,rootfs.cramfs是生產鏡像文件的名字。
Squashfs文件係統:是壓縮的隻讀的fs,保留了Cramfs很多優點,去掉它的限製。壓縮比更高。是一個不錯的文件係統。命令為:#mksquashfs [source] [dest]
JFFS2文件係統:可寫、保留數據、壓縮、掉電保護,提供wear leveling,適合板載NOR、NAND和Doc。JFFS2提供垃圾回收機製,通常可以很好地工作。但是當文件係統接近極限或者要求更新一個非常大的文件,垃圾回收的時間會很長,將會延遲文件係統的操作,這會對沒有考慮到這種情況的某些實時要求的軟件帶來負麵的影響。當空間滿的時候,嚐試更新或者階段文件內容會被提示文件係統已滿並失敗,即使看起來不要求添加存儲block,這是因為日誌結構文件係統,需要在log中增加log。在使用的時候,我們應保證存儲空間的充足,上麵的應用能夠容忍時延(避免快滿時候垃圾回收的消耗影響)。 JFFS2用途很廣,但是對於現在容量巨大的閃存不適合,新的UBI文件係統出現。JFFS2的不可擴展性是最大的問題,作為JFFS2的升級,JFFS3支持大容量的閃存。JFFS2使用MTD工具:
#mkfs.jffs2 –r ottfs/ –o images/rootfs-jffs2.img –e 128kiB 其中128是指擦寫block的大小,如果超過實際閃存的大小,會引起文件係統的崩潰,如果太小,block內有部分存儲空間沒能利用。
#sumtool –i rootfs-jffs2.img –o rootfs-jffs2-summed.img –e 128KiB 增減erase block的summary node。
 
YAFFS2文件係統:是可寫,下電保護的文件係統,廣泛引用於Linux和RTOSeS。和JFFS2相比,它減少一些功能,因此速度更快、占用內存資源更少。YAFFS2自帶NAND芯片的驅動,是專門為NAND閃存設計的。以前的YAFFS隻支持512-BYTE/Page的NAND,而YAFFS2不但兼容512-BYTE/Page,還支持目前流行的2048-BYTE/Page大容量NAND FLASH。YAFFS2文件係統的鏡像工具是mkyaffs2img。隨便在GOOGLE上輸入mkyaffs2img就可以找到滿屏幕的製作方法,這裏不用介紹。
 
RAMFS文件係統:
討論RAMFS,就不得不討論RAM disk,在RAM中,而作為一個block設備,內核可以同時支持多個RAM disk。通常用於保存磁盤文件係統中壓縮的img。這在嵌入式操作係統的初始化中使用,kernel可以從存儲設備中提取initial RAM disk(initrd)img作為的他的根文件係統。一開始,kernel根據boot的參數是否表麵intrid,如果是,他將從特定的存貯介質提取文件係統的img並放入RAM disk,同時mount為根文件係統。initrd的機製是以最簡單的方式提供一個帶根文件係統的內核在RAM中。對於新的係統,推薦使用Initramfs機製。
Tmpfs文件係統:也是RAM disk的一種,可以使用物理內存,是一個存放在虛擬memory的文件係統,不提供永久保存,適合於存儲臨時的數據,例如/tmp,用於Linux的page cache和dentry chache。
RAM disk的特點就是速度快,因為在RAM運行的。缺點就是每次重新啟動係統時,前麵的工作就無法保存。創建RAM Disk使用的命令式mke2fs。
有關嵌入式常用的文件係統詳細介紹和製作命令、方法,大家可以在網上搜索得到。
 
二、TI davinci根文件係統target介紹
在mv_pro_5.0.0/montavista/pro/devkit/arm/v5t_le目錄下,有個target的文件夾,這個就是TI EVM的根文件係統了。Target裏的內容,見下圖,本人是單獨COPY出來到自己工作目錄下,這點在《開發環境篇》有介紹。TI在這個target文件係統包裏放置很多開發工具,其實就是一個開發應用程序的環境,你進到usr目錄下就明白這點,裏邊包括交叉編譯命令、很多頭文件和應用程序的源代碼、usr/lib裏的lib文件,等等。其實這些東西肯定是不能全部燒到自己的板子裏的。單單這個usr裏相關的文件大小就達1G!!!因為TI EVM東西多,複雜,所以我們裁減的時候,最好做好備份。當然,有些朋友是自己手動重新製作根文件係統,再借助“Busybox”這個大名鼎鼎的嵌入式linux瑞士軍刀,一個精簡的文件係統就出來了。本人在S3C2440、2410的板子上玩過,挺不錯的,非常精簡。本文暫且不討論這種方法。
 

三、TI davinci根文件係統target的裁減
進入自己工作的target文件夾裏,見上圖:
bin文件夾:裏邊主要是一些linux shell命令,所有用戶都可以使用的、基本的命令,都是很基本的東西,暫時不用動它,保留。
boot文件夾:是存放編譯內核的一些相關文件,比如uImage等,這些東西沒必要放到板子上的文件係統裏,刪除掉。
dev文件夾:存放非常多的設備節點,如果你對這些節點不是很熟悉,分不清哪些是你係統用到的,哪些是不用的,可以保留,整個dev隻有16~17k的大小。當然節點太多也不好。
 etc文件夾:存放很多啟動的腳本文件、係統配置文件,這是下麵移植要討論的重點。整個文件夾有6~7M,像samba、apt這種在普通嵌入式產品不常用的東西可以刪除掉。如果產品不是帶LCD圖像界麵的產品,X11(X Window 係統版本 11,簡稱 X11,是一個對網絡透明的客戶/服務器架構的圖形顯示係統。它支持應用程序在你的屏幕上繪製象素,線條,文字,圖象等等。 X11 還包括一些其它的輔助的函數庫,使得它可以容易地繪製用戶界麵,例如:按鈕,文本輸入區等等)這個可以刪除掉,單這個文件夾就有2.85M。
 home文件夾:空的文件夾,係統運行會用到,普通用戶的主目錄,一定要保留。
 lib文件夾:很多工具和應用程序使用的庫文件,不是高高手,最好不要刪掉裏邊的文件。
 media文件夾:空的文件夾,保留。
 mnt文件夾:空文件夾,以後使用U盤和SD卡時,會掛到該目錄,所以保留。
 opt文件夾:空文件夾,自己開發的一些應用程序可以放到這裏,比如TI evm的一些應用程序就放在/opt/dvsdk/dm6446/,存放encode,decode,encodedecode的應用程序,等等。
 proc文件夾:空的文件夾,係統運行會用到,proc文件係統的掛載點,保留。
 root文件夾:空的文件夾,係統運行會用到,root用戶的主目錄,一定要保留。
 sbin文件夾:存放很多工具和基本的係統命令,它們用於啟動係統、修複係統,在嵌入式產品裏,可以把不常用的mkfs.xx的文件全部去掉。其他有很多工具和命令,要根據你自己的產品,不用到的都刪掉,裁減sbin建議再單獨備份一下sbin,通過NFS,一邊刪除,一邊測試,保證刪除掉後你的產品還很好地工作。這是一種笨辦法,畢竟要全部理解裏邊的每個命令和工具的作用也需要很多時間。建議這個文件夾最好不要動太多手腳。
 srv文件夾:空的文件夾,保留。
 sys文件夾:空的文件夾,係統運行會用到,比如sysfs,保留。
 tmp文件夾:空的文件夾,係統運行會用到,存放臨時文件,保留。
 usr文件夾:上麵提到,這個文件有很多在產品出廠不用到的東西,armv5tl-montavista-linux-gnueabi文件夾直接刪除掉;bin文件夾裏的arm_v5t_le-XXXXX和armv5tl-montavista-linux-gnueabi-XXX也去掉吧;include、local、share、src、X11R6文件夾全部去掉;Usr/lib/tcng/test幹掉;然後根據自己產品的,像perl5、python2.4、X11等等,不用到就搞定它們。笨辦法就是使用NFS和板子共同測試,這樣下來usr就小多了。
var文件夾:存放可變的數據,var/cache/cracklib裏的文件很大,不知在TI EVM有什麼用,本人不用;var\lib\rpm裏的文件本人也不用;var/www/html/manual是在開發html的時候用到,本人不用。這幾個都是var裏耗空間的文件夾。另外,在使用NFS調試的時候,var/log下的文件會保存每次內核啟動的打印信息,測試多了,debug,kern.log,messages等文件也加大,所以製作時要注意這些文件的裁減。
    按照上麵的動作下來,一個可以用的根文件係統也出來了,但還不是簡潔高效的,有些東西還得根據自己的板子要支持的功能選擇性保留和裁減。有些工具、命令、應用程序開始沒用到,但是後來升級產品會用到,所以,裁減要有針對性和規劃性。特別是有些產品使用小於等於64M NAND的嵌入式產品,要做的工作就更多,這裏僅供學習和參考。
 
四、TI davinci根文件係統target的移植
1、係統的分區:
在linux-2.6.18移植的博客文章介紹了FLASH的分區,這裏就不用重複了,一般分區是: Bootloader(UBL+U-BOOT)+參數 為mtdblock0,kernel為mtdblock1,根文件係統rootfs為mtdblock2。也有這樣分的:Bootloader(UBL+U-BOOT) 為mtdblock0,參數為mtdblock1,kernel為mtdblock2,根文件係統為mtdblock3。Bootloader要從FLASH 加載根文件係統,比如jffs2的根文件係統,u-boot的bootargs應該是:mem=118M console=ttyS0,115200n8 rootfstype=jffs2 root=/dev/mtdblock2 noinitrd rw ip=off或者是其他類型的文件係統。同時,u-boot對根文件係統的燒寫要支持,因為jffs2,cramfs,yaffs2等每種文件係統的燒寫格式都不一樣,燒寫的地址一定要和內核的FLASH分區地址一一對應。(補充:在DVSDK2.0中,U-BOOT的參數mem=118M,不再是120M,因為TI DVSDK2.0 CODEC ENGINE要求分配給cmem的大小是10M)。
2、內核選擇支持對應的文件係統
   通過make menuconfig的配置界麵,你的板子要支持什麼樣的文件係統,是cramfs,Squashfs,jffs2還yaffs2,則要對對MTD等相關選項進行選擇,見linux-2.6.18移植的博客。
   3、對根文件係統權限操作
Target下每個目錄的權限不是全部一樣的,根據自己的文件係統的類型,比如yaffs2,tmp、var等目錄可以使用chmod –R 777 tmp , chmod –R 777 var命令設置,文件夾域的設置使用chown的命令。為什麼要這樣強調呢?也許很多人調試DAVINCI 板子會碰到:Starting OpenBSD Secure Shell server: sshd/var/empty/sshd must be owned by root and not group or world-writable. failed (255: ).這個就是根文件係統權限和域得設置有問題。
4etc目錄下的移植
   A、拷貝你的LINUX開發主機etc目錄下的passwd、group、shadow文件到etc目錄下。這樣目標板就使用和你LINUX主機一樣的登錄賬號和密碼了。如果passwd、group、shadow被破壞了,如何都進不去板子的shell命令行,而且你的產品沒有嚴重網絡安全要求,這裏還有一個絕招:把target/etc 下的securetty文件改個名字,不用securetty就可以了,這樣輸入賬號直接回車就可以了。
 
   B、etc目錄下新建一個目錄sysconfig,並新建文件HOSTNAME,內容為“你公司名字或你喜歡的名字”。同時在etc/init.d/下RcS文件最後麵加入:/bin/hostname –F /etc/sysconfig/HOSTNAME,在profile最後麵加入:
USER="`id -un`" (注意 ` 是鍵盤1旁邊的 `
LOGNAME=$USER
PS1='[\u@\h \W]# '  (注意 是鍵盤 ; 旁邊的linux文件下顯示不一樣)
PATH=$PATH
HOSTNAME=`/bin/hostname` (注意 ` 是鍵盤1旁邊的 `
export USER LOGNAME PS1 PATH
這樣在板子上進入shell的命令行時,會顯示“[root@你定義的名字~]#”的格式。
 
   C、etc/fstab文件修改:目前這個本人直接使用TI的,但是自己的產品有時會定義
sysfs              /sys         sysfs       noauto                          0 0
tmpfs             /dev/shm tmpfs      noauto                                 0 0
目前沒有驗證,如果哪個網友對這方麵熟悉,可以在博客上討論。
 
   D、流程介紹
      根文件係統掛接到VFS(linux虛擬文件係統,一種軟件接口機製,原理這裏不描述)成功後,會根據腳本和配置一步一步運行。我們可以通過以下流程去熟悉:
先看inittab
      次看init.d/rcS
然後etc/rc.d/rcS.d,rcS.x等文件,開機是啟動/etc/rc.d/rcS.d/下的腳本,然後是/etc/rc.d/rc3.d/下的腳本。隻需把用戶的程序編譯稱shell腳本,放在rc3.d下麵就可以了。
      S開頭的腳本基本上是係統運行初始化要做的工作,K開頭就是關機要做的工作。
     客戶如果要在開機運行自己的某些應用程序,也可以修改etc/init.d/rcS,在
for i in /etc/rc.d/rcS.d/S??*
do
           # Ignore dangling symlinks for now.
           [ ! -f "$i" ] && continue
           case "$i" in
                 *.sh)
                      # Source shell script for speed.
                      (
                          trap - INT QUIT TSTP
                          set start
                          . $i
                      )
                      ;;
               *)
                     # No sh extension, so fork subprocess.
                     $i start
                     ;;
            esac
done
在這後麵加自己的運行命令就可以了。
 
   E、製作根文件係統映像文件
      就是使用mkcramfs、mkyaffs2image這些命令對整個修改的target文件進行鏡像打包了,格式上麵已經介紹了。
 
五、點評
以上是本人的經驗之談,肯定有描述不足的地方,希望網友能在博客裏指出來,大家一起學習。到目前為止,有關DM6446開發攻略的主架構的文章,基本上接近尾聲,最後1篇,有關自己開發的GPIO驅動移植的文章,近期也會出來。以後要寫也是某個環節的補充。其實寫這些文章,就是希望有這方麵的開發高手過來點評一下,指出不足和錯誤的地方。畢竟本人在這方麵還有很多東西要學習。

最後更新:2017-04-03 16:48:40

  上一篇:go ap module omap4460
  下一篇:go Pandaboard ES編譯bootloader、xloader、內核、以及安卓係統