极客油画

qemu参数说明

-M -machine的缩写,指定计算机类型

-smp 定义smp系统处理器的个数

-numa 定义numa系统处理器的属性

smp系统:Symmetric Multi Processing对称多处理器结构,所有的CPU共享全部资源,如总线,内存和I/O系统等。多个CPU之间没有区别,平等地访问内存、外设、一个操作系统。操作系统管理着一个队列,每个处理器依次处理队列中的进程。如果两个处理器同时请求访问一个资源(例如同一段内存地址),由硬件、软件的锁机制去解决资源争用问题。所谓对称多处理器结构,是指服务器中多个 CPU 对称工作,无主次或从属关系。各 CPU 共享相同的物理内存,每个 CPU 访问内存中的任何地址所需时间是相同的,因此 SMP 也被称为一致存储器访问结构

numa系统:Non-Uniform Memory Access非一致存储访问结构,NUMA 服务器的基本特征是具有多个 CPU 模块,每个 CPU 模块由多个 CPU( 如 4 个 ) 组成,并且具有独立的本地内存、 I/O 槽口等。由于其节点之间可以通过互联模块 ( 如称为 Crossbar Switch) 进行连接和信息交互,因此每个 CPU 可以访问整个系统的内存 ( 这是 NUMA 系统与 MPP 系统的重要差别 ) 。显然,访问本地内存的速度将远远高于访问远地内存 ( 系统内其它节点的内存 ) 的速度,这也是非一致存储访问 NUMA 的由来。由于这个特点,为了更好地发挥系统性能,开发应用程序时需要尽量减少不同 CPU 模块之间的信息交互。

调试选项:

-serial dev 将串口重定向到dev设备

-parallel dev 将并口重定向到dev设备

启动欧拉

欧拉镜像下载地址: https://repo.openeuler.org/openEuler-22.03-LTS-SP2/virtual_machine_img/x86_64/openEuler-22.03-LTS-SP2-x86_64.qcow2.xz

镜像默认登录密码: openEuler12#$

qemu-system-x86_64.exe -m 9216 -smp 6 -M q35 -cpu qemu64 -net user,hostfwd=tcp:127.0.0.1:2222-:22 -net nic -hda openEuler-22.03-LTS-SP2-x86_64.qcow2

qemu-system-x86_64.exe -m 9216 -smp 6 -M q35 -cpu qemu64 -net user,hostfwd=tcp:127.0.0.1:2222-:22 -net nic -drive file=tianqing.raw,index=1,media=disk,format=raw -drive file=openEuler-22.03-LTS-SP2-x86_64.qcow2,index=0,media=disk,format=qcow2

