MIRACLE Linux install memo

2022/05/16

LVMシステムディスクの修復とディスク交換

去る2022年5月16日,サーバーのうち1台が突然起動不能に.前から,HDDの不良セクタ警告が出ていたのが,カーネルアップデートで重要なファイルが読み取り不能になってしまったらしい.数日前から予兆があって,Sambaプロセスが何故か数時間で落ちる現象が続いていた.

なんとかしてディスクを修復,安全のためにシステムをまるごと新ディスクに入れ替えたが,はじめはLVMの概念がわからず,いろいろ調べて1週間ほどかかった.最終的に上手く行った方法をこに記す.なお,ネットには,LVMディスクのシステム移行についていくつもの情報があったが,

  • 元ディスクに手を加えない
  • 完全なデッドコピーを作る(稼働中のシステムからコピーを行わない)
方法はなかった.ここで紹介する方法は,ディスクコピー専用の別システムを使い,移行元ディスクのコピーを移行先ディスク上に作り,移行先ディスクを起動可能とするものである.また,MIRACLE LinuxのBIOS起動,MBR方式にのみ完全対応する.手順は大まかに言って以下のとおり.
  • 移行元ディスクの内容を移行先ディスクにコピー
  • 移行先ディスクにブートセクタを書き込む
  • 移行先ディスクのブート情報を手動で書き換え(grub2-mkconfigは使用しない)
  • 移行先ディスクを移行元システムに装着して起動すれば作業完了.
参考にしたサイト:LVM パーティション をrescue モードから操作する - うまいぼうぶろぐ
参考にしたサイト:Linuxでディスクのエラーや不良セクタのチェックと修正をする方法 - Ubuntu入門
参考にしたサイト:ディスク間データ移行で学ぶ LVM/ブートローダ/ファイルシステム - Qiita
参考にしたサイト:CentOS 8でのgrubの設定 - Qiita
参考にしたサイト:26.7. GRUB 2 の再インストール Red Hat Enterprise Linux 7 | Red Hat Customer Portal
参考にしたサイト:[Linux]ddを使用せずLVMのHDD交換方法 | alprovs の記録
参考にしたサイト:LVMのボリューム・グループ名の変更方法 - Just sleepy

(1)用意するもの
  • MIRACLE Linuxが起動する作業用の環境.以下では「システムディスク」と呼称する.
  • 移行元ディスク
  • 移行先ディスク
システムディスクは,USB起動のインストールディスクをレスキューモードで使うこともできる が,SSLが使えない.この後打ち込むコマンドの量を考えると,推奨できない.また,システムディスクはできればLVMなしでインストールしたほうが良い.移行元ディスクとvg名が同じだと,システムディスクが起動しない.

移行元とvg名が被っているなら,システムディスクのvg名を変えればよい.手順は「(12)移行先ディスクのブート情報を手動で書き換える」以降を参考に.

(2)ディスク接続,起動
システムディスクが起動するPCに,移行元ディスク,移行先ディスクディスクを接続,システムを起動する.以降の作業は,システムディスクをSSH接続して,任意の端末から操作.作業完了まで,(起動順変更など)低レベルの操作は不要.

確認する.
# lsblk

NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 232.9G  0 disk
├─sda1        8:1    0     1G  0 part /boot
├─sda2        8:2    0     4G  0 part [SWAP]
└─sda3        8:3    0   228G  0 part /
sdb           8:16   0   1.8T  0 disk
├─sdb1        8:17   0   954M  0 part
└─sdb2        8:18   0   1.8T  0 part
  ├─ml-root 253:0    0    70G  0 lvm
  ├─ml-swap 253:1    0    10G  0 lvm
  └─ml-home 253:2    0   1.8T  0 lvm
sdc           8:32   0 931.5G  0 disk
├─sdc1        8:33   0   385M  0 part
├─sdc2        8:34   0 928.1G  0 part
└─sdc3        8:35   0     3G  0 part
sr0          11:0    1  1024M  0 rom


