虚拟化系列教程-安装QEMU/KVM的三种方式

2023-10-31

RedHat Linux KVM 安装

RedHat 有两款产品提供 KVM 虚拟化:

  1. Red Hat Enterprise Linux:适用于小的环境,提供数目较少的KVM虚机。
  2. Red Hat Enterprise Virtualization (RHEV):提供企业规模的KVM虚拟化环境,包括更简单的管理、HA,性能优化和其它高级功能。
    RedHat Linux KVM:
     KVM 由 libvirt API 和基于该 API的一组工具进行管理和控制。
     KVM 支持系统资源超分,包括内存和CPU的超分。RedHat Linux 最多支持物理 CPU 内核总数的10倍数目的虚拟CPU,但是不支持在一个虚机上分配超过物理CPU内核总数的虚拟CPU。
     支持 KSM (Kenerl Same-page Merging 内核同页合并)

在安装 RedHat Linux 时安装 KVM

选择安装类型为 Virtualizaiton Host :
在这里插入图片描述

可以选择具体的 KVM 客户端、平台和工具:
在这里插入图片描述

在已有的 RedHat Linux 中安装 KVM

这种安装方式要求该系统已经被注册,否则会报错:
[root@centos8 ~]# yum install –y libvirt* virt-* qemu-kvm*
你至少需要安装 qemu-kvm qemu-img 这两个包。
[root@centos8 ~]# yum install qemu-kvm qemu-img
你还可以安装其它工具包:
[root@centos8 ~]# yum install virt-manager libvirt libvirt-python python-virtinst libvirt-client

QEMU/KVM 代码下载编译安装

QEMU/KVM 的代码结构

QEMU/KVM 的代码包括几个部分:
(1)KVM 内核模块是 Linux 内核的一部分。通常 Linux 比较新的发行版(4.18.0-408.el8.x86_64)都包含了 KVM 内核,也可以从得到。比如在我的RedHat 8.7 上:
[root@centos8 isoimages]# uname -r
4.18.0-408.el8.x86_64
[root@centos8 isoimages]# lsmod |grep kvm
kvm_intel 339968 2
kvm 942080 1 kvm_intel
(2)用户空间的工具即 qemu-kvm。qemu-kvm 是 KVM 项目从 QEMU 新拉出的一个分支。在 QEMU 1.3 版本之前,QEMU 和 QEMU-KVM 是有区别的,但是从 2012 年底 GA 的 QEMU 1.3 版本开始,两者就完全一样了。
(3)Linux Guest OS virtio 驱动,也是较新的Linux 内核的一部分了。

安装 QEMU

(1). 配置好网络源
(2). 安装依赖包
[root@centos8 ~]# yum install -y gcc autoconf automake libtool glib* zlib* gcc+ gcc-c++
(3). 从这里下载代码,上传到我的编译环境 Centos8.
[root@centos8 ~]# wget https://download.qemu.org/qemu-7.2.0.tar.xz
[root@centos8 ~]# tar xvJf qemu-7.2.0.tar.xz
[root@centos8 ~]# mkdir /usr/local/qemu7.2.0
[root@centos8 ~]# cd qemu-7.2.0
[root@centos8 qemu-7.2.0]# mkdir build && cd build
[root@centos8 build]#…/configure --prefix=/usr/local/qemu7.2.0 --enable-vnc --enable-kvm --target-list=“x86_64-softmmu”
[root@centos8 build]# make && make install
又或者,我们可以直接从git上下载和编译QEMU:
[root@centos8 ~]# git clone https://git.qemu.org/git/qemu.git
[root@centos8 ~]# cd qemu
[root@centos8 qemu]# git submodule init
[root@centos8 qemu]# git submodule update --recursive
[root@centos8 qemu]#./configure
[root@centos8 qemu]# make
configure 脚本用于生成 Makefile,其选项可以用 ./configure --help 查看。
这里使用到的选项含义如下:
–prefix 指定安装的目录,其实默认好像也是这个目录。
–enable-kvm:编译 KVM 模块,使 Qemu 可以利用 KVM 来访问硬件提供的虚拟化服务。
–enable-vnc:启用 VNC。
–enalbe-werror:编译时,将所有的警告当作错误处理。
–target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。
./configure是一个脚本,会自动检查系统环境,比如编译构建工具是否齐全,源码目录、依赖库目录、安装目录、系统平台和构架信息等其他编译选项。这些信息可以保持默认或通过参数传递给configure。然后configure会根据这些信息生成一个Makefile文件。
make命令会根据Makefile进行编译过程,参数 -j 用来指定编译过程可以同时并行任务的个数,一般为CPU核数的倍数。
make install是将编译好的二进制文件安装到系统上。
Note
其中我们可以看到aarch64-softmmu,aarch64-linux-user,aarch64_be-linux-user。对于这三个编译选项:
aarch64-softmmu:一般选择,用来跑os的,已经开了软件mmu。
aarch64-linux-user:用于跑app
aarch64_be-linux-user :与上面不同的是,用来跑big-endian的app程序
(4). 安装完成
[root@centos9 ~]# /root/qemu-7.2.0/build/qemu-system-x86_64 --version
QEMU emulator version 7.2.0
Copyright © 2003-2022 Fabrice Bellard and the QEMU Project developers
(5). 为方便起见,将qemu-system-x86_64拷贝到/usr/bin或创建一个link
[root@centos9 ~]# cp /root/qemu-7.2.0/build/qemu-system-x86_64 /usr/bin/
[root@centos9 ~]# qemu-s
qemu-storage-daemon qemu-system-x86_64
[root@centos9 ~]# qemu-system-x86_64
qemu: could not load PC BIOS 'bios-256k.bin
[root@centos9 ~]# ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
至此执行qemu-system-x86_64 --help可以查看帮助信息了。

