AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 766553
Accepted
Steve-no-Jobs
Steve-no-Jobs
Asked: 2024-01-10 11:23:55 +0800 CST2024-01-10 11:23:55 +0800 CST 2024-01-10 11:23:55 +0800 CST

如何从克隆的 USB 记忆棒启动 QEMU

  • 772

配置:

  • MacOS arm64 M1 Apple Silicon 作为主机
  • 以 Ubuntu 20.04 amd64 作为来宾,在 squashfs 文件系统中使用 Live USB
  • 主机操作系统上的 QEMU 模拟器

我想将操作系统中的squashfs 剥离出来,并在我的Mac 上模拟的amd64 虚拟机上启动它。我成功提取了 Ubuntu 操作系统。我安装了 squashfs 并将内容复制到我使用 dd 创建的 img 文件中。我在 Mac 上复制了映像,但当我尝试启动虚拟机时显示“无可启动设备”。

以下是我使用的命令,来自支持的 Linux 虚拟机

mount -t squashfs -o loop /path/to/filesystem.squashfs /sqshfs/mount/point

我创建了一个空映像并制作了一个 ext4 fs

dd if=/dev/zeroes of=image.img bs=1M count=15000
mkfs.ext4 image.img

安装它并复制文件

mount -t auto image.img /img/mount/point
cp -r /sqshfs/mount/point/* /img/mount/point

现在在图像上我有这个文件夹

total 112
drwxr-xr-x   2 root root  4096 Jan 10 02:37 bin
drwxr-xr-x   3 root root  4096 Jan 10 02:37 boot
drwxr-xr-x   4 root root  4096 Jan 10 02:37 dev
drwxr-xr-x 147 root root 12288 Jan 10 02:37 etc
drwxr-xr-x   3 root root  4096 Jan 10 02:37 home
lrwxrwxrwx   1 root root    33 Jan 10 02:37 initrd.img -> boot/initrd.img-5.4.0-150-generic
lrwxrwxrwx   1 root root    33 Jan 10 02:37 initrd.img.old -> boot/initrd.img-5.4.0-148-generic
drwxr-xr-x  23 root root  4096 Jan 10 02:37 lib
drwxr-xr-x   2 root root  4096 Jan 10 02:37 lib64
drwx------   2 root root 16384 Jan 10 02:36 lost+found
drwxr-xr-x   2 root root  4096 Jan 10 02:37 media
drwxr-xr-x   2 root root  4096 Jan 10 02:37 mnt
drwxr-xr-x   5 root root  4096 Jan 10 02:37 opt
drwxr-xr-x   2 root root  4096 Jan 10 02:37 proc
drwx------   3 root root  4096 Jan 10 02:37 root
drwxr-xr-x   2 root root  4096 Jan 10 02:37 run
drwxr-xr-x   2 root root 12288 Jan 10 02:37 sbin
drwxr-xr-x   2 root root  4096 Jan 10 02:37 snap
drwxr-xr-x   2 root root  4096 Jan 10 02:37 srv
drwxr-xr-x   2 root root  4096 Jan 10 02:37 sys
drwxr-xr-t   2 root root  4096 Jan 10 02:37 tmp
drwxr-xr-x  11 root root  4096 Jan 10 02:38 usr
drwxr-xr-x  15 root root  4096 Jan 10 02:38 var
lrwxrwxrwx   1 root root    30 Jan 10 02:38 vmlinuz -> boot/vmlinuz-5.4.0-150-generic
lrwxrwxrwx   1 root root    30 Jan 10 02:38 vmlinuz.old -> boot/vmlinuz-5.4.0-148-generic

在qcow2中转换img

qemu-img convert -f raw -O qcow2 -c image.img image.qcow2

并配置QEMU如下

qemu-system-x86_64 \
-name TEST \
-cpu qemu64-v1 \
-smp cpus=4,sockets=1,cores=4,threads=1 \
-machine pc-q35-7.2,vmport=off,i8042=off,hpet=off \
-accel tcg,thread=multi,tb-size=1024 \
-m 4096 \
-drive file=/Users/steve/VMs/image.qcow2 \
-boot menu=on

当我尝试启动虚拟机时,显示“无可启动设备”。我是 abt QEMU 的新手,我知道这个配置遗漏了一些东西,但它至少应该尝试引导内核。图形用户界面?

virtual-machine
  • 1 1 个回答
  • 25 Views

1 个回答

  • Voted
  1. Best Answer
    telcoM
    2024-01-10T14:48:03+08:002024-01-10T14:48:03+08:00

    您没有告诉 QEMU 直接查找内核和 initramfs,并且您指定了machine pc-q35-7.2.

    查看源代码,该系统类型的默认值之一是firmware=bios-256k.bin,这意味着系统将运行 SeaBIOS,尝试像经典的基于 BIOS 的 x86 系统一样启动并查找主启动记录。

    由于您将文件从一个文件系统映像复制到另一个文件系统映像,因此任何引导块(直接嵌入到映像中并且不属于任何文件的一部分)都不存在。此外,您的image.qcow2镜像是单个文件系统,相当于直接运行mkfs.ext4 /dev/sda而不先对其进行分区。因此,没有分区表,也没有主引导记录(位于任何分区之外)。

    您可以轻松地从映像中复制内核和 initramfs 文件:

    mount -t auto image.img /img/mount/point
    cp /img/mount/point/boot/vmlinux-5.4.0-150-generic /Users/steve/VMs/
    cp /img/mount/point/boot/initrd.img-5.4.0-150-generic /Users/steve/VMs/
    

    并添加 QEMU 选项-kernel /Users/steve/VMs/vmlinux-5.4.0-150-generic -initrd /Users/steve/VMs/initrd.img-5.4.0-150-generic以将它们直接提供给 QEMU 进行引导。

    您的下一个障碍是您需要指定内核的根文件系统位置,因为 initramfs 映像中嵌入的任何根文件系统 UUID 都不再正确,因为该文件系统不再是原始文件系统。因此,您可以添加一个 QEMU 选项来指定一个内核命令行,例如-append root=/dev/sda(未分区的映像,还记得吗?),并希望内核不会被精简为仅支持根文件系统类型的 squashfs。

    此外,像这样的直接启动可能不允许内核获取通常从 BIOS 接收的任何配置信息,因此有些事情可能会很不稳定。

    您可能会发现,最好设置一个适当的分区磁盘映像,并在 MBR 中嵌入合适的引导加载程序,但至少直接内核映像引导将很容易尝试。谁知道呢?它可能会起作用!

    • 1

相关问题

  • VirtualBox guest Win10 @ Linux 主机在启动时挂了很大的时间,如何排除故障?

  • Debian 9:如何在 QEMU-Host 和 QEMU-Guest (Windows) 之间设置 Samba-Exchange?

  • 如何手动触发来宾上的 virtio 气球驱动程序?

  • 如何在运行时从命令行更改 KVM VNC 端口?

  • LXC 容器内部从零开始的 Linux

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve