画像やリンクが無効になっている可能性もあるのでご了承下さい。
はじめに
先週購入した Crucial BX500 120GB のドライブとサーバーで稼働中の SSD をいつ交換するかと考えていた物の、アクセスの割とある真っ昼間だけど問題があったらその後のトラブルシュートで時間がかかるし夜はちゃんと寝たいから~で構わず実行に移した。
実行手順
下準備
稼働ホストでディスクへのアクセスがあるサービスを停止させる。特に Web と DB にアクセスする物は全て。
これは systemctl disable をするだけなので対象サービスをリストアップしておけば良いだけ。
systemctl disable nginx smb nmb munin-node munin-fcgi-graph munin-fcgi-html
systemctl stop nginx smb nmb munin-node munin-fcgi-graph munin-fcgi-html
うちの場合はこんな感じで。特に一旦外す HDD にアクセスする Samba や、NextCloud へアクセスがあっても HDD を見に行くので Nginx は確実に止めておく。
あとは Munin で rrd にデータ集めたりするんで止めて置いた。
その他サービスはディスクがないだとかエラー吐いておいてくれて問題ないから放置。
サーバー機に SSD だけを接続
極力何かあったとしてもストレージへの被害を抑えたいから新しい SSD 以外、ケーブルを外しておく事でマウントしないようにしておいた。
予め外す HDD 等あれば UUID と対応する HDD の型番をメモっておくと GOOD。
USB インストールメディアから CentOS をインストール
新しい SSD に CentOS 7 をインストールする。
予め USB メモリの方が SSD よりもブートプライオリティが高い事を確認しておいたので、USB メモリを挿して起動させたらインストーラが表示された。このまま最小構成でインストールを進めてしまう。
パーティションは LVM の配下に置くようにした。正直 LVM に対する理解度が低いので後日別途要学習である……
肝心な割り当ては次の様にした。
lsblk /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 111.8G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 102G 0 part
├─LogVol-root 253:0 0 15G 0 lvm /
├─LogVol-swap 253:1 0 12G 0 lvm [SWAP]
├─LogVol-var 253:2 0 25G 0 lvm /var
└─LogVol-home 253:3 0 50G 0 lvm /home
各パーティションは旧 SSD 使用時よりも当然増量。
111.8GiB に対して割り当ては 103GiB なので未割り当てが 9GiB ちょいあるけど、これは SSD のオーバープロビジョニング用ということで開けておく。
万が一どこかが容量不足になったら未割り当て分を分けて上げれば良いし。
今回は SSD 交換とはいってもファイルシステムの問題でフォーマット必須なのでちょっとイレギュラーな手段をとった。
元も LVM を使っているからそこに新 SSD を繋げてボリュームを移動させてから grub をインストールして旧 SSD を LVM から外すって手もあるにはあるけど、理解度が低いためにトラブル防止の為にも手を付けなかった。
パッケージを最新に
旧 SSD に入っているシステムも予め yum -y update して最新状態を保っているので、新 SSD 環境でも同様にしておく。
加えて旧環境では起動させないようにしているパッケージも新環境では起動してしまうサービスがあるので、適時潰しておく。
自分の場合は firewalld が該当した。これは使わず iptables にやらせているのだが、新環境ではこの両方が起動してしまうのでちょっとマズい。
fstab をバックアップしておく
旧 SSD から全てのファイルをコピーする事で環境移行を行うため、新 SSD の環境の fstab まで上書きされると起動しなくなる。
その為、新 SSD にインストールした時に生成された fstab をバックアップしておかなければならない。
mkdir -p /root/backup
cp -rp /etc/grub* /root/backup
cp -p /etc/fstab /root/backup
grub 関連も念のためバックアップしておいた。
でもってバックアップしたら旧 SSD を繋いでファイルのコピーをするので電源を落とす。
halt -p
旧 SSD を繋いでレスキューモードへ
外しておいたケーブルに旧 SSD を繋いで CentOS をレスキューモードで起動する。
レスキューモードで起動するときはカーネルパラメータで selinux=0 を追加しなければ自動で SELinux が有効になって正常にファイルコピーが出来ないので要注意。
レスキューモードで起動、ディスクのマウント
レスキューモードで起動したら旧 SSD の LVM 配下のパーティションをマウントする。
pvscan
vgscan
lvscan
としてボリュームを確認してから
lvm vgchange -ay
とすると LVM のパーティションがアクティブになるのでマウント出来るようになる。
先ずは新 SSD をマウントするディレクトリを掘ってマウント。
mkdir -p /mnt/new/{home,var}
mount /dev/mapper/LogVol-root /mnt/new
mount /dev/mapper/LogVol-var /mnt/new/var
mount /dev/mapper/LogVol-home /mnt/new/home
次に旧 SSD を読み込み専用でマウントする。
mkdir -p /mnt/old/{home,var}
mount -o ro /dev/mapper/hoge-root /mnt/old
mount -o ro /dev/mapper/hoge-home /mnt/old/home
mount -o ro /dev/mapper/hoge-var /mnt/old/var
データをフルコピーする
bash で次のコマンドを打ち込むと旧 SSD のファイルが全て新 SSD にコピーされるので、終了するまで暫し待つ。
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /mnt/old/ /mnt/new
バックアップしていた fstab を戻す
fstab を戻さないと OS が起動しなくなるのでバックアップしておいた fstab を戻す。
cp -p /mnt/new/root/backup/fstab /mnt/new/etc/fstab
再起動して OS の起動確認
ここまで来たら reboot コマンドを打ち込んで USB メモリを抜いておく。
正常に作業が出来ていれば OS もまた正常に起動をしてくれる。
一旦停止させていたサービスを再度有効化する。
systemctl enable nginx smb nmb munin-node munin-fcgi-graph munin-fcgi-html
systemctl start nginx smb nmb munin-node munin-fcgi-graph munin-fcgi-html
他 HDD 等のマウント
旧環境で自動マウントさせていたエントリがあれば、ここで fstab を編集して該当エントリを追加しておく。
移行完了後の確認
今回一番の目的だった xfs フォーマット時の ftype の値。
xfs_info /dev/mapper/LogVol-root
meta-data=/dev/mapper/LogVol-root isize=512 agcount=4, agsize=983040 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=3932160, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
ということで無事 ftype=1 となっているので OverlayFS が使えるようになり、Docker やらも使用可能となると共に次期 CentOS 8 へのアップデートも安心して行えるかなとおもう。
RHEL 8 のアップデート要件のお話しだけど、一応次のリンクの内容を気には留めておきたい。
おわりに
サーバーのダウンタイムは 2 時間くらい見積もっていたが予定通り 2 時間かかってしまった。
レスキューモード起動時には SELinux が有効化される所でちょっと無駄な時間を過ごしてしまったのが無念な所。
ともあれ無事にサーバーのシステムドライブにしていた SSD を 2,480 円の Crucial BX500 120GB に交換完了となったのでホッとした。
SATA2 という旧世代の I/F だけどシーケンシャルリードで 270MB/s は出ていたので以前よりは多少早いはず。
なにより SSD の寿命という観点から交換して今後も安心して使えるので良かったかなと。
Crucial C300 64GB も 8 年稼働して無事退役と。
コメント