一步一步教你:如何在Linux上用QEMU搭建虚拟机

原创 Linux二进制 2024-11-01 08:30

QEMU 是一个强大的开源硬件虚拟化软件,可以在多种操作系统上运行。本文将详细介绍如何在 Linux 平台上从源码编译 QEMU,并创建和配置一个虚拟机。我们将使用 CentOS 8.5 作为示例操作系统,但部分步骤同样适用于其他操作系统(如 Ubuntu)。

1. 简介

QEMUQuick Emulator)是一个强大的开源虚拟化工具,可以模拟整个计算机系统,包括 CPU、内存、硬盘、网卡等。结合 KVMKernel-based Virtual Machine),QEMU 可以提供高效的虚拟化性能。

2. 安装依赖

在开始之前,确保你的系统已经安装了必要的依赖项。以下命令适用于基于 Red Hat 的系统(如 CentOS 和 Fedora):

sudo dnf install pixman-devel -y

3. 源码编译 QEMU

  1. 下载 QEMU 源码

    wget https://download.qemu.org/qemu-8.2.0.tar.xz
    tar -xvf qemu-8.2.0.tar.xz
    cd qemu-8.2.0
  2. 安装编译依赖

    sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk bison flex patchutils gcc gcc-c++ zlib-devel expat-devel libslirp-devel -y
    sudo dnf group install "Development Tools" -y
  3. 安装 texinfo

    wget https://ftp.gnu.org/gnu/texinfo/texinfo-6.8.tar.xz
    tar -xvf texinfo-6.8.tar.xz
    cd texinfo-6.8
    ./configure
    make
    make install
  4. 编译和安装 QEMU

    cd qemu-8.2.0
    ./configure --enable-kvm --enable-debug --enable-vnc --enable-werror --target-list="x86_64-softmmu" --enable-slirp
    make -j $(nproc)
    make install

configure 脚本用于生成 Makefile,其选项可以用 ./configure --help 查看。这里使用到的选项含义如下:

  • --enable-kvm:编译 KVM 模块,使 QEMU 可以利用 KVM 来访问硬件提供的虚拟化服务

  • --enable-debug:启用调试符号的生成,这有助于调试程序。

  • --enable-vnc:启用 VNC 支持,允许通过 VNC 客户端连接到 QEMU 实例,并查看其图形输出。

  • --enalbe-werror:告诉编译器将所有的警告都视为错误,这样可以确保代码质量更高,任何可能的问题都会阻止编译过程。

  • --target-list="x86_64-softmmu":选择目标机器的架构。默认将所有的架构都编译,但为了更快完成编译,指定要构建的目标体系结构。在这个例子中,它指定了 x86_64 架构,并且使用软MMU(内存管理单元),这意味着 QEMU 将模拟硬件的内存管理功能。

  • --enable-slirp:启用 SLiRP,使 qemu 增加了一种 user mode 的网络后端实现,该网络后端的实现是在用户态实现的一套 tcp/ip 协议栈。

整个命令的作用就是配置 QEMU 的编译选项,以便它可以支持 KVM 加速、VNC 连接、调试信息,并且能够模拟 x86_64 架构的机器,同时提供 SLiRP 网络支持。这些配置完成后,接下来就可以通过 make 命令开始编译过程了。

这里需要注意,开启 --enable-slirp 后,可能会遇到如下错误:qemu-system-x86_64: error while loading shared libraries: libslirp.so.0: cannot open shared object file: No such file or directory,这个错误表明 QEMU 在启动时无法找到或加载 libslirp.so.0 库。libslirp.so.0 是 QEMU 用户模式网络支持的一部分,用于模拟网络连接。当 QEMU 尝试使用用户模式网络 (-netdev user) 时,需要这个库来完成网络仿真。为安装 libslirp.so.0 库,可通过如下方式:

