永遠的真田幸村
Linux平台使用SSD必讀 (範例為Ubuntu)
由 ivan 發表於 23:20, Oct 19, 2010 | 文章分類: 數位科技, hardware, software | 標籤列表: SSD Ubuntu Linux |
網址: http://yblog.org/archive/index.php/ssd_on_ubuntu_linux_howto

SSD和一般傳統硬碟最大的不同,就是它的寫入壽命比較有限,同一塊資料區裡面的快閃記憶體(flash memory)經不起大量多次的寫入,故SSD採用控制晶片內建的特殊演算法,把資料平均寫入到不同區塊的快閃記憶體晶片上。

本文範例為Ubuntu Linux,我的Acer 3750G筆電裝的是Ubuntu 11.04,SATAII SSD 120GB(SandForce SF-1222控制晶片),開機過UEFI後大約8秒進入自動桌面。

1、使用適當的磁區分割程式

在Linux平台上使用SSD,最重要的一件事情就是「分割硬碟磁區」中的「對齊」問題,這是因為過去傳統硬碟有磁柱、磁扇這些設定(CHS地址地址),而SSD則沒有,故設定磁區大小的時候,如果沒有對齊磁區(Partition Alignment),會有浪費和效能的問題,這在新的硬碟分割程式中都已經有對應的方式。

以圖形化的磁區分割工具來看,大家最常用的gparted新版本(我手邊的是0.7.0),擁有自動對齊磁區的功能,安裝Ubuntu或其他Linux發行版到SSD上時,可以進入桌面,在安裝程式啟動前,使用live-cd或live-usb內建的磁區管理程式gparted(要安裝)進行分割。

舊式的桌機主機板、筆電主機板使用的還是BIOS系統,格式化這個SSD的分割表時,最初要選擇MBR(Master Boot Record)分割表的形式。如果你的桌機、筆電是較新的款式,開機用的韌體已經改成新技術且更快的UEFI,那麼初始格式化分割表建議是要選擇「GUID分割表」形式(Mac OS現在都用這個新的分割表形式),也就是選gpt這種分割形式(建議),當然你要沿用MBR、msdos的型態也可以。

接著格式化磁區就依照你原本在圖形化介面的習慣即(前面提到的gparted)可,純文字介面的話要用GPT fdisk,才能幫你自動對齊,用fdisk的話,過去你得自己計算磁區對齊的問題,現在新版的fdisk可以下fdisk -cu (device)這樣的方式來解決。gparted圖形化界面操作分割磁區,自動對齊的選項在左下角,貼齊右邊的項目要選「MiB」,不要選「磁柱」。

以120GB的SSD而言,我的分割習慣是,/boot給256MB,/給20GB,盛下的都給/home,然後常讀寫的/tmp,放到tmpfs裡面去,用系統DRAM記憶體來負責,減少對SSD的損害。

這樣透過USB隨身碟安裝Ubuntu或其他Linux Distro時,你會發現複製檔案寫入的時間縮短許多,如果不想等網路更新檔案,可以選擇跳過網路下載檔案的部份,只消幾分鐘Ubuntu就自己安裝好了。重開機連上網之後,再來進行套件的自動更新或語言包的完整安裝。

2、設定正確掛載選項,啟用TRIM

安裝好Linux之後,接下來這個非常重要。

SSD要保持長期穩定和速度,就需要啟用TRIM的支援,這是讓SSD在非尖峰讀寫時間才去真正抹除快閃記憶體晶片上被標記抹除的資料。本例是以ext4檔案系統為主,以ext4而言,刪除檔案後,系統cycle有跑到sync指令時才真正抹除資料。要開啟TRIM支援,就得編輯fstab,讓指定的磁區掛載選項加上discard這個flag即可。

要在終端機視窗下的指令

fstab先備份 sudo cp /etc/fstab /etc/fstab_bak-notrim

fstab編輯 sudo gedit /etc/fstab

