導航:首頁 > 操作系統 > linux內核打補丁

linux內核打補丁

發布時間:2023-01-31 22:48:15

Ⅰ 怎樣為linux內核打補丁

1.進入你的工作文件夾(cd /usr/src/linux);
2.解壓 linux-2.4.18.tar.gz包(tar -zxf linux-2.4.18.tar.gz),會在當前目錄生成一個名為 linux-2.4.18或linux的文件夾;
3.進入此文件夾,執行zcat ../patch-2.4.18.gz | patch -p2
4.結束

Ⅱ 如何將linux2.6.38內核移植到TQ2440

移植步驟:
1.修改根目錄的Makefile中的ARCH=arm,CROSS-COMPILE=arm-linux-
2.在arch/arm/mach-s3c2440/mach-smdk2440.c中,將163行的s3c24xx_init_clocks(16934400)改為s3c24xx_init_clocks(12000000)。
3.修改arch/arm/tools/mach-types中379行的362改為168,因為uboot中定義的機器碼是168.
4.修改arch/arm/boot/中的Makefile文件,在58行添加@cp -f arch/arm/boot/zImage zImage.bin,實現把生成的zImage文件復制到內核源碼根目錄下。
5.在根目錄的Makefile的1164行添加rm -f zImage.bin,使得在執行make distclean在清除產生的文件的同時,把內核根目錄下的zImage也清除。
6.修改arch/arm/plat-s3c24xx/common-smdk.c中111行的static struct mtd_partition smdk_default_nand_part[]的nandflash分區為:
[0] = {
.name = "Andy_uboot",
.offset = 0x00000000,
.size = 0x00040000,
},
[1] = {
.name = "Andy_kernel",
.offset = 0x00200000,
.size = 0x00200000,
},
[2] = {
.name = "Andy_yaffs2",
.offset = 0x00400000,
.size = 0x0FB80000,
}
7.修改drivers/mtd/nand/s3c2410.c中的839行為chip->ecc.mode=NAND_ECC_NONE;
8.修改arch/arm/mach-s3c2440/mach-smdk2440.c中100行為.ulcon = 0x03。
9.在drivers/serial/samsung.c的51行添加
#include
#include
在433行添加:
if (port->line == 2) {
s3c2410_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2);
s3c2410_gpio_pullup(S3C2410_GPH(6), 1);
s3c2410_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);
s3c2410_gpio_pullup(S3C2410_GPH(7), 1);
}
10.用git工具下載最新的yaffs2源代碼。
具體為在終端輸入git clone git://www.aleph1.co.uk/yaffs2下載最新的yaffs2,下
載完成給內核打補丁,進入yaffs目錄,執行
./patch-kernel.sh c m opt/Andy/linux-2.6.38(以自己的內核目錄為准),其中的c代表復制,m代表復合類型。
11.用make menuconfig配置linux內核。
12.執行make zImage,將生成的zImage.bin下載到TQ2440。
13.製作文件系統。
解壓busybox-1.18.4.tar.bz2,修改busybox-1.18.4中的Makefile,在164行和190行分別修改為CROSS-COMPILE=arm-linux-和ARCH=arm。執行make,然後在執行make install。將生成_install復制到根目錄,添加文件系統文件,用天嵌提供的mkyaffs2image生成root.bin的可執行文件,下載到開發板。
14.啟動開發板,列印信息如下:
Start Linux ...
Copy linux kernel from 0x00200000 to 0x30008000, size = 0x00200000 ... Copy Kernel to SDRAM done,NOW, Booting Linux......
Uncompressing Linux... done, booting the kernel.
Linux version 2.6.38-Andy (root@Andy) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-176) ) #15 Fri Apr 8 20:21:42 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: Andy's TQ2440 development board!
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60896k/60896k available, 4640k reserved, 0K highmem
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xf6000000 ( 792 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
moles : 0xbf000000 - 0xc0000000 ( 16 MB)
.init : 0xc0008000 - 0xc0025000 ( 116 kB)
.text : 0xc0025000 - 0xc0399000 (3536 kB)
.data : 0xc039a000 - 0xc03bac40 ( 132 kB)
SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
NR_IRQS:85
irq: clearing pending ext status 00080000
irq: clearing subpending status 00000003
irq: clearing subpending status 00000002
Console: colour mmy device 80x30
console [ttySAC0] enabled
Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
gpiochip_add: gpios 288..303 (GPIOK) failed to register
gpiochip_add: gpios 320..334 (GPIOL) failed to register
gpiochip_add: gpios 352..353 (GPIOM) failed to register
NET: Registered protocol family 16
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C24XX DMA Driver, Copyright 2003-2006 Simtec Electronics
DMA channel 0 at c4808000, irq 33
DMA channel 1 at c4808040, irq 34
DMA channel 2 at c4808080, irq 35
DMA channel 3 at c48080c0, irq 36
S3C244X: Clock Support, DVS off
bio: create slab at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
s3c-i2c s3c2440-i2c: slave address 0x10
s3c-i2c s3c2440-i2c: bus frequency set to 97 KHz
s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
Advanced Linux Sound Architecture Driver Version 1.0.23.
cfg80211: Calling CRDA to update world regulatory domain
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered udp transport mole.
RPC: Registered tcp transport mole.
RPC: Registered tcp NFSv4.1 backchannel transport mole.
msgmni has been set to 118
io scheler noop registered (default)
s3c2440-uart.0: ttySAC0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1: ttySAC1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2: ttySAC2 at MMIO 0x50008000 (irq = 76) is a S3C2440
loop: mole loaded
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand: Tacls=2, 20ns Twrph0=6 60ns, Twrph1=2 20ns
s3c24xx-nand s3c2440-nand: NAND ECC disabled
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
NAND_ECC_NONE selected by board driver. This is not recommended !!
Scanning device for bad blocks
Bad eraseblock 62 at 0x0000007c0000
Bad eraseblock 1435 at 0x00000b360000
cmdlinepart partition parsing not available
Creating 3 MTD partitions on "NAND":
0x000000000000-0x000000040000 : "Andy_uboot"
0x000000200000-0x000000400000 : "Andy_kernel"
0x000000400000-0x00000ff80000 : "Andy_yaffs2"
dm9000 Ethernet Driver, V1.31
Now use the default MAC address: 10:23:45:67:89:ab
eth0: dm9000e at c4810000,c4814004 IRQ 51 MAC: 10:23:45:67:89:ab (EmbedSky)
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
usb usb1: New USB device found, idVendor=1d6b, idProct=0001
usb usb1: New USB device strings: Mfr=3, Proct=2, SerialNumber=1
usb usb1: Proct: S3C24XX OHCI
usb usb1: Manufacturer: Linux 2.6.38-Andy ohci_hcd
usb usb1: SerialNumber: s3c24xx
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usbcore: registered new interface driver usbserial
usbserial: USB Serial Driver core
USB Serial support registered for pl2303
usbcore: registered new interface driver pl2303
pl2303: Prolific PL2303 USB to serial adaptor driver
s3c2410_udc: debugfs dir creation failed -19
mousedev: PS/2 mouse device common for all mice
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c-rtc s3c2410-rtc: rtc disabled, re-enabling
s3c-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
i2c /dev entries driver
S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
ALSA device list:
No soundcards found.
TCP cubic registered
lib80211: common routines for IEEE802.11 drivers
s3c-rtc s3c2410-rtc: setting system clock to 2000-01-02 00:47:19 UTC (946774039)
yaffs: dev is 32505858 name is "mtdblock2" rw
yaffs: passed flags ""
VFS: Mounted root (yaffs filesystem) on device 31:2.
Freeing init memory: 116K
Please press Enter to activate this console.
移植過程中產生的問題及其解決方法將在下一節說明。還有一些驅動沒有移植。繼續努力!

在移植linux2.6.38過程中,遇見了很多的問題,通過在網上查閱相關信息和在圖書館不停的查閱資料,終於成功了。下面將移植過程中產生的問題及其解放方法與大家共享一下。
1、編譯內核時yaffs2出現unknown field 'clear_inode' specified in initializer的
錯誤,原因是所下載的yaffs2不支持linux2.6.38.
解決方法:最新的yaffs2採用git發布,所以採用git工具下載最新的yaffs2源代碼。
具體為在終端輸入git clone git://www.aleph1.co.uk/yaffs2下載最新的yaffs2,下
載完成給內核打補丁,進入yaffs目錄,執行
./patch-ker.sh c m opt/Andy/linux-2.6.38(以自己的內核目錄為准),其中的c代表復制,m代表復合類型。

2、移植linux內核到開發板後,出現data abort的錯誤,錯誤原因為內核大小超過了2M,
天嵌的Uboot只分配給內核2M的空間,所以報錯。
解決方法:精簡內核,使其小於2M。或者修改Uboot,是內核大小大於2M。
所以個人認為天嵌的Uboot值得改進,下一步我將移植Uboot,用自己的Uboot就不存在這個問題了。嘿嘿

3.移植內核時,出現Uncompressing Linux... done, booting the kernel後,系統不能啟動,網上好多人說是因為在menuconfig選項中的Boot options中的Default kernel command string中沒有設置noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 rootfs=yaffs2 rw。其實不用設置這個參數也可以,我採用在內核配置文件中將Kernel Feature/Provide old way to pass kernel parameters選上就行了,因為天嵌用的bootloader太老了,從列印的內核信息中就可以看出。(ATAG_INITRD is deprecated; please update your bootloader.)

4.內核啟動時,出現Failed to execute /linuxrc的錯誤,原因是:
(1)文件系統中沒有包含linuxrc的可執行文件。在文件系統中添加linuxrc就可完成linux的啟動。
(2)在/driver/mtd/nand/s3c2410.c中將chip->ecc.mode = NAND_ECC_SOFT;改為chip->ecc.mode = NAND_ECC_NONE;並在配置內核中將Samsung S3C NAND Hardware ECC選項刪掉。
這個問題糾結了我好久,我遇見這個問題後,先嘗試用nfs掛載,能夠掛載上,所以我確定肯定是nandflash出了問題了,以為nandflash壞了(因為被我不停的擦寫,嘿嘿),後來用天嵌自帶的鏡像試了是好的,我就明白了,估計是我的nand驅動有問題了,仔細檢查驅動,發現內核配置中的Samsung S3C NAND Hardware ECC沒有去掉,,一個小小的問題折磨了我這么久。所以一定一定要仔細啊。

5.編譯串口驅動是出現error: implicit declaration of function 's3c2410_gpio_cfgpin'的錯誤,是因為內核版本2.6.38的內核定義s3c2410_gpio_cfgpin是在linux/gpio.h中,所以添加#include 後即可。

6.編譯串口驅動是出現error: 'S3C2410_GPH6' undeclared (first use in this function)是因為在內核版本2.6.38的內核定義s3c2410_gpio_cfgpin的函數變數採用的是S3C2410_GPH(6),而非S3C2410_GPH6,將其改為S3C2410_GPH(6)即可解決問題。

7.linux內核2.6.38的串口程序samsung.c在/driver/tty/serial中。這里與原來的內核版本不一致。這個要注意,內核版本改了,介面也改了,我當時找不到samsung.c,然後通過find命令一看,暈,原來在這裡面。

8.在添加yaffs2內核支持時,找不到Kconfig,復制Yaffs2文件夾中的Kconfig_muti到linux內核的fs/yaffs2中,並將Kconfig_muti修改為Kconfig。

Ⅲ Linux日誌式文件系統面面觀

文件系統是用來管理和組織保存在磁碟驅動器上的數據的系統軟體,其實現了數據完整性的保 證,也就是保證寫入磁碟的數據和隨後讀出的內容的一致性。除了保存以文件方式存儲的數據以外,一個文件系統同樣存儲和管理關於文件和文件系統自身的一些重要信息(例如:日期時間、屬主、訪問許可權、文件大小和存儲位置等等)。這些信息通常被稱為元數據(metadata)。

由於為了避免磁碟訪問瓶頸效應,一般文件系統大都以非同步方式工作,因此如果磁碟操作被突然中斷可能導致數據被丟失。例如如果出現這種情況:如果當你處理一個在linux的ext2文件系統上的文檔,突然機器崩潰會出現什麼情況?

有這幾種可能:

*當你保存文件以後,系統崩潰。這是最好的情況,你不會丟失任何信息。只需要重新啟動計算機然後繼續工作。

*在你保存文件之前系統崩潰。你會丟失你所有的工作內容,但是老版本的文檔還會存在。

*當正在將保存的文檔寫入磁碟時系統崩潰。這是最糟的情況:新版文件覆蓋了舊版本的文件。這樣磁碟上只剩下一個部分新部分舊的文件。如果文件是二進制文件那麼就會出現不能打開文件的情況,因為其文件格式和應用所期待的不同。

在最後這種情況下,如果系統崩潰是發生在驅動器正在寫入元數據時,那麼情況可能更糟。這時候就是文件系統發生了損壞,你可能會丟失整個目錄或者整個磁碟分區的數據。

linux標准文件系統(ext2fs)在重新啟動時會通過調用文件掃描工具fsck試圖恢復損壞的元數據信息。由於ext2文件系統保存有冗餘的關鍵元數據信息的備份,因此一般來說不大可能出現數據完全丟失。系統會計算出被損壞的數據的位置,然後或者是通過恢復冗餘的元數據信息,或者是直接刪除被損壞或是元數據信息損毀的文件。

很明顯,要檢測的文件系統越大,檢測過程費時就越長。對於有幾十個G大小的分區,可能會花費很長時間來進行檢測。由於Linux開始用於大型伺服器中越來越重要的應用,因此就越來越不能容忍長時間的當機時間。這就需要更復雜和精巧的文件系統來替代ext2。

因此就出現了日誌式文件系統(journalling filesystems)來滿足這樣的需求。

什麼是日誌式文件系統

這里僅僅對日誌式文件系統進行簡單的說明。如果需要更深入的信息請參考文章日誌式文件系統,或者是日誌式文件系統介紹。

大多數現代文件系統都使用了來自於資料庫系統中為了提高崩潰恢復能力而開發的日誌技術。磁碟事務在被真正寫入到磁碟的最終位置以前首先按照順序方式寫入磁碟中日誌區(或是log區)的特定位置。

根據日誌文件系統實現技術的不同,寫入日誌區的信息是不完全一樣的。某些實現技術僅僅寫文件系統元數據,而其他則會記錄所有的寫操作到日誌中。

現在,如果崩潰發生在日誌內容被寫入之前發生,那麼原始數據仍然在磁碟上,丟失的僅僅是最新的更新內容。如果當崩潰發生在真正的寫操作時(也就是日誌內容已經更新),日誌文件系統的日誌內容則會顯示進行了哪些操作。因此當系統重啟時,它能輕易根據日誌內容,很快地恢復被破壞的更新。

在任何一種情況下,都會得到完整的數據,不會出現損壞的分區的情況。由於恢復過程根據日誌進行,因此整個過程會非常快只需要幾秒鍾時間。

應該注意的是使用日誌文件系統並不意味著完全不需要使用文件掃描工具fsck了。隨機發生的文件系統的硬體和軟體錯誤是根據日誌是無法恢復的,必須藉助於fsck工具。

目前Linux環境下的日誌文件系統

在下面的內容里將討論三種日誌文件系統:第一種是ext3,由Linux內核Stephen Tweedie開發。ext3是通過向ext2文件系統上添加日誌功能來實現的,目前是redhat7.2的默認文件系統;Namesys開發的ReiserFs日誌式文件系統,可以下載,目前Mandrake8.1採用該日誌式文件系統。SGI在2001年三月發布了XFS日誌式文件系統。可以在 oss.sgi.com/projects/xfs/下載。下面將對這三種日誌文件系統採用不同的工具進行檢測和性能測試。

安裝ext3

關於ext3文件系統技術方面的問題請參考Dr. Stephen Tweedie的論文和訪談。ext3日誌式文件系統直接來自於其祖先ext2文件系統。其具有完全向後兼容的關鍵特性,實際上其僅僅是在ext2日誌式文件系統上添加了日誌功能。其最大的缺點是沒有現代文件系統所具有的能提高文件數據處理速度和解壓的高性能。

ext3從 2.2.19開始是作為一個補丁方式存在的。如果希望對內核添加對ext3文件系統的支持,就需要使用補丁,可以得到補丁程序,一共需要如下文件:

* ext3-0.0.7a.tar.bz2:內核補丁

* e2fsprogs-1.21-WIP-0601.tar.bz2 支持ext3的e2fsprogs程序套件

拷貝linux-2.2.19.tar.bz2和ext3-0.0.7a.tar.bz2到/usr/src目錄下,進行解壓:

mv linux linux-old

tar -Ixvf linux-2.2.19.tar.bz2

tar -Ixvf ext3-0.0.7a.tar.bz2

cd linux

cat ../ext3-0.0.7a/linux-2.2.19.kdb.diff | patch -sp1

cat ../ext3-0.0.7a/linux-2.2.19.ext3.diff | patch -sp1

首先對內核添加SGI的kdb內核調試器補丁,第二個是ext3文件系統補丁。下來就需要配置內核,對文件系統部分的"Enable Second extended fs development code"回答Yes。然後編譯。

內核編譯安裝以後,需要安裝e2fsprogs軟體套件:

tar -Ixvf e2fsprogs-1.21-WIP-0601.tar.bz2

cd e2fsprogs-1.21

./configure

make

make check

make install

下來要做的工作就是在分區上創建一個ext3文件系統,使用新內核重新啟動,這時候你有兩種選擇創建新的日誌文件系統或者對一個已有的ext2文件系統升級到ext3日誌文件系統。

對於需要創建新ext3文件系統的情況下,只需要使用安裝的e2fsprogs軟體包中的mke2fs命令加-f參數就可以創建新的ext3文件系統:

mke2fs -j /dev/xxx

這里/dev/xxx是希望創建ext3文件系統的新分區。-j參數表示創建ext3而不是ext2文件系統。可以使用參數"-Jsize="來指定希望的日誌區大小(n單位為M)。

升級一個已有的ext2,使用tune2fs就可以了:

tune2fs -j /dev/xxx

你可以對正在載入的文件系統和沒有載入的文件系統進行升級操作。如果當前文件系統正在被載入,則文件.journal會在文件系統載入點的所在目錄被創建。如果是升級一個當時沒有載入的文件系統,則使用隱含的系統inode來記錄日誌,這時候文件系統的所有內容都會被保留不被破壞。

你可以使用下面的命令載入ext3文件系統:

mount -t ext3 /dev/xxx /mount_dir

由於ext3實際上是帶有日誌功能的ext2文件系統 ,因此一個ext3文件系統可以以ext2的方式被載入。

安裝XFS文件系統

如果需要從技術方面了解XFS文件系統,請參考SGI的XFS文件系統和SGI信息頁面。也可以參考FAQ。

XFS是一個SGI開發的linux環境下的日誌文件系統,它是一個成熟的技術,最初是使用在IRIX系統上的文件系統。XFS遵循GPL版權申明。目前xfs文件系統最新版本是1.02。下載得到對內核xfs文件系統支持補丁或者直接下載RPM包方式的內核,下面我們就以補丁方式說明如何對2.4.14內核使用xfs。首先下載如下內容

patch-2.4.14-xfs-1.0.2.bz2

patch-2.4.14-xfs-1.0.2-kdb.bz2

拷貝Linux內核linux-2.4.2.tar.bz2到 /usr/src目錄下,修改老的內核目錄名,然後解壓新內核:

mv linux linux-old

tar -Ixf inux-2.4.2.tar.bz2

拷貝每個每個補丁到內核源碼目錄下(例如:/usr/src/linux),並打補丁:

zcat patch-2.4.14-xfs-1.0.2.bz2 | patch -p1

zcat patch-2.4.14-xfs-1.0.2-kdb.bz2 | patch -p1

然後配置內核,打開文件系統部分的內核選項:"XFS filesystem support" (CONFIG_XFS_FS)和"Page Buffer support" (CONFIG_PAGE_BUF)。同時需要升級下面這些系統工具到下面或更高的版本:

motils-2.4.0

autoconf-2.13

e2fsprogs-devel-1.18

安裝新內核並重啟伺服器。

然後下載xfs工具。這個軟體包包括下面的命令來處理文件系統,使用下面的命令來安裝該軟體包::

tar -zxf xfsprogs-1.2.0.src.tar.gz

cd xfsprogs-1.2.0

make configure

make

make install

安裝這些命令以後,就可以創建新的XFS文件系統:

mkfs -t xfs /dev/xxx

如果xxx是一個已經存在的文件系統,那麼就需要使用"-f"參數來創建新分區,但是記得這將會破壞該分區的所有數據。

mkfs -t xfs -f /dev/xxx

創建以後就可以使用基於下面的命令載入新文件系統:

mount -t xfs /dev/xxx /mount_dir

安裝ReiserFS文件系統

如果希望更多地從技術方面了解reiserFS文件系統,請參考NAMESYS和FAQ。

ReiserFS文件系統從2.4.1-pre4開始就是Linux內核的正式支持的文件系統了。為了使用reiserFS文件系統那你首先需要在系統上安裝文件系統支持工具(如:創建ReiserFS文件系統的mkreiserfs工具)。最新的ReiserFS文件系統版本可以以補丁的方式添加到2.2.x或者2.4.x內核中。這里我們以2.2.19為例:

第一步,首先下在內核源碼,並下在ReiserFS文件系統的2.2.19補丁 ,目前補丁最新版本是linux-2.2.19-reiserfs-3.5.34-patch.bz2。同時應該下載工具軟體包:reiserfsprogs-3.x.0j.tar.gz。

然後解壓內核源碼和補丁包到/usr/src中:

tar -Ixf linux-2.2.19.tar.bz2

bzcat linux-2.2.19-reiserfs-3.5.34-patch.bz2 | patch -p0

編譯內核支持reiserfs,安裝內核。然後安裝文件系統工具軟體:

cd /usr/src/linux/fs/reiserfs/utils

make

make install

安裝新內核並重新啟動。現在就可以創建新的'reiserfs文件系統,並載入:

mkreiserfs /dev/xxxx

mount -t reiserfs /dev/xxx /mount_dir

文件系統性能測試

測試環境使用的計算機環境如下:Pentium III - 16 Mb RAM - 2 Gb HD,操作系統為RedHat6.2。所有的文件系統都能正常工作,所以就進行benchmark分析來對它們進行性能比較。首先我直接拔掉系統電源以模擬系統掉電情況,以測試日誌文件系統恢復過程。所有的文件系統都成功地經過了文件掃描檢測階段,在數秒以後系統都經過了掃描然後正常啟動了系統。

下一步就採用了bonnie++性能測試程序進行測試,這個程序對一個文件進行資料庫類型的訪問,進行了創建、讀和刪除小文件,這些操作對於Squid、INN或者Maildir格式的郵件伺服器程序(qmail)是最常見的操作。性能測試命令為:

bonnie++ -d/work1 -s10 -r4 -u0

其對載入在/work1目錄下的文件系統進行了10Mb(-s10)的測試。因此在執行測試之前必須創建適當類型的文件系統並載入到目錄/work1下。其他的參數指定內存大小(-r4)的M數,和以root身份運行測試程序,測試結果如下:

每種測試都有兩組數據:文件系統速度(K/sec)和CPU佔用率(%CPU)。速度越高,文件系統越好。而對於CPU率來說,數字越小性能越好。可以看到Reiserfs文件系統在文件操作方面(Sequential Create和Random Create部分的) 的性能最好,超出其他文件系統10倍之多。在其他方面(Sequential Output和Sequential Input)則和其他文件系統性能不相上下。對於其他文件系統則沒有特別明顯的區別。XFS性能接近ext2文件系統,ext3文件系統則比ext2要稍微慢上一些(因為記錄日誌需要一些額外的時間)。 最後使用從得到的性能測試程序mongo,並對其進行了修改以對三種日誌文件系統進行測試。這里在mongo.pl程序中添加了添加了載入xfs和ext3文件系統的命令,並對其進行格式化處理,然後就開始性能測試分析。 該腳本格式劃分區/dev/xxxx,載入其並在每個階段運行指定數目的進程:創建、拷貝、符號連接處理、讀、顯示文件狀態信息、重命名和刪除文件。同時,該程序在創建和拷貝階段以後會計算分段數(fragmentation)。

Fragm = number_of_fragments / number_of_files

可以在結果文件中得到同樣的測試比較結果:

log - 原始結果

log.tbl - 比較程序的輸出結果

log_table - 表格式的結果

下面的命令進行測試:

mongo.pl ext3 /dev/hda3 /work1 logext3 1

如果要測試其他文件系統,就需要把上面命令的參數中的ext3修改為reiserfs或xfs。其他參數分別為要載入的分區,載入路徑,保存測試結果的文件名及啟動的進程數。

下面的表格是測試結果。數據單位為秒。值越低性能越好。第一個表格測試使用的數據塊大小為100位元組,第二個表格為1000位元組,最後一個為10000位元組

從上面的表格可以看到ext3在狀態刪除和重命名方面要性能更好一些,而ReiserFS文件系統在文件創建和拷貝性能表現更出色。同時也可以看到reiserFS正如其技術文檔提到的其在小文件處理方面性能相當出色。

結論

目前Linux至少有兩個健壯可靠的日誌文件系統可供選擇(XFS和reiserFS),其都得到了廣泛的應用。例如Mandrake8.1就默認支持reiserFS文件系統。

從性能測試的結果可以看到,reiserFS是最好的選擇。

閱讀全文

與linux內核打補丁相關的資料

熱點內容
查看ipdns命令 瀏覽:260
命令與征服3凱恩之怒漢化 瀏覽:865
linuxc一站式編程 瀏覽:96
比心app男的識別女的怎麼樣 瀏覽:637
線切割pdf 瀏覽:638
命令與征服3泰伯利亞戰爭109修改器 瀏覽:521
看著很解壓的景色 瀏覽:896
sqlite在Android中應用 瀏覽:77
pdf虛擬列印機ofmac 瀏覽:354
九江php招聘 瀏覽:376
怎麼在ubuntu編程 瀏覽:256
思科保存的命令是什麼意思 瀏覽:958
主力控制副圖源碼及套利選股公式 瀏覽:813
兄弟php培訓怎麼樣 瀏覽:678
金炯泰編譯器 瀏覽:860
涼山參加青少年編程培訓班報名 瀏覽:598
程序員開發者模式 瀏覽:199
電腦有圖標的文件夾是什麼 瀏覽:350
app停運了怎麼恢復 瀏覽:188
u盤加密密碼怎麼刪除 瀏覽:90