サーバマシンのストレージをHDDからNVMe SSDに換装した

そうだ、SSD換装しよう

現在自宅でサーバ機として運用しているDeskMini A300をSSD換装することにしました。

このマシンは以前投稿した通り、もともとノートパソコンで動かしていたものが故障したためにDeskMiniに移行したものです。

当時は一刻も早く原状回復したかったのでHDDをそのまま挿げ替えて使い続けていましたが、まあ時代はSSDでしょw という感じでIntelのM.2 SSDヒートシンクを軽率にポチりました。

実際に取り付ける

パッケージを開けて早速取り付けていきます。

まずは熱伝導両面テープの剥離紙を剥がし、ヒートシンクに貼ります。

これをSSDの上面と合わせ、ゴムバンドで固定していきます。ゴムバンドを通すのに少し力がいりました。こわいです。

DeskMiniのSSDスロットに取り付けます。

移行するための設定をする

本題はここからです。

これまではCSMを有効にしてレガシーBIOSでHDDのOSを起動しており、パーティションは以下のようにGPTでフォーマットされています。

# parted
[sudo] password for paltee:
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) select /dev/sda
Using /dev/sda
(parted) print
Model: ATA FUJITSU MHZ2250B (scsi)
Disk /dev/sda: 250GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name  Flags
 4      1049kB  200MB   199MB                         bios_grub
 1      200MB   67.6GB  67.4GB  ext4
 2      67.6GB  69.6GB  2048MB  linux-swap(v1)
 3      69.6GB  230GB   161GB   ext4                  msftdata

今回はSSDに移行してUEFIブートで起動できるようにしたいので、UEFI用のブートローダを使えるようにする必要があります。

BIOSブートとは異なりEFI System Partitionが必要となりますが、まっさらなSSDにはそんなものはないのでおててで作ってよしなに設定していきます。

HDDに現状存在しているbios_grubの領域はレガシーBIOS(not UEFI)を利用する環境でGPTを使う条件のもと、grubをインストールするために必要らしいです。
grub-install /dev/sdaを実行すると/dev/sdaにあるBIOS Boot Partition(bios_grub)を発見して必要なデータを書き込んでくれます。

UEFIの場合はEFI System Partition(FAT32 with boot flag)に書き込む必要があり、サイズは512MiBが推奨されています。
実際にコピーされるデータは十分小さいものの、OSの数だけデータが必要となる上に、grubは直接インストールされるので余裕を持たせておくためらしいです。

実際の手順

今回は/dev/sda(HDD)にインストールされているUbuntuを/dev/nvme0n1(SSD)に移行します。
まず移行作業に入る前に、apt install grub-efi-amd64でUEFIブート用のパッケージをインストールしておきます。(今回移行中はネットワークに接続しないので)

一度マシンの電源を切ってからBIOS設定を開き、CSMを無効化してLive USBでUbuntuを起動します。

Ctrl + Alt + F2で仮想コンソールを開き、ubuntuユーザでログインします。

ここでlsblkを実行し、SSDのデバイス名を確認します。
今回は/dev/nvme0n1で認識されていました。

パーティション設定

まずはパーティションラベルをGPTに設定します。

# parted /dev/nvme0n1
(parted) mklabel gpt

続いてEFI System Partition (ESP)を作成します。

(parted) mkpart ESP fat32 1MiB 501MiB
(parted) set 1 esp on

この時点でboot, espのフラグも立ちます。

続いてOS用のパーティションを作成します。
今回はddコマンドで元のOSをクローンするため、コピー元のパーティションよりも大きなサイズで確保する必要があります。

(parted) mkpart primary ext4 501MiB 70.5GiB
(parted) exit

終わりに、ESPをフォーマットします。

# mkfs.fat -F32 /dev/nvme0n1p1`

既存OSのクローン

ddで既存のOSをクローンします。

# dd if=/dev/sda1 of=/dev/nvme0n1p2 status=progress bs=64K

まあまあ時間がかかるのでお茶でも淹れて気長に待ちます。
今回は67GB (63GiB)で1150秒かかりました。

続いてクローンしたOSのUUIDを変更します。
UUIDはパーティションごとに一意に設定でき、ハードウェア構成の変更に対しても不変な識別子として利用できます。
クローンしたままだとクローン元とクローン先で同一のUUIDを持つことになるので、適切に区別するためにクローン先へ新たなUUIDを割り当てます。

# tune2fs -U random /dev/nvme0n1p2

今回はこのコマンドを実行しようとするとe2fsck -f /dev/nvme0n1p2しなさいと言われるので、これを実行してから先のコマンドを走らせます。

fstabの更新とブートローダのインストール

まず[ -d /sys/firmware/efi ] && echo UEFI || echo BIOSがUEFIを出力することを確認します。
コマンドを手打ちするのは面倒なのでls /sys/firmware/efiが存在することを確認すればいいんですが。

続いてクローン先のパーティションを参照できるようにマウントします。

# mount /dev/nvme0n1p2 /mnt
# mkdir -p /mnt/boot/efi
# mount /dev/nvme0n1p1 /mnt/boot/efi
# for i in /dev /dev/pts /proc /sys /run; do mount -B $i /mnt$i; done
# modprobe efivars
# chroot /mnt

chrootでSSDのOSパーティションに入ったら、/etc/fstabのUUIDを更新します。
予めblkid /dev/nvme0n1p2 > /tmp/uuidでUUIDを控えておき、vimで複窓を開いてコピペするのが楽だと思います。
fstabはmount pointが/になっている行の先頭を変更します。
また、/boot/efiをマウントできるようにしなければならないため、同様に/dev/nvme0n1p1のUUIDを調べ、以下のエントリを追加します。

UUID=AAAA-AAAA /boot/efi vfat umask=0077 0 1

続いて以下のようにブートローダをインストールします。

# grub-install --target=x86_64-efi  --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck --no-floppy --debug

再起動

ここまでの手順を踏んだ後、再起動してBIOS設定からデバイスの起動順を確認します。
SSDが上位に存在することを確認して改めて再起動し、SSD側のOSが立ち上がっていれば無事終了です。

感想

この手順通りにやればよかったのですが、実際はfstabへUUIDを反映する前にブートローダをインストールしてしまい、そのまま再起動して移行前のHDDのOSが立ち上がるというヘマをしました。わりと原因が分からず1時間ぐらい溶かしてしまったのでつらかった。

最終的に無事移行チャレンジには成功し、実際に起動時間が爆速になったのを体感したのでやはりSSDはつよいなあという気持ちになりました。
HDDはバックアップ兼大きめのファイル用のストレージとして流用したいと思います。

参考

Leave a Comment

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