在編輯文件視窗中,把你要加上TRIM的磁區,比方說這樣的一行「UUID=[一長串英文與數字] /               ext4    errors=remount-ro 0       1」

在errors之前加上discard,

或defaults之後加上,

接著再儲存檔案,重開機後就有支援TRIM了。

我自己則是還會加上noatime,nodiratime,discard,

noatime與noairatime是不存取檔案或資料夾的access屬性,也就形同減少對磁區的讀寫次數。

比方說我的/home磁區,設定就會變成

# /home was on /dev/sda3 during installation
UUID=2d86c8c2-2db5-4f10-a5e8-b91d04a06518 /home           ext4     noatime,nodiratime,discard,defaults        0       2

或者類似成這樣 ext4    noatime,nodiratime,discard,errors=remount-ro 0       1

都改好之後,請儲存這份文件。

3、將 /tmp 以 tmpfs 形式掛上

同樣sudo gedit /etc/fstab,在文件的最下面加上這一行

tmpfs   /tmp       tmpfs   defaults,noatime,mode=1777   0  0

tmpfs   /var/spool tmpfs   defaults,noatime,mode=1777   0  0

tmpfs   /var/tmp   tmpfs   defaults,noatime,mode=1777   0  0
 
重啟或不重啟,用sudo mount -oremount / 也可以

如果你的筆電或桌機使用SSD,而不是伺服器的話,還可以加上

tmpfs   /var/log   tmpfs   defaults,noatime,mode=0755   0  0

這是讓log檔案也丟到記憶體去,就減少對SSD的存取,提昇效能與SSD使用壽命。

之後,你可以在Firefox裡面透過about:config設定,把快取都丟到/tmp去,提高Firefox效率外,也可以減少對SSD的讀取。

新增browser.cache.disk.parent_directory.

設定數值到/tmp

要檢視的話,瀏覽列輸入 about:cache

4、測試SSD速度

我這邊只提供一個最簡單的方法,你除了用磁碟公用程式去測試外,最好是開終端機視窗(terminal)。

下指令

hdparm -Tt /dev/sdX 這個X是a或b,看你的SSD是第一顆或第二顆硬碟。我的是sda,因為是第一顆硬碟。

Timing cached reads:   x MB in  y seconds = z MB/sec 這是快取的速度,與你的SSD支援SATAII或SATAIII、以及上面的DRAM快取有關,不重要。

Timing buffered disk reads:  x MB in  y seconds = z MB/sec 這個才是真正的SSD讀取效率數值。

比說我的就是這樣的結果:

/dev/sda:
 Timing cached reads:   9760 MB in  2.00 seconds = 4883.67 MB/sec
 Timing buffered disk reads: 774 MB in  3.00 seconds = 257.57 MB/sec

小結

大致上,這樣SSD會在你的Ubuntu或其他Linux發行版上運作得很好了。如果要改I/O Scheduler提供系統效率的,可以改成 noop 或 deadline,理論上使用SSD,用後者長期會比較快。

要修改這個得動到/etc/default/grub設定。

延伸閱讀

HOWTO: Configure Ext4 to Enable TRIM Support for SSDs on Ubuntu and Other Distributions

HOWTO: Check If TRIM On Ext4 Is Enabled And Working On Ubuntu And Other Distributions

Aligning filesystems to an SSD’s erase block size

迴響留言
很棒的文章。

對了,裡面有個指令少一個空白:

sudo mount -oremount /

應該是:

sudo mount -o remount /
由 kenduest 發表於 1:47, Sep 29, 2011 | 61.230.78.*
好的,已經修正過來了,謝謝你。
由 ivan 發表於 16:00, Sep 29, 2011 | 208.97.143.*
感謝分享。待會小弟也來試試自己的SSD。

但是小弟有一個問題,下面兩個效能的說明是不是相反了?

Timing cached reads: x MB in y seconds = z MB/sec 這個才是真正的SSD讀取效率數值。

