web-dev-qa-db-ja.com

Hyper-V用のUbuntu 16.04の事前シードVMはUEFIブートセクションのインストールに失敗します

Packer でHyper-V(Win10およびWin2016)Ubuntuベースイメージを作成しています。マシンは正常にビルドされ、エクスポートされた仮想マシンを問題なく起動できます。ただし、新しく作成した仮想ハー​​ドドライブを使用して新しい仮想マシンを作成すると、次のメッセージが表示されて起動に失敗します

No x64-based UEFI boot loader was found

Ben Armstrongのブログ から収集したのは、UEFIブートファイルがディスクの正しい場所に書き込まれないという事実に関係しているということです。

EFIドライブとブートドライブを生成するためにpreseedファイルを更新しましたが、必要なファイルをEFI/bootドライブにインストールするためにpreseedファイルに追加するもの、またはbootコマンドを理解できないため、使用できますGen 2 Hyper-V仮想マシンを搭載した仮想ハー​​ドドライブ。

私のパッカー構成は次のようになります。

{
    "variables": {
        "admin_username": "admin",
        "admin_password": "admin",

        "dir_deploy": null,
        "dir_http_user": null,
        "dir_scripts_user": null,
        "dir_temp": null,

        "iso_checksum": null,
        "iso_url": null,

        "vm_name": "not_really_a_vm_name",
        "vm_ram_size_in_mb": "2048",
        "vm_switch_name": "this_switch_does_not_exist",
        "vm_switch_vlan": ""
    },
    "builders": [
        {
            "boot_wait": "5s",
            "boot_command": [
                "<esc><wait10><esc><esc><enter><wait>",
                "set gfxpayload=1024x768<enter>",
                "linux /install/vmlinuz ",
                "preseed/url=http://${NetworkHostIpAddressForPreseed}:{{.HTTPPort}}/preseed.cfg ",
                "debian-installer=en_US auto locale=en_US kbd-chooser/method=us ",
                "hostname={{.Name}} ",
                "fb=false debconf/frontend=noninteractive ",
                "keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA ",
                "keyboard-configuration/variant=USA console-setup/ask_detect=false <enter>",
                "initrd /install/initrd.gz<enter>",
                "boot<enter>"
            ],
            "communicator": "ssh",
            "enable_secure_boot": false,
            "generation": 2,
            "guest_additions_mode": "disable",
            "http_directory": "{{ user `dir_http_user` }}",
            "iso_url": "{{user `iso_url`}}",
            "iso_checksum_type": "sha256",
            "iso_checksum": "{{user `iso_checksum`}}",
            "iso_target_path": "{{ user `dir_temp` }}/packer",
            "output_directory": "{{ user `dir_temp` }}/{{ user `vm_name` }}",
            "ram_size": "{{user `vm_ram_size_in_mb`}}",
            "shutdown_command": "echo '{{user `admin_password`}}' | Sudo -S -E shutdown -P now",
            "ssh_password": "{{user `admin_password`}}",
            "ssh_timeout": "4h",
            "ssh_username": "{{user `admin_username`}}",
            "switch_name": "{{user `vm_switch_name`}}",
            "type": "hyperv-iso",
            "vm_name": "{{ user `vm_name` }}"
        }
    ],
    "provisioners": [
        {
            "type": "Shell",
            "execute_command": "echo '{{user `admin_password`}}' | Sudo -S -E sh {{.Path}}",
            "scripts": [
                "{{ user `dir_scripts_user` }}/ubuntu/update.sh",
                "{{ user `dir_scripts_user` }}/ubuntu/network.sh",
                "{{ user `dir_scripts_user` }}/ubuntu/cleanup.sh",
                "{{ user `dir_scripts_user` }}/ubuntu/sysprep.sh"
            ]
        }
    ]
}

また、preseedファイルは次のようになります。

# preseed configuration file for Ubuntu.
# Based on: https://help.ubuntu.com/lts/installation-guide/armhf/apbs04.html

#
# *** Localization ***
#
# Originally from: https://help.ubuntu.com/lts/installation-guide/armhf/apbs04.html#preseed-l10n
#

d-i debian-installer/locale string en_US.utf8
d-i console-setup/ask_detect boolean false
d-i console-setup/layout string us

d-i kbd-chooser/method select American English


#
# *** Network configuration ***
#
# Originally from: https://help.ubuntu.com/lts/installation-guide/armhf/apbs04.html#preseed-network
#

d-i netcfg/choose_interface select auto
d-i netcfg/dhcp_failed note ignore
d-i netcfg/dhcp_options select Configure network manually
d-i netcfg/confirm_static boolean true
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
d-i netcfg/wireless_wep string

#
# *** Account setup ***
#
# Originally from: https://help.ubuntu.com/lts/installation-guide/armhf/apbs04.html#preseed-account
#

