Closed9

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を手にしているので難しいことはなにもない。


  1. /dev/sda1vg1 に参加させる。
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


  1. /dev/sda2vg1から退去させる。

/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.


  1. /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
このスクラップは4ヶ月前にクローズされました