sdbが移行元ディスク,vg名「ml」でroot,swap,homeの3つのlvが存在.sdcが移行先ディスクで,Windows10のシステムディスクだったもので,複数のパーティションが存在する.

(3)移行元ディスクのエラーチェック
マウントする前に,エラーをチェックしておく.
# fsck -t -y -f -c /dev/sdb1
# fsck -t -y -f -c /dev/mapper/ml-root
# fsck -t -y -f -c /dev/mapper/ml-home


(4)移行元ディスクのマウント
# mkdir /mnt/old_root
# mkdir /mnt/old_root/boot
# mkdir /mnt/old_root/home
# mount /dev/mapper/ml-root /mnt/old_root
# mount /dev/mapper/ml-home /mnt/old_root/home
# mount /dev/sdb1 /mnt/old_root/boot


(5)移行先ディスクをパーティショニング
# fdisk /dev/sdc
(以下は対話型コマンド.[ ]は操作手順,( )はデフォルト値.)

[パーティション消去.必要に応じて複数回]
d

[partition 1作成]
n[enter]
[enter](p)
[enter](1)
[enter](最初)
+1GB[enter]

[起動フラグを立てる]
a[enter]

[partition 2作成]
n[enter]
[enter](p)
[enter](2)
[enter](最初)
[enter](残り全部)

[Linux LVMフラグを立てる]
t[enter]
[enter](パーティション2)
8e[enter]

[ディスクに書き込み,終了]
w[enter]


確認する.
# fdisk -l | grep sdc

ディスク /dev/sdc: 931.5 GiB, 1000204886016 バイト, 1953525168 セクタ
/dev/sdc1  *        2048    1955839    1953792   954M 83 Linux
/dev/sdc2        1955840 1953525167 1951569328 930.6G 8e Linux LVM

# lsblk

NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 232.9G  0 disk
├─sda1        8:1    0     1G  0 part /boot
├─sda2        8:2    0     4G  0 part [SWAP]
└─sda3        8:3    0   228G  0 part /
sdb           8:16   0   1.8T  0 disk
├─sdb1        8:17   0   954M  0 part
sdb             8:16   0   1.8T  0 disk
├─sdb1          8:17   0   954M  0 part /mnt/old_root/boot
└─sdb2          8:18   0   1.8T  0 part
  ├─ml-root   253:0    0    70G  0 lvm  /mnt/old_root
  ├─ml-swap   253:1    0    10G  0 lvm
  └─ml-home   253:2    0   1.8T  0 lvm  /mnt/old_root/home
sdc           8:32   0 931.5G  0 disk
├─sdc1        8:33   0   954M  0 part
└─sdc2        8:34   0 930.6G  0 part
sr0          11:0    1  1024M  0 rom


(6)移行先ディスクのボリューム作成
pv作成
# pvcreate /dev/sdc2


vg作成.ここでは「vg00」とする.
# vgcreate vg00 /dev/sdc2


移行元に合わせ,lv作成.
# lvcreate -n root -L 70g vg00
# lvcreate -n swap -L 10g vg00
# lvcreate -n home  -l 100%FREE vg00


確認する.
# lsblk

NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda             8:0    0 232.9G  0 disk
├─sda1          8:1    0     1G  0 part /boot
├─sda2          8:2    0     4G  0 part [SWAP]
└─sda3          8:3    0   228G  0 part /
sdb             8:16   0   1.8T  0 disk
├─sdb1          8:17   0   954M  0 part /mnt/old_root/boot
└─sdb2          8:18   0   1.8T  0 part
  ├─ml-root   253:0    0    70G  0 lvm  /mnt/old_root
  ├─ml-swap   253:1    0    10G  0 lvm
  └─ml-home   253:2    0   1.8T  0 lvm  /mnt/old_root/home
sdc             8:32   0 931.5G  0 disk
├─sdc1          8:33   0   954M  0 part
└─sdc2          8:34   0 930.6G  0 part
  ├─vg00-root 253:3    0    70G  0 lvm
  ├─vg00-swap 253:4    0    10G  0 lvm
  └─vg00-home 253:5    0 850.6G  0 lvm
sr0            11:0    1  1024M  0 rom



