OCIでBoot VolumeをLVM (root) にする
作業前にバックアップをとっておこう。
幸い、OCIにはBoot Volume Backupという機能がある。Create Manual Backupするだけで、救われる命がありますう。
k8sのノードだったので、事前にdrainしてある。あとは、イメージとかのデータの削除 (sudo crictl rmi --prune
) をしてなるべく空きをつくっておいた。
Block Volumeをいくつかattachしている関係で、ルートが/dev/sdc
になってるけど、13Gくらいの使用量になっている。
partedで確認。
sudo parted /dev/sdc
GNU Parted 3.4
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: ORACLE BlockVolume (scsi)
Disk /dev/sdc: 50.0GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
15 1049kB 105MB 104MB fat32 boot, esp
1 106MB 50.0GB 49.9GB ext4
このままだとディスクに空きがなくてLVM Physical Volume用の領域がないので、root partitionをちぢめる。
最初に、cloud-initのgrowpart
, resizefs
あたりを無効化しておかないと、
ディスク一杯まで勝手にパーティションを拡張しやがる (一敗) ので、編集しておく。
/etc/cloud/cloud.cfg
の30行目あたりにあるものをコメントアウトしよう
cloud_init_modules:
- seed_random
- bootcmd
- write_files
# - growpart
# - resizefs
- disk_setup
- mounts
- set_hostname
- update_hostname
- update_etc_hosts
- ca_certs
- rsyslog
- users_groups
- ssh
OCI Consoleの「Boot Volume」のとこからDetach Volumeすると、他のインスタンスにBlock Volumeとして割りあてられるようになるので、別のインスタンスから操作する。
sdbとして出現した。 (いろんなloopデバイスとかも見えたけど省略してある)
sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 46.6G 0 disk
├─sda1
│ 8:1 0 46.5G 0 part /var/lib/kubelet/pods/...
│ /
└─sda15
8:15 0 99M 0 part /boot/efi
sdb 8:16 0 46.6G 0 disk
├─sdb1
│ 8:17 0 46.5G 0 part
└─sdb15
8:31 0 99M 0 part
/dev/sdb1
を25GBまで縮小したいわけだが、ここで何もせずpartedのようなツールで縮小するのは絶対にしてはいけない。
ハミ出た領域のデータがまるまる飛ぶからだ (データは先頭から詰まっているとは限らないので、13GBしか使用していなくても、それはパーティションの13GBより後の場所に何も書いてないということを意味しない)
まずは目標より少し小さいサイズまでファイルシステムを縮小する。
sudo e2fsck -f /dev/sdb1 #resizeの前にファイルシステムのチェックが必須
sudo resize2fs /dev/sdb1 20G
結構時間がかかるので、気長に待つ。
partedで縮小。
sudo parted /dev/sdb
(parted) p
Model: ORACLE BlockVolume (scsi)
Disk /dev/sdb: 50.0GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
15 1049kB 105MB 104MB fat32 boot, esp
1 106MB 50.0GB 49.9GB ext4
(parted) resizepart 1 25GB
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? y
ここで入力した25GBは、パーティションのサイズではなくEnd(終了地点) なので注意。
あとはもういちどresize2fsしてあげれば、サイズいっぱいまでファイルシステムをふくらませてくれる。
sudo resize2fs /dev/sdb1
作業用のインスタンスからBoot Volumeをdetachして、元のインスタンスに戻して立ちあげる。
lsblk
なりparted
なりで確認して空きができてれば成功。
lvm2をインストール
sudo apt install lvm2
ルートは/dev/sda
に戻ってるみたいです。
Physical Volume用のパーティションを生やします。
sudo parted /dev/sda
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit MB
(parted) p
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 50011MB
Sector size (logical/physical): 512B/4096B
Partition Table: gptDisk Flags:
Number Start End Size File system Name Flags
15 1.05MB 105MB 104MB fat32 boot, esp
1 106MB 25000MB 24894MB ext4
(parted) mkpart
Partition name? []?
File system type? [ext2]? ext4
Start? 25001
End? 100%
(parted) p
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 50011MB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
15 1.05MB 105MB 104MB fat32 boot, esp
1 106MB 25000MB 24894MB ext4
2 25001MB 50010MB 25009MB ext4
Physical Volumeを今生やしたパーティションからつくります
sudo pvcreate /dev/sda2
Physical volume "/dev/sda2" successfully created.
Physical VolumeからVolume Groupをつくります
sudo vgcreate vg1 /dev/sda2
Volume group "vg1" successfully created
20GのLogical Volumeroot_lv
を生やします
sudo lvcreate -L 20G -n root_lv vg1
Logical volume "root_lv" created.
今生やしたボリュームに、現在のファイルシステムの内容をコピーしていく。
マウントポイントをつくって、ファイルシステムをつくって、マウントする。
sudo mkfs.ext4 /dev/vg1/root_lv
sudo mkdir -p /mnt/new_root
sudo mount /dev/vg1/root_lv /mnt/new_root
rsyncで内容をうつす。
別のディスクがマウントされてる/mnt
とか、
仮想ファイルシステムの/sys
, /proc
, /run
とかは除く。(もちろん/dev
も)
他にも何かをマウントしているなら除外しておく。
不安なら、df -ha
で確認可能。
sudo rsync -aAXv --exclude={"/mnt","/sys","/proc","/dev","/run","/boot/efi"} / /mnt/new_root
もしミスった場合ファイルシステムをつくりなおしてやりなおせばよい。
sudo umount /mnt/new_root #アンマウント
sudo mkfs.ext4 /dev/vg1/root_lv
sudo mount /dev/vg1/root_lv /mnt/new_root
ブートできるようにします。 (ここでバックアップをもう一度つくってもいいかも)
必要なものをいろいろマウントしてchroot、grubを更新する。
私の環境でEFIパーティションは/dev/sda15
だった。
sudo mkdir -p /mnt/new_root/{dev,proc,sys,boot/efi}
sudo mount --bind /dev /mnt/new_root/dev
sudo mount --bind /proc /mnt/new_root/proc
sudo mount --bind /sys /mnt/new_root/sys
sudo mount /dev/sda15 /mnt/new_root/boot/efi
sudo chroot /mnt/new_root
update-initramfs -u
grub-install /dev/sda
update-grub
exit
cloud-initはLABEL=cloudimg-rootfs
を探すので……
sudo e2label /dev/sda1 ""
sudo e2label /dev/vg1/root_lv cloudimg-rootfs
あとは自分の信じる神か、あるいは自分自身を信じて再起動する。
df -h
で確認
/dev/mapper/vg1-root_lv 20G 14G 5.2G 73% /
いぇい!ぴーす!
今、
/dev/sda1 25GB (もともとルートファイルシステム)
/dev/sda2 25GB(vg1/root_lv)
/dev/sda15 (EFI)
これを
/dev/sda1 50GB (vg1/root_lv)
/dev/sda15 (EFI)
にしたい。我々はもはやlvmを手にしているので難しいことはなにもない。
-
/dev/sda1
をvg1
に参加させる。
sudo pvcreate /dev/sda1
WARNING: ext4 signature detected on /dev/sda1 at offset 1080. Wipe it? [y/n]: y
Wiping ext4 signature on /dev/sda1.
Physical volume "/dev/sda1" successfully created.
sudo vgextend vg1 /dev/sda1
Volume group "vg1" successfully extended
-
/dev/sda2
をvg1
から退去させる。
今/dev/sda2
にはいっぱいデータが入っているが、
sudo pvmove /dev/sda2
/dev/sda2: Moved: 0.12%
/dev/sda2: Moved: 2.07%
/dev/sda2: Moved: 3.85%
...
/dev/sda2: Moved: 100.00%
このコマンドを打てば他の場所にうつして/dev/sda2
をあけてくれる。
sudo vgreduce vg1 /dev/sda2
Removed "/dev/sda2" from volume group "vg1"
sudo pvremove /dev/sda2
Labels on physical volume "/dev/sda2" successfully wiped.
-
/dev/sda1
を最大サイズに
sudo parted /dev/sda
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 50.0GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
15 1049kB 105MB 104MB fat32 boot, esp
1 106MB 25.0GB 24.9GB
2 25.0GB 50.0GB 25.0GB
(parted) rm 2
(parted) resizepart 1 100%
(parted) p
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 50.0GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
15 1049kB 105MB 104MB fat32 boot, esp
1 106MB 50.0GB 49.9GB
(parted) q
sudo pvresize /dev/sda1
Physical volume "/dev/sda1" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
これでおわり!