雖然RAM Disk已經不是什麼新鮮的東西了,但是這次我針對Linux上的RAM Disk Script加入了開/關機備份/還原的功能,應該就很少見了。
我個人認為Linux上的RAM Disk比Windows和FreeBSD來得方便好用,Linux的shm(Share Memory)實在太強大了。
在Windows上,RAM Disk的軟體不少,但多半都是切割一塊RAM當磁碟,FreeBSD上也是(FreeBSD的shm實做了嗎?有消息的回覆一下吧~),但在Linux上,因為Share Memory技術的關係,可以直接把Share Memory bind 到 /tmp,直接當作 RAM Disk 使用,這樣的優點是,系統記憶體和RAM Disk是共用的,RAM Disk不需要額外割一塊出來,舉個例子:
假設RAM有1024MB(1G),我要512MB的RAM Disk
在Windows、FreeBSD上,系統記憶體就只剩下512MB,另外512MB變成一個RAM Disk。
而在Linux上,系統記憶體還是1024MB(1G),假如我在RAM Disk上吃掉了100MB的空間,則系統記憶體會變成924MB,而RAM Disk(Share Memory)的上限是多少?1024MB嗎?
這可以自己設定,系統預設是RAM的一半,以這例子來說,Linux預設的RAM Disk(Share Memory)就是512MB。
RAM Disk速度很快,尤其是拿來compile kernel時特別明顯,可以明顯感受到,花費的時間比較短,這要歸功於Linux Kernel Source Code很大,所以感受得出來。
另一個重要的場合大概就是Eee PC這類輕巧筆電了,輕巧筆電因為「輕巧」、「價格」...等因素,往往硬碟很小,而且硬碟經常速度很慢(EeePC 900、901的第二顆Flash,Aspire one 110的8G Flash),在無法擴充或是擴充價格很誇張時,加大RAM並善用它變得很重要,因此在輕巧筆電上設定RAM Disk,幾乎是「必要的設定」(不論是XP或Linux)。
RAM Disk的致命傷就是重開機資料就消失,稍微搜尋後可以發現,Windows上已經有不少人提供備份、還原的script,搭配XP Pro的系統原則就可以在關機時備份RAM Disk的資料,那Linux呢?就在這裡啦~~
首先,我RAM Disk的建立,是使用[閒聊]有趣的 tmpfs最後的script版本,並不是寫在/etc/fstab當中。
RAM Disk(tmpfs)的詳細介紹可以參考Tsung's Blog的拿 RAM 當硬碟來用(RAM Disk),作者把所有的tmpfs建立方法全部敘述了,內容清楚明確,非常值得參考,我使用的屬於方法一。
簡單敘述建立RAM Disk的方法:
1. 把下列script內容編輯,並存檔為/etc/init.d/mounttmpfs.sh
- 代碼: 選擇全部
#!/bin/sh
#
# mounttmpdir Mount /tmp after mounvirtfs exec-ed
#
# Version: @(#)mounttmpdir 0.01 24-Dec-2004 antony shen
# 參考網址:http://moto.debian.org.tw/viewtopic.php?t=4100&highlight=shm
# 執行指令:update-rc.d mounttmpfs.sh start 37 S .
#
# Script needs to be robust and continue when parts fail,
# so we're not setting the "-e" flag.
#set -e
PATH=/lib/init:/bin:/sbin
if [ -d /dev/shm ]
then
if [ ! -d /dev/shm/tmp ]
then
echo -n "Mounting tmpfs(/tmp,/var/tmp) under /dev/shm..."
mkdir /dev/shm/tmp
mkdir /dev/shm/vtmp
chmod 1777 /dev/shm/tmp
chmod 1777 /dev/shm/vtmp
mount --bind /dev/shm/tmp /tmp
mount --bind /dev/shm/vtmp /var/tmp
echo "OK."
fi
else
echo "Failed to find /dev/shm, unable to link /tmp under it!"
fi
2. 執行
- 代碼: 選擇全部
update-rc.d mounttmpfs.sh start 37 S .
3. 重新開機
4. 複製個檔案 (cp /boot/* /tmp/) 到 /tmp 執行 df,查看 /dev/shm 的使用空間有沒有變化,有變化就是成功了。
接下來,我們進一步來玩Backup/Restore的部份,如下:
1. 把下列script存檔為/etc/init.d/backuptmpfs.sh
- 代碼: 選擇全部
#!/bin/sh
#
# 參考 mounttmpfs.sh 修改而成
#
# Version: @(#)backuptmpfs.sh 0.01 2008-08-26 YCFu
# 執行指令:update-rc.d backuptmpfs.sh stop 1 0 6 .
#
# Script needs to be robust and continue when parts fail,
# so we're not setting the "-e" flag.
#set -e
PATH=/lib/init:/bin:/sbin
if [ -d /dev/shm ]
then
if [ -d /dev/shm/tmp ]
then
echo -n "Backup tmpfs(/tmp) to /RAMDISK_bak.tar..."
tar -X /etc/non-list -C /tmp -cf /RAMDISK_bak.tar .
chmod 600 /RAMDISK_bak.tar
echo "OK."
fi
else
echo "Backup Fail!"
fi
2. 把下列script存檔為/etc/init.d/restoretmpfs.sh
- 代碼: 選擇全部
#!/bin/sh
#
# 參考 backuptmpfs.sh 修改而成
#
# Version: @(#)backuptmpfs.sh 0.01 2008-08-26 YCFu
# 執行指令:update-rc.d restoretmpfs.sh start 38 S .
#
# Script needs to be robust and continue when parts fail,
# so we're not setting the "-e" flag.
#set -e
PATH=/lib/init:/bin:/sbin
if [ -f /RAMDISK_bak.tar ]
then
echo -n "Restore tmpfs(/tmp) from /RAMDISK_bak.tar..."
tar -C /tmp -xf /RAMDISK_bak.tar
rm /RAMDISK_bak.tar
echo "OK."
fi
3. 執行下列指令:
- 代碼: 選擇全部
update-rc.d restoretmpfs.sh start 38 S .
update-rc.d backuptmpfs.sh stop 1 0 6 .
4. 執行下列指令建立排除檔案列表
- 代碼: 選擇全部
touch /etc/non-list
5.完成
上述程式說明:
簡單的說,我改了2個script,一個用在關機時備份RAM Disk,一個用在開機時還原RAM Disk。
關機時備份RAM Disk的叫做backuptmpfs.sh,它會在inittab狀態為0和6時執行(放到rc0.d和rc6.d),0和6分別是關機狀態和重新開機狀態。
開機時還原RAM Disk的叫做restoretmpfs.sh,「它必須在 mounttmpfs.sh 之後執行」,它會在開機時,建立RAM Disk之後,將RAM Disk資料還原回去。
為什麼不整合到mounttmpfs.sh之中呢?
我試過了,它似乎會和mount --bind衝突,可能需要delay一點時間吧。
由於RAM Disk中,通常會放置Firefox的暫存目錄,我們不希望所有東西都備份,因此我們要設定個排除檔案名單,將特定的目錄或檔案排除。
排除名單放在/etc/non-list,只需要把不要備份的名稱加入即可
以Firefox的暫存目錄來說,Firefox會自動建立暫存目錄/tmp/Cache,我們只需要在/etc/non-list中寫上:
- 代碼: 選擇全部
Cache
如果我們希望排除多個檔案或目錄,例如檔案「EEE」和目錄「Cache」,則在/etc/non-list中寫上:
- 代碼: 選擇全部
Cache
EEE
備份的檔案會存在哪裡?檔名是什麼呢?
備份的檔案會存為/RAMDISK_bak.tar,會在還原後自動刪除。
此外,為了安全性的考量,/RAMDISK_bak.tar的權限會設為600。
最後,因為這是第一版,所以我並沒有將上面提到的參數設為變數,不過這幾個script並不複雜,相信稍微看一下,就能夠看懂並修改,歡迎大家修改使用,改過後記得再貼出來造福更多人。
PS: 本篇同步 po 在我的blog