RamDisk實際是從內存中劃出一部分作爲一個分區使用,換句話說,就是把內存一部分當做硬盤使用,你可以向裏邊存文件。那麼爲什麼要用RamDisk呢?假設有幾個文件要頻繁的使用,你如果將它們加到內存當中,程序運行速度會大副提高,因爲內存的讀寫速度遠高於硬盤。況且內存價格低廉,一臺PC有128M或256M已不是什麼新鮮事。劃出部分內存提高整體性能不亞於更換新的CPU。何樂而不爲呢?象WEB服務器這樣的計算機,需要大量的讀取和交換特定的文件,因此,在WEB服務器上建立RamDisk會大大提高網絡讀取速度。
使用RamDisk非常方便,缺省安裝的RedHat6.0就支持RamDisk。你所要作的就是格式化RamDisk並把它裝載到一個目錄下。要想查看RamDisk的數目,用命令"ls -al /dev/ram*",它會給出所有當前情況下可用的RamDisk。這些RamDisk只有使用的時候才佔用內存。下面是使用RamDisk的幾個命令:
#創建裝載點
mkdir /tmp/ramdisk0
# 創建一個文件系統
mke2fs /dev/ram0
#裝載ramdisk:
mount /dev/ram0 /tmp/ramdisk0
這三個命令將會爲RamDisk創建一個目錄、格式化RamDisk(創建文件系統)並把RamDisk裝載到目錄"/tmp/ramdisk0"中。現在,你就可以把它作爲一個磁盤分區使用了。
如果格式化RamDisk失敗,可能是因爲你沒有把對RamDisk的支持編譯進內核中去。內核中對RamDisk的配置選項是 CONFIG_BLK_DEV_RAM。
缺省的RamDisk爲4M。使用mke2fs命令可以查知你所獲RamDisk的大小。命令mke2fs /dev/ram0會產生以下信息:
mke2fs 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09
Linux ext2 filesystem format
Filesystem label=
1024 inodes, 4096 blocks
204 blocks (4.98%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
使用命令df /dev/ram0可以查到你實際能用的RamDisk的大小(文件系統也佔用一定空間):
>df -k /dev/ram0
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/ram0 3963 13 3746 0% /tmp/ramdisk0
不過要記住,RamDisk中的數據會在機器重新啓動後消失,因此應把其中有用的數據及時備份到硬盤中。
爲使用RamDisk,你或者要將對RamDisk的支持編譯到內核中去,或者把它編譯爲一個可裝載模塊。編譯爲一個可裝載模塊有一個好處,就是可以在裝載時任意指定RamDisk的大小。
把下面這一行加到你的lilo.conf 文件中去:
ramdisk_size=10000 (或對老內核寫作ramdisk=10000)
這樣你鍵入LILO命令並重新啓動後,缺省的RamDisk的大小將爲10M,下面是我的/etc/lilo.conf文件:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
p_w_picpath=/boot/vmlinuz
label=linux
root=/dev/hda2
read-only
ramdisk_size=10000
實際上,我只獲得了9M多一點的RamDisk,其餘被文件系統佔用。
當你編譯爲一個可裝載模塊後,你可以在模塊裝載時決定RamDisk的大小,這可以通過 /etc/conf中的選項設置來設定。或者通過作爲ismod命令行參數來實現。
options rd rd_size=10000
insmod rd rd_size=10000
下面是使用模塊的例子:
本例介紹在WEB服務器上使用3個RamDisk的方法。所用的WEB服務器是RedHat 6.0 自帶的Apache。
首先,把WEB根目錄中所有文件移到其它目錄中,然後創建RamDisk的裝載點:
mv /home/httpd/ /home/httpd_real
mkdir /home/httpd
mkdir /home/httpd/cgi-bin
mkdir /home/httpd/html
mkdir /home/httpd/icons
然後,把以下命令加到你的/etc/rc.d/init.d/httpd.init文件中去:
### 創建3個RamDisk
/sbin/mkfs -t ext2 /dev/ram0
/sbin/mkfs -t ext2 /dev/ram1
/sbin/mkfs -t ext2 /dev/ram2
### 加載RamDisk到開始創建的目錄中
mount /dev/ram0 /home/httpd/cgi-bin
mount /dev/ram1 /home/httpd/icons
mount /dev/ram2 /home/httpd/html
### 拷貝真正的目錄中的所用文件到RamDisk 中
tar -C /home/httpd_real -c . | tar -C /home/httpd -x
最後,重新啓動WEB服務器即可生效,試一下速度是否有所改變。
後語:1. 一定要記住保存RamDisk中有用的東西,否則,重新啓動後將化爲烏有。你可以用cron設定一個計劃,每隔10分鐘掃描一下RamDisk中的文件是否發生變化,如有,拷貝到硬盤中,這會比較安全。
2.最酷的應用是如果你有1G的內存,劃出256M來作爲暫存區/tmp,如果很多程序用到/tmp,那麼你的系統性能會大大提高,而且重新啓動後垃圾消失,真是一舉兩得。
1、實驗背景:主機WIN7 虛擬機VMware (ubuntu12.04) 內核版本Linux-3.2.0-23-generic-pae
2、下載了新的內核版本linux-3.2.1來進行編譯,安裝
步驟:
1、首先下載你想要編譯的內核版本:linux-3.2.1.tar.bz2。
2、進入root權限把剛下載的內核代碼複製到/usr/src目錄下面去。
3、在/usr/src目錄下面解壓剛纔下載的內核代碼:tar -xjvf linux-3.2.1.tar.bz2,解壓完成後進入相應的linux-3.2.1 目錄,以後的工作都會在這個目錄下面完成。
4、開始編譯前的工作:
4.1 使用命令:make mrproper
作用是在每次配置並重新編譯內核前需要先執行”make mrproper”命令清理源代碼樹,包括過去曾經配置的內核配置文件”.config”都將被清除。即進行新的編譯工作時將原來老的配置文件給刪除,以免影響新的內核編譯。(但是一般情況也可以不執行這條命令,因爲內核編譯是增量編譯,清除之後又要從頭開始編譯,浪費時間).
4.2 使用命令:make menuconfig,進行內核定製,配置編譯信息。
輸入命令:make menuconfig 。然後再出現的界面中移動鼠標選中file system項目 然後再出現的界面中移動鼠標選中file system項目,進入其中,把second extended fs suppor前面的 * 好改成M(修改這個的目的是讓在編譯內核的時候以模塊的方式進行編譯,而不是編譯進內核)。這裏可能會提醒安裝ncurses相應的包。安裝這個包的命令如下:sudo apt-get install libncurses5-dev
4.3 保存退出
5、 make dep命令生成內核功能間的依賴關係。一般會提示unecessary.
6、 make命令 編譯內核。(若過程不出現問題,大約1-2個小時編譯完成) 。
這個相當於手工執行下面兩步:
#make bzImage(編譯出核心)
#make modules(編譯可加載模塊)
7、 等編譯內核完成之後就是安裝模塊。使用命令:make modules_install
8、 安裝核心。 使用命令:make install
9、 創建initrd文件 使用命令:mkinitramfs -o /boot/initrd.img-3.2.1(後面的數字是自己需要編譯的內核的版本,根據自己的版本不同來書寫).*****後面出現的一個錯誤在重新用另外的方法生成initrd.img-3.2.1文件後解決,不知道是不是這裏的生成方法有錯,但是可以用這種方法試一試,出錯了再改。因爲我也只試了一次,說不定是我操作失誤了。*****
10、 更新grub來顯示自己安裝的內核。進入/boot/grub目錄,然後輸入命令:update-grub即可。
經過以上的步驟,內核基本上已經編譯成功並且已經安裝上了。
爲了看自己的內核是否安裝上了可以通過以下步驟來看:進入/boot/grub/目錄,然後打開grub.cfg文件,看你自己編譯的版本是否已經在裏面了,如果在裏面了,就說明你自己編譯的內核就完成了。這是後重啓就可以進入你自己編譯的內核裏面了。(但是爲了選擇自己安裝的內核或者是選擇進入以前系統自帶的內核還必須更改/boot/grub/目錄下面的文件grub.cfg,把裏面的所有的timeout的值都更改成10)。然後重新啓動就可以選擇了。
以上就是編譯和安裝自己內核的步驟。
過程中出現的錯誤:
1、提示虛擬機磁盤空間不足,如下:
原因是我分配給虛擬系統的磁盤只有10G,而已經使用完了,查看磁盤使用率如下圖:
解決方法:我按照網上的方法使用vmware-manager.exe擴充磁盤結果導致虛擬機無法進入系統。所以只好重裝系統,分配更大的空間。
重裝之後,編譯順利通過。但是在進入新編譯的內核是出現錯誤2.
2、could not load /lib/modules/3.2.1/modules.dep。
但是 在/lib/modules/3.2.1/下又能找到modules.dep文件。於是我嘗試了網上的方法,結果能夠正常進入新編譯的內核了。方法如下:
1、備份之前生成的/boot/initrd.img-3.2.1,執行
使用如下命令:mv initrd.img-3.2.1 initrd.img-3.2.1.old(重命名)
2、cd /usr/src/linux-3.2.1.
3、執行:update-initramfs –c –k 3.2.1。這樣,重新在/boot下創建initrd.img-3.2.1
4 、sudo update-grub
5、將/boot/grub/grub.cfg中的timeout改爲10
重啓後,進入了新內核,內核編譯升級成功。