wget  https://gitlab.freedesktop.org/slirp/libslirp/-/archive/v4.8.0/libslirp-v4.8.0.tar.bz2
tar -xvjf libslirp-v4.8.0.tar.bz2
mkdir build
cd build
meson setup --prefix=/usr --buildtype=release ..
ninja
ninja install

即使库文件已经安装,但如果 QEMU 可执行文件所在环境的 LD_LIBRARY_PATH 中没有包含库文件所在的目录,可以手动设置 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/path/to/libslirp:$LD_LIBRARY_PATH

如果 libslirp.so.0 存在于 /usr/lib64 目录中:

export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH

通过上述步骤,你应该能够解决 QEMU 在启动时无法找到 libslirp.so.0 的问题。如果问题仍然存在,请进一步检查其他配置或环境问题。

4. 创建虚拟机镜像

使用 qemu-img 工具创建一个新的磁盘镜像文件。这里我们创建一个 100 GB 的 qcow2 格式的磁盘镜像。

qemu-img create -f qcow2 CentOS-8.5-VM.qcow2 100G

5. 创建虚拟机

qemu-system-x86_64 是一个基于 QEMU 的命令行工具,用于模拟 x86 架构的计算机系统。假设您要在虚拟机中安装 x86 架构操作系统,可以使用 qemu-system-x86_64 命令创建虚拟机并安装操作系统,这里假设你已经下载了 CentOS-8.5.2111-x86_64-dvd1.iso 文件。

qemu-system-x86_64 -name CentOS-8.5-VM -smp 4 -m 4096 -enable-kvm -boot order=dc,once=d -hda /home/tmp/image/vmImages/CentOS-8.5-VM/CentOS-8.5-VM.qcow2 -cdrom /home/tmp/image/qemu/vImage/CentOS-8.5/CentOS-8.5.2111-x86_64-dvd1.iso -netdev user,id=mynic0,hostfwd=tcp::1234-:22 -device virtio-net-pci,netdev=mynic0,mac=52:54:98:76:54:32 -vnc :10 -serial stdio -machine usb=on -device usb-tablet

