web-dev-qa-db-fra.com

La présélection d'Ubuntu 16.04 pour un Hyper-V VM ne parvient pas à installer la section de démarrage UEFI

Je construis une image de base Ubuntu Hyper-V (sur Win10 et Win2016) avec Packer . La machine se construit bien et je peux démarrer la machine virtuelle exportée sans problème. Cependant, si je crée une nouvelle machine virtuelle avec le disque dur virtuel nouvellement créé, il ne parvient pas à démarrer avec un message disant

No x64-based UEFI boot loader was found

D'après blog de Ben Armstrong , j'ai compris que cela est dû au fait que les fichiers de démarrage UEFI ne sont pas écrits sur le disque au bon endroit.

J'ai mis à jour mon fichier de préconfiguration pour générer un lecteur EFI et un lecteur d'amorçage. Cependant, je ne sais pas quoi ajouter au fichier de préconfiguration ou à la commande d'amorçage pour installer les fichiers requis dans les lecteurs EFI/boot afin de pouvoir les utiliser. le disque dur virtuel avec les machines virtuelles Hyper-V de génération 2.

Ma configuration de packer ressemble à:

{
    "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"
            ]
        }
    ]
}

Et le fichier de préconfiguration ressemble à:

# 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

Le réglage de d-i grub-installer/force-efi-extra-removable boolean true installera Grub en tant que EFI/boot/bootx64.efi. Toutefois, Grub n’est pas signé avec la clé Microsoft, ce qui endommagera le Secure Boot, si vous l’utilisez.

Une autre approche consiste à utiliser ceci, qui copie la configuration Shim + Grub installée dans EFI/ubuntu.

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

EDIT: Notez que /target est le système de fichiers du système cible , de sorte que ce chemin ne doit pas apparaître dans la section disque du fichier preseed.

2
Peter Russell

En ajoutant la ligne suivante au fichier de préconfiguration, GRUB installe un bootstrapper UEFI sur la partition efi.

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

Avec cette ligne ajoutée, le démarrage UEFI se termine sur le disque dur virtuel, ce qui signifie qu'il est possible de le réutiliser séparément de la configuration de la machine virtuelle.

1
Petrik