后浪笔记一零二四

1. msys2中mingw64,ucrt64,clang64的区别

https://www.msys2.org/docs/environments/

mingw64、ucrt64、clang64都是windows原生程序(不依赖cygwin.dll),不过mingw64是很早就有的,后两者是2021年6月之后才新加的,现在msys2官方推荐优先选择ucrt64。

这三者的区别是:mingw64 与 ucrt64 都是用 gcc 编译器编译的 Windows 64 位程序,只不过它们链接到的 crt(C runtime)不同, mingw64 是链接到了 msvcrt ,而 ucrt64 则是链接到了 Windows 上新的 ucrt 上。

而 clang64 很好理解,就是用 clang 而非 gcc 来编译各种库。另外它也是链接到了 ucrt 而非 msvcrt。

三者的共同点是,它们都需要 mingw-w64 环境来进行编译。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ ldd /ucrt64/bin/zstd
ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb256b0000)
KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffb24cc0000)
KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffb22e80000)
ucrtbase.dll => /c/WINDOWS/System32/ucrtbase.dll (0x7ffb232e0000)

$ ldd /mingw64/bin/zstd
ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb256b0000)
KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffb24cc0000)
KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffb22e80000)
msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffb23e9000)

$ ldd /clang64/bin/zstd
ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb256b0000)
KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffb24cc0000)
KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffb22e80000)
apphelp.dll => /c/WINDOWS/System32/apphelp.dll (0x7ffb1ff00000)
ucrtbase.dll => /c/WINDOWS/System32/ucrtbase.dll (0x7ffb232e0000)

# /usr/bin/zstd就是依赖cygwin的非原生程序,这里的msys-2.0.dll实际上就是msys2版的cygwin.dll
$ ldd /usr/bin/zstd
ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb256b0000)
KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffb24cc0000)
KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffb22e80000)
msys-2.0.dll => /usr/bin/msys-2.0.dll (0x180040000)

2. Cygwin和MinGW的区别

1、从目标上说

MinGW 是让Windows 用户可以用上GNU 工具,比如GCC。

Cygwin 提供完整的类Unix 环境,Windows 用户不仅可以使用GNU 工具,理论上Linux 上的程序只要用Cygwin 重新编译,就可以在Windows 上运行。

2、从能力上说

如果程序只用到C/C++ 标准库,可以用MinGW 或Cygwin 编译。

如果程序还用到了POSIX API,则只能用Cygwin 编译。

3、从依赖上说

程序经MinGW 编译后可以直接在Windows 上面运行。

程序经Cygwin 编译后运行,需要依赖安装时附带的cygwin.dll。

注意,mingw已经过时,现在都用mingw-w64,而mingw64 = gcc + mingw-w64

MSYS 和 MSYS2

MSYS fork Cygwin(较旧版),且万年不更新。

MSYS2 fork Cygwin(较新版),使用了pacman包管理工具,且项目开发活跃。

3. cpu不支持硬件虚拟化能使用KVM吗

在使用kvm之前,需要确认cpu是否支持硬件虚拟化,如果cpu不支持,我们将无法使用kvm

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 检查cpu是否支持虚拟化
import os

def check_cpu_virtualization_support():
    cmd = "grep -E 'svm|vmx' /proc/cpuinfo"
    result = os.popen(cmd).read()
    if result:
        print("cpu支持硬件虚拟化")
    else:
        print("cpu不支持硬件虚拟化")

check_cpu_virtualization_support()

# 在确认cpu支持硬件虚拟化后,还需要确保bios中已经启动了虚拟化扩展
import os

def check_bios_virtualization_support():
    cmd = "dmesg | grep 'Hypervisor detected'"
    result = os.popen(cmd).read()
    if result:
        print("虚拟化扩展已在BIOS中启用")
    else:
        print("虚拟化扩展未在BIOS中启用")

check_bios_virtualization_support()

为了让虚拟机达到原生虚拟化的目的,需要使用硬件辅助虚拟化技术(HVM)

在第一代技术中,支持Intel VT-x/AMD-V的CPU上提供新处理器指令,可将CPU置入新的执行模式。为硬件辅助虚拟机执行指令时, CPU将切换到非root或客户机模式,在该模式下虚拟机的内核能够以级别0运行,而用户空间能够以级别3运行。

对于虚拟机内核来讲,只要将标志位设为虚拟机状态,我们就可以直接在 CPU 上执行大部分的指令,不需要虚拟化软件在中间转述,除非遇到特别敏感的指令,才需要将标志位设为物理机内核态运行,这样大大提高了效率。

这样操作以后,就出现了 CPU 快而 RAM 慢的情况。

第二代x86 硬件虚拟化支持内存管理单元(MMU)虚拟化。通常,CPU需要花费很多周期来处理内存页面与虚拟机的映射。MMU 虚拟化允许将工作负载转移到特殊硬件,从而提高性能。Intel将此技术称为扩展页表(ERT),在Nehalem微型架构处理器中引入。AMD将此技术称为快速虚拟化索引(RVi), 于2007年在四核Opteron处理器中引入。

这样 CPU 和 RAM 就都解决掉了。

第三代x86 硬件虚拟化支持集中于I/0虚拟化。主板芯片集上的使能技术为安全PCI穿透,允许将物理PCI设备直接连接到虚拟机。该技术可为虚拟机提供近似原生的I/O性能。在Intel中,这称为直接1/O虚拟化技术(VT-d);在AMD中,称为1/0虚拟化技术(AMD-Vi)(最初称为IOMMU)