qemu-system-x86_64 命令用来创建一个虚拟机,并配置了一些基本的参数。这个命令的各个参数意义如下:

  • qemu-system-x86_64QEMU 的二进制文件名,这里表示运行 x86_64 架构的系统级模拟器。

  • -name CentOS-8.5-VM:为虚拟机命名,虽然这不是一个必需的参数,但它可以用于标识虚拟机,便于日志记录或管理。

  • -smp n [,cores=cores][,threads=threads][,sockets=sockets] [,maxcpus=maxcpus]

    设置客户机总共有 n 个逻辑 CPU,并设置了其中 CPU socket 的数量、每个 socket 上核心(core)的数量、每个核心上的线程(thread)数量。其中:n = sockets x cores x threads

    • n:虚拟CPU(vcpu)的个数,每个 thread 都视为一个虚拟 CPU 。

    • cores:每个 CPU 拥有的 CPU 核心数目

    • threads:每个 CPU 核心拥有的线程数目。

    • sockets :CPU 插槽数目,也就是 CPU 的个数。

    • maxcpus: 根据文档,是设置可热插拔的 CPU 数量,经测试,n 的值不可超过maxcpus

  • -m 4096:设置虚拟机内存大小为 4096 MB(4 GB),默认单位是 MB 。

  • -enable-kvm:启用 KVM 加速,提高虚拟机性能。KVMKernel-based Virtual Machine)是一种全虚拟化技术,利用 Linux 内核作为 Hypervisor

  • -boot order=dc,once=d:定义设备的引导次序,每种设备使用一个字符表示,a,b 表示软驱,c 表示第一块硬盘,d 表示第一个光驱,n-p 表示网络适配器。这里表示设置引导顺序为从 CD-ROM (d 表示 CD-ROM)引导,如果没有 CD-ROM,则从硬盘(c 表示硬盘)引导。once=d 表示仅在首次启动时尝试从 CD-ROM 引导,之后的启动都从硬盘引导。

  • -hda /home/tmp/image/vmImages/CentOS-8.5-VM/CentOS-8.5-VM.qcow2:指定虚拟机的硬盘映像文件 /home/tmp/image/vmImages/CentOS-8.5-VM/CentOS-8.5-VM.qcow2,并将其作为第一个硬盘(hda)加载。

  • -cdrom /home/tmp/image/qemu/vImage/CentOS-8.5/CentOS-8.5.2111-x86_64-dvd1.iso:指定 ISO 文件的位置 /home/tmp/image/qemu/vImage/CentOS-8.5/CentOS-8.5.2111-x86_64-dvd1.iso,并将它作为虚拟 CD-ROM 设备加载。

  • -netdev user,id=mynic0,hostfwd=tcp::1234-:22: 配置网络设备,user 表示使用用户模式网络,即通过 QEMU 本身的网络栈模拟网络连接。id=mynic0 给这个网络设备分配一个标识符 mynic0hostfwd=tcp::1234-:22 表示将主机的端口 1234 映射到虚拟机的端口 22SSH 默认端口)。

     

    注意user 指 config user mode host network backend, 端口转发配置格式为:hostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport

  • -device virtio-net-pci,netdev=mynic0,mac=52:54:98:76:54:32: 添加一个 VirtIO 网卡设备,指定虚拟网卡设备类型为 virtio-net-pci,并将其与前面定义的网络设备 mynic0 关联起来。mac 参数设置 MAC 地址为 52:54:98:76:54:32

  • -vnc :10:开启 VNC 服务,允许远程访问虚拟机的图形界面。VNC 服务将在本地的 5910 端口上监听。

  • -serial stdio:开启串行控制台,允许通过终端与虚拟机交互。

  • -machine usb=on -device usb-tabletusb=on 表示启用 USB 支持。-device usb-tablet 表示添加一个 USB 平板设备,使得可以通过 USB 接口与虚拟机交互。在qemu 里面使用 kvm,在 vnc 终端里面鼠标会错位(真实鼠标在外,虚拟鼠标在 vnc 内部,需要不断调整角度)。这两个参数主要为了解决在使用 vnc 连接虚拟机时鼠标不同步(错位)的问题。

上面命令执行后,会弹出图形安装界面,可根据图形界面引导进行操作系统安装,操作系统安装完成后,在图形安装界面,点击重启系统,重新启动虚拟机,同时可以在宿主机命令行中按 Ctrl C 终结上面的 qemu-system-x86_64 命令行创建流程,重新运行启动虚拟机命令。

6. 启动虚拟机

安装完成后重起虚拟机便会从硬盘启动,之后再启动虚拟机只需要执行:

qemu-system-x86_64 -name CentOS-8.5-VM -smp 4 -m 4096 -enable-kvm -hda /home/tmp/image/vmImages/CentOS-8.5-VM/CentOS-8.5-VM.qcow2 -netdev user,id=mynic0,hostfwd=tcp::1234-:22 -device virtio-net-pci,netdev=mynic0,mac=52:54:98:76:54:32 -vnc :10

qemu-system-x86_64 命令用来启动一个虚拟机,并配置了一些基本的参数。这个命令的各个参数意义如下:

  • -name CentOS-8.5-VM: 为虚拟机命名,这样可以在日志和其他管理工具中更容易识别虚拟机。

  • -smp 4 :设置虚拟机拥有 4 个虚拟 CPUSMPSymmetric Multi-Processing)。

  • -m 4096:设置虚拟机拥有 4096MB(即 4GB)的内存。

  • -enable-kvm:启用 KVM 加速功能,提高虚拟化性能。KVM 是 Linux 内核的一个模块,提供了硬件加速的虚拟化功能。

  • -hda /home/tmp/image/vmImages/CentOS-8.5-VM/CentOS-8.5-VM.qcow2:指定虚拟机的硬盘映像文件 /home/tmp/image/vmImages/CentOS-8.5-VM/CentOS-8.5-VM.qcow2,并将其作为第一个硬盘(hda)加载。

  • -netdev user,id=mynic0,hostfwd=tcp::1234-:22: 设置网络设备为用户模式网络 (user),并使用 ID mynic0。同时,设置端口转发规则,允许外部主机通过本地的 1234 端口访问虚拟机的 SSH 服务(默认端口 22)。

     

    注意user 指 config user mode host network backendhostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport

  • -device virtio-net-pci,netdev=mynic0,mac=52:54:98:76:54:32: 指定虚拟网卡设备类型为 virtio-net-pci,使用前面定义的 netdev=mynic0 网络设备,并设置 MAC 地址为 52:54:98:76:54:32

 

