それマグで!

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

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

Linux のマルチブートを作りたい レベル1 インストーラーによる、デュアルブートの構築

レベル1 インストーラーによる、デュアルブートの構築

簡単に言えば、CD-ROMでOS別にインストールを行う。2回インストをする方法だ。

ディスクを準備

パーティションをインストール時に作ると面倒なので、先にパーティションをqcow2に仕込んでおく。

qcow2 を作って、nbd でループデバイスにして、sgdsik でパーティション作成してく。

NAME=mbt-d01
DISK=/var/lib/libvirt/images/$NAME.qcow2
## disk 初期化
sudo qemu-img create -f qcow2 $DISK 20G

最初に決めたディスク・レイアウトを目指してディスクをパーティションする。

パーティション作成はインストール中に行うほうが分かりやすい。

私はインストーラーのパーティション作成画面が得意ではないので、事前にパーティションを作っておくことにした。(参考資料 nbdでqcowを扱う , sgdisk使い方)

パーティションの作成

  

qcow2 のディスクをnbd でループデバイスにして、
sgdisk でパーティション作成、
LVMを作成してパーティションレイアウトを先に完成させておく。

先に完成させることでインスト中の作業を減らす。

## 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

### LVMを作成
sudo pvcreate /dev/nbd0p4
sudo vgcreate vg0 /dev/nbd0p4
sudo lvcreate vg0 -n  u04root  -L 5G  
sudo lvcreate vg0 -n  d05root  -L 5G 


## LVMを取り外し
sudo dmsetup ls 
sudo dmsetup remove vg0-u04root
sudo dmsetup remove vg0-d05root

## ディスク取り外し
sudo qemu-nbd --disconnect /dev/nbd0


## nbd 無効化
sudo rmmod nbd

OS-01 のDebianインストールを開始。

## 必要な変数を用意
NAME=mbt-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 \
 ; 

インストール作業

インストーラーでディスクをマニュアルで選ぶ

作ったパーティション/, , swap をそれぞれを割り当てる。

- dev/vda2 未使用
- dev/vda3 swap
- dev/vda4
    - lvm-vg0-d05root /
    - lvm-vg0-u04root 未使用

/bootの配置

rootファイルシステム(LVM内部)にブートを作っておくことにした。

インストールチェック

起動を確認して

ログインも確認する

ディスクのマウント状態を確認する。

目的はディスク作成なので、仮想マシン自体は一旦消す。

NAME=mbt-d01
sudo -E virsh destroy $NAME
sudo -E virsh undefine $NAME

DebianOSのインストールが完了

これで、Debianディスク作成完了。

ls $DISK

バックアップを作っておく。

念のために、ここまでのディスクをコピーしてバックアップする。

コピーしたものを次の作業で使う。

cp mbt-d01.qcow2 mbt-d01.installed.qcow2 
cp mbt-d01.qcow2 mbt01.qcow2

qcow2スナップショットの作成もありかもしれない。

sudo qemu-img snapshot -c debian.installed mbt01.qcow2
sudo qemu-img snapshot -l mbt01.qcow2

バックアップを作っておかないと、失敗時に何度も作り直す羽目になり心が折れそうになる。

OS-02 のUbuntuを追加インストール開始。

先程開けておいた容量に、Ubuntuをインストール

Ubuntuインストーラーにより、インストール+boot追加する。作ったディスクを、上書きする。

ubuntuインストール

先程作ったDISKを使って、Ubuntuを更にインストール

NAME=mbt01
DISK=/var/lib/libvirt/images/$NAME.qcow2
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" \

Ubuntuのインストールが始まる。

ubuntuSSH経由のインストール。

ubuntuSSH経由でインストールが楽なのでSSH経由でインストールする。このときホスト鍵を無視しておくと面倒がなくていい。

## SSHインストールへの接続

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no  installer@192.168.200.141

SSH接続でインストールが始まる。

ディスクの割当をマニュアルで行う。

Debianが作った/bootはいじらないようにして、別の場所に/bootを作る

インストールの完了のチェック

再起動して、ubuntuをインストールしたパーティションが使われているのを確認。

Ubuntu側からDebianが発見出来ることを確認。

バックアップ

ディスク状態を一旦ここで保存しときます。

cp  mbt01.qcow2  mbt01.ubuntu-installed.qcow2

qcow2スナップショットの作成もありかもしれない。

sudo qemu-img snapshot -c ubuntu.installed mbt01.qcow2
sudo qemu-img snapshot -l mbt01.qcow2

ubuntuGRUBメニューを有効化

Ubuntuは起動時にGRUBメニューを「隠す」ので表示する必要がある。(関連記事 ubuntuでgrubメニューを出す)

/etc/default/grub を書き換える

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
    

/etc/default/grub を書き換えて反映すると、Ubuntuでシリアルコンソールで接続できる。

デュアルブートの確認。

この時点で再起動してすると、UbuntuからDebianが発見されていて、Ubuntuの起動メニューに出てるはずである。

debian で起動することを確認

Debianは /dev/vda2 を使わないことを確認。

debianubuntu はそれぞれ別個にGRUBを持っていることがわかる。

GRUBメモ

Grubメニューの移動方法。UbuntuGRUBCtl-P/Ctl-Nまたは^/v で項目移動、Enterで決定、ESCで抜ける。

デュアルブート時の注意。

今回は両方ともにGRUBを持ってるので、どっちがどっちGRUBを使っていて、今何処のGRUBから起動しているのか、ちゃんと意識してupdate-grub をする必要がある。

今回の構成は、あとからインストールしたUbuntuのGRUBをメインで使っている。DebianGrubは使われていない。しかし存在はしている。存在はしているので忘れないようにしておく。

切り替える場合の注意。

表示される。順番を変える話ではない。つかう GURBを切り替える話です。

sudo grub-install /dev/sda
sudo reboot

debiangrub-installすると

Debianで、grub-installをすると、DebianGRUBが起動に使用されるようになる。

Debian側で実行

Debianからみたディスクのマウント状況は以下の通り。

debianGRUBを登録

/dev/vda のBISO Boot PartitionにDebianGrubを登録する。

sudo grub-install /dev/sda
sudo reboot

再起動後

DebianGrubから起動している。

ubuntugrub-install すると

Ubuntu側で、grubを作り上書きし、grub-installをすると、UbuntuGRUBが使われる。

ubuntu側から見たマウント状況

Ubuntu側のGRUBを登録

sudo grub-install /dev/sda
sudo reboot

再起動後

DebianGRUBより、UbuntuGRUBが優先されて起動している。

上記GRUBの切り替えの留意点

GPT(MBR互換) / MBRのディスクの場合に限る

GPT / MBRの ディスクは、どのパーティションが「Bootable」であり、どのパーティションからブートするかのオーダーをフラグで管理している。そのフラグに/boot/grubの所有者が書きに行くのである。そのため、起動順が書き換わり、Bootするブロックデバイスが変わってくることになる。

個人的な感想でいえば、だるい。めっちゃめんどくさい仕様だ。だからEFIではこの辺を解消して/EFIパーティションというブート仕様専用のパーティションが設けられてそこを共有して使うことになっている。

ここまでの作業のまとめ

最初に、既存のDebianをつくっておき、Ubuntuインストーラーで追加インストールした。

続く

次回へつづく。 → rsync/ddコピーで作る

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