Я изучаю mit6.858. В Lab1 мне нужно настроить лабораторную среду на моем M2 Mac с помощью qemu (версия 7.2.0, установленная homebrew).
Я следую инструкциям лабораторных подсказок и запускаю курс VM Image с этими сценариями оболочки:
#!/bin/bash
if ! command -v qemu-system-x86_64 > /dev/null; then
echo "You do not have QEMU installed."
echo "If you are on a Linux system, install QEMU and try again."
echo "Otherwise, follow the lab instructions for your OS instead of using this script."
exit
fi
# can we use the -nic option?
version=$(qemu-system-x86_64 --version \
| grep 'QEMU emulator version' \
| sed 's/QEMU emulator version \([0-9]\)\.\([0-9]\).*/\1.\2/')
major=$(echo "$version" | cut -d. -f1)
minor=$(echo "$version" | cut -d. -f2)
net=()
if (( major > 2 || major == 2 && minor >= 12 )); then
net=("-nic" "user,ipv6=off,model=virtio,hostfwd=tcp:127.0.0.1:2222-:2222,hostfwd=tcp:127.0.0.1:8080-:8080,hostfwd=tcp:127.0.0.1:8888-:8888")
else
net=("-netdev" "user,id=n1,ipv6=off,hostfwd=tcp:127.0.0.1:2222-:2222,hostfwd=tcp:127.0.0.1:8080-:8080,hostfwd=tcp:127.0.0.1:8888-:8888" "-device" "virtio-net,netdev=n1")
fi
qemu-system-x86_64 \
-m 2048 \
-nographic -serial mon:stdio \
"$@" \
# -enable-kvm \
"${net[@]}" \
6.858-x86_64-v22.vmdk
Но я получил этот вывод:
SeaBIOS (version rel-1.16.1-0-g3208b098f51a-prebuilt.qemu.org)
iPXE (http://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+7EFD11A0+7EF311A0 CA00
Booting from Hard Disk...
Boot failed: could not read the boot disk
Booting from Floppy...
Boot failed: could not read the boot disk
Booting from DVD/CD...
Boot failed: Could not read from CDROM (code 0003)
Booting from ROM...
iPXE (PCI 00:03.0) starting execution...ok
iPXE initialising devices...ok
iPXE 1.20.1+ (g4bd0) -- Open Source Network Boot Firmware -- http://ipxe.org
Features: DNS HTTP iSCSI TFTP AoE ELF MBOOT PXE bzImage Menu PXEXT
net0: 52:54:00:12:34:56 using 82540em on 0000:00:03.0 (open)
[Link:up, TX:0 TXE:0 RX:0 RXE:0]
Configuring (net0 52:54:00:12:34:56)...... ok
net0: 10.0.2.15/255.255.255.0 gw 10.0.2.2
Nothing to boot: No such file or directory (http://ipxe.org/2d03e13b)
No more network devices
No bootable device.
Когда я набираю ctrlA+X
, чтобы выйти, я получаю еще одну строку вывода.
QEMU: Terminated
./6.858-x86_64-v22.sh: line 30: -nic: command not found
Моя доморощенная установка правильная. Я хотел бы знать, как правильно запустить виртуальную машину курса на Mac M2.
Привет. Я попытался удалить grep
$ qemu-system-x86_64 --version | sed 's/QEMU emulator version \([0-9]\)\.\([0-9]\).*/\1.\2/'
и получить вывод с дополнительной строкой Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
Поэтому я думаю, что grep
нельзя опускать. @tripleee
Таким образом, на первый взгляд это выглядело не по теме, поскольку не являлось вопросом программирования как таковым (запуск Qemu — это скорее вопрос superuser.com или serverfault.com, или, возможно, apple.stackexchange.com, поскольку мы говорим о запуске Qemu на macOS ), но при более внимательном рассмотрении ваша проблема выглядит как bash
скриптовая, что снова делает ее актуальной!
Одна вещь, которую вы явно не упомянули в своем вопросе, это то, что вы изменили скрипт, пытаясь закомментировать эту строку:
# -enable-kvm \
(Причина удаления этого флага заключается в том, что kvm недоступен на хостах macOS, а альтернатива, hvf, недоступна при использовании двоичной трансляции для запуска виртуальной машины x86-64 на хост-процессоре arm64.)
Еще одним ключом к проблеме является эта ошибка:
./6.858-x86_64-v22.sh: line 30: -nic: command not found
Здесь произошло то, что обратная косая черта (\
) в конце каждой из этих строк в исходном скрипте превращает многострочный блок в одну строку:
qemu-system-x86_64 \
-m 2048 \
-nographic -serial mon:stdio \
"$@" \
-enable-kvm \
"${net[@]}" \
6.858-x86_64-v22.vmdk
К сожалению, при комментировании строки с помощью #
bash игнорирует обратную косую черту в конце строки — это прерывает и разделяет многострочную команду.
Это означает, что ваши сетевые параметры и параметры командной строки образа диска не попадают в командную строку qemu, что, в свою очередь, является причиной того, что он не может найти образ виртуального диска. Ошибка -nic
возникает из-за того, что следующая команда рассматривается как новая:
"${net[@]}" \
6.858-x86_64-v22.vmdk
Не комментируйте флаг -enable-kvm \
на месте: либо удалите строку полностью, либо переместите ее за пределы команды и закомментируйте там.
Кроме того, этот скрипт, вероятно, должен избегать бесполезного grep