
我正在建立 Hyper-V(在 Win10 和 Win2016 上)Ubuntu 基礎映像包裝機。機器建置良好,我可以毫無問題地啟動導出的虛擬機器。但是,如果我使用新建立的虛擬硬碟建立新的虛擬機,它將無法啟動,並顯示一則訊息:
No x64-based UEFI boot loader was found
我收集自本·阿姆斯特朗的博客這與 UEFI 開機檔案未寫入磁碟的正確位置有關。
我已更新我的預置文件以生成EFI 驅動器和啟動驅動器,但是我無法弄清楚要添加到預置文件或啟動命令中的內容,以便在EFI/啟動驅動器中安裝所需的文件,以便我可以使用帶有 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 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
設定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
是目標系統的檔案系統因此該路徑不應出現在預置檔案的磁碟部分中。
答案2
透過將以下行新增至 preseed 文件,使 GRUB 將 UEFI 引導程式安裝到efi
分割區
d-i grub-installer/force-efi-extra-removable boolean true
新增該行後,UEFI 引導程式最終位於虛擬硬碟上,這表示可以與虛擬機器配置分開重複使用該磁碟機。