Timing buffered disk reads: x MB in y seconds = z MB/sec 這是快取的速度,與你的SSD支援SATAII或SATAIII、以及上面的DRAM快取有關,不重要。

大大可以參照man page的 -t (Timing buffered disk reads) 跟 -T (Timing cached reads)之說明。
由 wlotus 發表於 22:47, Sep 30, 2011 | 204.154.45.*
謝謝你,已經改過來了,上下寫反 : P
由 ivan 發表於 3:37, Oct 2, 2011 | 208.97.143.*
有以btrfs為系統的例子嗎?網路能找到的資料不多,我整理如下,不一定正確,可以討論:
btrfs有對ssd最佳化
1、使用(btrfs)磁區分割
自動對齊的選項的項目一樣要選「MiB」
2、設定正確掛載選項
sudo gedit /etc/fstab
btrfs加入noatime即可,不需discard
3、將 /tmp 以 tmpfs 形式掛上
同樣sudo gedit /etc/fstab,在文件的最下面加上這一行
tmpfs /tmp tmpfs nodev,nosuid,size=10%,mode=1777 0 0
4,有啟用 swap space,降底 /proc/sys/vm/swappiness 的值來減少系統使用
sudo gedit /etc/sysctl.conf
增加一行
vm.swappiness=0
由 sevenjay 發表於 19:22, Oct 13, 2011 | 220.134.121.*
感謝分享
我不知道你還有沒有在看這個blog了 但是我有一些事情想詢問
我要組一台桌上型
打算裝win 7跟ubuntu
可是聽說ssd上面裝linux系統很麻煩 需要自己計算甚麼byte offset之類的
可是我google了半天都沒看到類似的文章
請問如果要裝在ssd上面有甚麼需要注意的事項嗎?
由 Steven 發表於 5:29, Feb 9, 2012 | 68.181.252.*
設置的方法在本文上方,你使用新的分割工具,它就會自己對齊了。

我就是用本文的方法在筆電的SSD上面安裝了Ubuntu 與 Windows。
由 ivan 發表於 15:25, Feb 10, 2012 | 111.243.194.*
感謝!!
Crucial M4 128GB
/dev/sda:
Timing cached reads: 28098 MB in 2.00 seconds = 14067.43 MB/sec
Timing buffered disk reads: 1246 MB in 3.00 seconds = 415.03 MB/sec

新的fdisk也速可以的,partition alignment主要是第一個partition要4k alignment
現在都自動在2048了

在/boot/grub/grub.cfg的kernel部份後面加上 elevator=noop或者deadline就可以了
/var/log也是可以掛上tmpfs的 如果沒有特別把/var/log掛到其他地方去的話
由 阿里佈達 發表於 9:55, Jul 1, 2012 | 71.135.43.*
不知道大大還有沒有在注意這篇,想請問一下有關於在 Firefox 上新增上讓 cache 轉存到記憶體的方法,要怎麼去設定呢?文章裡面提到要把數值傳給 /tmp,這個部份有點看不懂要怎麼去設定可以麻煩大大解釋一下嗎?感激不盡
由 迪蘭帝 發表於 1:08, Apr 21, 2013 | 61.70.233.*
不好意思,我電腦只有一顆120g ssd,我要怎麼直接分割,能替我提供解決辦法嗎?
由 Tony 發表於 15:40, Apr 12, 2016 | 120.108.94.*
256mb >>> /boot
20 gb >>> /
100gb >>> /home
由 kent 發表於 15:58, 五月 9, 2016 | 118.163.96.*
六年過了,這篇「Linux 平台使用 SSD 必讀 」一文還是給予在下很多幫助!

謝謝您的分享!<[_ _]>
由 凍仁翔 發表於 13:01, Feb 21, 2017 | 111.250.3.*
Copyright Reserved.本站圖文內容原作者版權所有:yblog.org 若欲轉載請先徵求本站同意並標明出處