(7)移行先ディスクのファイルシステム作成,マウント
ファイルシステム作成.
# mkfs.ext4 /dev/vg00/root
# mkfs.ext4 /dev/vg00/home
# mkfs.ext4 /dev/sdc1


マウント.
# mkdir /mnt/new_root
# mkdir /mnt/new_root/boot
# mkdir /mnt/new_root/home
# mount /dev/mapper/vg00-root /mnt/new_root
# mount /dev/mapper/vg00-home /mnt/new_root/home
# mount /dev/sdc1 /mnt/new_root/boot


確認する.
# lsblk

NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda             8:0    0 232.9G  0 disk
├─sda1          8:1    0     1G  0 part /boot
├─sda2          8:2    0     4G  0 part [SWAP]
└─sda3          8:3    0   228G  0 part /
sdb             8:16   0   1.8T  0 disk
├─sdb1          8:17   0   954M  0 part /mnt/old_root/boot
└─sdb2          8:18   0   1.8T  0 part
  ├─ml-root   253:0    0    70G  0 lvm  /mnt/old_root
  ├─ml-swap   253:1    0    10G  0 lvm
  └─ml-home   253:2    0   1.8T  0 lvm  /mnt/old_root/home
sdc             8:32   0 931.5G  0 disk
├─sdc1          8:33   0   954M  0 part /mnt/new_root/boot
└─sdc2          8:34   0 930.6G  0 part
  ├─vg00-root 253:3    0    70G  0 lvm  /mnt/new_root
  ├─vg00-swap 253:4    0    10G  0 lvm
  └─vg00-home 253:5    0 850.6G  0 lvm  /mnt/new_root/home
sr0            11:0    1  1024M  0 rom


(8)移行先ディスクのswapパーティション作成
ファイルシステム作成.
# mkswap /dev/mapper/vg00-swap
# swapon /dev/mapper/vg00-swap


確認する.
# lsblk

NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda             8:0    0 232.9G  0 disk
├─sda1          8:1    0     1G  0 part /boot
├─sda2          8:2    0     4G  0 part [SWAP]
└─sda3          8:3    0   228G  0 part /
sdb             8:16   0   1.8T  0 disk
├─sdb1          8:17   0   954M  0 part /mnt/old_root/boot
└─sdb2          8:18   0   1.8T  0 part
  ├─ml-root   253:0    0    70G  0 lvm  /mnt/old_root
  ├─ml-swap   253:1    0    10G  0 lvm
  └─ml-home   253:2    0   1.8T  0 lvm  /mnt/old_root/home
sdc             8:32   0 931.5G  0 disk
├─sdc1          8:33   0   954M  0 part /mnt/new_root/boot
└─sdc2          8:34   0 930.6G  0 part
  ├─vg00-root 253:3    0    70G  0 lvm  /mnt/new_root
  ├─vg00-swap 253:4    0    10G  0 lvm  [SWAP]
  └─vg00-home 253:5    0 850.6G  0 lvm  /mnt/new_root/home
sr0            11:0    1  1024M  0 rom


(9)データコピー
# for f in /!(sys|proc|dev|run|mnt) ;do rsync -a /mnt/old_root$f /mnt/new_root/ ;done

環境にもよるが,相当時間がかかる.

(10)特殊ディレクトリ作成
Step (9)で飛ばしたディレクトリはシンボリックリンク.フォルダを作り,パーミッションを適切に設定する.
# mkdir /mnt/new_root/{sys,proc,dev,run,mnt}
# for f in /{sys,proc,dev,run,mnt} ;do chmod $(stat $f -c '%a') /mnt/new_root$f ;done


(11)移行先ディスクのブートローダー書き込み
まず,システムディスクの/bootをアンマウント,移行先(sdc)の/bootになる予定の/sdc1をマウントしてしまう.
# umount /boot
# mount /dev/sdc1 /boot


ブートローダー書き込み.
# grub2-install /dev/sdc