拓展:QEMU 的网络配置

 

要理解 QEMU 的网络配置实现由两个部分组成:

  • 提供给虚拟机的虚拟网卡(virtual network device)比如经典的 e1000,rtl8139 以及 virtio-net-pci 等,是虚拟机内部看到的设备。
  • 与虚拟网卡交互的后端(network backend)虚拟机往虚拟网卡写入的数据都会由 network backend 流出到真实的网络环境中。

QEMU 网络配置需要组合使用  -device DEVNAME,netdev=NAME 与 -netdev TYPE,id=NAME,... 命令,-device 用于配置虚拟网卡,-netdev 用于配置网络后端, device 中的 netdev 的值与 netdev 中的 id 的值相同,一起配合用于组成一组网络配置,一台虚拟机可以配置多个网络。

 

拓展:QEMU 配置网络环境通常有 2 种方式

  1. 可插拔网卡(pluggable NIC
-device DEVNAME,netdev=NET-ID,... \
-netdev TYPE,id=NET-ID,...
 

注意qemu-system-x86_64 -device help 可以查看机器支持的设备(包含网卡设备)

  1. 板载网卡(On-board NIC
-nic TYPE,model=DEVNAME,...
 

注意qemu-system-x86_64 -nic model=help 可以查看机器支持的 NIC 设备。

 

注意:如果在命令行(通过 -net(已废弃)、-nic 或 -netdev)指定任何网络选项,那么 QEMU 将要求您提供足以定义和连接这两个部分的选项。(忘记指定网络后端或网络虚拟设备会给出警告信息,如“Warning: netdev mynet0 has no peer”,“Warning: hub 0 is not connected to host network”或者“Warning: hub 0 with no nics”,然后 VM 将启动,但是没有正常运行的网络) 注意:如果您使用(默认)SLiRP 用户网络,则 pingICMP)将不起作用,但 TCP 和 UDP 将起作用。不要尝试使用 ping 来测试您的 QEMU 网络配置。

  • -vnc :10:开启 VNC 服务,允许远程访问虚拟机的图形界面。VNC 服务将在本地的 5910 端口上监听。

7. 登录虚拟机

启动虚拟机后,常用登录虚拟机可以通过如下 2 种方式:

  1. 使用 SSH 登录虚拟机

  2. VNC 登录虚拟机

具体采用哪种方式取决于你的虚拟机的配置和需求。

1. 使用 SSH 登录虚拟机

如果你的虚拟机已经配置了网络,并且安装了 SSH 服务,那么最常用的方法就是通过 SSH 登录。配置方法如下:

1)确保虚拟机有网络连接

配置虚拟机的网络接口为桥接模式(Bridged)或 NAT 模式(NAT),以便虚拟机能够访问网络。

2)安装 SSH 服务

在虚拟机内部安装 SSH 服务(如 OpenSSH):

  • 基于 Red Hat 的系统

    sudo dnf install openssh-server
  • Ubuntu 系统

    sudo apt update && sudo apt install openssh-server

3)启动并设置 SSH 自启动

设置 SSH 自启动配置命令如下:

sudo systemctl start ssh
sudo systemctl enable ssh

4)检查 SSH 服务状态

查看虚拟机中 SSH 的状态,命令如下:

sudo systemctl status ssh

5)通过 SSH 登录

