既にRHELが稼働している検証機に、故あってUbuntuを追加しマルチブート環境を構築する必要に迫られました。パーティション操作やGRUBの再設定が必要でやや手間取りましたので、備忘を兼ねて書き残すことにします。
1. 初期状態の確認と方針の策定
検証用RHEL 8.7 環境を確認すると、パーティションとLVMは次のような構造になっていました。
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.8G 0 disk
├ sda1 8:1 0 1G 0 part /boot
└ sda2 8:2 0 464.8G 0 part
├ rhel-root 253:0 0 70G 0 lvm /
├ rhel-swap 253:1 0 7.8G 0 lvm [SWAP]
└ rhel-home 253:2 0 387G 0 lvm /home
/home は387GBもいらないので、ここを縮小してUbuntu関係のインストール領域に変えることとします。
とはいえ既存のPVにインストールはできないので、/homeの縮小に合わせて大本の物理ディスクパーティションも縮小しましょう。
2. 空き領域の確保
ファイルシステム縮小 → LVM LV縮小 → LVM PV縮小 → パーティション縮小 の順で実施し、空き領域を確保します。
RHELのファイルシステムはXFSですが、ext4と違って単純な縮小に対応しておらず、バックアップ – リストア による手順を採る必要があります。
xfsdump -l 0 - /dev/mapper/rhel-home > /hoge/back.dump #バックアップ取得
umount -l /home #縮小のためアンマウント
lvreduce -L 100G /dev/rhel/home #LV縮小
mkfs.xfs -f /dev/mapper/rhel-home #縮小後LVに、新規でファイルシステム構築
mount /dev/rhel/home /home #リストアのためマウント
xfsrestore -f /hoge/back.dump /home #リストア
これで領域が空いたのでpvreduceを、と思いましたが、cannot resizeと怒られました。よく調べてみると、どうやら真ん中の領域が減っただけのようです。
pvdisplay -v -m
--- Physical volume ---
PV Name /dev/sda2
VG Name rhel
PV Size 464.76 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 118978
Free PE 73455
Allocated PE 45523
--- Physical Segments ---
Physical extent 0 to 2002:
Logical volume /dev/rhel/swap
Logical extents 0 to 2002
Physical extent 2003 to 27602:
Logical volume /dev/rhel/home
Logical extents 0 to 25599
Physical extent 27603 to 101057:
FREE
Physical extent 101058 to 118977:
Logical volume /dev/rhel/root
Logical extents 0 to 17919
それでもLVMであれば pvmove コマンドで Physical extentを移動できるようなので、移動して進めます。pvmoveは時間がかかるので気長に待ちましょう。
pvmove --alloc anywhere /dev/sda2:101058-118977 /dev/sda2:27603-45522 #Physical extent移動
pvresize --setphysicalvolumesize 182096M /dev/sda2 #PV縮小 (サイズは-tで何度か試行し、ぴったりに合わせる)
pvdisplay --units b #パーティション分割用に情報取得
--- Physical volume ---
PV Name /dev/sda2
VG Name rhel
PV Size 190940446720 B / not usable 3145728 B #必要セクタ数:190940446720 / 512 = 372930560
Allocatable yes (but full)
PE Size 4194304 B
Total PE 45523
Free PE 0
Allocated PE 45523
parted /dev/sda
(parted) unit s
(parted) print
ディスク /dev/sda: 976773168s
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
番号 開始 終了 サイズ タイプ ファイルシステム フラグ
1 2048s 2099199s 2097152s primary xfs boot
2 2099200s 976773119s 974673920s primary lvm #ここを、終了:(2099200 + 372930560 - 1) = 375029759 へ変更
(parted) resizepart 2 375029759
警告: パーティションを縮小するとデータを失うかもしれませんが、それでも実行しますか?
はい(Y)/Yes/いいえ(N)/No? Y
(parted) quit
3. Ubuntuのインストール
通常通りインストール用USBからブートし、基本はデフォルト設定で進めていきます。
ただし落とし穴が一つ、なぜかRHELインストール時にMBRディスクとなっていたようで、GPTと思い込みUEFI の表示がある起動デバイスを選択してはboot diskが選択できず小一時間足踏みをしてしまいました。
GPT : UEFI表記有りのインストールメディアからブート
MBR : UEFI表記なしのインストールメディアからブート
するようにしましょう。
あとはCustom storage layout から、2で作った空き領域を/に割り当て、boot diskも選択して待つだけです。
最後のReboot Now で再起動すると、無事Ubuntuが立ち上がりました。
4. RHELブート失敗のリカバリ
Ubuntuインストール後にRHELを起動したところ、以下のような表示が出てブートシーケンスが止まり、レスキューモードに入ってしまいました。
[FAILED] Failed to start Switch Root.
See 'systemctl status initrd-switch-root.service' for details.
Generating "/run/initramfs/rdsosreport.txt"
Entering emergency mode. Exit the shell to continue.
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot
after mounting them and attach it to a bug report.
:/#
色々と確認したところ、/sysroot を / にスイッチしようとして失敗したようです。
現状の/sysroot を ls すると、本来あるべき / ではなく /home の内容が表示されました。
LVMを弄ったせいで、/sysroot にマウントされるLVが変わってしまったと推察されます。
まずは起動させないと何もできないので、/sysroot に正しいLVをマウントしてブートシーケンスを続行させます。
:/# umount /sysout
:/# mount /dev/rhel/root /sysroot
:/# exit
無事に起動することが確認できました。
あとは根本的な解決法の模索です。GRUB画面でeを押下し編集画面を確認したところ、ルートデバイスの指定が /dev/dm-* 形式になっていました。Ubuntuインストールによりdm番号がずれ、本来の root ではなく home のLVをルートデバイス扱いにしてしまっているようです。
GRUBの再設定を行います。
(注:バックアップは取りましょう。また、以下の手順はBIOSベースの場合です。UEFIベースの場合は別手順となりますので、参考文献「GRUB2の再インストール」を参照してください)
rm /etc/grub.d/*
rm /etc/sysconfig/grub #現状のGRUB設定削除
yum reinstall grub2-tools #GRUB再設定
grub2-mkconfig -o /boot/grub2/grub.cfg #grub.cfg ファイルの再構築
これで、RHEL側のルートデバイスも /dev/mapper/ 形式の指定に更新されました。
Ubuntu, RHELともに正常起動を確認し、作業完了です。
参考文献
・rootのXFSファイルシステムを縮小する方法
・LinuxのLVMパーティションを縮小してWindowsをインストールした
・GRUB 2 の再インストール