我使用 VirtualBox 设置了一台小型 Arch Linux 64 位 x86 机器。以VMDK格式安装在8GB大虚拟硬盘上,一切运行正常。
cfdisk 显示我创建了两个分区:
- 类型:主分区,类型:Linux (ext4),可启动,第一个分区,大小:7.5G
- 类型:主分区,类型:交换,Solaris,可引导,第二分区,大小:0.5G
我大量定制了 Arch Linux,现在想用它制作真正的可启动媒体。
1. 如何在没有复杂的 archiso 安装过程的情况下创建可启动媒体,而是直接使用我以某种方式创建的驱动器映像?
事实上,我已经尝试创建我的可启动媒体。我使用 Ubuntu 将我的转换os.vmdk
为/dev/sdc
使用命令qemu-img convert os.vmdk -O raw /dev/sdc
完成后,我重新启动到电脑的启动菜单,但随身碟没有显示。我关闭了安全启动并启用了Legace Boot Support
.没有任何帮助。因此,我进入了 Ubuntu 安装的 Grub 命令行并输入
set root=(hd1,msdos2) # hd1 is my usb stick, msdos1 is swap, msdos2 is bootable
configfile /boot/grub/grub.cfg # in order to load the usb's grub
2. 然后发生了一些奇怪的事情
- 我将棒插入我的笔记本电脑 -> USB2.0端口(我有一个 USB 3.0 棒)-> 启动...-> 图形 Arch Linux 启动屏幕 -> 紧急 Shell 说明类似的内容
Can't run fsck. Error: Can't find drive with UUID=...
(但是,UUID 绝对正确。我在 Ubuntu 上和 Arch 本身中更改了它 /当我blkid
在紧急 shell 上执行此操作时,USB 驱动器根本不存在,相反,我什至在 /dev/* 中找不到任何 USB 驱动器,并且 dmesg 没有任何说明。出色地!) - 我将棒插入我的笔记本电脑 -> USB3.0端口 -> grub 命令行未检测到驱动器。有
hd0
却无hd1
。不过,我有时会使用 BIOS 启动菜单从通过 USB 3 连接的外部硬盘启动。 - 我将棒通过 USB 插入我的工作站 PC3.0端口 -> 不在 BIOS 启动菜单中,通过 grub 和
configfile
命令启动 ->它可以启动,但无法在我的笔记本电脑上的 USB 3.0 端口上启动-> 然后是与中相同的紧急 shell1.
- 我将棒通过 USB 插入我的工作站 PC2.0端口 -> 通过 GRUB 启动 ->就可以成功启动了没有任何问题。
我不知道我该怎么办!?我基本上只是想从现有的虚拟 Arch Linux 中制作一个映像,只需复制它即可将其传输到任何设备,而无需进行复杂的 Arch 安装。
任何帮助表示赞赏。
答案1
1.)既然您已经对 USB 记忆棒进行了分区,为什么不将真实文件系统的全部内容(忽略任何tmpfs
其他基于 RAM 或完全虚拟的文件系统,例如/dev
、/proc
和/sys
)复制到ext4
USB 记忆棒上的分区呢?
我认为qemu-img convert
你所做的基本上就是这样做的,但你也许可以跳过它。基本上,没有魔法:如果您将操作系统的所有必要文件复制到适当的目录层次结构中,那么无论复制如何完成,它都将是一个有效的系统。不活动的操作系统本质上只是一堆文件,您可以将其视为这样。
唯一特殊的部分是旧版 BIOS 引导加载程序:它需要将数据写入棒上的特定块位置,以便引导加载程序稍后可以找到它们。另一方面,UEFI 引导加载程序只是 FAT32 分区上具有特定路径名的另一个文件。
2.1.)尝试使用带有 USB 2 的 Ubuntu 安装的引导加载程序(可能是 UEFI)进行引导:看起来引导加载程序成功加载了内核和 initramfs 文件并启动了内核,但 initramfs 文件没有访问所需的所有驱动程序USB 记忆棒上的根文件系统。至少,您需要适当的 USB 控制器驱动程序、usb-storage
驱动程序和ext4
文件系统驱动程序及其依赖项。此外,由于USB控制器通常包含在芯片组中,因此内核版本需要足够新才能识别芯片组,以便它知道芯片组内的特定PCI ID实际上是USB控制器。
2.2.)在 USB 3.0 端口中未检测到 USB 记忆棒:也许您的笔记本电脑固件不包含 USB 3.0 支持,除非通过 BIOS 启动菜单实际请求?或者 USB2 和 USB3 控制器之间可能存在某种 USB2/USB3 切换开关,需要以某种方式翻转?
2.3.)在桌面上,在 USB 3.0 端口中检测到该棒,但启动失败,如 2.1 所示: 看起来您的桌面可能有更好的 USB 3.0 支持,但您遇到的问题与 2.1 中基本相同:没有 USB3 控制器和/或 USB- initramfs 中的存储驱动程序。
2.4.)有趣的。您的笔记本电脑是否有特殊类型的 USB 2.0 控制器,而台式机使用标准类型ehci_hcd
?看起来您的 initramfs 拥有在台式机中访问 USB 2.0 所需的所有驱动程序,但在笔记本电脑中却没有。或者您的笔记本电脑可能有一个非常新的芯片组,而内核无法在其中找到 USB 控制器?
2.1 和 2.3 中的问题可能可以通过在 initramfs 文件中添加更多 USB 控制器驱动程序来解决,并确保您的内核足够新以完全识别笔记本电脑的芯片组。
2.2.似乎是一个可能的固件限制。在不知道系统的品牌和型号的情况下很难提供任何建议。
您实际上可能想向您的 USB 记忆棒添加一个小的 FAT32 分区,并向其中添加一个 UEFI 版本的 GRUB 作为\EFI\BOOT\BOOTx64.efi
.这将使其在 UEFI 意义上可启动。看来该棒目前只能在传统 BIOS 意义上启动。通过这种方式,您可以创建一个同时具有传统引导加载程序和 UEFI 引导加载程序的“混合”USB 记忆棒。
通常,传统 BIOS 将完全隐藏任何固件级 USB 存储支持,除非在 BIOS 菜单中专门启用它,以便提供最大的传统兼容性,一直追溯到 1986 年的原始 IBM PC/AT(尽可能) 。 UEFI 没有这个负担,并且可能默认为引导加载程序提供 USB 存储支持。
答案2
您很可能遇到安全启动和 UEFI/EFI BIOS 问题。
创建可启动 USB 时,您需要确保它是针对您的 PC/笔记本电脑 BIOS 配置构建的(可以是 Legacy 或 UEFI)。
考虑到您正在从 VM 映像创建可启动设备,您很可能没有考虑到这一点。
根据 Arch Linux wiki[1],如果您使用 GPT/UEFI 和 GRUB,您需要:
# grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --removable --recheck
但我不知道它是否适合你的设置。如果您愿意尝试其他选项,我会尝试将 VMDK 转换为 ISO,并且“烧伤“ 使用 Etcher 等闪存实用程序将 ISO 转换为 USB 闪存盘https://etcher.io
那可能解决 UEFI 问题。