在宿主机上使用 SSH 客户端连接虚拟机:

ssh user@virtual_machine_hostname

如果你更改了 SSH 端口,需要加上 -p 参数指定端口号:

ssh -p host_port user@virtual_machine_hostname

其中,host_port 是宿主机的端口号,即前面启动虚拟机时,-netdev user,id=mynic0,hostfwd=tcp::1234-:22 命令中的 1234 端口号。

让我们通过 ssh 登录虚拟机演示一下,这里通过如下命令:

ssh -p 1234 root@localhost

前面创建虚拟机时,设置了宿主机 1234 端口映射到虚拟机的 22 端口,因此,可通过 -p 指定宿主机的 1234 端口转发到虚拟机的 22 端口,root 是登录虚拟机使用的用户名,localhost 是安装虚拟机时设置的虚拟机主机名。结果如下:

dmidecode 可以显示有关系统硬件的详细信息,包括制造商信息。虚拟机通常会在制造商信息中显示虚拟化平台的名称。如果输出类似于 QEMU、VMware, Inc. 或 innotek GmbH(VirtualBox),则说明该系统运行在虚拟机上。如果输出的是一个实际的硬件制造商名称,如 Dell Inc. 或 Lenovo,则说明该系统运行在物理机上。

2. 使用 VNC 登录虚拟机

VNC(Virtual Network Computing) 是一种允许你通过网络远程控制另一台计算机桌面的技术。VNC 主要由两部分组成:VNC 服务器(Server)和 VNC 客户端(Client)。VNC 服务器运行在被控制的计算机上,而 VNC 客户端则运行在远程控制计算机上。

QEMU 本身支持 VNC 功能,这意味着你可以直接通过 QEMU 的命令行参数启动虚拟机,并启用 VNC 服务器功能。这样就不需要在虚拟机内部单独安装 VNC 服务器软件。要在 QEMU 创建的虚拟机内启用 VNC 功能,使用 QEMU 的 -vnc 选项启动虚拟机,并指定 VNC 端口:-vnc :10 。但宿主机则需要安装 VNC 客户端,从而连接虚拟机中的 VNC 服务端。宿主机上 VNC 客户端安装命令如下:

yum install tigervnc -y

在宿主机上使用 VNC 客户端连接虚拟机:

vncviewer :10

8. 虚拟机的仓库配置

为了加快虚拟机中软件包的下载速度,可以修改 CentOS 的仓库配置,使用国内的镜像源。

编辑 /etc/yum.repos.d/CentOS-AppStream.repo 文件:

[AppStream]
name=CentOS-$releasever - AppStream
baseurl=http://mirrors.aliyun.com/centos/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

编辑 /etc/yum.repos.d/CentOS-Linux-BaseOS.repo 文件:

[baseos]
name=CentOS Linux $releasever - BaseOS
baseurl=http://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

编辑 /etc/yum.repos.d/CentOS-Linux-Extras.repo 文件:

[extras]
name=CentOS Linux $releasever - Extras
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

9. 常用工具安装

在虚拟机中安装一些常用的开发工具和库:

yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk bison flex patchutils gcc gcc-c++ zlib-devel expat-devel libslirp-devel -y

10. 虚拟机GNU工具链

下载工具链源码:

git clone https://mirrors.tuna.tsinghua.edu.cn/git/binutils-gdb.git
git clone https://mirrors.tuna.tsinghua.edu.cn/git/gcc.git

安装依赖:

yum groupinstall "Development Tools" -y
yum install gmp-devel mpfr-devel libmpc-devel -y
 

拓展yum groupinstall "Development Tools" 是一个命令,用于在基于 Red Hat 的系统(如 CentOS、Fedora、Red Hat Enterprise Linux)上安装一组常用的开发工具。该命令解析如下:

  1. yum(Yellowdog Updater Modified) 是一个包管理器,用于安装、更新和卸载软件包。它可以根据依赖关系自动解决软件包之间的依赖关系。

  2. groupinstall 命令用于安装预定义的软件包组。每个组都包含一组相关的软件包,这些软件包通常是为了解决特定的任务或满足某种用途而组合在一起的。

  3. "Development Tools" 是一个预定义的软件包组,包含了开发人员在编写、编译和调试程序时需要的各种工具。这些工具通常包括编译器、链接器、调试工具等。