之前,网卡 nic 还是要通过 hypervsor 交给虚拟机来用 vm ,到了千兆上不去。现在,新技术 SR-IOV 的网卡划48个口,跨过 hypervisor 直接给 vm 调用。很多通道的处理,直接交给网卡自己来做。通过这种技术,就解决了 IO 性能问题。

4. kvm qemu libvirt的区别和联系

qemu的第一种工作模式:qemu本身作为Type-2 Hypervisor。交互层次:VM -> qemu -> linux kernel -> Driver -> Hardware

qemu的第二种工作模式:qemu作为虚拟机与Linux KVM交互的中间层,仅负责传递交互信息,而不发挥Hypervisor的实际功能。真正发挥Hypervisor功能的是Linux KVM。交互层次:VM -> qemu -> linux KVM -> KVM virtual Driver -> Hardware

virt-manager是libvirt的图形化界面。在virt-manager上的所有操作,都会被映射为libvirt命令;libvirt命令又会被映射为qemu命令;如果qemu处于第二种工作模式,那么qemu命令又会再次被映射为KVM命令。

  1. KVM KVM(Kernel Virtual Machine)是Linux的一个内核驱动模块,它能够让Linux主机成为一个Hypervisor(虚拟机监控器)。

从Linux2.6.20起,KVM作为内核的一个模块集成到Linux主要发行版中。从技术架构(代码量、功能特性、调度管理、性能等)、社区活跃度,以及应用广泛度来看,KVM显现出明显优势,已逐渐替换另一开源虚拟化技术Xen。在公有云领域,2017年之后AWS、阿里云、华为云等厂商都逐渐从Xen转向KVM。在私有云领域,目前VMware ESXi是领导者,随着公有云厂商不断推进专有云/私有云方案,未来KVM应用也会逐渐增加。

  1. QEMU 最开始,QEMU是一个纯软件的实现,有整套的虚拟机实现,包括cpu虚拟化、内存虚拟化以及I/O设备的虚拟化,并不依赖KVM模块。 KVM只模拟CPU和内存,因此一个虚拟机可以在宿主机上跑起来,但是你看不到它,无法和它沟通。于是,有人修改了QEMU代码,把它模拟CPU、内存的代码换成KVM,而网卡、显示器等留着,因此QEMU+KVM就成了一个完整的虚拟化平台。

KVM和QEMU相辅相成,QEMU通过KVM达到了硬件虚拟化的速度,而KVM则通过QEMU来模拟设备。

  1. libvirt只是api,它依赖libvirtd才能工作

The libvirt KVM/QEMU driver can manage any QEMU emulator from version 4.2.0 or later.

It supports multiple QEMU accelerators: software emulation also known as TCG, hardware-assisted virtualization on Linux with KVM and hardware-assisted virtualization on macOS with Hypervisor.framework (since 8.1.0).

  • QEMU emulators: The driver will probe /usr/bin for the presence of qemu, qemu-system-x86_64, qemu-system-microblaze, qemu-system-microblazeel, qemu-system-mips,qemu-system-mipsel, qemu-system-sparc,qemu-system-ppc. The results of this can be seen from the capabilities XML output.

  • KVM hypervisor: The driver will probe /usr/bin for the presence of qemu-kvm and /dev/kvm device node. If both are found, then KVM fully virtualized, hardware accelerated guests will be available.

  • Hypervisor.framework (HVF): The driver will probe sysctl for the presence of Hypervisor.framework. If it is found it will be possible to create hardware accelerated guests.

5. Node/Hypervisor/Domain

  1. 节点(Node): 一个物理机器,上面可能运行着多个虚拟客户机。Hypervisor和Domain都运行在Node之上。

  2. Hypervisor: 也称虚拟机监控程序(VMM),如KVM、Xen、VMware、Hyper-V等,是虚拟机中的一个底层软件层,它可以虚拟化一个节点让其运行多个虚拟客户机(不同客户机可能有不同的配置和操作系统)。

  3. 域(Domain): 是在Hypervisor上运行的一个客户机操作系统实例。域也被称为实例(instance,如亚马逊的AWS云计算服务中客户机就被称为实例)、客户机操作系统(guest OS)、虚拟机(virtual machine),它们都是指同一个概念。

6. Hypervisor的两种类型

VMM意为Virtual Machine Monitor,虚拟机监控程序,或者用另一个更专业的名词:HyperVisor

Hypervisor介于虚拟机和宿主机操作系统之间,负责对宿主机硬件资源(实际上被虚拟化的不只有硬件资源)进行虚拟化,并将虚拟化后的硬件资源提供给虚拟机。Hypervisor分为两类:

Type-1 Hypervisor: 位于操作系统内核空间,具备对宿主机硬件资源的直接访问权限。代表:Microsoft Hyper-V、Linux KVM、VMWare ESXi、VMware vSphere。

这一类虚拟机监控程序在企业数据中心或其他基于服务器的环境中最为常见。

Type-2 Hypervisor: 位于用户空间,需要通过操作系统内核才能访问硬件。代表:QEMU、VirtualBox、VMware Workstation。

第 2 类虚拟机监控程序更适合希望在私人计算机上运行多个操作系统的个人用户。


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

本站永久域名「 jiavvc.top 」,也可搜索「 后浪笔记一零二四 」找到我。


上一篇 « 下一篇 »

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image