编译安装过程的问题:

1、./configre过程中:这个过程可能会出现各种问题,缺少各种依赖和库文件。
(1)ERROR: Cannot find Ninja
解决办法:安装re2c,安装Ninja,在安装Ninja时很有可能python版本不够高,还得升级python的版本。
安装 re2c 和 ninja
a、准备编译环境
[root@centos8 ~]# yum -y install git automake gcc+ gcc-c++ libtool
b、获取源码、并编译安装
[root@centos8 ~]# git clone https://github.com/skvadrik/re2c.git re2c
[root@centos8 ~]# cd re2c
[root@centos8 re2c]# mkdir -p m4
[root@centos8 re2c]#./autogen.sh && ./configure --prefix=/usr && make
[root@centos8 re2c]# sudo make install
c、检查是否安装成功
[root@centos8 ~]# re2c -v
re2c 1.1.1
这样就安装完毕了,因为re2c作为基础依赖, 然后可以安装ninja了,ninja官网地址:https://ninja-build.org/,github仓库地址:https://github.com/ninja-build/ninja,可以从github仓库克隆项目切换到release分支或者下载release包,目前最新版是1.11.1,安装过程如下:
[root@centos8 ~]# git clone git://github.com/ninja-build/ninja.git && cd ninja
[root@centos8 ninja]#./configure.py --bootstrap
[root@centos8 ninja]# sudo cp ninja /usr/bin/
现在可以执行 ./configure.py --help 查看帮助,直接执行 ./configure.py --bootstrap 进行编译,编译完成之后,当前目录下会有ninja的可执行文件,执行 ./ninja -h 可以查看帮助。 ninja比较精简,只需要一个可执行文件即可,现在可以做软链或者复制到/usr/bin下面就可以直接调用了,比如: cp ninja /usr/bin/ 然后可以直接使用 ninja 命令,这样就安装好了.
(2)ERROR: glib-2.48 gthread-2.0 is required to compile QEMU
解决办法:安装对应的包
[root@centos8 ~]# yum install glib2 glib2-devel
(3)ERROR:Dependency “pixman-1” not found, tried pkgconfig
解决办法:没有安装pixman,下载pixman源码后编译安装。
[root@centos8 ~]# wget https://www.cairographics.org/releases/pixman-0.40.0.tar.gz #下载的是0.40版本
[root@centos8 ~]# tar -xzvf pixman-0.40.0.tar.gz
[root@centos8 ~]# cd pixman-0.40.0
[root@centos8 pixman-0.40.0]# ./configure #生成Makefile文件
[root@centos8 pixman-0.40.0]# make && make install #编译及安装

安装完成后,找到pixman-1.pc的路径 ,然后修改PKG_CONFIG_PATH它的值:
[root@centos8 ~]# find / -name “pixman-1.pc”
/usr/local/lib/pkgconfig/pixman-1.pc
[root@centos8 ~]# export PKG_CONFIG_PATH=“/usr/local/lib/pkgconfig/” //设置环境变量
使用export设置的环境变量,在另一个shell中是不会生效的,所以后续可能还要设置环境变量。
(4)ERROR: glib-2.56 gthread-2.0 is required to compile QEMU
解决办法:
[root@centos8 ~]# yum install glib2
[root@centos8 ~]# yum install glib2-devel
(5)ERROR: Dependency “sdl2” not found
解决办法:SDL2是一种多媒体的包文件,如果想要启动qemu界面的话,要正确配置。我把yum search sdl找到的源能安装的都安装了,还是不行,最后找到官网下载源码安装的.
这个要是实在安装不了,或者安装了即支持了sdl,而qemu界面也启动不了也没关系,用命令行调试也可以,不影响。
[root@centos8 ~]# git clone https://github.com/libsdl-org/SDL
[root@centos8 ~]# cd SDL
[root@centos8 SDL]# mkdir build
[root@centos8 SDL]# cd build
[root@centos8 build]# …/configure
[root@centos8 build]# make
[root@centos8 build]# sudo make install

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚拟化系列教程-安装QEMU/KVM的三种方式 的相关文章

  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 错误:NVIDIA-SMI 失败,因为无法与 NVIDIA 驱动程序通信

    NVIDIA SMI 抛出此错误 NVIDIA SMI 失败 因为无法与 NVIDIA 通信 司机 确保安装了最新的 NVIDIA 驱动程序并且 跑步 我清除了 NVIDIA 并按照提到的步骤重新安装了它here https askubun
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 确保 config.h 包含一次

    我有一个库项目 正在使用 Linux 中的 autotools 套件移植到该项目 我对自动工具很陌生 本周 我已经了解了其操作的基础知识 我有一个关于如何保留内容的问题config h免遭重新定义 我惊讶地发现生成的config h文件也没
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • diff 文件仅比较每行的前 n 个字符

    我有2个文件 我们将它们称为 md5s1 txt 和 md5s2 txt 两者都包含a的输出 find type f print0 xargs 0 md5sum sort gt md5s txt 不同目录下的命令 许多文件被重命名 但内容保
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i

随机推荐