一. 簡介:
fcache的作者是Jens Axboe,他是把這個patch當成一個weekend project寫的 。
這個補丁的目的是在不修改文件系統的前提下,而使啟動的流程是完全線性的(應該是指讀磁盤的流程),從而加速linux的啟動,簡單的說fcache就是文件系統和塊設備之間一種重映射。
fcache有兩種運行模式:prime模式和normal模式。當運行在prime模式時,他緩存一切對目標分區的讀操作,寫入緩存分區。從而使數據在緩存設備中線性存放,即是一個關於時間的函數。當運行在normal模式時,fcache將會在緩存設備中查找緩存,如果命中的話,那麼啟動即可以直接讀入緩存設備的線性數據。由於啟動流程大多時候是重復性的,因此,fcache會提供完美的獲取啟動數據途徑。
一般來說,第一次啟動使用prime模式,准備好緩存數據,以後啟動時使用normal模式,可以大大加速啟動的速度(只要你的啟動流程不變的話)
這裡有一份hzmagnel寫的關於fcache原理的文檔,有興趣的同學可以隨便翻翻,我們會感動的內牛滿面!
二. 如何使用fcache
Step 1:給內核打上fcache補丁,推薦的內核版本是2.6.17
cd /usr/src/linux
下載補丁 wget http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.17/2.6.17-ck1/patches/fs-fcache-v2.1.patch
進入內核源代碼目錄 patch -p1 Block devices->Boot fronted cache driver
然後重新編譯內核,並使用這個內核。
Step 2:創建fcache的分區
分區大小為512M左右,文件系統為ext3,如果僅僅為試驗,可以暫時使用swap分區作為fcache的分區
Step 3:修改啟動和關閉腳本
在linux啟動的時候,根文件系統第一次被加載的時候是readonly的,等到檢查完根文件系統,這時候再用rw的方式remount根文件系統。我們要做事情就是在remount的時候,加上fcache的參數。而remount的所在是因不同發行版而異的,比如在gentoo中,remount在/etc/init.d/checkroot裡,而在suse中,remount在/etc/init.d/rootfsck中。我們可以通過grep
"remount"找到那個腳本。
找到那個腳本後,找出mount -n -o remount,rw / 2>/dev/null
修改為mount -n -o remount,fcache_dev=#/*,fcache_prime=0 / 2>/dev/null
以下針對ubuntu 7.04,寫出一種具體做法(注意:其他版本需要做相應調整)
編輯 /etc/init.d/checkroot.sh腳本,找到
if ! mount -n -o remount,$rootopts,$rootmode $fstabroot / 2>/dev/null
then
mount -n -o remount,$rootopts,$rootmode /
fi
修改為
if ! mount -n -o
remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=1 $fsabroot /
2>/dev/null
then
mount -n -o remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=1 /
fi
注意這裡fcache_dev=#/*,其中fcache_dev是指我們在第二步創建的那個分區對應的設備。
#代表主設備號,*代表次設備號。比如筆者的使用的IDE硬盤,是hda10,因此fcache_dev=3/10
編輯/etc/init.d/umountroot腳本,找到
mount $MOUNT_FORCE_OPT -n -o remount,ro -t dummytype dummydev /
2>/dev/null \
|| mount $MOUNT_FORCE_OPT -n -o remount,ro dummydev /
2>/dev/null \
|| mount $MOUNT_FORCE_OPT -n -o remount,ro
修改為
mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/* -t
dummytype dummydev / 2>/dev/null \
|| mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/*
dummydev / 2>/dev/null \
|| mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/*
/
ok,現在可以重新啟動了,這時候,fcache就會進入prime模式。這次啟動會比平時啟動稍微慢一點。啟動完畢,進入桌面後,執行mount
/ -o remount,fcache_dev=#/*,fcache_prime=0
我們可以檢驗一下,fcahce是否工作了
ken@ubuntu:~$ dmesg | grep "fcache"
[17179592.200000] fcache: new header: first block 2872, max 294040
[17179592.200000] fcache: hda10 opened successfully (priming)
[17180105.
728000] fcache: ios r/w 6286/4904, hits 0, misses 0, overwrites 766
[17180105.744000] fcache: wrote 6286 extents, holding 354656 sectors of data
[17180105.756000] fcache: wrote header (extents=6286,serial=27)
[17180105.808000] fcache: header looks valid (extents=6286 extents, serial=27)
[17180105.824000] fcache: loaded 6286 extents
[17180105.824000] fcache: hda10 opened successfully (not priming)
可以看到,fcahce的確處於prime模式,並且緩存啟動時的數據。
最後再次修改/etc/init.d/checkroot.sh,把第一次我們修改的地方,再修改為
if ! mount -n -o
remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=0 $fsabroot /
2>/dev/null
then
mount -n -o
remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=0 /
fi
即讓fcahce處於normal狀態,再次啟動,你就能享受fcache給你帶來的啟動如飛的感覺了。
以後如果你的啟動流程變了,比如你增加或減少某些啟動腳本,則需要重新激活prime模式一次,即重復一遍上述流程。
個人覺得從出現gdm的登錄窗口,到登錄,完全進入桌面環境,加載完啟動項。這一段時間,fcache帶來的速度提升是相當明顯的。
以下是測試報告
time1 time2 total
--------------------------------------------------------------------------------------
fcache and prime=1 50s 52s 102s
fcache and prime=0 46s 29s 75s
without fcache 48s 38s 86s
注: time1表示從加載內核到出現登錄窗口
time2表示從開始登錄到完全啟動完畢