"Development Tools" 软件包组中的这些工具通常包括编译器、链接器、调试工具以及其他与软件开发相关的工具。通常包括但不限于:

  • 编译器:如 gcc 和 g++GNU 编译器集合的一部分)。

  • 链接器:如 ldGNU 链接器)。

  • 调试工具:如 gdbGNU 调试器)。

  • 库文件:如 libstdc++C++ 标准库)。

  • 文本编辑器:如 vim 或 nano

  • 构建工具:如 make 和 autotoolsautoconf, automake, libtool)。

  • 包管理工具:如 rpm-build

这些工具是软件开发的基本组成部分,对于编写、编译、调试和打包应用程序非常重要。

编译 binutils-gdb 工具:

cd binutils-gdb/
./configure --enable-gold
# 使用所有可用的 CPU 核心进行并行编译,加快编译速度。
make -j$(nproc)
# 以 root 权限安装编译好的 binutils
make install

其中,configure 选项的含义如下:

  • --enable-gold:选项用于在编译 binutils-gdb 时启用 gold 链接器的支持。gold 是 GNU 链接器的一个替代品,设计用于提供更好的性能和额外的功能。

安装好上述工具后,可在 /usr/local/bin/ 路径下看到日常开发中常用的二进制工具,如下:

[root@localhost repo]# ls /usr/local/bin
addr2line cpp gcc-ar gcov-dump gp-archive gprof ld.bfd objcopy readelf texi2dvi x86_64-pc-linux-gnu-gcc
ar dwp gcc-nm gcov-tool gp-collect-app gprofng ld.gold objdump size texi2pdf x86_64-pc-linux-gnu-gcc-15.0.0
as elfedit gcc-ranlib gdb gp-display-html help2man lto-dump pdftexi2dvi strings texindex x86_64-pc-linux-gnu-gcc-ar
c++ g++ gcore gdb-add-index gp-display-src install-info makeinfo pod2texi strip x86_64-pc-linux-gnu-c++ x86_64-pc-linux-gnu-gcc-nm
c++filt gcc gcov gdbserver gp-display-text ld nm ranlib texi2any x86_64-pc-linux-gnu-g++ x86_64-pc-linux-gnu-gcc-ranlib

运行其中一个工具试验一下:

[root@localhost repo]# addr2line --help
Usage: addr2line [option(s)] [addr(s)]
Convert addresses into line number/file name pairs.
If no addresses are specified on the command line, they will be read from stdin
The options are:
@ Read options from
-a --addresses Show addresses
-b --target= Set the binary file format
-e --exe= Set the input file name (default is a.out)
-i --inlines Unwind inlined functions
-j --section= Read section-relative offsets instead of addresses
-p --pretty-print Make the output easier to read for humans
-s --basenames Strip directory names
-f --functions Show function names
-C --demangle[=style] Demangle function names
-R --recurse-limit Enable a limit on recursion whilst demangling. [Default]
-r --no-recurse-limit Disable a limit on recursion whilst demangling
-h --help Display this information
-v --version Display the program's version

addr2line: supported targets: elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 pei-i386 pe-x86-64 pei-x86-64 elf64-little elf64-big elf32-little elf32-big srec symbolsrec verilog tekhex binary ihex plugin
Report bugs to

可以正常使用,但是当运行 gdb 时,却报如下错误:

[root@localhost repo]# gdb --help
gdb: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by gdb)
gdb: /lib64/libstdc++.so.6: version `CXXABI_1.3.15' not found (required by gdb)
gdb: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by gdb)
gdb: /lib64/libstdc++.so.6: version `CXXABI_1.3.13' not found (required by gdb)

