摘要:提出了一種智能網絡磁盤的存儲系統結構。詳細介紹了智能網絡磁盤接口的硬件和嵌入式操作系統的選型以及編譯和移植方法,最后根據智能網絡磁盤的需要對uClinux操作系統下多文件系統進行了研究。
關鍵詞:智能網絡磁盤; 嵌入式系統; uClinux; 多文件系統
中圖分類號:TP336文獻標志碼:A
文章編號:1001-3695(2007)11-0180-03
目前,網絡存儲架構大致可分為DAS(direct-attached sto ̄rage)、NAS(network-attached storage)、SAN(storage area network)。其中,DAS的速度最快,但是資源無法共享。為了解決DAS的部分難題,存儲市場出現了SAN與NAS兩種不同的存儲架構。
為了解決架構昂貴和服務器單點故障的問題,本文提出了用嵌入式開發板代替服務器的功能,即智能網絡磁盤(IND)。圖1是智能網絡磁盤存儲系統的結構圖。多個智能網絡磁盤實行分布式存儲,這樣可以輕松擴充存儲容量和解決單點故障以及實現負載平衡。
1嵌入式硬件選型
智能網絡磁盤的重要特點就是硬盤連接嵌入式開發板并通過網卡與外面進行數據交換,所以開發板上IDE接口和網卡是必不可少的;另外還需要串口和JTAG接口進行移植和調試以及需要用NOR flash來存儲嵌入式操作系統和程序;當然內存也是必不可少的。
在這里選擇的開發板是三星公司的以ARM7TDMI為內核的S3C44B0X的處理器;存儲器采用2 MB 16位數據寬度的NOR flash和8 MB 16位數據寬度的SDRAM;外部接口用于下載和通信,配備以太網接口來支持網絡功能,配備IDE接口來支持硬盤。開發板的主要功能框圖如圖2所示。
2嵌入式操作系統的選擇
嵌入式系統發展已有二十多年的歷史,國際上也出現了一些著名的嵌入式操作系統,如VxWorks、Palm OS、Windows CE等,但這些操作系統均屬于商業化產品,價格昂貴且由于源代碼不公開導致了諸如對設備的支持、應用軟件的移植等一系列的問題。uC/OSⅡ和uClinux操作系統是當前得到廣泛應用的兩種免費且公開源碼的嵌入式操作系統。本文對嵌入式系統的選擇是通過對這兩種操作系統進行比較以及項目的需求來決定的。
uC/OSⅡ適合小型控制系統,具有執行效率高、占用空間小、實時性能優良和可擴展性強等特點,最小內核可編譯至2 KB。uClinux則是繼承標準Linux的優良特性,針對嵌入式處理器的特點設計的一種操作系統,具有內嵌網絡協議、支持多種文件系統、開發者可利用標準Linux先驗知識等優勢,其編譯后目標文件可控制在幾百K量級。
通過對uC/OSⅡ和uClinux的比較,可以看出這兩種操作系統在應用方面各有優劣。uC/OSⅡ占用空間少、執行效率高、實時性能優良,且針對新處理器的移植相對簡單。uClinux則占用空間相對較大、實時性能一般,針對新處理器的移植相對復雜。但是,uClinux具有對多種文件系統的支持能力、內嵌了TCP/IP協議。考慮到智能網絡磁盤需要強大的網絡功能和對多種文件系統的支持,如需要支持硬盤的FAT文件系統和適合flash的Ext2文件系統,故選擇了uClinux操作系統來進行嵌入式系統開發。
uClinux就是Micro-Control-Linux,它也是一個開放源碼的項目。uClinux的源代碼和開發工具可以免費從http://www.uClinux.org上下載。uClinux是專為那些沒有MMU(內存管理單元)的嵌入式處理器開發的。與主流的Linux相比,uClinux有以下的特點:
a)簡化了內核加載方式。
uClinux的內核可以在flash上直接運行,將uClinux的內核的可執行映像燒寫到flash上,系統啟動時從flash的某個地址開始逐句執行;也可以加載到內存中運行,將內核的壓縮文件存放在flash上,系統啟動時讀取壓縮文件在內存中解壓,然后開始執行。
b)采用了Romfs文件系統作為根文件系統。
這種文件系統相對于一般的Ext2文件系統要求更少的空間。首先內核支持Romfs文件系統比支持Ext2文件系統需要更少的代碼;其次Romfs文件系統相對簡單,建立文件系統superblock需要更少的存儲空間。Romfs文件系統不支持動態擦寫,對于系統需要動態保存的數據采用RAM盤的方法處理。RAM盤采用Ext2文件系統。
c)使用了Flat可執行文件格式。
Elf格式有很大的文件頭;Flat文件對文件頭和一些段信息進行了簡化。
d)重寫了應用程序庫。
uclibc對libc進行了精簡,uClinux對用戶程序采用靜態鏈接的形式。uClinux的開發環境http://www.uClinux.org為uClinux提供了GNU的交叉編譯器,包括以下組件:gcc交叉編譯器,即在宿主機上開發編譯目標上可運行的二進制文件;binutils輔助工具,包括objdump、as、ld等;gdb調試器。
3嵌入式系統的編譯和移植
嵌入式系統的開發過程比較復雜,包括了開發環境的建立以及代碼的編譯和移植;而代碼的編譯和移植包括Bootloader的編譯和移植、uClinux內核的編譯和移植以及文件系統的編譯和移植。圖3所示即為嵌入式Linux的系統概念圖。在進行嵌入式系統開發前,必須先建立開發環境。
3.1建立主機開發環境
嵌入式系統的軟件開發不適宜以Native方式進行,即本機(host)開發、調試,本機運行的方式。因為對于嵌入式系統的開發,沒有足夠的資源在開發板運行開發工具和調試工具。通常的嵌入式系統的軟件開發采用一種交叉編譯調試的方式。交叉編譯調試環境建立在主機上,對應的開發板叫做目標板。
開發時使用宿主機上的交叉編譯、匯編及連接工具形成可執行的二進制代碼,然后將可執行文件下載到目標板上運行。宿主機和目標板的處理器一般都不相同,宿主機為Intel處理器,而目標板為三星的S3C44B0X。在進行嵌入式開發前第一步的工作就是要安裝一臺裝有指定操作系統的PC機作為宿主開發機,對于嵌入式Linux,宿主機上的操作系統一般要求為Redhat Linux。筆者選用的宿主機的操作系統是Redhat Linux 13.8。在宿主機Linux環境下編譯開發包括編譯Bootloader、編譯Linux內核、制作文件系統。在主機上安裝好Linux后還要對系統進行配置用于以后的移植,這樣配置好了minicom和TFTP以及NFS。
需要獲得ARM開發工具來建立交叉編譯環境,http://www.uClinux.org提供uClinux的交叉編譯工具。要在開發主機上為ARM目標系統編譯uClinux,還需要從http://www.uClinux.org/pub/.../arm-elf-tools/上下載ARM交叉編譯器arm-elf-tools-20030314.sh;得到這個文件以后,執行以下命令:
sharm-elf-tools-20030314.sh
3.2U-Boot的編譯
U-Boot是德國DENX小組開發的用于多種嵌入式CPU的開放源代碼bootloader程序。U-Boot是在PPCBoot以及ARMboot的基礎上發展而來,現已非常成熟和穩定,在許多嵌入式系統開發過程中被采用。目前支持的目標操作系統包括OpenBSD、NetBSD、FreeBSD、 Linux、SVR4、Esix、Solaris、rix、SCO、Dell、NCR、VxWorks、Lynxos、pSOS、QNX、RTEMS和ARTOS。U-Boot支持很多處理器,包括PowerPC、ARM、MIPS、x86、Nios、X Scale等諸多常用系列處理器。它是嵌入式Linux Bootloader的最佳選擇。
下載U-Boot的源碼可以通過ftp://ftp.denx.de/pub/u-boot/下載正式發布的壓縮文件,可以選擇下載U-Boot 1.1.1。移植U-Boot到新的開發板上僅需要修改和硬件相關的部分,在代碼結構上添加如下幾個步驟進行編譯:
a)在board目錄下創建gold44b目錄,創建gold44b.c以及flash.c、memsetup.s、u-boot.lds等。不需要從零開始,可選擇一個相似的目錄直接復制過來,修改文件名以及內容。由于U-Boot已經包含基于s3c24b0的開發板目錄,作為參考,也可以復制相應的目錄。
b)在CPU目錄下創建s3c44b0x目錄,主要包含start.s、interrupts.c以及cpu.c、serial.c幾個文件。同樣不需要從零開始建立文件,直接從arm720t復制,然后修改相應內容。
c)在include/configs目錄下添加gold44b.h,在這里放上全局的宏定義等。
d)找到U-Boot根目錄下makefile,修改加入gold44b_config:unconfig@./mkconfig$(@:_config=)arm s3c44b0 gold44b。
e)運行make ev44bii_config,編譯后生成最終可以下載到flash中的uboot.bin文件。如果沒有錯誤就可以開始硬件相關代碼的移植工作。
3.3uClinux的編譯
在對uClinux進行裁減和編譯前,首先要下載uClinux的源代碼。可以在uClinux的官方網址下載uClinux的源碼包——uClinux-dist-20051110.tar。然后將其拷貝到home目錄下,再對其進行解壓,輸入如下命令:
tar zxvf uClinux-dist-20051110.tar
解壓完畢后,就會在home目錄下生成uClinux-dist,再進入到該目錄下輸入如下命令:
cd uClinux-dist
然后依次輸入如下命令:
make menuconfig
make dep
make romfs
make image
make
這樣就會在/home/uClinux-dist/image目錄下產生三個文件image.rom、image.ram和romfs.img。其中:image.rom是內核的映像文件;image.ram是內核的調試文件;romfs.img是根文件系統的映像文件。
3.4U-Boot映像、內核映像和根文件系統映像的下載
在宿主機使用Redhat上的minicom、TFTP將啟動加載程序U-Boot映像、內核映像、根文件系統映像依次下載到開發板上。其中還應正確設置以下U-Boot環境變量:網絡屬性ethact、ethaddr、ipaddr、netmask、gatewayip、serverip、hostname,內核啟動參數bootdelay,默認執行的啟動命令串bootcmd。通過適當設置bootargs和bootcmd變量來選擇加載文件系統的方法——使用RAMdisk技術還是NFS。當然前提是已將內核編譯成支持該功能。建議在軟件開發過程中采用NFS遠程加載文件系統,便于進行動態軟件開發調試;在把軟件最終固化到板上時采用RAMdisk的方式加載文件系統并固化進flash。
4多文件系統的研究與實現
Linux支持很多種文件系統,uClinux繼承了Linux的特性,也支持很多種文件系統。要在uClinux內核上構建多個文件系統,首先就要選擇一個根文件系統在這里選擇Romfs作為嵌入式系統的根文件系統。這是因為Romfs本身是uClinux的默認根文件系統,且相對簡單、易于開發和維護;所需的存儲空間也比其他文件系統要少;同時因為嵌入式系統中的大部分代碼通常是固定不變的,而Romfs又是只讀文件系統,還可防止根文件系統被意外修改。
在建立可讀寫的文件系統時,通常選用JFFS2文件系統。這是因為充分考慮了flash的各種技術特性和操作限制,JFFS2文件系統能夠高效地直接對flash芯片進行操作。同時充分考慮了非正常斷電對文件系統的破壞,使文件崩潰后能夠迅速地恢復。還可以加一個RAMdisk文件系統。這是因為有些系統可能在數據庫處理時需要用到RAMdisk文件系統,這樣可以獲得高速度,簡單而明快。對于那些只讀的數據庫來說,這是一個非常實用的方案。
對于操作系統而言,其文件系統只有一個,即根文件系統。當然也可以根據需要掛上其他的文件系統。當根文件系統和普通文件系統并存時,flash上的布局如圖4所示。
5結束語
本文提出了一種新的網絡存儲架構——智能網絡存儲存儲系統結構。這種存儲架構是用嵌入式系統來替代服務器的功能,多個IND還可以解決服務器單點故障的問題。說明了嵌入式系統所需要的硬件資源,并詳細介紹了嵌入式軟件系統的開發,包括Bootloader的制作、uClinux的編譯和文件系統的制作,以及它們的移植。考慮到IND涉及到多種存儲設備,可能需要支持多種文件系統,這樣就對多文件系統做了一些研究,在根文件系統上掛載其他需要的文件系統可以實現對多種文件系統的支持。
參考文獻:
[1]王東,李哲英.U-Boot在S3C44B0上的移植方法[J].北京交通大學學報,2005,29(2):76-80.
[2]廖羽,戴瑜興.基于uClinux的嵌入式系統開發過程[J].湖南工程學院學報:自然科學版,2004,14(4):12-15.
[3]常銀霞,張振東,唐繼英.利用Bootloader實現uClinux向S3C44B0上的移植[J].河北工業大學學報,2005,34(2):100-104.
[4]肖建,張宇.uClinux下多文件系統的研究與實現[J].鐵路計算機應用,2005,14(2):11-13.
[5]李貴良,劉發貴.JFFS2文件系統的關鍵技術及其在嵌入式系統的應用[J].計算機應用,2003,23(7):135-137.
[6]顧詠楓,陳章龍.嵌入式Linux裁剪方法[J].小型微型計算機系統,2003,24(9):1697-1700.
[7]楊潔潔.嵌入式Linux系統的移植及其根文件系統的實現[J].漳州師范學院學報:自然科學版, 2005,18(2):46-50.
[8]沈利香,朱宇光,李東俠.網絡存儲構架發展[J].常州工學院學報,2005,18(4):12-14.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”