hiroの長い冒険日記

主にコンピュータ周辺の興味を持った内容を綴ります

Desktop PC 128GB SSD へ Debian install (Hyper-V Pass through disk) その6

当日記ではアフィリエイト広告を利用しています

Hyper-V Path through 物理 SSD に install した debian を disk image (raw) にして vhd に変換し、Windows10 Hyper-V 第一世代の仮想マシンで起動する事が出来た。ただし、vhdx に変換してから Hyper-V 第二世代の仮想マシンでは起動できなかった。Microsoft UEFI の画面で停止していた。
hiro20180901.hatenablog.com
おそらく、vhdx が GPT に変換されていない為と推測した。MBR -> GPT に変換し、UEFI boot 出来るように修正する事により、Hyper-V 第二世代の仮想マシンで起動できると考え、試してみた。

vhdx MBR -> GPT 変換

Hyper-V 仮想 Ubuntuに vhdx 仮想ディスクを起動後に接続、MBR 形式から GPT 形式に変換した。
参考:
note.kurodigi.com
takuya-1st.hatenablog.jp
仮想 Ubuntu で以下の作業を行った。

  • gdisk で MBR -> GPT に変換
# dpkg -S `which gdisk`
gdisk: /sbin/gdisk
# gdisk /dev/sdc
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************


Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.
  • gparted で先頭に ESP 領域用の 512 MB 程度の空き領域を作成 (root fs を減少させる)
# dpkg -S `which gparted`
gparted: /usr/sbin/gparted
# gparted /dev/sdc
(root fs 領域の先頭を減少)
  • gdisk で先頭を領域確保し、ESP 領域に変更
# gdisk /dev/sdc
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/sdc: 250071360 sectors, 119.2 GiB
Model: Virtual Disk
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 00000000-0000-00nn-0000-0000nnnn0000nn
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 250071326
Partitions will be aligned on 2-sector boundaries
Total free space is 1052925 sectors (514.1 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1         1050624       241684479   114.7 GiB   8300  Linux filesystem
   5       241684480       250068991   4.0 GiB     8200  Linux swap

Command (? for help): n
Partition number (2-128, default 2): 2
First sector (34-250071326, default = 34) or {+-}size{KMGTP}: 34
Last sector (34-1050623, default = 1050623) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): L
... 略 ...
ed00 Sony system partitio  ed01 Lenovo system partit  ef00 EFI System
ef01 MBR partition scheme  ef02 BIOS boot partition   f800 Ceph OSD
... 略 ...
Hex code or GUID (L to show codes, Enter = 8300): ef00
Changed type of partition to 'EFI System'

Command (? for help): p
Disk /dev/sdc: 250071360 sectors, 119.2 GiB
Model: Virtual Disk
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 00000000-0000-00nn-0000-0000nnnn0000nn
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 250071326
Partitions will be aligned on 2-sector boundaries
Total free space is 2335 sectors (1.1 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1         1050624       241684479   114.7 GiB   8300  Linux filesystem
   2              34         1050623   513.0 MiB   EF00  EFI System
   5       241684480       250068991   4.0 GiB     8200  Linux swap

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.
  • ESP 領域 を fat32 で mkfs
# dpkg -S `which mkfs.vfat`
dosfstools: /sbin/mkfs.vfat
# mkfs.vfat -F 32 /dev/sdc2
  • root fs を /mnt に、ESP 領域を /mnt/boot に mount。root fs の /boot 以下を ESP 領域に移しておく。
# mount /dev/sdc1 /mnt/
# mount /dev/sdc2 /mnt/mnt
# cd /mnt/mnt
# ls /mnt/boot
System.map-4.9.0-8-amd64  config-4.9.0-8-amd64  grub  initrd.img-4.9.0-8-amd64  vmlinuz-4.9.0-8-amd64
# cp -pr /mnt/boot ./
# cd /mnt
# umount /mnt/mnt
# mount /dev/sdc2 /mnt/boot
  • /proc、/dev、 /dev/pts、/sys を /mnt 以下に bind してから /mnt に chroot
# mount --bind /proc /mnt/proc
# mount --bind /dev /mnt/dev
# mount --bind /dev/pts /mnt/dev/pts
# mount --bind /sys /mnt/sys
# chroot /mnt
# apt install grub-efi
  • grub-install、update-grub この段階では、chroot前の Ubuntu の entry が作成される。
# grub-install --target=x86_64-efi --efi-directory=/boot --recheck --debug /dev/sdc
# update-grub
  • /boot/EFI/boot 以下に bootx64.efi を cp する。実はこれが肝で、Microsoft Hyper-V UEFI はこれが無いと起動しなかった。

Arch LinuxをUEFI + GPT環境にインストールする | クロの思考ノートの「ブートローダーのインストール」より引用:

UEFIファームウェアによってはブータブルスタブが特定の名前で特定の場所に置かれていないと起動できないものがあります。念の為に以下のコマンドを実行しておきます。

# mkdir /boot/EFI/boot
# cp /boot/EFI/arch_grub/grubx64.efi  /boot/EFI/boot/bootx64.efi
  • chroot から抜けて後始末
# exit
exit
# umount /mnt/proc
# umount /mnt/dev/pts
# umount /mnt/sys
# umount /mnt/dev
# umount /mnt/boot
# umount /mnt

Hyper-V 第二世代で仮想ディスク接続し起動...OK (修正要)

出来た vhdx を使用して、Hyper-V 第二世代の仮想マシンを作成し起動してみた。

  • grub menu が ubuntu の物になるので、"e" で menuitem を編集し、vmlinuz と initrd と root fs を指定して起動した。tab 補完が効くので、file を探すのは難しくない。
  • /boot を自動で mount するように fstab を編集した。
  • 再度、grub-install と update-grub を実行した。

これで、再起動しても問題なく起動できるようになった。

結果

これまでの作業で、

  1. Hyper-V Path through 物理 SSD に Debian64 をinstall し、
  2. 仮想マシンでも実 PC でも起動でき、
  3. 仮想マシンUbuntu の dd で Path through 物理 SSD の中身を取り出し
  4. disk image を raw -> vhdqemu-image で変換し、
  5. qemu から vhd 仮想ディスクで仮想マシンを起動できる事を確認し、
  6. Hyper-V 第一世代(vhd)で仮想マシンを起動できる事を確認し、
  7. vhd -> vhdx、更に MBR -> GPT に変換し、GPT の ESP 領域の Hyper-V UEFI で認識する場所に efi を配置し、
  8. Hyper-V 第二世代(vhdx)で仮想マシンを起動できる事を確認

という所まで実施できた。

/boot/EFI/boot/bootx64.efi が無いと Microsoft Hyper-V UEFI から起動できない、という所で引っ掛かってしまったが、無事起動できた。

実 PC から仮想化する時、あるいは MBR -> GPT に移行する時には、今回の経験が役立つと考えている。

次は、仮想ディスクから実 PC の SSD へ移して起動できるかどうか試してみる予定。