上述错误信息表明 gdb 依赖的 libstdc++.so.6 库版本不满足要求。具体来说,gdb 需要的 GLIBCXX_3.4.30 和 CXXABI_1.3.15 版本在你的系统中找不到。这通常是因为你的系统中的 libstdc++ 库版本过旧。 为解决该问题,特进行如下操作:

# 更新 libstdc++ 库
yum update
yum install libstdc++-devel

# 验证安装
strings /usr/local/lib64/libstdc++.so.6 | grep GLIBCXX
strings /usr/local/lib64/libstdc++.so.6 | grep CXXABI

# 设置库路径到 .bashrc 文件中,以便每次登录时自动设置
vi ~/.bashrc
# 在文件最后添加如下行:
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH

进行如上操作后,即可解决 gdb 因为 libstdc++ 库版本不匹配而无法运行的问题。如果系统提供的库版本过旧,可以从源代码编译安装较新版本的 libstdc++ 库。

编译 gcc 工具:

mkdir build
cd build
../configure --enable-languages=c,c++ --disable-multilib
# 使用所有可用的 CPU 核心进行并行编译,加快编译速度。
make -j$(nproc)
# 以 root 权限安装编译好的 GCC
make install

其中,configure 选项的含义如下:

  • --enable-languages=c,c++:启用 C 和 C++ 语言支持。

  • --disable-multilib:禁用多库支持,减少编译时间。

安装完成后,验证 gcc/g++ 是否正确安装:

[root@localhost ~]# gcc --version
gcc (GCC) 15.0.0 20241023 (experimental)
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[root@localhost ~]# g++ --version
g++ (GCC) 15.0.0 20241023 (experimental)
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

你应该看到类似如上的输出,说明 gcc/g++ 已成功安装。通过以上步骤,你可以下载并安装 g++ 15.0.0 版本。

11. 总结

通过以上步骤,你已经成功地在 Linux 平台上从源码编译 QEMU,并创建和配置了一个虚拟机。QEMU 提供了强大的虚拟化功能,结合 KVM 可以显著提高虚拟机的性能。希望这篇博文对你有所帮助!


