2007年8月27日 星期一

Software RAID For Linux

我想大家也聽過RAID 吧! 它能夠保護你的資料, 或是增加讀取的效能,或是把數個硬碟結合在一起。正如大家所知道RAID 也有Hardware RAID 和Software RAID 之分。Hardware RAID 是透過硬體的支援令OS 認為它是一個device。而Software RAID 則是利用OS 的功能來模擬RAID。由於在Linux 下支援的RAID 卡實在不多, 所以在Linux 下要用IDE 作RAID 便只能用Software RAID 的方法了。


RAID 主要分為Linear , RAID 0 to 5 各種Level, 我想大家也很清楚其分別吧, 所以只會簡介一下 : Linear mode 是會把2 個或以上的Harddisk 連起來, 寫完一個再寫一個。RAID-0 和Linear 差不多, 但資料會同時寫在那數個harddisk 上。好處是能夠增進讀寫效能,壞處則是只要其中一個harddisk 有問題則整個RAID-0 的partition 的資料也會不見了(唉~ 筆者家中的電腦舊harddisk 壞了, 所有資料全部失去.. 但和RAID-0 無關 ^^) RAID-1 則會把資料重複寫進harddisk, 好處當然是能夠保護資料, 即使一個harddisk 有問題另一個仍然會保留了應有的資料。 壞處便是效能可能會下降。

至於RAID4 和 5 , 都必須有3個harddisk 以上才能執行。 它們在儲存資料時會同時儲存一寫計算出來的資料。那麼3個harddisk 中其中一個有問題時便能夠靠那寫特點計算的資料重新建立數據。4 和5 的不同之處在於,RAID-4 會把所有計算出來資料存儲在一個 harddisk 上, 但如果所有harddisk 均同速的話那便會拖慢整個RAID-4 partition。而 RAID-5 則會把計算出來的資料分開。

值得一提的是在同一RAID partition 內的harddisk 最好速度一樣, 大小也一樣。除了 Linear mode 外其他level 的RAID 在使用不同速度和大小的 harddisk時都可能會令到效能下降。

另外在RAID-4,5 中我們常常會加進一個spare disks, spare disks 在平常是不會被讀寫的,只有在其中一個harddisk fail 時spare disks 才會代替原有harddisk 的功能。

最後, Swap parition 是不需要RAID 的,因為linux kernel 本身已經能夠同時控制多個 swap parition 的存取來增進效能了。

Kernel Setting

在Linux 中設定Software RAID 其實是十分簡單的,首先你必需重新compile 一個support RAID 的kernel。最新的kernel 2.4.x 已經內建RAID support 了。

你必需要enable 以下的RAID 選項:

Multidevice support ->

Multiple devices driver support (RAID and LVM) -- y
RAID support -- y
Linear (append mode) -- y (如果你用linear mode)
RAID-0 (striping) mode -- y (如果你用RAID - 0)
RAID-1 (mirroring) mode -- y (如果你用RAID - 1)
RAID-4 /RAID-5 mode --y (如果你用RAID 4 或5)


以上的選項如果你的RAID partition 將會是root paritition 的話請必定要選y 而不是 compile 成modules。但如果不是的話(例如只有/home 是RAID paritition),那用modules 也無問題。

然後compile kernel 也不用教吧 ^^
make dep;make bzImage;make modules;make modules_install


設定RAID tools

現在reboot 一下, 看看有沒有問題, 沒有的話便要裝raidtools 了多數的distribution 也附有raidtools 的, 如果沒有的話, 用debian 的請安裝raidtools2 :

apt-get install raidtools2

用RPM 的話便自己到rpmfind.net 下載了並安裝 ,或到ftp 下載sources compile~ (對不起~ 筆者也中了Debian 毒 ^^)

完成安裝了嗎? 那麼便要設定 /etc/raidtab 了,現在你應該沒有這個file 的,但mkraid 預設是會讀取這個設定檔。

Linear mode 的範例設定檔:

raiddev /dev/md0 <--device 名
raid-level linear <--Raidlevel 是linear
nr-raid-disks 2 <--會被加進partition 的總parition 數
chunk-size 32
persistent-superblock 1
device /dev/hde1 <--第0個parition
raid-disk 0
device /dev/hdf1 <--第1個parition
raid-disk 1

至於chunk-size 和persistent-superblock 是什麼呢? chunk-size 是指寫進單一個 partition 的大小, 例如在RAID-0 中把一個file同時寫進兩個或以上parition 時, 會把 file 分成多大才寫進一其中一個partition 呢? (總不能1 bit 寫在這, 1bit 寫在那吧) chunk-size 在linear mode 中也許沒意義, 但在其他level 如RAID-0 對效能是會有影響的。至於persistent-superblock, 加上許是為了令kernel 在開機時能直接detect 到那 partition。

RAID-0 的範例設定檔:

raiddev /dev/md0
raid-level 0
nr-raid-disks 2
chunk-size 32
persistent-superblock 1
device /dev/hde1
raid-disk 0
device /dev/hdf1
raid-disk 1

RAID-1 的範例設定檔:

raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 1 <-- 還記得剛才說過的spare-disks 嗎?
chunk-size 4
persistent-superblock 1
device /dev/hde1
raid-disk 0
device /dev/hdf1
raid-disk 1
device /dev/hdh1
spare-disk 0

RAID-4 的範例設定檔:

raiddev /dev/md0
raid-level 4
nr-raid-disks 3 <-- 最少要有3個partition
nr-spare-disks 1
persistent-superblock 1
chunk-size 32
device /dev/hde1
raid-disk 0
device /dev/hdf1
raid-disk 1
device /dev/hdg1
raid-disk 2
device /dev/hdh1
spare-disk 0

RAID-5 的範例設定檔:

raiddev /dev/md0
raid-level 5
nr-raid-disks 3
nr-spare-disks 1
persistent-superblock 1
chunk-size 32
parity-algorithm left-symmetric
device /dev/hde1
raid-disk 0
device /dev/hdf1
raid-disk 1
device /dev/hdg1
raid-disk 2
device /dev/hdh1
spare-disk 0

怎麼樣? 很簡單吧!

寫完你的設定檔後便執行:

mkraid /dev/md0

那麼你的RAID parition 便建立起來了!看一看 /proc/mdstat 吧! ^^

chpapa@power:~$ sudo cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5]
read_ahead 1024 sectors
md0 : active raid5 hdh1[3] hdg1[2] hdf1[1] hde4[0]
80418048 blocks level5, 32k chunk, algorithm 2 [3/3] [UUU]

unused devices:

跑起來了, 很爽吧!
(順帶一提, 筆者測試是用HPT370 的RAID Card,在Linux Kernel 中選用HPT366 的driver 便能認得出各devices 了)

哈哈~ 但那些沒看完文章便走去mount /dev/md0 的人該打了, 你還未format partition 呀!

mke2fs -b 4096 /dev/md0

(如果是用RAID 4, 5 的話, mke2fs 是有特點options 的: -R stride=8, 為什麼是8? chunksize 除以 blocksize)

