LinuxのストレージをSSDに換装

開発でメインに使っているPC (DELL Precision T5500)のストレージを、HDDからSSDに換装しました。2.5インチ→3.5インチ変換アダプタも合わせて購入しました。

最初は単純にSSDをSATA 2に接続し、rescue modeでDebianを起動して

# ddrescue -f -v -r 3 /dev/sda /dev/sdb

し、shutdownした後にHDDをSATA 0から外してSSDをこちらに繋ぎ直し、再起動で一応Debianが起動しました。が、いくつか問題が。

  • fdiskを実行するとエラーが表示される。パーティションの開始セクタがおかしいらしい
  • 元のHDDのfsはext3だが、SSDのfsはext4の方がいいらしい
  • 起動時にエラーが表示される (起動はする)。fsck.ext4が見つからないらしい

まず最初の問題。一応は起動するものの、気持ちが悪いです。SSDはセクタのサイズが4096バイトですが、元のHDDは512バイトで開始セクタが63になっており、コピー先のSSDでも63になっています。しかし、セクタのサイズが4096バイトの場合は、開始セクタが8の倍数でないとパフォーマンスが出ないらしいのです。

パフォーマンス改善のために導入したSSDをパフォーマンスが出ないままにするは本末転倒です。ちゃんとパーティションを切るところから遣り直しました。電源を落として再度HDDをSATA 0に接続し、SSDをSATA 2に接続し直してDebianを起動し、

# cfdisk -z /dev/sdb

でパーティションを切り直します。今回のSSDは500GBのストレージなので、パーティションテーブルはGPTではなく従来通りのDOS (MBR)を選択します。元のHDDが256GBなので、一旦256GBのパーティションを切り、LInux Filesystemとしてwriteします。これで開始セクタが2048になり、fdiskでもエラーが出なくなります。

次にfsの件です。kernel.orgのWikiページArch LinuxのWikiページに情報が整理されています。パーティションをコピーして、fsをext3からext4に変更しましょう。rebootしてrescue modeで起動し直し、今度はストレージ全体ではなくroot fsのパーティションだけをコピーするので

# ddrescue -f -v -r 3 /dev/sda1 /dev/sdb1

と実行します。コピーが済んだらexitしてrescue modeからmulti user modeに移ってログインし直します。256GBのパーティション全体を使い切っていないので、これをSSD全体に拡張すべくgpartedを起動します。

/dev/sdbを選択してパーティション一覧を見ると、/dev/sdb1に「!」アイコンが表示されています。右クリックして「チェック」を選択し、まずはパーティション全体を使い切っていない状態を修復します。次に、「リサイズ」で/dev/sdb1をSSD全体に拡張します。

ここでswapの話。swapへの頻繁な書き出しでSSDの寿命を短かくしたくありませんし、そもそも実メモリも24GBあるので、今回はswap領域は用意しません。

さて、ここまで済んだら/dev/sdb1をmountし、fstabを編集します。この後にfsをext3からext4に変更しますので、fstabのエントリも変更します。ついでに、noatimeオプションも付与しちゃいましょう。上述の通りswapは使わないので元のエントリが残っていた場合はコメントアウト (または削除)します。

# mount -t ext3 /dev/sdb1 /mnt
# vi /mnt/etc/fstab
...
UUID=...    /    ext4    noatime,erros=ro    0    1
...

fstabの編集が終わったら、fsをext4に変更します。続いてfsck, e2defragを実行しておきます。

# umount /mnt
# tune2fs -O extent,uninit_bg,dir_index /dev/sdb1
...
# fsck -fDC0 /dev/sdb1
...
# mount -t ext4 /dev/sdb1 /mnt
# e4defrag -c -v /dev/sdb1
...

tune2fs後のfsckは必須ですのでご注意を。これでfsをext4に変換することができました。

最後にfsckの件。まずはSSDから起動できるように/dev/sdbにgrubをインストールしておきましょう。

# grub-install --root-directory=/mnt /dev/sdb

エラーが出なければshutdownし、HDDを外してSATA 0にSSDを接続して電源を入れ直します。おそらくgrubが起動し、そのままDebianが起動すると思います。今はまだfsckのエラーが表示されますが、ここでは一旦無視して下さい。ちなみに換装前と比べると、この時点で起動時間が劇的に短かくなっています。

起動時にfsck.ext4が見つからない (no such file or directory) のは、どうも起動時に読み込むRAM Diskイメージにfsck.ext4が含まれていないのが原因のようです。initrd.imgを作り直しましょう。

# dpkg-reconfigure linux-image-4.4.0-1-amd64

これで再起動すれば、起動時のfsckのエラーも出なくなります。

最後に、DebianのWikiページを参考にext4用にTRIMの設定を追加しておきます。

# cp /usr/share/doc/util-linux/examples/fstrim.service /etc/systemd/system
# cp /usr/share/doc/util-linux/examples/fstrim.timer /etc/systemd/system
# systemctl enable fstrim.timer

余談ですが、このページを見ると、initrdの作り直し (update-initramfs)についても触れられていますね。

これでようやくHDDからSDDへの換装とデータの移行が完了です。rebootして、起動の早さを改めて体感しましたが、思わず笑ってしまいました。それぐらいに起動が高速化されています。FirefoxやIcedoveのような起動がモッサリしているアプリもサクサク立ち上がるようになりました。

ただ、Scalaのコンパイル時間はあまり改善されていないようです。これはちょっと困りました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です