使用 -cpu qemu64 -M q35 配置启动的openEuler-24.03-LTS-SP2-x86_64.qcow2时报错:

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
CPU: 2  PID: 1  Comm: init not tainted 6.6.0-98.0.0.103.oe2403sp2.x86_64
Hardware name: QEMU Standard PC (Q35 + ICH9,  2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuild.qemu.org 04/01/2014

内核(6.6.0-98.0.0.103.oe2403sp2.x86_64)在QEMU的Q35机器类型下,可能存在某些不兼容的指令集或配置。

解决方案:

  • 更换CPU类型:将 -cpu qemu64尝试换成 -cpu Nehalem或其他型号。
  • 更换机器类型:如果条件允许,可以尝试将 -M q35换成 -M pc(即经典的PC兼容机型)。

对于aarch64类型的虚拟机,还需要执行这一步:

$ find / -type f -name 'edk2*'
/ucrt64/share/licenses/qemu/pc-bios/edk2-licenses.txt
/ucrt64/share/qemu/edk2-aarch64-code.fd
/ucrt64/share/qemu/edk2-arm-code.fd
/ucrt64/share/qemu/edk2-arm-vars.fd
/ucrt64/share/qemu/edk2-i386-code.fd
/ucrt64/share/qemu/edk2-i386-secure-code.fd
/ucrt64/share/qemu/edk2-i386-vars.fd
/ucrt64/share/qemu/edk2-licenses.txt
/ucrt64/share/qemu/edk2-x86_64-code.fd
/ucrt64/share/qemu/edk2-x86_64-secure-code.fd

# 将edk2-aarch64-code.fd文件复制到qcow2镜像文件所在的目录下
$ cp /ucrt64/share/qemu/edk2-aarch64-code.fd .

# 使用如下命令启动虚拟机:
$ qemu-system-aarch64.exe -m 9216 -smp 6 -M virt -cpu cortex-a72  -bios edk2-aarch64-code.fd -net user,hostfwd=tcp:127.0.0.1:222-:22 -net nic -drive file=openEuler-22.03-LTS-SP2-aarch64.qcow2,index=0,media=disk,format=qcow2

# aarch64类型的虚拟机,默认打开的是qemu的虚拟化窗口,需要按下Ctrl+Alt+2切换到串口控制台

修改qcow2镜像的root密码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ yum install -y libguestfs-tools
$ LIBGUESTFS_BACKEND=direct virt-customize --add CentOS-7-x86_64-GenericCloud-2003.qcow2 --root-password password:1234


或者
$ LIBGUESTFS_BACKEND=direct guestfish  --rw -a openSUSE-Leap-15.6.aarch64-1.0.0-NoCloud-Build3.197.qcow2
><fs> run
><fs> list-filesystems
><fs> vi /etc/shadow #替代root的秘密,利用前面openssl生成的密码,openssl passwd -1 1234
><fs> quit


或者,在grub引导界面,按e:
在内核那部分把ro改成rw,在最后加上init=/bin/bash,然后按ctrl+x或者F10
$linux  /boot/Image-5.14.21-150500.55.49-default  root=LABEL=ROOT console=ttyS0  net.ifnames=0  dis_ucode_ldr  init=/bin/bash

进入系统后:
mount -n / -o remount,rw #把根重新mount为可读写
passwd root 修改密码
mount -n / -o remount,ro #把根设回原来转态

ARM架构的BIOS固件下载地址: https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd

使用iso镜像安装arm64架构的麒麟系统时,还需要BIOS固件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 精细版本
$ qemu-system-aarch64.exe -m 9216 -smp 6 -M virt -cpu cortex-a72 --accel tcg,thread=multi -bios QEMU_EFI.fd \
> -drive if=virtio,file=Kylin-Server-V10-SP3-General-Release-2303-ARM64.qcow2,index=0,media=disk,format=qcow2 \
> -drive if=none,file=Kylin-Server-V10-SP3-General-Release-2303-ARM64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom \
> -device nec-usb-xhci -device usb-tablet -device usb-kbd \
> -display sdl -device VGA
# -device usb-mouse有个问题就是它的鼠标坐标系 > 基于物理机分辨率计算,当虚拟机分辨率和宿主机不一样时会发生偏移现象,所以建议使用-device usb-tablet
# -display sdl 可以替换为 -display vnc=127.0.0.1:0,以开启vnc;这两个参数也可以同时使用,会同时开启vnc和sdl(qemu默认的图形化界面),不推荐。
# -monitor stdio是默认使用serial0控制台,在windows下请使用此项;如在linux下,请替换为-nographic,因为在Linux中存在键盘方向键无法使用的问题,十分不便

# 简单版本
$ qemu-system-aarch64.exe -m 9216 -smp 6 -M virt -cpu cortex-a72 --accel tcg,thread=multi -bios QEMU_EFI.fd \
> -cdrom Kylin-Server-V10-SP3-General-Release-2303-ARM64.iso -hda Kylin-Server-V10-SP3-General-Release-2303-ARM64.qcow2

麒麟v10 aarch64安装踩坑:

1
#更改bios设置:在Security选项卡下面将Secure boot改为Disable;在Startup选项卡下面,将UEFI/LEGACY BOOT 改为Both或者LEGACY First

添加数据盘

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ qemu-img create -f fmt -o options fname size

# -f fmt : 目标映像的格式,通常使用raw或qcow2,其中默认值是raw
# -o options : raw映像格式支持size和nocow选项
# fname :  要创建的目标硬盘映像的路径
# 目标硬盘映像的大小(如果尚未使用 -o size=<image_size>选项指定)。映像大小可使用的后缀有:K、M、G、T

$ qemu-img create -f raw -o size=4G /images/sles.raw
Formatting '/images/sles.raw', fmt=raw size=4294967296

$ ls -l /images/sles.raw
-rw-r--r-- 1 tux users 4294967296 Nov 15 15:56 /images/sles.raw

$ qemu-img info /images/sles.raw
image: /images/sles11.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 0

提示:如果您需要在 Btrfs 文件系统上创建磁盘映像,可以使用 nocow=on 来减少 Btrfs 的写入时复制功能产生的性能开销 但是,如果您想使用写入时复制(例如,要使用此功能来创建快照或者在虚拟机之间共享快照),请在命令行中省略 nocow 选项

qcow2 是 QEMU 使用的主要磁盘映像格式。其大小可按需增长,仅当虚拟机确实需要磁盘空间时才分配磁盘空间。

qcow2 格式的文件以恒定大小的单元进行组织。这些单元称为簇。QEMU 默认为 64 kB 簇,可以使用cluster_size选项来指定其他值。

qcow2 映像包含一组表,这些表划分为两个级别,分别称为 L1 表和 L2 表。每个磁盘映像只有一个 L1 表,而根据映像的大小,L2 表可能有很多。

要在虚拟磁盘中读取或写入数据,QEMU 需要读取其对应的 L2 表,以确定相关数据位置。由于为每个 I/O 操作读取该表会消耗系统资源,QEMU 会在内存中缓存 L2 表,以提高磁盘访问速度。

提高硬盘性能

优化器:

  • tcg 默认值,QEMU虚拟化的思路是:提取Guest代码,翻译为TCG中间代码,而后翻译为Host代码。相当于实现了一个“中间人”的角色。
    • 微型代码生成器(TCG)旨在消除依赖特定版本的GCC或编译器的缺点,并将编译合并到QEMU的运行时任务中。
    • 因此,整个翻译阶段由两部分组成:目标代码块(TB)以TCG指令(一种机器无关的中间符号)重写 ,随后TCG为宿主机架构执行编译。
  • whpx : Windows Hypervisor Platform,使用这个优化器时会启用hyper-v, -accel accel=whpx,kernel-irqchip=off
    • kernel-irqchip=off选项用于解决injection failed问题
  • kvm : linux平台专用

调整ext4根文件系统大小

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 使用qemu-img命令,扩大qcow2文件的大小
$ qemu-img.exe resize   jammy-server-cloudimg-amd64.img +20G

# 使用ssh命令登录虚拟机

# 给 /dev/vda 硬盘重新分区,先删除vda2分区,再创建它
$ fdisk /dev/vda
$ lsblk
$ cat /proc/partitions | grep vd
$ partx -u /dev/vda
$ cat /proc/partitions | grep vd
$ tune2fs -l /dev/vda2
$ df -lhT
$ resize2fs /dev/vda2
$ echo $?
$ df -lhT
$ dumpe2fs -h /dev/vda2 | grep -i "mount count"
$ tune2fs -c 1 /dev/vda2
$ dumpe2fs -h /dev/vda2 | grep -i "mount count"
$ reboot
$ tune2fs -c -1 /dev/vda2
$ dumpe2fs -h /dev/vda2 | grep -i "mount count"

其他命令

fstrim -a 解决频繁删除文件,底层存储没有释放的问题

LIBGUESTFS_BACKEND=direct virt-sparsify –in-place disk.qcow2

如果ls -lh 和 du -sh 的值不一致,还需要转一下: qemu-img convert -p -f qcow2 -O qcow2 disk.qcow2 disk_new.qcow2


本文发表于 0001-01-01,最后修改于 0001-01-01。

本站永久域名「 jiavvc.top 」,也可搜索「 极客油画 」找到我。


上一篇 « 下一篇 »

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image