假如你的RAID parition 是要在開機時能夠讓Linux 自動Detect (例如是要做root partition) 的話, 你還有一些事情要做的。

首先當然是要有kernel support 吧, 如果是root partition 的話請compile 成內建而不是modules。另外要有persistent-superblock, 剛才便已經有了。最後是每個parition type 都要為Linux raid autodetect。

頭兩項剛才已經列明了做法, 至於要把partition type 轉為Linux raid autodetect...

首先用raidstop 暫停raid partition /dev/md0

power:/# raidstop /dev/md0

power:/# fdisk /dev/hde

The number of cylinders for this disk is set to 5606.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/hde: 255 heads, 63 sectors, 5606 cylinders
Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System
/dev/hde1 * 1 7 56196 83 Linux
/dev/hde2 8 71 514080 83 Linux
/dev/hde3 72 135 514080 82 Linux swap
/dev/hde4 136 5606 43945807+ 83 Linux

跑 t 指令

Command (m for help): t
Partition number (1-4): 4
Hex code (type L to list codes): l
0 Empty 18 AST Windows swa 61 SpeedStor a6 OpenBSD
1 FAT12 1b Hidden Win95 FA 63 GNU HURD or Sys a7 NeXTSTEP
2 XENIX root 1c Hidden Win95 FA 64 Novell Netware b7 BSDI fs
3 XENIX usr 1e Hidden Win95 FA 65 Novell Netware b8 BSDI swap
4 FAT16 <32M 24 NEC DOS 70 DiskSecure Mult c1 DRDOS/sec (FAT-
5 Extended 39 Plan 9 75 PC/IX c4 DRDOS/sec (FAT-
6 FAT16 3c PartitionMagic 80 Old Minix c6 DRDOS/sec (FAT-
7 HPFS/NTFS 40 Venix 80286 81 Minix / old Lin c7 Syrinx
8 AIX 41 PPC PReP Boot 82 Linux swap da Non-FS data
9 AIX bootable 42 SFS 83 Linux db CP/M / CTOS / .
a OS/2 Boot Manag 4d QNX4.x 84 OS/2 hidden C: e1 DOS access
b Win95 FAT32 4e QNX4.x 2nd part 85 Linux extended e3 DOS R/O
c Win95 FAT32 (LB 4f QNX4.x 3rd part 86 NTFS volume set e4 SpeedStor
e Win95 FAT16 (LB 50 OnTrack DM 87 NTFS volume set eb BeOS fs
f Win95 Ext'd (LB 51 OnTrack DM6 Aux 8e Linux LVM f1 SpeedStor
10 OPUS 52 CP/M 93 Amoeba f4 SpeedStor
11 Hidden FAT12 53 OnTrack DM6 Aux 94 Amoeba BBT f2 DOS secondary
12 Compaq diagnost 54 OnTrackDM6 9f BSD/OS fd Linux raid auto
14 Hidden FAT16 <3 55 EZ-Drive a0 IBM Thinkpad hi fe LANstep
16 Hidden FAT16 56 Golden Bow a5 BSD/386 ff BBT
17 Hidden HPFS/NTF 5c Priam Edisk

看來是 fd 吧!

Hex code(type L to list codes): fd

然後跑 w 寫入就成了。

把剛才的做法在每個參與RAID 的partition 都做一次,然後試一下reboot 吧!看一看有沒有開機訊息告訢你已經找到RAID partition 吧!

實例

是次實例是一部原本已經在運行的Server , 它的/ partition 在/dev/hda1, /home 在 /dev/hdb1, 我們假設已經在kernel 設定好RAID5 support 了, 現在會增加四個harddisk 上去並跑RAID5

首先把那些Harddisk 分割好~ 四個harddisk 分別是 /dev/hde , /dev/hdf , /dev/hdg , /dev/hdh
(筆者測試用的電腦是用HPT370 Controller) 打算用 /dev/hde1 作 /boot 開機,用 /dev/hde2 作 /tmp, /dev/hde3 作swap。

首先當然是 fdisk, 相信大家都懂得用fdisk 吧,記緊RAID partition 要差不多size ,也要把partition type 設定為 fd 呀!

安裝raidtools :
apt-get install raidtools2

然後便是篇寫/etc/raidtab 了:

pico /etc/raidtab

raiddev /dev/md0
raid-level 5
nr-raid-disks 3
nr-spare-disks 1
persistent-superblock 1
parity-algorithm left-symmetric
chunk-size 32
device /dev/hde4
raid-disk 0
device /dev/hdf1
raid-disk 1
device /dev/hdg1
raid-disk 2
device /dev/hdh1
spare-disk 0


然後用mkraid 指令...
mkraid /dev/md0

格式化:
mke2fs -b 4096 -R stride=8 /dev/md0

把新的RAID5 mount 作/mnt/newroot:
mount /dev/md0 /mnt/newroot

把舊的資料抄到 /mnt/newroot
umask 0
cp -ax / /mnt/newroot
cp -ax /home /mnt/newroot/ <-- 因為-ax 只會把同一個partition 的資料抄走, 而 /home 現在和/ 在不同partition, 所以要跑兩次, 這是新手常常忘記了的

把/boot 抄到/dev/hde1 來開機
mount /dev/hde1 /mnt/newroot/boot
cp -R /boot /mnt/newroot/boot

chroot到新的harddisk:
chroot /mnt/newroot

設定新的fstab:
pico /etc/fstab (因為已經chroot, 所以現在/ 已經是/mnt/newroot 了)

/dev/md0 / ext2 defaults,errors=remount-ro,usrquota,grpquota 0 0
/dev/cdrom /cdrom iso9660 defaults,ro,user,noauto 0 0
/dev/hde1 /boot ext2 defaults 0 0
/dev/hde2 /tmp ext2 defaults 0 0
/dev/hde3 none swap sw 0 0

設定新的lilo:
pico /etc/lilo.conf

boot=/dev/hde
disk=/dev/hde
bios=0x80
compact
install=/boot/boot-menu.b
delay=1
map=/boot/map
append=""
read-only
default=Linux
image=/boot/vmlinuz-2.4.2
root=/dev/md0
label=Linux


然後執行lilo: /sbin/lilo

重新開機後, 把舊的harddisk 拔出來, 應該可以用/dev/hde 來正常開機了最後別忘了用mkswap format swap parition 呀!

多數用者在設定RAID 都不會遇到問題, 反而是lilo 的設定倒是較麻煩,另外筆者沒有試過直接用RAID 作/boot 來開機, 有興趣的讀者可以試一試, ^o^

raidtools 常用指令介紹

以下為RAID 的常用指令:

raidstart - 開動一個已建立的raid partition
raidstop - 暫停一個已開動的raid partition
raidhotadd - 在RAID 運行時加入一個新Harddisk, 例如在RAID5 中有一個harddisk 壞了, 要更換一個新的上去。
raidhotremove - 和raidhotadd 相反, 是會移除harddisk 的

最後提一提各位讀者, 要更動raid partition 的話, 請先用raidstop 暫停它。

RedHat Linux 9軟體RAID配置

RedHat Linux 9軟體RAID配置
首先請閱讀第3章來瞭解一下 RAID、硬體和軟體 RAID 間的區別、以及 RAID 0、1、和 5 之間的區別。
軟體 RAID 能夠在 Red Hat Linux 的圖形化安裝期間或 kickstart 安裝期間配置。本章討論如何使用 Disk Druid 介面來在安裝期間配置軟體 RAID。
在你創建 RAID 設備之前,你必須首先創建 RAID 分區,然後遵循以下步驟:
1. 在 「磁片分區設置」 螢幕上,選擇 「用 Disk Druid 手工分區」 。
2. 在 Disk Druid 中,選擇 「新建」 來創建一個新分區。
3. 你不能輸入一個掛載點(在你創建了 RAID 設備後你才可以做)。
4. 從 「檔系統類型」 下拉功能表中選擇 「軟體 RAID」 ,如圖10-1所示。


圖 10-1. 創建一個新 RAID 分區
5. 對於 「允許的驅動器」 ,選擇要在其上創建 RAID 的驅動器。如果你有多個驅動器,所有驅動器都會在這裏被選擇,你必須取消選擇你 不想 在上面創建 RAID 的驅動器。
6. 輸入你想要的分區大小。
7. 選擇 「固定大小」 來使物理卷具備指定大小,選擇 「指定空間大小(MB)」 ,輸入以 MB 為單位的大小來給物理卷大小一個範圍,或選擇 「使用全部可用空間」 來使它的大小擴充到填滿整個硬碟的可用空間。如果你有不止一個可擴展的分區,它們會分享磁片上的可用空閒空間。
8. 如果你想讓這個分區成為主分區,選擇 「強制為主分區」 。
9. 如果你想讓安裝程式在格式化硬碟驅動器之前檢查磁片壞塊,選擇 「檢查磁片壞塊」 。
10. 點擊 「確定」 來返回到主螢幕。
重複這些步驟來創建你的 RAID 設置所需的分區。注意,不是所有的分區都必須是 RAID 分區。譬如,你可以僅把 /home 分區配置為軟體 RAID 設備。
一旦你創建了所有所需的 「軟體 RAID」 分區,遵循以下步驟:
1. 在 Disk Druid 的主分區螢幕上(參見圖 10-3 選擇 「RAID」 按鈕。
2. 接著,圖 10-2 就會出現,你可以在這裏製作 RAID 設備。


圖 10-2. 製作 RAID 設備
3. 輸入掛載點。
4. 為分區選擇檔系統類型。
5. 為 RAID 設備選擇設備名稱,如: md0 。
6. 選擇你的 RAID 級別。可供選擇的有: RAID 0 、 RAID 1 、和 RAID 5 。
注記:如果你想把 /boot 製成 RAID 分區,你必須選擇 RAID 級別 1,而且它必須使用前兩個驅動器之一(首先 IDE,其次 SCSI)。如果你不想把 /boot 製成 RAID 分區,但是你要把 / 製成 RAID 分區,它必須是 RAID 級別 1,而且它必須是前兩個驅動器之一(首先 IDE,其次 SCSI)。
7. 你剛剛創建的 RAID 分區會出現在 「RAID 成員」 列表中。從這個列表中選擇要創建 RAID 設備的分區。
8. 如果配置的是 RAID 1 和 RAID 5,請指定備用分區的數量。如果某個軟體 RAID 分區失效了,這個備用的分區會自動被用作替換分區。對每一個你想指定的備用分區,你必須製作一個額外的軟體 RAID 分區(RAID 設備中的分區以外的)。在前一步驟中,為 RAID 設備以及備件選擇分區。
9. 點擊了 「確定」 後,RAID 設備會出現在 「驅動器摘要」 列表中,如圖10-3所示。這時,你可以繼續安裝進程。要獲取進一步說明,請參閱 《Red Hat Linux 安裝指南》 。


圖 10-3. RAID 陣列已創建

SATA RAID的準備與安裝

SATA硬碟跟PATA硬碟幾乎沒有價差,但SATA效能較高一些,而且用來組RAID更加輕鬆方便,不但排線細長較好連接,也沒有Master與Slave設定問題。至於選用第一代SATA( 1.5Gb/s ),或是具備3Gb/s外部傳輸率的SATA II硬碟,基本上是沒有差別的,因為就算組了RAID效能也不一定能破3Gb/s。
選用SATA的另一個重要因素,是PATA硬碟短期內雖不會退出市場,以後也不一定無法買到,但是未來主機對PATA的支援將會越來越少,當你換新主機板時原有RAID系統能否轉移過去也是個問題。
在各種RAID組法中,RAID 5同時具備了效能與安全,容量的浪費也較少,可說是較好的選擇。況且最新的主機板大多開始支援SATA RAID 5的功能,更可看出主流RAID架構的趨勢,因此我們就選擇SATA RAID 5的安裝來做示範。
準備與安裝
1.三顆SATA硬碟(或四顆)
要組磁碟陣列當然要準備硬碟,以RAID 5的架構我們至少要準備3顆硬碟,如果預算允許也能用4顆硬碟來組。而4顆硬碟的SATA RAID也是目前大多主機板的極限了,雖然有些主機板具備額外的RAID控制晶片,可以提供超過4組SATA插槽,但單一控制晶片還是只能管理4顆硬碟。
組成RAID的各顆硬碟最好是同一廠牌、型號,來確保容量、轉速、緩衝區、存取特性等各項規格相同。規格不同的硬碟也是可以組成RAID,但是穩定性可能會較差,而且整個RAID系統的容量與效能,都會遷就其中規格最低的一個硬碟,造成資源的浪費。
2.支援SATA RAID 5的主機板
在主流的主機板中,採用Intel 955X 晶片組的ICH7R南橋,以及AMD平台的NVIDIA nForce4 SLI晶片組,都可以提供「硬體RAID 5」的支援能力,而且最少會提供4個SATA插槽。如果是較舊款的主機板,通常只能支援RAID 0、1、01/10。
某些主機板有附加的RAID控制晶片,可以多提供2個或4個SATA插槽。常見如Silicon Image Sil3132,只提供2個SATA插槽,可想而知一定無法支援需要3顆硬碟的RAID 5。而Silicon Image Sil3114R能控制4個SATA插槽,但對RAID 5只提供軟體支援,必須要在作業系統下以軟體來架構RAID 5,效能與實用性都不理想。
3.軟碟機、軟碟片
平常幾乎完全被人遺忘的軟碟機,在組RAID時卻變成不可或缺,這是因為Windows安裝光碟無法支援RAID、SCSI、SATA等磁碟型式,必須在作業系統安裝時以軟碟片將這些驅動程式「餵」給Windows,否則安裝程式將會完全不認識你的RAID,更別說要把系統裝好了。
舊有的軟碟機通常已積滿灰塵,或是不堪使用,舊的軟碟片也可能都無法讀寫了。如果有這方面問題,花個幾百塊買部新的軟碟機與幾片新軟碟,在整個系統的預算中也只是九牛一毛。
4.空間足夠的機殼
因為要放入3~4顆3.5吋的SATA硬碟,而且還要塞進同為3.5吋外型的軟碟機,所以機殼至少要有「四小」或「五小」的3.5吋設備安裝空間,來安置這麼一堆硬碟。當然,你的硬碟要疊羅漢隨處放著,或是用膠帶整堆綁起來也可以,但是請風險自負。
安裝方式
在舊系統或另一部電腦中,先使用主機板驅動光碟中的「RAID驅動磁片製作程式」,作出一片待會安裝作業系統要用的驅動磁片。

1.製作一片RAID驅動用的軟碟片


2.軟碟片中的驅動檔
在硬體組裝部分,將所有硬碟都掛到機架上固定好,一個個都插上排線與電源,再將一條條排線接到主機板上有提供RAID 5功能的SATA插槽上,不清楚的話請參考主機板的說明書。


3.將SATA排線、電源線都接上


4.將SATA排線接上主機板,順序不重要
確定硬碟都裝好沒問題後,可以先開機進入BIOS中調整相關設定,依照主機板的不同會有不一樣的設定項目,大致上是進入「附加週邊」(Integrated Peripheral)的項目,將主要SATA控制器的模式設為「RAID」,這樣才能開啟主機板的「RAID」功能。

5.進入主機板BIOS作設定


6.將SATA控制器設定為RAID模式
儲存設定後並離開BIOS後,系統會重新開機,如果上個步驟設定正確的話,在BIOS載入過程中應該會出現RAID晶片的提示畫面。這個畫面會列出每顆硬碟的型號、容量等資訊,並提示使用者進入RAID晶片BIOS的組合鍵。這時不要遲疑,趕快按下組合鍵吧。﹙如果錯過的話,就重新開機再來一次就好﹚


7.開機時可以看到RAID提示畫面


8.就是這個快速鍵,按下去就對了
進入RAID設定介面後,通常第一個選項就是「創建新RAID」,進入選項後必須設定RAID的名稱﹙自由輸入﹚、模式﹙選RAID 5或Parity﹚、組成硬碟﹙全選﹚、資料分割大小﹙RAID 5的建議值是64KB﹚、使用容量﹙系統會自動帶出可用容量的最大值,大約是使用硬碟數減一顆的容量總合﹚。


9.組成RAID 5的設定


10.全選所有硬碟


11.根據建議值設定資料分割大小


12.容量自動設為最大值
完成設定後,就可以安裝Windows作業系統了。跟一般安裝類似,先將BIOS的優先開機裝置設為「光碟機」,並記得將含有驅動檔的軟碟片放入﹙BIOS裡也要啟用軟碟機﹚,接著將Windows安裝光碟放進光碟機並重新開機即可。
在安裝光碟載入並開始安裝時,注意螢幕最下方的提示字串,會有一行「Press F6 if you need to install a third party SCSI or RAID driver...」,這邊記得一定要按下「F6」。
安裝到某個階段時,會跳出一個提問畫面,要使用者選擇特定的驅動程式,按下「S」進入並選取要用的RAID控制器名稱,設定完後安裝程式會讀取軟碟中的驅動檔並繼續安裝。


13.看到這行字就按下F6


14.要求選定驅動程式的提示


15.選定要安裝的RAID控制器
後面的步驟就跟一般作業系統安裝相同了,Windows安裝完畢後也可以在視窗環境下安裝RAID的管理程式,可以檢視RAID的組成與狀態,如果不安裝的話也不會影響RAID運作。

磁碟陣列 ( RAID ) 原理及各個階層詳細介紹

前言:

什麼是磁碟陣列?

磁碟陣列的由來:

磁碟陣列,時事所趨:

磁碟陣列有那些優點:

各階層磁碟陣列(RAID)介紹:

RAID 0:Striping/Span (切分/延展)

RAID 1:Mirroring (磁碟鏡射)

RAID 0+1:Mirror + Striping (磁碟鏡射+切分/延展)

RAID 3:Parallel with Parity (平行同位元檢查)

RAID 5:Striping with Rotating Parity (切分/延展+輪轉同位元)

前言:

現在己經有很多主機板都內建了IDE RAID晶片,除了提供ATA/133功能外,也提供了磁碟陣列功能,給使用者一個完整的IDE周邊解決方案。不過,應該還有很多人弄不清楚磁碟陣列是什麼,對磁碟陣列的使用及工作原理也有很多疑問。在這裏我們就來介紹一下磁碟陣列(RAID)的概念與工作原理,相信對各位會有所幫助。

什麼是磁碟陣列?
磁碟陣列簡稱RAID(Redundant Arrays of Inexpensive Disks),有”價格便宜且多餘的磁碟陣列”之意。其原理是利用陣列方式來作磁碟組,配合資料分散排列的設計,提升資料的安全性。磁碟陣列主要針對硬碟,在容量及速度上,無法跟上CPU及記憶體的發展,提出改善方法。磁碟陣列是由很多便宜、容量較小、穩定性較高、速度較慢磁碟,組合成一個大型的磁碟組,利用個別磁碟提供資料所產生的加成效果來提升整個磁碟系統的效能。同時,在儲存資料時,利用這項技術,將資料切割成許多區段,分別存放在各個硬碟上。

磁碟陣列還能利用同位元檢查(Parity Check)的觀念,在陣列中任一顆硬碟故障時,仍可讀出資料,在資料重建時,將故障硬碟內的資料,經計算後重新置入新硬碟中。

磁碟陣列的由來:
由美國柏克萊大學(University of California-Berkeley)在1987年,發表的文章:”A Case for Redundant Arrays of Inexpensive Disks”。文章中,談到了RAID這個字彙,而且定義了RAID的5層級。柏克萊大學研究其研究目的為,反應當時CPU快速的性能。CPU效能每年大約成長30~50%,而硬磁機只能成長約7%。研究小組希望能找出一種新的技術,在短期內,立即提升效能來平衡電腦的運算能力。在當時,柏克萊研究小組的主要研究目的是效能與成本。

另外,研究小組也設計出容錯(fault-tolerance),邏輯資料備份(logical data redundancy),而產生了RAID 理論。研究初期,便宜(Inexpensive)的磁碟也是主要的重點,但後來發現,大量便宜磁碟組合並不能適用於現實的生產環境,後來Inexpensive被改為independence,許多獨立的磁碟組。

磁碟陣列,時事所趨:
自有PC以來,硬碟是最常使用的儲存裝置。但在整個電腦系統架構中,跟CPU與RAM來比,硬碟的速度是PC中最弱的設備之一。所以,為了加速電腦整體的資料流量,增加儲存的吞吐量,進階改進硬碟資料的安全,磁碟陣列的設計因應而生。

硬碟隨著科技的日新月異,現在其容量已達40GB以上,轉速到了1萬轉,甚至15000轉,而且價格實在是很便宜,再加現在企業流行,人力資源規畫(Enterprise Resource Planning:ERP)是每個公司建構網路的主要目標。所以,利用區域網路來傳遞資料,伺服器所使用的硬碟顯得非常重要,除了容量大、速度快之外,穩定更是基本要求。基於此因,磁碟陣列開始廣泛的應用在個人電腦上。

磁碟陣列其樣式有三種,一是外接式磁碟陣列櫃、二是內接式磁碟陣列卡,三是利用軟體來模擬。外接式磁碟陣列櫃最常被使用大型伺服器上,具可熱抽換(Hot Swap)的特性,不過這類產品的價格都很貴。內接式磁碟陣列卡,因為價格便宜,但需要較高的安裝技術,適合技術人員使用****作。另外利用軟體模擬的方式,由於會拖累機器的速度,不適合大資料流量的伺服器。

由上述可知,現在IDE磁碟陣列大行其道的道理;IDE介面硬碟的穩定度與效能表現已有很大的提升,加上成本考量,所以採用IDE介面硬碟來作為磁碟陣列的決解方案,可說是最佳的方式。

磁碟陣列有那些優點:

1.傳輸速率快
2.儲存容量可提升
3.提升I/O每秒的數量
4.增加資料安全性及穩定性
5.大量資料快速及簡易管理
6.增加可用運時間,減少維護

各階層磁碟陣列(RAID)介紹:

磁碟陣列是由2個以上的硬碟,模擬一個邏輯硬碟出現在系統中;使用磁碟陣列控制器以達成其存在,利用不同陣列形式,模擬各種層級。現在我們先來了解磁碟陣列(RAID)到底有幾種模式,一般最常提到及應用的RAID層級分為0、1、0+1、3及5。另外還有一些極少用到的RAID 4及RAID 6在此我們就不提它了。

以下就是各個階層的介紹及圖解:

RAID 0:Striping/Span (切分/延展)

RAID 1:Mirroring (磁碟鏡射)

RAID 0+1:Mirror + Striping (磁碟鏡射+切分/延展)

RAID 3:Parallel with Parity (平行同位元檢查)

RAID 5:Striping with Rotating Parity (切分/延展+輪轉同位元)


RAID 0:Striping/Span (切分/延展)
RAID 0,它是將資料儲存在2個以上的硬碟機,其將全部磁碟機的儲存容量合併,藉由將資料切分到全部的磁碟機上,進行平行讀寫,而達到提高效能增加容量。但是缺點是完全沒有容錯能力,只要有一個磁碟故障,就會導致陣列磁碟的所有資料,毀於一旦無法挽回。

RAID 1:Mirroring (磁碟鏡射)
RAID 1,必須由2個以上的硬碟所組成,由磁碟陣列(RAID)來控制,將資料同時寫入第1個與第2個硬碟,其2組硬碟上的資料完全相同,也就是其中一個硬碟是用來作備份用途;當其中有一個硬碟故障時,系統照常運作正常。RAID 1是所有RAID階層上,經濟效益最好,效能很高,極佳的資料安全性。是所有階層中使用最多最廣最符合當初RAID設計概念的一種。唯一小缺點是,其陣列磁碟容量是全部硬碟容量的一半。


RAID 0+1:Mirror + Striping (磁碟鏡射+切分/延展)
RAID 0+1,是結合了RAID 0與1兩種模式,這個階層須具備4個或以上的雙數硬碟所組成。這個模式是由2個硬碟遵守RAID 0規範,設定成一組,再由每組間遵循RAID 1的規範,使RAID 0+1擁有容錯力及整體讀寫速度與資料安全性。不過,缺點是成本很高。


RAID 3:Parallel with Parity (平行同位元檢查)
RAID 3,最少須3個硬碟或以上,這個階層的磁碟陣列具備了同位元高階智慧型演算法,利用一個硬碟來儲存其運算出來的同位元值的資料。當陣列磁碟中有一個硬碟發生故障時(當然不能是同位元碟),只要換上新硬碟後,磁碟陣列控制器就能利用同位元碟的資料,重新演算得到其舊有資料並回寫建立。因為其同位元檢查資料是將資料切割成數個區段,利用XOR演算法計算出同位元資料;而其區段以Bytes計算時,稱為RAID 3,如果是以Block計算時,就稱為RAID 4。所以RAID 3在整體讀寫效能會較慢較差,但在成本上會比RAID 0+1還省一點,其陣列磁碟整體容量計算公式為N-1。


RAID 5:Striping with Rotating Parity (切分/延展+輪轉同位元)
RAID 5,最少須3個硬碟,其工作原理與RAID 3相似,主要差別是其同位元資料沒有固定在同個硬碟,是以輪流方式儲存在每個硬碟上,故稱輪轉同位元。當磁碟陣列控制器利用XOR演算出同位元檢查資料後,會隨著資料分別寫入各台硬碟上,因此整體讀寫效能比RAID 3要好一些,當然比RAID 0要差。不過在大型資料處理時,需同時讀寫多個硬碟,而同位元檢查是由磁碟陣列控制器的XOR邏輯所控制的,所以資料處理越大越多時,一定會有所遺失,但這個階層的RAID還是可以提供很高的容錯能力。

CentOS 5 yum國內鏡像伺服器 配置檔[CentOS-Base.repo]

/etc/yum.repos.d/CentOS-Base.repo
CentOS5 yum國內鏡像伺服器 配置檔:

[base]
name=CentOS-5 - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever5&arch=$basearch&
repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://mirror.be10.com/centos/5.0/os/$basearch/
http://ftp.iasi.roedu.net/mirrors/centos.org/centos/5.0/os/$basearch/
http://ftp.hostrino.com/pub/centos/5.0/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos5

#released updates
[update]
name=CentOS-5 - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=updates
baseurl=http://mirror.be10.com/centos/5.0/updates/$basearch/
http://ftp.iasi.roedu.net/mirrors/centos.org/centos/5.0/updates/$basearch/
http://ftp.hostrino.com/pub/centos/5.0/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos5

#packages used/produced in the build but not released
[addons]
name=CentOS-5 - Addons
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=addons
baseurl=http://mirror.be10.com/centos/5.0/addons/$basearch/
http://ftp.iasi.roedu.net/mirrors/centos.org/centos/5.0/addons/$basearch/
http://ftp.hostrino.com/pub/centos/5.0/addons/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos5

#additional packages that may be useful
[extras]
name=CentOS-5 - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=extras

baseurl=http://mirror.be10.com/centos/5.0/extras/$basearch/
http://ftp.iasi.roedu.net/mirrors/centos.org/centos/5.0/extras/$basearch/
http://ftp.hostrino.com/pub/centos/5.0/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos5

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-5 - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=centosplus
baseurl=http://mirror.be10.com/centos/5.0/centosplus/$basearch/
http://ftp.iasi.roedu.net/mirror ... tos/5.0/centosplus/$basearch/
http://ftp.hostrino.com/pub/centos/5.0/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos5

#contrib - packages by Centos Users
[contrib]
name=CentOS-5 - Contrib
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=contrib
baseurl=http://mirror.be10.com/centos/5.0/contrib/$basearch/
http://ftp.iasi.roedu.net/mirrors/centos.org/centos/5.0/contrib/$basearch/
http://ftp.hostrino.com/pub/centos/5.0/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos5

uClinux下Nor Flash的JFFS2檔系統構建


嵌入式系統正隨著Internet的發展而在各個領域得到廣泛的應用,作為嵌入式應用的核心,嵌入式Linux以其自由軟體特性正日益被人們看好。Linux具有內核小、效率高、源代碼開放等優點,還內涵了完整的TCP/IP網路協定,因此非常適於嵌入式系統的應用。而作為專門運行於沒有MMU的微處理器的嵌入式作業系統,uClinux更是得到廣泛應用。
當前的嵌入式系統開發,需要方便靈活的使用Flash。NOR和NAND是現在市場上兩種主要的非易失快閃記憶體技術。Intel于1988年首先開發出NOR flash技術,徹底改變了原先由EPROM和EEPROM一統天下的局面。NOR的特點是晶片內執行XIP eXe-cute In Place,這樣應用程式可以直接在flash快閃記憶體內運行,不必再把代碼讀到系統RAM中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,因此在嵌入式系統得到廣泛的應用。

1 JFFS2檔系統簡介
uClinux通常默認ROMFS作為根檔系統,它相對於一般的EXT2檔系統具有節約空間的優點。但是ROMFS是一種唯讀的檔系統,不支援動態擦寫保存。雖然對於需要動態保存的資料可以採用虛擬ram盤的方法來保存,但當系統掉電後,ram盤的內容將全部丟失,而不能永久保存,因此需要實現一個可讀寫的檔系統。JFFS2檔系統便是一個很好的選擇。
JFFS檔系統是瑞典Axis通信公司開發的一種基於Flash的日誌檔系統,它在設計時充分考慮了Flash的讀寫特性和用電池供電的嵌入式系統的特點,在這類系統中必需確保在讀取檔時,如果系統突然掉電,其檔的可靠性不受到影響。對Red Hat的David Woodhouse進行改進後,形成了JFFS2。主要改善了存取策略以提高FLASH的抗疲勞性,同時也優化了碎片整理性能,增加了資料壓縮功能。需要注意的是,當檔系統已滿或接近滿時,JFFS2會大大放慢運行速度。這是因為垃圾收集的問題。
JFFS2的底層驅動主要完成檔系統對Flash晶片的訪問控制,如讀、寫、擦除操作。在Linux中這部分功能是通過調用MTD(memory technology device記憶體技術設備)驅動實現的。相對於常規塊設備驅動程式,使用 MTD 驅動程式的主要優點在於 MTD 驅動程式是專門為基於快閃記憶體的設備所設計的,所以它們通常有更好的支持、更好的管理和更好的基於磁區的擦除和讀寫操作的介面。MTD相當於在硬體和上層之間提供了一個抽象的介面,可以把它理解為FLASH的設備驅動程式,它主要向上提供兩個介面:MTD字元設備和MTD塊設備。通過這兩個介面,就可以象讀寫普通檔一樣對FLASH設備進行讀寫操作。經過簡單的配置後,MTD在系統啟動以後可以自動識別支援CFI或JEDEC介面的FLASH晶片,並自動採用適當的命令參數對FLASH進行讀寫或擦除。
JFFS2在uClinux中有兩種使用方式,一種是作為根檔系統,另一種是作為普通檔系統在系統啟動後被掛載。考慮到實際應用中需要動態保存的資料並不多,且在Linux系統目錄樹中,根目錄和/usr等目錄主要是讀操作,只有少量的寫操作,但是大量的讀寫操作又發生在/var和/tmp目錄(這是因為在系統運行過程中產生大量log檔和暫存檔案都放在這兩個目錄中),因此,通常選用後一種方式。根檔指的是Romfs、var和/tmp,目錄採用Ramfs,當系統斷電後,該目錄所有的資料都會丟失。
綜上所述,通常在uClinux下採用的檔系統構成如圖1所示。對於本文來說,圖中Romfs和Ramfs兩個檔系統的實現是很方便的,主要需要實現的是Nor Flash的底層MTD驅動,下面就以SST39VF160晶片為例來介紹MTD的驅動設計方法。

2 JFFS2底層MTD驅動設計
本文採用的系統以三星公司的SND-100為母板,CPU為ARM7TDMI晶片S3C4510B,16M的SDRAM,Nor Flash為SST39VF160,容量為1M×16bit,速度為70ns,通過16位元資料匯流排與CPU交換資料,擦寫次數典型值為10萬次。
在\linux-2.4.x\drivers\mtd\maps目錄下,每一個檔都是一個具體的MTD原始設備的相關資訊,包括該MTD原始設備的起始物理位址、大小、分區情況、讀寫函數、初始化和清除程式。設計時,需要對SST39VF160編寫相關的程式,假設為S3C4510B.C。則需要進行以下幾點操作:
(1) 定義SST39VF160在系統中的起始位址、大小、匯流排寬度
#define WINDO DDR 0x1000000|0x04000000 //注意FLASH分區地址必須是non-cacheble
#define WINDOW SIZE 0x200000
#define BUSWIDTH 2
(2) 定義SST39VF160分區
典型的記憶體分區應包括:內核引導區、Linux內核區、應用區。其中內核引導區用來保存內核載入程式,Linux內核區存放的是經過壓縮的uClinux內核,應用區則用來保存用戶的資料和應用程式,該區設為我們要採用的JFFS2檔系統。具體如下:
static struct mtd_partition s3c4510_partitions[]={
{
name: ″bootloader(128K)″,
size: 0x20000,
offset: 0x0000,
mask_flags:MTD_WRITEABLE //設置成唯讀區域
},
{
name: ″uClinux_kernel(832K)″,
size: 0xd0000,
offset: 0x20000,
},
{
name: ″jffs2 (1088K)″,
size: 0x110000,
offset: 0xf0000
}
};
(3) 定義SST39VF160位元組、半字、字的讀寫操作函數。
(4) 初始化SST39VF160函數int_init init_s3c4510b()。
該操作主要包括兩個方面:第一是調用do map probe()檢測搜索MTD設備。通常檢測方式有兩種:cfi probe和jedec probe,這裏採用後一種,該方法在jedec_probe.c檔中定義。另外,jedec probe.c中定義了各種jedec probe類型晶片的資訊,有些linux版本沒有包含SST39VF160,需要手動添加;而操作的第二方面則是調用add_mtd_partitions()以將your_partiton的各個分區加入mtd_table。

3 內核相關配置的設定
3.1 內核配置檔設置
為使內核支持JFFS2,需在內核配置選項功能表裏選擇相關選項。首先把SST39VF160的MTD驅動加入配置功能表。並在mtd/maps/Config.in檔中加入如下程式:
if[″$CONFIG ARM″= ″y″]; then
dep_tristate′CFI Flash device mapped on Samsung S3C4510B′CONFIG_MTD_S3C4510B $CONFIG_MTD_CFI
相應\mtd\maps\Makefile文件加入
obj_$(CONFIG_MTD_S3C4510B)+=s3c4510b.o
其次選擇Menuconfig下的配置選項。
在linux Kernel v2.4.20-uc0 Configuration下
Memory Technology DevicesMTD下
CONFIG_MTD=Y
CONFIG_MTD_DEBUG=Y
CONFIG_MTD_DEBUG_VERBOSE=3
CONFIG_MTD_PARTITIONS=Y
CONFIG_MTD_CHAR=Y
CONFIG_MTD_BLOCK=Y
RAM/ROM/Flash chip drivers下
CONFIG_MTD_CFI=Y
CONFIG_MTD_JEDECPROBE=Y
CONFIG_MTD_CFI_AMDSTD=Y
Mapping drivers for chip access下
CONFIG_S3C4510B=Y
File systems下
CONFIG_JFFS2_FS=Y
CONFIG_JFFS2_FS_DEBUG=2
在uClinux v1.3.4 Configuration下
Flash Tools下
CONFIG_USER_MTDUTILS=Y
CONFIG_USER_MTDUTILS_ERASE=Y
CONFIG_USER_MTDUTILS_ERASEALL=Y
CONFIG_USER MTDUTILS_MKFSJFFS2=Y
BusyBox下選中cat,cp,dd, mount,umount,mkdir工具。
3.2 MTD塊設備配置
下面是修改系統塊設備的主設備號。默認情況下,MTDBLOCK主設備號為31,與BLKMEM的主設備號衝突,因此 修改\mtd\mtd.h中 MTD BLOCK MAJOR的值為30。
接著應添加MTD設備節點到/vender/--你所使用的目的機類型--/Makefile檔中。其中字元設備的主設備號為90,次設備號為0、2、4、6...(奇數次設備號為唯讀設備),塊設備的主設備號為31,次設備號為0、1、2、3。可按以下方式增加DEVICES目標:
mtd0,c,90,0 mtd1,c,90,1 mtd2,c,90,2
mtdblock0,b,30,0 mtdblock1,b,30,1 mtd-block2,b,30,2
做完以上步驟,可以運行內核編譯命令make dep, make 以對內核進行編譯。
當系統啟動時,可以看到以下資訊:
s3c4510b flash device: 200000 at 5000000
Found: SST SST39VF160
number of JEDEC chips: 1
Creating 3 MTD partitions on ″S3C4510B flash de-vice″:
0x00000000-0x00020000: ″bootloader(128K)″
mtd:Giving out device 0 to bootloader(128K)
0x00020000-0x00f0000:″uClinux_kernel(832K)″
mtd: Giving out device 1 to uClinux_kernel(832K)
0x00f0000-0x00200000:″jffs2_usr(1088K)″
mtd: Giving out device 2 to jffs2_usr(1088K)
init_mtdchar: allocated major number 90.
init_mtdblock: allocated major number 31.
……
3.3 創建檔系統鏡像檔
系統會編譯生成JFFS2的輔助工具:mkfs.jffs2、eraseall、erase。其中mkfs.jffs2會產生JFFS2檔系統鏡像的工具,eraseall和erase用來對FLASH晶片的擦除。mkfs.jffs的使用方法如下:mkfs.jffs -d 根目錄 -b| l -e 擦除塊大小 -o 輸出檔 -v 0-9 -q。
另外,為了使系統在啟動時自動掛載建好的JFFS2檔系統,在啟動腳本裏應加入:
mount -t jffs2 /dev/mtdblock2 /mnt4 結束語
本文討論了在uClinux下建立基於Nor Flash的JFFS2的檔系統的一般步驟。Nor Flash的特性決定了它在對資料存儲要求不高的嵌入式系統中有著廣泛的應用,因此JFFS2檔系統對Flash上的資料管理非常方便。對於一些高端的掌上設備來說,Nand Flash更為適合,其單元存儲密度比較高,成本較低,這樣系統可以在不增加成本的情況下擴大存儲容量。目前有一種新型的檔系統YAFFS更適於Nand Flash,本文不再予以討論。

2007年8月26日 星期日

嵌入式Linux檔系統及其存儲機制分析

嵌入式系統與通用PC機不同,一般沒有硬碟這樣的存儲設備而是使用Flash快閃記憶體晶片、小型快閃記憶體卡等專為嵌入式系統設計的存儲裝置,本文分析了嵌入式系統中常用的存儲設備及其管理機制,介紹了常用的基於FLASH的檔系統類型。
1.嵌入式系統存儲設備及其管理機制分析

構建適用於嵌入式系統的Linux檔系統,必然會涉及到兩個關鍵點,一是檔系統類型的選擇,它關係到檔系統的讀寫性能、尺寸大小;另一個就是根檔系統內容的選擇,它關係到根檔系統所能提供的功能及尺寸大小。

嵌入式設備中使用的記憶體是像Flash快閃記憶體晶片、小型快閃記憶體卡等專為嵌入式系統設計的存儲裝置。Flash是目前嵌入式系統中廣泛採用的主流記憶體,它的主要特點是按整體/磁區擦除和按位元組編程,具有低功耗、高密度、小體積等優點。目前,Flash分為NOR, NAND兩種類型。

NOR型快閃記憶體可以直接讀取晶片內儲存的資料,因而速度比較快,但是價格較高。NOR型晶片,位址線與資料線分開,所以NOR型晶片可以像SR

AM一樣連在資料線上,對NOR晶片可以“字”為基本單位操作,因此傳輸效率很高,應用程式可以直接在Flash內運行,不必再把代碼讀到系統RAM中運行。它與SRAM的最大不同在於寫操作需要經過擦除和寫入兩個過程。

NAND型快閃記憶體晶片共用位址線與資料線,內部資料以塊為單位進行存儲,直接將NAND晶片做啟動晶片比較難。NAND快閃記憶體是連續存儲介質,適合放大檔。擦除NOR器件時是以64-128KB的塊進行的,執行一個寫入/擦除操作的時間為5s;擦除NAND器件是以8-32KB的塊進行的,執行相同的操作最多只需要4ms。

NAND Rash的單元尺寸幾乎是NOR器件的一半,由於生產過程更為簡單,NAND結構可以在給定的模具尺寸內提供更高的容量,也就相應地降低了價格。NOR flash佔據了容量為1―16MB快閃記憶體市場的大部分,而NAND flash只是用在8―128MB的產品當中,這也說明NOR主要應用在代碼存儲介質中,NAND適合於資料存儲。

壽命(耐用性),在NAND快閃記憶體中每個塊的最大擦寫次數是一百萬次,而NOR的擦寫次數是十萬次。NAND記憶體除了具有10比1的塊擦除週期優勢,典型的NAND塊尺寸要比NOR器件小8倍,每個NAND記憶體塊在給定的時間內的刪除次數要少一些。

所有嵌入式系統的啟動都至少需要使用某種形式的永久性存儲設備,它們需要合適的驅動程式,當前在嵌入式Linux中有三種常用的塊驅動程式可以選擇。

● Blkmem驅動層

Blkmem驅動是為uclinux專門設計的,也是最早的一種塊驅動程式之一,現在仍然有很多嵌入式Linux作業系統選用它作為塊驅動程,尤其是在uClinux中。它相對來說是最簡單的,而且只支持建立在NOR型Flash和RAM中的根檔系統。使用Blkmem驅動,建立Flash分區配置比較困難,這種驅動程式為Flash提供了一些基本擦除/寫操作。

● RAMdisk驅動層

RAMdisk驅動層通常應用在標準Linux中無盤工作站的啟動,對Flash記憶體並不提供任何的直接支援, RAM disk就是在開機時,把一部分的記憶體虛擬成塊設備,並且把之前所準備好的檔案系統映射解壓縮到該RAM disk環境中。當在Flash中放置一個壓縮的檔系統,可以將檔系統解壓到RAM,使用RAM disk驅動層支援一個保持在RAM中的檔系統。

● MTD驅動層

為了盡可能避免針對不同的技術使用不同的工具,以及為不同的的技術提供共同的能力,Linux內核納入了MTD子系統(memory Technology Device)。它提供了一致且統一的介面,讓底層的MTD晶片驅動程式無縫地與較高層介面組合在一起。
JFFS2, Cramfs, YAFFS等檔系統都可以被安裝成MTD塊設備。MTD驅動也可以為那些支援CFI介面的NOR型Flash提供支援。雖然MTD可以建立在RAM上,但它是專為基於Flash的設備而設計的。MTD包含特定Flash晶片的驅動程式,開發者要選擇適合自己系統的Flash晶片驅動。Flash晶片驅動向上層提供讀、寫、擦除等基本的操作,MTD對這些操作進行封裝後向用戶層提供MTD char和MTD block類型的設備。
MTD char類型的設備包括/dev/mtd0, /dev/mtdl等,它們提供對Flash原始字元的訪問。MTD block類型的設備包括/dev/mtdblock0,/dev/mtdblock1等,MTD block設備是將Flash類比成塊設備,這樣可以在這些類比的塊設備上創建像Cramfs, JFFS2等格式的檔系統。

MTD驅動層也支持在一塊Flash上建立多個Flash分區,每一個分區作為了一個MTD block設備,可以把系統軟體和資料等分配到不同的分區上,同時可以在不同的分區採用不用的檔系統格式。這一點非常重要,正是由於這一點才為嵌入式系統多檔系統的建立提供了靈活性。
2. 基於Flash的檔系統

鑒於Flash存儲介質的讀寫特點,傳統的Linux檔系統己經不適合應用在嵌入式系統中,像Ext2fs檔系統是為像IDE那樣的塊設備設計的,這些設備的邏輯塊是512位元組、1024位元組等大小,沒有提供很好的磁區

擦寫支持,不支持損耗平衡,沒有掉電保護,也沒有特別完美的磁區管理,這不太適合於磁區大小因設備類型而劃分的快閃記憶體設備。基於這樣的原因,產生了很多專為Flash設備而設計的檔系統,常見的專用於快閃記憶體設備的檔系統如下:

● Romfs

傳統型的Romfs檔系統是最常使用的一種檔系統,它是一種簡單的、緊湊的、唯讀的檔系統,不支援動態擦寫保存;它按順序存放所有的檔資料,所以這種檔系統格式支援應用程式以XIP方式運行,在系統運行時,可以獲得可觀的RAM節省空間。uClinux系統通常採用Romfs檔系統。

● Cramfs

Cramfs是Linux的創始人Linus Torvalds開發的一種可壓縮唯讀檔案系統在Cramfs檔系統中,每一頁被單獨壓縮,可以隨機頁訪問,其壓縮比高達2:1,為嵌入式系統節省大量的Flash存儲空間。Cramfs檔系統以壓縮方式存儲,在運行時解壓縮,所以不支援應用程式以XIP方式運行,所有的應用程式要求被拷到RAM裏去運行,但這並不代表比Ramfs需求的RAM 空間要大一點,因為Cramfs是採用分頁壓縮的方式存放檔案,在讀取檔案時,不會一下子就耗用過多的記憶體空間,只針對目前實際讀取的部分分配記憶體,尚沒有讀取的部分不分配記憶體空間,當我們讀取的檔案不在記憶體時, Cramfs檔系統自動計算壓縮後的資料所存的位置,再即時解壓縮到RAM中。

另外,它的速度快,效率高,其唯讀的特點有利於保護檔系統免受破壞,提高了系統的可靠性;但是它的唯讀屬性同時又是它的一大缺陷,使得用戶無法對其內容對進擴充。Cramfs映射通常是放在Flash中,但是也能放在別的檔系統裏,使用loopback設備可以把它安裝別的檔系統裏。使用mkcramfs工具可以創建Cramfs映射。

● Ramfs/Tmpfs

Ramfs也是Linus Torvalds開發的,Ramfs檔系統把所有的檔都放在RAM裏運行,通常是Flash系統用來存儲一些臨時性或經常要修改的資料,相對於ramdisk來說,Ramfs的大小可以隨著所含檔內容大小變化,不像ramdisk的大小是固定的。Tmpfs是基於記憶體的檔系統,因為tmpfs駐留在RAM 中,所以寫/讀操作發生在RAM 中。tmpfs檔系統大小可隨所含檔內容大小變化,使得能夠最理想地使用記憶體;tmpfs駐留在RAM,所以讀和寫幾乎都是暫態的。tmpfs的一個缺點是當系統重新引導時會丟失所有資料。

● JFFS2

JFFS2是RedHat公司基於JFFS開發的快閃記憶體檔系統,最初是針對RedHat公司的嵌入式產品eCos開發的嵌入式檔系統,所以JFFS2也可以用在Linux,uCLinux中。JFFS檔系統最早是由瑞典Axis Communications公司基於Linux2.0的內核為嵌入式系統開發的檔系統。JFFS2是一個可讀寫的、壓縮的、日誌型檔系統,並提供了崩潰/掉電安全保護,克服了JFFS的一些缺點:使用了基於哈希表的日誌節點結構,大大加快了對節點的操作速度;支持資料壓縮;提供了“寫平衡”支援;支持多種節點類型;提高了對快閃記憶體的利用率,降低了記憶體的消耗。這些特點使JFFS2檔系統成為目前Flash設備上最流行的檔系統格式,它的缺點就是當檔系統已滿或接近滿時,JFFS2運行會變慢,這主要是因為碎片收集的問題。
● YAFFS

YAFFS/YAFFS2是一種和JFFSx類似的快閃記憶體檔系統,它是專為嵌入式系統使用NAND型快閃記憶體而設計的一種日誌型檔系統。和JFFS2相比它減少了一些功能,所以速度更快,而且對記憶體的佔用比較小。此外,YAFFS自帶NAND晶片的驅動,並且為嵌入式系統提供了直接訪問檔系統的API,用戶可以不使用Linux中的MTD與VFS,直接對檔系統操作。YAFFS2支援大頁面的NAND設備,並且對大頁面的NAND設備做了優化。JFFS2在NAND快閃記憶體上表現並不穩定,更適合於NOR快閃記憶體,所以相對大容量的NAND快閃記憶體,YAFFS是更好的選擇。

在具體的嵌入式系統設計中可根據不同目錄存放的內容不同以及存放的檔屬性,確定使用何種檔系統。