それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Linux のマルチブートを作りたい-その2 ddでコピーする

レベル2 通常インストール済みディスクをコピーして持ってくる。

ここまでで、grub-install と update-grub の使い方がちょっとわかった。 そこでインストール済みのOSが入ったパーティションを持ち込んで、既存のディスクにOSを追加する事を考えてみる。

目的は、FSCKとLVMのリサイズである。メンテナンスを楽にするために、既存のシステムにメンテナンス用のOSを追加する方法を模索していく。

これができれば、インストーラーをわざわざ起動しなくても済むわけです。

OSを2つ用意する。

ディスクの用意

## 必要な変数を用意
NAME=d01
DISK=/var/lib/libvirt/images/$NAME.qcow2
sudo qemu-img create -f qcow2 $DISK 20G

パーティションを用意する。

## nbd有効化
sudo modprobe nbd max_part=8
## 接続
sudo -E qemu-nbd --connect=/dev/nbd0 $DISK
## パーティションを作成する。point of no return.
vda=/dev/nbd0
sudo -E sgdisk -og $vda # 初期化 
sudo -E sgdisk  -p $vda
sudo -E sgdisk \
-n 1:2048:4095 -c 1:"BIOS Boot" -t 1:ef02  \
-n "2::+1G" -c 2:"GRUB" -t 2:8300 \
-n "3::+1G" -c 3:"swap" -t 3:8200 \
-n 4:0:$(sudo -E sgdisk -E $vda ) -c 4:"LVM" -t 4:8e00 \
$vda;
sudo -E sgdisk  -p $vda
sudo pvcreate /dev/nbd0p4
sudo vgcreate vg0 /dev/nbd0p4
sudo lvcreate vg0 -n debian  -L 5G
## 解放
sudo dmsetup ls 
sudo dmsetup remove vg0-debian
## 取り外し
sudo qemu-nbd --disconnect /dev/nbd0
## nbd 無効化
sudo rmmod nbd

これで、ディスクが用意できた。

OS-01 Debianの用意

## 必要な変数を用意
NAME=d01
DISK=/var/lib/libvirt/images/$NAME.qcow2
## インストール開始
INSTALLER=http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/
virt-install --connect=qemu:///system --graphics none \
 --location $INSTALLER --extra-args="console=ttyS0" \
 --ram 4096 --vcpus 8 --virt-type kvm --os-type linux \
 --os-variant debian10 \
 --name $NAME \
 --disk path=$DISK \
; 

OSをインストールするときに、/boot は別パーティションにする。

インストールができた。

OS-02 Ubuntuの用意

素のUbuntuを用意する。単純なインストール

## 必要な変数を用意
NAME=u02
DISK=/var/lib/libvirt/images/$NAME.qcow2
sudo qemu-img create -f qcow2 $DISK 10G
### インストール
virt-install\
 --connect=qemu:///system  \
 --ram 8192 --virt-type kvm --vcpus 8 --name $NAME --os-type linux  \
 --graphics none \
 --disk path=$DISK  \
 --location /var/lib/libvirt/images/ubuntu-20.04.3-live-server-amd64.iso,kernel=casper/hwe-vmlinuz,initrd=casper/hwe-initrd \
 --os-variant ubuntu20.04  \
 --extra-args "console=tty0 console=ttyS0,115200n8" \

Enter diskを選んで、シンプルにインストール。

ディスクのレイアウト設定

インストールができた

インストール後のディスクのマウント状況

Ubuntuのシリアルコンソールを有効にする。

sudo sed '/console/i GRUB_TERMINAL="console serial"' -i /etc/default/grub
sudo sed 's/GRUB_TIMEOUT/#GRUB_TIMEOUT/' -i /etc/default/grub
sudo sed '/GRUB_DEFAULT/a GRUB_TIMEOUT=5' -i /etc/default/grub
sudo sed '/GRUB_DEFAULT/a GRUB_TIMEOUT_STYLE=menu' -i /etc/default/grub
sudo update-grub
sudo grub-install --boot-directory=/boot /dev/vda

シリアルコンソールの有効化を忘れると、やばい。Ubuntuをシリアルコンソールで見られない。

シリアル経由でUbuntuが起動してるのか失敗したかわからない。Grubミスで停止しても起動してても、全くわからないので注意。

2つのHDDを接続する

これで、次のディスクができた。

ubuntu u02.qcow2
debian d01.qcow2

USBディスクのUbuntuをPCに差し込んだ状態をシミュレートする。OS入りHDDをそれぞれ1台を2台用意し、1台のPCに2台を突っ込む。

ubuntuのディスクをPCに接続する

sudo virsh attach-disk \
  --domain d01 \
  --source /var/lib/libvirt/images/u02.qcow2\
  --driver qemu\
  --subdriver qcow2\
  --targetbus virtio\
  vdb

二台とも接続できたかチェック

sudo virsh console d01
lsblk

ちゃんと接続されて、VGが認識されていることがわかる。

ディスクの内容をコピー

コピー先を用意する

sudo lvcreate vg0 -n ubuntu -L 5G
sudo mkfs.ext4 /dev/mapper/vg0-ubuntu

マウントする

sudo mount /dev/mapper/ubuntu--vg-ubuntu--lv  /mnt
sudo mount /dev/vdb2 /mnt/boot
sudo mkdir /mnt2
sudo mount /dev/mapper/vg0-ubuntu /mnt2

マウント状況を確認する。/bootも

コピーする。

sudo rsync -avz /mnt/ /mnt2

rsyncコピーは遅いので、dump-restore/ddでもいいかも

/etc/fstabを変更する

ubuntuのfstabを書き換える。UUIDで記述されていてまずい。/bootは使わないようにしたので変更する。

/mnt2/etc/fstab

/dev/disk/by-id/dm-name-vg0-ubuntu / ext4 defaults 0 1
#/dev/disk/by-uuid/xxxxx /boot ext4 defaults 0 1

DebianGrub再構築。

アンマウントして

sudo umount /mnt
sudo umount /mnt/boot
sudo umount /mnt2
sudo dmsetup remove ubuntu--vg-ubuntu--lv

ディスクを取り外しする

sudo virsh detach-disk d01 vdb

正常に取外した。

os-proberでコピー確認

コピーした領域が、DebianからUbuntuとして認識されてるかテスト

GRUBメニューを作り直す

Debianで起動しログインする。Ubuntuが追加されたのをGRUBに認識させて、メニューに追加させる。

sudo update-grub

再起動して確認。

GRUBを使った起動を確認する。

Debianで起動することを確認

無事起動した。

Ubuntuで起動するか確認

Ubuntuも無事に起動した。

ここまでのまとめ

Ubuntuがインストールされたディスクをコピーして起動させることができた。

ミスしそうポイントは以下の通り。

  • /etc/fstab
  • GRUB_TERMINAL="serial console"
  • mount /dev/vdb2 /mnt/boot
  • os-prober

手順としては単純にコピーをしてファイルを作るだけでいい。なるほどね。

次回へつづく

次回は、EFIブートと組み合わあせます。→ 次回

Linuxのマルチブートの作業ログ一覧