grub2-install: warning: Sector 57 is already in use by the program `FlexNet'; avoiding it.  
This software may cause boot or other problems in future.  Please ask its authors not to store data in the boot track.
Installation finished. No error reported.

エラーが出るが大丈夫.

(12)移行先ディスクのブート情報を手動で書き換える
まず,移行元,移行先のUUIDを表示.
# blkid /dev/sdb1

/dev/sdb1: UUID="2f251c55-f017-4693-9f10-ae02032f3179" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="000e20a8-01"

# blkid /dev/sdc1

/dev/sdc1: UUID="8ad00826-f77e-42ba-b6cc-5295541b300b" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="d222e2d8-01"


書き換えるのは,移行先の/boot/grub2/grub.cfg,/boot/grub2/grubenv,/etc/fstab.MIRACLE Linuxはこれらの情報を見てロードするパーティションを決定する.移行先ディスクはUUIDとvg名が変わっているので置換.以下ではsedを使って自動化しているが,たまたま「ml」という文字列が旧ディスクのUUIDにあると誤動作する.心配なら,
# cat grub.cfg | grep ml

でチェック可能.

# cd /mnt/new_root/boot/grub2
# cp -p grub.cfg grub.cfg.org
# sed -i 's/ml/vg00/g' grub.cfg

# cat grub.cfg | grep 2f251c55-f017-4693-9f10-ae02032f3179
# sed -i 's/2f251c55-f017-4693-9f10-ae02032f3179/8ad00826-f77e-42ba-b6cc-5295541b300b/g' grub.cfg

# cp -p grubenv grubenv.org
# sed -i 's/ml/vg00/g' grubenv

# cd /mnt/new_root/etc
# cp -p fstab fstab.org
# sed -i 's/ml/vg00/g' fstab
# cat fstab | grep 2f251c55-f017-4693-9f10-ae02032f3179
# sed -i 's/2f251c55-f017-4693-9f10-ae02032f3179/8ad00826-f77e-42ba-b6cc-5295541b300b/g' fstab


これですべての作業が完了.移行先ディスクを移行元のハードウェアに装着,電源を入れれば起動するはず.移行元ディスクは,そのままバックアップとして保存しておく.

(13)移行先ディスクのvg名を書き換える
この作業は特に不要なのだが,潔癖症の人はどうぞ.移行先ディスクが稼働中のシステムで以下の作業を実行.

パーティション構成を確認する.
# lsblk

NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda             8:0    0 931.5G  0 disk
├─sda1          8:1    0   954M  0 part /boot
└─sda2          8:2    0 930.6G  0 part
  ├─vg00-root 253:0    0    70G  0 lvm  /
  ├─vg00-swap 253:1    0    10G  0 lvm  [SWAP]
  └─vg00-home 253:2    0 850.6G  0 lvm  /home
sr0            11:0    1  1024M  0 rom

/bootは/dev/sda1にある.

移行元ディスクと移行先ディスクはパーティション構成が同じだから,バックアップからUUIDだけ変えて復元すればよい.
# blkid /dev/sda1

/dev/sda1: UUID="8ad00826-f77e-42ba-b6cc-5295541b300b" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="d222e2d8-01"

# cd /boot/grub2
# mv grub.cfg grub.cfg.org2
# mv grub.cfg.org grub.cfg

# cat grub.cfg | grep 2f251c55-f017-4693-9f10-ae02032f3179
# sed -i 's/2f251c55-f017-4693-9f10-ae02032f3179/8ad00826-f77e-42ba-b6cc-5295541b300b/g' grub.cfg

# mv grubenv grubenv.org2
# mv grubenv.org grubenv

# cd /etc
# mv fstab fstab.org2
# mv fstab.org fstab
# cat fstab | grep 2f251c55-f017-4693-9f10-ae02032f3179
# sed -i 's/2f251c55-f017-4693-9f10-ae02032f3179/8ad00826-f77e-42ba-b6cc-5295541b300b/g' fstab


最後に,vg名を変更して再起動.
# vgrename vg00 ml
# vgs

  VG #PV #LV #SN Attr   VSize    VFree
  ml   1   3   0 wz--n- <930.58g    0

# shutdown -r now