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