d-i passwd/user-fullname string admin
d-i passwd/username string admin
d-i passwd/user-password password password
d-i passwd/user-password-again password password
d-i user-setup/encrypt-home boolean false
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false


#
# *** Clock and time zone setup ***
#
# Originally from: https://help.ubuntu.com/lts/installation-guide/armhf/apbs04.html#preseed-time
#

d-i clock-setup/utc boolean true
d-i clock-setup/utc-auto boolean true
d-i time/zone string UTC

#
# *** Partitioning ***
#
# Originally from: https://help.ubuntu.com/lts/installation-guide/armhf/apbs04.html#preseed-partman
#

d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-auto/method string lvm
d-i partman-auto/purge_lvm_from_device boolean true
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/device_remove_lvm_span boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto-lvm/guided_size string max
d-i partman-auto-lvm/new_vg_name string system
d-i partman-auto/choose_recipe select grub-efi-boot-root
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/default_filesystem string ext4

d-i partman-auto/expert_recipe string       \
    grub-efi-boot-root ::                   \
        1 1 1 free                          \
            $bios_boot{ }                   \
            method{ biosgrub }              \
        .                                   \
        256 256 256 fat32                   \
            $primary{ }                     \
            method{ efi }                   \
            format{ }                       \
        .                                   \
        512 512 512 ext4                    \
            $primary{ }                     \
            $bootable{ }                    \
            method{ format }                \
            format{ }                       \
            use_filesystem{ }               \
            filesystem{ ext4 }              \
            mountpoint{ /boot }             \
        .                                   \
        4096 4096 4096 linux-swap           \
            $lvmok{ }                       \
            method{ swap }                  \
            format{ }                       \
        .                                   \
        10000 20000 -1 ext4                 \
            $lvmok{ }                       \
            method{ format }                \
            format{ }                       \
            use_filesystem{ }               \
            filesystem{ ext4 }              \
            mountpoint{ / }                 \
        .

d-i partman-partitioning/no_bootable_gpt_biosgrub boolean false
d-i partman-partitioning/no_bootable_gpt_efi boolean false

# enforce usage of GPT - a must have to use EFI!
d-i partman-basicfilesystems/choose_label string gpt
d-i partman-basicfilesystems/default_label string gpt
d-i partman-partitioning/choose_label string gpt
d-i partman-partitioning/default_label string gpt
d-i partman/choose_label string gpt
d-i partman/default_label string gpt

# Keep that one set to true so we end up with a UEFI enabled
# system. If set to false, /var/lib/partman/uefi_ignore will be touched
d-i partman-efi/non_efi_system boolean true


#
# *** base system installation ***
#
# Originally from: https://help.ubuntu.com/lts/installation-guide/armhf/apbs04.html#preseed-apt
#

d-i base-installer/kernel/override-image string linux-server

#
# *** Package selection ***
#
# originally from: https://help.ubuntu.com/lts/installation-guide/armhf/apbs04.html#preseed-pkgsel
#

tasksel tasksel/first multiselect standard, ubuntu-server

# Minimum packages (see postinstall.sh). This includes the hyper-v tools
d-i pkgsel/include string openssh-server ntp linux-tools-$(uname -r) linux-cloud-tools-$(uname -r) linux-cloud-tools-common
d-i pkgsel/upgrade select none
d-i pkgsel/update-policy select none
d-i pkgsel/install-language-support boolean false

#
# Boot loader installation
#

d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev  string /dev/sda

# grub-install –target=x86_64-efi –efi-directory=/boot/efi –no-nvram –removable

#
# *** Preseed other packages ***
#

d-i debconf debconf/frontend select Noninteractive
d-i finish-install/reboot_in_progress note

choose-mirror-bin mirror/http/proxy string
1
Petrik

d-i grub-installer/force-efi-extra-removable boolean trueを設定すると、GrubがEFI/boot/bootx64.efiとしてインストールされますが、GrubはMicrosoftキーで署名されていないため、使用している場合はセキュアブートが壊れます。

別のアプローチはこれを使用することで、EFI/ubuntuにインストールされているShim + Grubセットアップをコピーします

d-i preseed/late_command string \
    mkdir -p /target/boot/efi/EFI/BOOT && \
    cp /target/boot/efi/EFI/ubuntu/* /target/boot/efi/EFI/BOOT && \
    cd /target/boot/efi/EFI/BOOT/ && mv shimx64.efi BOOTX64.EFI

編集:/targetターゲットシステムのファイルシステム であるため、このパスはpreseedファイルのディスクセクションに表示されないことに注意してください。

2
Peter Russell

次の行をpreseedファイルに追加すると、GRUBがUEFIブートストラップをefiパーティションにインストールします

d-i grub-installer/force-efi-extra-removable boolean true

その行が追加されると、UEFIブートストラップは仮想ハードドライブ上で終了します。つまり、仮想マシン構成とは別にドライブを再利用することができます。

1
Petrik