Linux二进制 Linux编程、内核模块、网络原创文章分享,欢迎关注"Linux二进制"微信公众号
评论
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 54浏览
  • 国产光耦合器正以其创新性和多样性引领行业发展。凭借强大的研发能力,国内制造商推出了适应汽车、电信等领域独特需求的专业化光耦合器,为各行业的技术进步提供了重要支持。本文将重点探讨国产光耦合器的技术创新与产品多样性,以及它们在推动产业升级中的重要作用。国产光耦合器创新的作用满足现代需求的创新模式新设计正在满足不断变化的市场需求。例如,高速光耦合器满足了电信和数据处理系统中快速信号传输的需求。同时,栅极驱动光耦合器支持电动汽车(EV)和工业电机驱动器等大功率应用中的精确高效控制。先进材料和设计将碳化硅
    克里雅半导体科技 2024-11-29 16:18 157浏览
  • By Toradex胡珊逢简介嵌入式领域的部分应用对安全、可靠、实时性有切实的需求,在诸多实现该需求的方案中,QNX 是经行业验证的选择。在 QNX SDP 8.0 上 BlackBerry 推出了 QNX Everywhere 项目,个人用户可以出于非商业目的免费使用 QNX 操作系统。得益于 Toradex 和 QNX 的良好合作伙伴关系,用户能够在 Apalis iMX8QM 和 Verdin iMX8MP 模块上轻松测试和评估 QNX 8 系统。下面将基于 Apalis iMX8QM 介
    hai.qin_651820742 2024-11-29 15:29 150浏览
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-29 14:30 118浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 57浏览
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-30 14:30 63浏览
  • 光耦合器作为关键技术组件,在确保安全性、可靠性和效率方面发挥着不可或缺的作用。无论是混合动力和电动汽车(HEV),还是军事和航空航天系统,它们都以卓越的性能支持高要求的应用环境,成为现代复杂系统中的隐形功臣。在迈向更环保技术和先进系统的过程中,光耦合器的重要性愈加凸显。1.混合动力和电动汽车中的光耦合器电池管理:保护动力源在电动汽车中,电池管理系统(BMS)是最佳充电、放电和性能监控背后的大脑。光耦合器在这里充当守门人,将高压电池组与敏感的低压电路隔离开来。这不仅可以防止潜在的损坏,还可以提高乘
    腾恩科技-彭工 2024-11-29 16:12 117浏览
  • 国产光耦合器因其在电子系统中的重要作用而受到认可,可提供可靠的电气隔离并保护敏感电路免受高压干扰。然而,随着行业向5G和高频数据传输等高速应用迈进,对其性能和寿命的担忧已成为焦点。本文深入探讨了国产光耦合器在高频环境中面临的挑战,并探索了克服这些限制的创新方法。高频性能:一个持续关注的问题信号传输中的挑战国产光耦合器传统上利用LED和光电晶体管进行信号隔离。虽然这些组件对于标准应用有效,但在高频下面临挑战。随着工作频率的增加,信号延迟和数据保真度降低很常见,限制了它们在电信和高速计算等领域的有效
    腾恩科技-彭工 2024-11-29 16:11 106浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 70浏览
  • 在电子技术快速发展的今天,KLV15002光耦固态继电器以高性能和强可靠性完美解决行业需求。该光继电器旨在提供无与伦比的电气隔离和无缝切换,是现代系统的终极选择。无论是在电信、工业自动化还是测试环境中,KLV15002光耦合器固态继电器都完美融合了效率和耐用性,可满足当今苛刻的应用需求。为什么选择KLV15002光耦合器固态继电器?不妥协的电压隔离从本质上讲,KLV15002优先考虑安全性。输入到输出隔离达到3750Vrms(后缀为V的型号为5000Vrms),确保即使在高压情况下,敏感的低功耗
    克里雅半导体科技 2024-11-29 16:15 119浏览
  • 《高速PCB设计经验规则应用实践》+PCB绘制学习与验证读书首先看目录,我感兴趣的是这一节;作者在书中列举了一条经典规则,然后进行详细分析,通过公式推导图表列举说明了传统的这一规则是受到电容加工特点影响的,在使用了MLCC陶瓷电容后这一条规则已经不再实用了。图书还列举了高速PCB设计需要的专业工具和仿真软件,当然由于篇幅所限,只是介绍了一点点设计步骤;我最感兴趣的部分还是元件布局的经验规则,在这里列举如下:在这里,演示一下,我根据书本知识进行电机驱动的布局:这也算知行合一吧。对于布局书中有一句:
    wuyu2009 2024-11-30 20:30 86浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 59浏览
  • 在现代科技浪潮中,精准定位技术已成为推动众多关键领域前进的核心力量。虹科PCAN-GPS FD 作为一款多功能可编程传感器模块,专为精确捕捉位置和方向而设计。该模块集成了先进的卫星接收器、磁场传感器、加速计和陀螺仪,能够通过 CAN/CAN FD 总线实时传输采样数据,并具备内部存储卡记录功能。本篇文章带你深入虹科PCAN-GPS FD的技术亮点、多场景应用实例,并展示其如何与PCAN-Explorer6软件结合,实现数据解析与可视化。虹科PCAN-GPS FD虹科PCAN-GPS FD的数据处
    虹科汽车智能互联 2024-11-29 14:35 149浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期热荐性能显著提升的OSLON® Optimal,GF CSSRML.24ams OSRAM 基于最新芯片技术推出全新LED产品OSLON® Optimal系列,实现了显著的性能升级。该系列提供五种不同颜色的光源选项,包括Hyper Red(660 nm,PDN)、Red(640 nm)、Deep Blue(450 nm,PDN)、Far Red(730 nm)及Ho
    艾迈斯欧司朗 2024-11-29 16:55 155浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