2015年1月11日日曜日

Arch LinuxでSSDを使う | Linux, SSD, fstrim, gdisk

Arch LinuxでSSDを使う上で注意すべきことをまとめておく。SSDを使う上で、ブロックサイズやTRIMなどに注意する必要がある。

SSDのパーティショニングとフォーマット
ページサイズ・ブロックサイズの確認
HDDと同じように、ページサイズに合わせてパーティショニングする必要がある。メーカーの製品情報からページサイズを調べてから、パーティショニングする。ところが、現在使っているCrucial m4 CT256M4SSD2のページサイズを調べてみたが、どこにも情報がなかった。また、最近のパーティショニングツールは、最適なセクターサイズでパーティショニングしてくれるらしいので、特にセクターサイズ等をいじらずパーティショニングすることにした。

/sys/block/sdX/queue/physical_block_sizeから調べる方法もあるが、この値は当てにならないという情報も。参考程度に、メモしておく。

物理ブロックサイズを調べる。(Crucial m4 CT256M4SSD2の場合)
$ cat /sys/block/sdX/queue/physical_block_size
512

論理ブロックサイズを調べる。
$ cat /sys/block/sde/queue/logical_block_size 
512


SSDのパーティショニング
例えば、fdiskやgdiskを使えばページサイズにあったパーティショニングを行ってくれるらしい。cdiskは使わないこと。GPTでパーティショニングしたほうが良いので、gdiskを使うのがベストだと思う。gdiskを使ったパーティショニングは以下のとおり。

# gdisk /dev/sde
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): o(新しくGPTパーティションテーブルを作る)
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y

Command (? for help): n(パーティションテーブルに新しいパーティションを追加)
Partition number (1-128, default 1): 1
First sector (34-5860533134, default = 2048) or {+-}size{KMGTP}: (デフォルトでの値を使うので、何も入力せずエンター)
Last sector (2048-5860533134, default = 5860533134) or {+-}size{KMGTP}: (デフォルトでの値を使うので、何も入力せずエンター)
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): (デフォルトでの値を使うので、何も入力せずエンター)
Changed type of partition to 'Linux filesystem'

Command (? for help): w(ディスクにパーティションテーブルを書き込み)

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdX.
The operation has completed successfully.


SSDのフォーマット
SSDをフォーマットするときは、TRIMに対応したファイルシステム( Ext4, Btrfs, JFS, XFS)を使う。Ext4かXFSあたりがメジャーだと思う。例えば、XFSでフォーマットする場合は、以下のとおり。XFSもデフォルトで自動的に、セクターサイズ等を調整してくれるとのとこ。Wikiによると-m crc=1のオプションで停電時にファイルを壊れてもリカバリできるようになるっぽい。「SSSDの名前」は好きなように指定する。なくてもよい。
# mkfs.xfs -m crc=1 -L "SSDの名前" /dev/sdX1

おそらく、ブートドライブをXFSにしてもブートできると思う。ただし、SELinuxを使う場合は、ブートの時にboot: linux xfs noselinux selinux=0と指定する必要があるらしい。

セクタサイズ等を確認する
XFSフォーマットのディスクのセクタサイズ等はxfs_infoで確認する。ちなみにext4はdumpe2fs /dev/sdXXで確認する。
$ xfs_info /dev/sdXX

また、ページサイズにあったパーティショニングができているかは、blockdevで確認する。0が返ってこれば正しくパーティショニングできている。
# blockdev --getalignoff /dev/sdX
0


TRIMを設定する
SSDは使用していると、アクセス速度が遅くなる。できるだけ遅くならないように、Trim(discard)コマンドであらかじめ不要になった領域を定期的に集約する。いくつかの方法がある。systemdで定期的に行うのが一番手軽だと思う。

systemdで定期的にfstrimを実行
util-linuxにfstrimのユニットが含まれているので、systemctlから有効にする。
# systemctl enable fstrim.timer

このユニットで、週に一回fstrim.service(fstrim -a)を実行してくれる。実行の状況はjournalctlから確認する。
$ journalctl -u fstrim.timer


fstabのdiscardオプションを使う
fstabにdiscardオプションをつけることでもTRIMが実行される。ただし、このオプションだと小さいファイルが多い場合、時間がかかったり、間違って指定するとデータが消えたりするらしいので、注意が必要。あらかじめ、SSDがTRIM対応か調べる。
# hdparm -I /dev/sda | grep TRIM
    * Data Set Management TRIM supported (limit 8 blocks)
    * Deterministic read data after TRIM

TRIM supportedと返ってこれば、TRIMに対応している。ファイルシステムがExt4, Btrfs, JFS, VFAT, XFS(swap)であればdiscardオプションに対応している。その他のファイルシステムでは使わないこと。
# vim /etc/fstab

...
UUID=xxxx マウントポイント      xfs       defaults,noatime,discard   0  2
...



参考:
[1]Solid State Drives
[2]systemd/Timers

スポンサーリンク

スポンサーリンク

0 件のコメント:

コメントを投稿