在本指南中，你将了解如何在 Linux 主机（例如使用 KVM 的 Fedora、Ubuntu 或 Linux Mint）下运行的 Windows 客户机之间共享文件夹。virt-manager 应用（带有 libvirt）和软件包提供了一组灵活的工具来管理 Linux 中的虚拟机。它是自由开源的，用于 KVM 虚拟机和其他虚拟机管理程序。在上一篇文章中，我解释了 如何在 Linux 客户机和 Linux 主机之间共享文件夹。然而，当你尝试使用 Windows 客户机和 Linux 主机创建共享文件夹时，这是一个有点困难和复杂的过程。因为两种操作系统的工作方式不同，需要进行大量配置。按照下面提到的说明在 Windows 客户机和 Linux 主机之间共享文件夹。关于 virtiofs 的说明共享文件和文件夹由名为 virtiofs 的 libvirt 共享文件系统提供支持。它提供了访问主机上目录树的所有功能和参数。由于大多数 virt-manager 虚拟机配置都会转换为 XML，因此共享文件/文件夹也可以由 XML 文件指定。注意：如果你正在寻求在两台 Linux 计算机（客户机和主机）之间使用 KVM 进行文件共享，请 阅读此文。使用 KVM 在 Windows 客户机和 Linux 主机之间共享文件夹以下说明假设你已在任何 Linux 主机的 virt-manager 中安装了 Windows。如果没有，你可以阅读有关如何在 Linux 中安装 Windows 的完整指南。在 virt-manager 中设置挂载标签首先，确保你的客户虚拟机已关闭。从 virt-manager GUI 中，选择虚拟机并单击“ 打开 Open ”以调出控制台设置。单击工具栏中显示虚拟硬件详细信息的图标。然后单击左侧面板上的“ 内存 Memory ”。选择选项“ 启用共享内存 Enable shared memory ”。单击“ 应用 Apply ”。确保 XML 在 XML 选项卡中显示 <access mode="shared"/>，如下所示。<memoryBacking> <access mode="shared"/> </memoryBacking> 单击底部的“ 添加硬件 Add hardware ”。从添加新硬件窗口的左侧面板中选择“ 文件系统 Filesystem ”。然后在详细信息选项卡中选择 “ 驱动 Driver ” 为 “virtiofs”。单击“ 浏览 browse > 浏览本地 browse local ”并从 Linux 系统中选择主机路径。在“ 目标路径 Target path ”中，输入你想要的任何名称。它只是一个文件标签，将在挂载过程中使用。目标路径中的此名称将作为 Windows 中的驱动器挂载，即资源管理器中的我的电脑。我已添加 “linux\_pictures” 作为目标挂载标签。因此，如果我想访问图片文件夹（/home/debugpoint/Pictures），示例设置可能如下：单击“ 完成 Finish ”。上述配置的 XML 设置如下。你可以在 XML 选项卡中找到它。<filesystem type="mount" accessmode="passthrough"> <driver type="virtiofs"/> <target dir="linux_pictures"/> </filesystem> 在 virt-manager 主窗口中，右键单击 Windows 虚拟机，然后单击“ 运行 Run ”启动虚拟机。如果未显示虚拟机，请单击“显示图形控制台”（工具栏中的监视器图标）。设置 WinFSP – 适用于 Windows 的 FUSE确保 Windows 虚拟机（客户机）正在运行。首先，我们需要安装 WinFSP（Windows File System Proxy）– FUSE for Windows。这使你能够毫无困难地挂载任何类 UNIX 文件系统。从客户 Windows 计算机打开 WinFSP 的 GitHub 页面。下载 WinFSP 安装程序下载 WinFSP .msi 安装程序。在 Windows 虚拟机上安装软件包。安装软件包时请确保选择 “Core”。完成安装。创建 VirtIO-FS 服务进入 stable-virtio 文件夹，从以下地址下载 virtio-win-guest-tools.exe。下载 virtio-win-guest-tools在 Windows 虚拟机上安装软件包。安装完成后，重启 Windows 虚拟机。重启后，在开始菜单中搜索打开“设备管理器”。进入系统设备并查找 “VirtIO FS 设备”。它应该被识别并且驱动程序应该由 Red Hat 签名。注意：（可选）如果你看到感叹号，即未检测到驱动程序，请按照 此处 说明下载 ISO 文件、安装它并手动检测驱动程序。打开开始菜单并搜索“服务”。向下滚动找到 “VirtIO-FS Service”。右键单击并单击“开始”启动该服务。或者，你可以以管理员身份从 PowerShell/命令提示符运行以下命令来启动服务。sc create VirtioFsSvc binpath="C:\Program Files\Virtio-Win\VioFS\virtiofs.exe" start=auto depend="WinFsp.Launcher/VirtioFsDrv" DisplayName="Virtio FS Service" sc start VirtioFsSvc 服务启动后，打开资源管理器，你应该看到你在上面第一步中创建的挂载标签，该标签应映射为 Z 驱动器。见下图。你现在可以根据需要使用修改后的权限访问整个 Linux 文件夹。以下是在 Linux Mint 和 Windows 客户虚拟机中访问的同一文件夹的并排比较。总结我希望你现在能够在 Windows 客户机和 Linux 主机系统之间共享文件夹。本文在 Linux Mint 中测试了上述方法。它应该也适用于 Ubuntu、Fedora。如果上述方法有效，请在下面发表评论以造福他人。参考https://virtio-fs.gitlab.io/howto-windows.htmlhttps://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.mdhttps://github.com/virtio-win/kvm-guest-drivers-windows/issues/473（题图：MJ/91c30453-5939-4368-b885-c4cb84e732bf）via: https://www.debugpoint.com/kvm-share-folder-windows-guest/作者：Arindam 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在本指南中，我们演示了如何在 Rocky Linux 9 / Alma Linux 9 上安装 KVM。KVM 是 内核虚拟机 Kernel Virtualization Machine 的简称，是一个为 Linux 内核设计的开源虚拟化平台。它是一种 1 类管理程序，或通常称为裸机管理程序。它允许用户创建和管理多台客户机，这些可以在 Linux 或 Windows 操作系统中创建。与大多数虚拟化平台一样，它将硬件资源（如 CPU、内存、存储、网络、图形等）抽象化，并将它们分配给独立于宿主机运行的客户机。先决条件预装 Rocky Linux 9 / AlmaLinux 9具有管理员权限的 sudo 用户互联网连接1、验证是否启用了硬件虚拟化首先，你需要验证你的系统是否启用了虚拟化功能。在大多数现代系统上，此功能已在 BIOS 中启用。但可以肯定的是，你可以验证是否如图所示启用了虚拟化。该命令探测是否存在 VMX（ 虚拟机扩展 Virtual Machine Extension ），它是英特尔硬件虚拟化的 CPU 标志，或 SVM，它是 AMD 硬件虚拟化的标志。$ cat /proc/cpuinfo | egrep "vmx|svm" 从以下输出中，你可以看到我们的系统启用了英特尔硬件虚拟化：2、在 Rocky Linux 9 / AlmaLinux 9 上安装 KVM确保启用虚拟化后，下一步就是安装 KVM 和管理工具。为此，请运行以下 dnf 命令。$ sudo dnf install qemu-kvm virt-manager libvirt virt-install virt-viewer virt-top bridge-utils bridge-utils virt-top libguestfs-tools -y 安装完成后，运行以下命令检查是否已加载所需的 KVM 模块。$ lsmod | grep kvm 你应该得到以下输出以确认已加载必要的模块：3、启动并启用 libvirtd 守护进程在下一步中，一定要启动 libvirtd 守护进程。这是一个服务器端守护程序组件，可在虚拟化的客户机上运行和管理任务。它用于管理虚拟化技术，例如 Xen、KVM 和 ESXi 等等。要启动 libvirtd 守护进程，请运行以下命令：$ sudo systemctl start libvirtd 请务必启用该服务以在引导时启动：$ sudo systemctl enable --now libvirtd 验证 libvirtd 守护进程是否正在运行，如下所示：$ sudo systemctl status libvirtd 4、设置桥接接口到目前为止，我们已经安装了 KVM 和所有管理工具，事实上，我们可以继续启动虚拟机。但是，如果我们可以从管理程序网络外部访问虚拟机，那就太好了。为此，我们需要创建一个桥接接口。首先，确定系统上的网络接口。$ sudo nmcli connection show 从输出来看，ens160 是活动的网络接口，请务必注意你的情况下的接口，因为你将一路使用它。要开始创建网桥，首先，使用以下语法用其 UUID 删除连接：$ sudo nmcli connection delete UUID 在我们的例子中，命令将是：$ sudo nmcli connection delete 19e98123-9a84-30a6-bc59-a7134446bb26 你将收到连接已成功删除的确认信息。在继续进行之前，最好准备好以下详细信息：网桥名称 – 新网桥的首选名称（例如 br1）设备名称 – 这是你的网络接口的名称。它将作为网桥的从属设备（例如，ens160）IP 地址/子网 – 桥接网络的 IP 地址和子网（例如 192.168.2.50/24）。请注意，这应该与你的网络子网和 IP 地址相对应。网关 – 你网络的默认网关地址（例如 192.168.2.1）DNS1 和 DNS2 – 首选 DNS 地址（例如 8.8.8.8 和 8.8.4.4）继续，使用以下语法创建一个新的桥接接口。$ sudo nmcli connection add type bridge autoconnect yes con-name BRIDGE NAME ifname BRIDGE NAME 在我们的例子中，br1 是首选的网桥接口名称。因此，命令将如图所示：$ sudo nmcli connection add type bridge autoconnect yes con-name br1 ifname br1 在接下来的步骤中，你将通过指定 IP 子网、网关和 DNS 值来修改网桥。首先使用以下语法指定 IP 子网：$ sudo nmcli connection modify BRIDGE NAME ipv4.addresses IP ADDRESS/SUBNET ipv4.method manual 根据我们的设置，命令将是：$ sudo nmcli connection modify br1 ipv4.addresses 192.168.2.150/24 ipv4.method manual 接下来，使用以下语法指定网关地址：$ sudo nmcli connection modify BRIDGE NAME ipv4.gateway GATEWAY 根据我们的网络，该命令采用以下格式：$ sudo nmcli connection modify br1 ipv4.gateway 192.168.2.1 DNS 地址的语法如下：$ sudo nmcli connection modify BRIDGE NAME ipv4.dns DNS1 +ipv4.dns DNS2 该命令采用以下格式：$ sudo nmcli connection modify br1 ipv4.dns 8.8.8.8 +ipv4.dns 8.8.4.4 此后，使用以下命令添加网桥从属设备：$ sudo nmcli connection add type bridge-slave autoconnect yes con-name DEVICE NAME ifname DEVICE NAME master BRIDGE NAME 使用我们的值，命令如图所示：$ sudo nmcli connection add type bridge-slave autoconnect yes con-name ens160 ifname ens160 master br1 你将收到以下确认信息，表明已成功添加网桥从属设备。请记住，桥接从属设备是你的网络接口或适配器。要确认网桥已创建，请运行以下命令：$ sudo nmcli connection show 从输出中，你可以看到列出了网桥接口。激要活它，请运行以下命令：$ sudo nmcli connection up br1 此外，你可以使用 ip addr 命令验证：$ ip addr | grep br1 最后，编辑网桥配置文件。$ sudo vi /etc/qemu-kvm/bridge.conf 添加以下行：allow all 然后重新启动虚拟化守护进程以应用更改$ sudo systemctl restart libvirtd 5、创建虚拟机安装 KVM 并配置桥接连接后，现在让我们创建一个虚拟机。在执行之前，为登录用户分配必要的所有权，以便在不切换到 root 的情况下运行命令。$ sudo chown -R $USER:libvirt /var/lib/libvirt/ 在命令行上，我们将使用以下语法使用 Ubuntu 20.04 ISO 镜像创建虚拟机。$ virt-install \ --name Ubuntu \ --ram 2048 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/ubuntu-20.04.img,size=15 \ --os-variant ubuntu20.04 \ --network bridge=br1,model=virtio \ --graphics vnc,listen=0.0.0.0 \ --console pty,target_type=serial \ --cdrom /home/linuxtechi/Downloads/ubuntu-20.04.4-desktop-amd64.iso 执行该命令后，将启动图形屏幕会话，并开始安装客户操作系统。总结我们关于如何在 Rocky Linux 9 / AlmaLinux 9 上安装 KVM 的文章到此结束，非常欢迎你提供反馈。（题图：MJ/a364d6e3-0c59-4be8-bf02-5df078359429）via: https://www.linuxtechi.com/install-kvm-on-rocky-linux-almalinux/作者：Pradeep Kumar 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
KVM 是 基于内核的虚拟机 Kernel-based Virtual Machine 的首字母缩写，这是一项集成在内核中的开源虚拟化技术。它是一种类型一（裸机）的 管理程序 hypervisor ，可以使内核能够作为一个 裸机管理程序 bare-metal hypervisor 。在 KVM 之上可以运行 Windows 和 Liunx 虚拟机。每个虚拟机都独立于其它虚拟机和底层操作系统（宿主机系统），并拥有自己的 CPU、内存、网络接口、存储设备等计算资源。本文将介绍在 Ubuntu 22.04 LTS（Jammy Jellyfish）中如何安装 KVM 。在文末，我们也将演示如何在安装 KVM 完成之后创建一台虚拟机。1、更新 Ubuntu 22.04在一切开始前，打开终端并通过如下命令更新本地的软件包索引：$ sudo apt update 2、检查虚拟化是否开启在进一步行动之前，首先需要检查你的 CPU 是否支持 KVM 虚拟化，确保你系统中有 VT-x（ vmx）英特尔处理器或 AMD-V（svm）处理器。你可以通过运行如下命令，如果输出值大于 0，那么虚拟化被启用。否则，虚拟化被禁用，你需要启用它：$ egrep -c '(vmx|svm)' /proc/cpuinfo 根据上方命令输出，你可以推断出虚拟化功能已经启用，因为输出结果大于 0。如果虚拟化功能没有启用，请确保在系统的 BIOS 设置中启用虚拟化功能。另外，你可以通过如下命令判断 KVM 虚拟化是否已经在运行：$ kvm-ok 运行该命令之前，请确保你已经安装了 cpu-checker 软件包，否则将提示未找到该命令的报错。直接就在下面，你会得到如何解决这个问题的指示，那就是安装 cpu-checker 包。随后，通过如下命令安装 cpu-checker 软件包：$ sudo apt install -y cpu-checker 接着再运行 kvm-ok 命令，如果 KVM 已经启动，你将看到如下输出：$ kvm-ok 3、在 Ubuntu 22.04 上安装 KVM随后，通过如下命令在 Ubuntu 22.04 中安装 KVM 以及其他相关虚拟化软件包：$ sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-utils 以下为你解释刚刚安装了哪些软件包：qemu-kvm – 一个提供硬件仿真的开源仿真器和虚拟化包virt-manager – 一款通过 libvirt 守护进程，基于 QT 的图形界面的虚拟机管理工具libvirt-daemon-system – 为运行 libvirt 进程提供必要配置文件的工具virtinst – 一套为置备和修改虚拟机提供的命令行工具libvirt-clients – 一组客户端的库和API，用于从命令行管理和控制虚拟机和管理程序bridge-utils – 一套用于创建和管理桥接设备的工具4、启用虚拟化守护进程（libvirtd）在所有软件包安装完毕之后，通过如下命令启用并启动 libvirt 守护进程：$ sudo systemctl enable --now libvirtd $ sudo systemctl start libvirtd 你可以通过如下命令验证该虚拟化守护进程是否已经运行：$ sudo systemctl status libvirtd 另外，请将当前登录用户加入 kvm 和 libvirt 用户组，以便能够创建和管理虚拟机。$ sudo usermod -aG kvm $USER $ sudo usermod -aG libvirt $USER $USER 环境变量引用的即为当前登录的用户名。你需要重新登录才能使得配置生效。5、创建网桥（br0）如果你打算从本机（Ubuntu 22.04）之外访问 KVM 虚拟机，你必须将虚拟机的网卡映射至网桥。virbr0 网桥是 KVM 安装完成后自动创建的，仅做测试用途。你可以通过如下内容在 /etc/netplan 目录下创建文件 01-netcfg.yaml 来新建网桥：$ sudo vi /etc/netplan/01-netcfg.yaml network: ethernets: enp0s3: dhcp4: false dhcp6: false # add configuration for bridge interface bridges: br0: interfaces: [enp0s3] dhcp4: false addresses: [192.168.1.162/24] macaddress: 08:00:27:4b:1d:45 routes: - to: default via: 192.168.1.1 metric: 100 nameservers: addresses: [4.2.2.2] parameters: stp: false dhcp6: false version: 2 保存并退出文件。注：上述文件的配置是我环境中的，请根据你实际环境替换 IP 地址、网口名称以及 MAC 地址。你可以通过运行 netplan apply 命令应用上述变更。$ sudo netplan apply 你可以通过如下 ip 命令，验证网桥 br0：$ ip add show 6、启动 KVM 虚拟机管理器当 KVM 安装完成后，你可以使用图形管理工具 virt-manager 创建虚拟机。你可以在 GNOME 搜索工具中搜索 Virtual Machine Manager 以启动。点击搜索出来的图标即可：虚拟机管理器界面如下所示：你可以点击 “ 文件 File ” 并选择 “ 新建虚拟机 New Virtual Machine ”。你也可以点击下图所示的图标：在弹出的虚拟机安装向导将看到如下四个选项：本地安装介质（ISO 镜像或 CDROM）网络安装（HTTP、HTTPS 和 FTP）导入现有磁盘镜像手动安装本文使用已下载的 ISO 镜像，你可以选择自己的 ISO 镜像，选择第一个选项，并点击 “ 向前 Forward ”。下一步中，点击 “ 浏览 Browse ” 选择 ISO 镜像位置。在下一个窗口中点击 “ 浏览本地 Browse local ” 选取本机中 ISO 镜像。如下所示，我们选择了 Debian 11 ISO 镜像，随后点击 “ 打开 Open ”。当 ISO 镜像选择后，点击 “ 向前 Forward ” 进入下一步。接着定义虚拟机所用内存大小以及 CPU 核心数，并点击 “ 向前 Forward ” 。下一步中，输入虚拟机磁盘空间，并点击 “ 向前 Forward ” 继续。如你需要将虚拟机网卡连接至网桥，点击 “ 选择网络 Network selection ” 并选择 br0 网桥。最后，点击 “ 完成 Finish ” 按钮结束设置虚拟机。稍等片刻，虚拟机的创建过程将开始。当创建结束时，虚拟机将开机并进入系统安装界面。如下是 Debian 11 的安装选项。在这里你可以根据需要进行系统安装。小结至此，本文向你演示了如何在 Ubuntu 22.04 上 安装 KVM 虚拟化引擎。你的反馈对我们至关重要。via: https://www.linuxtechi.com/how-to-install-kvm-on-ubuntu-22-04/作者：James Kiarie 选题：lkxed 译者：turbokernel 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
我们已经讲解了 在 Ubuntu 18.04 无头服务器上配置 Oracle VirtualBox 。在本教程中，我们将讨论如何使用 KVM 去配置无头虚拟化服务器，以及如何从一个远程客户端去管理访客系统。正如你所知道的，KVM（Kernel-based virtual machine）是开源的，是 Linux 上的全虚拟化。使用 KVM，我们可以在几分钟之内，很轻松地将任意 Linux 服务器转换到一个完全的虚拟化环境中，以及部署不同种类的虚拟机，比如 GNU/Linux、*BSD、Windows 等等。使用 KVM 配置无头虚拟化服务器我在 Ubuntu 18.04 LTS 服务器上测试了本指南，但是它在其它的 Linux 发行版上也可以使用，比如，Debian、CentOS、RHEL 以及 Scientific Linux。这个方法完全适合哪些希望在没有任何图形环境的 Linux 服务器上，去配置一个简单的虚拟化环境。基于本指南的目的，我将使用两个系统。KVM 虚拟化服务器：宿主机操作系统 – 最小化安装的 Ubuntu 18.04 LTS（没有 GUI）宿主机操作系统的 IP 地址：192.168.225.22/24访客操作系统（它将运行在 Ubuntu 18.04 的宿主机上）：Ubuntu 16.04 LTS server远程桌面客户端：操作系统 – Arch Linux安装 KVM首先，我们先检查一下我们的系统是否支持硬件虚拟化。为此，需要在终端中运行如下的命令：$ egrep -c '(vmx|svm)' /proc/cpuinfo假如结果是 zero (0)，说明系统不支持硬件虚拟化，或者在 BIOS 中禁用了虚拟化。进入你的系统 BIOS 并检查虚拟化选项，然后启用它。假如结果是 1 或者 更大的数，说明系统将支持硬件虚拟化。然而，在你运行上面的命令之前，你需要始终保持 BIOS 中的虚拟化选项是启用的。或者，你也可以使用如下的命令去验证它。但是为了使用这个命令你需要先安装 KVM。$ kvm-ok示例输出：INFO: /dev/kvm exists KVM acceleration can be used如果输出的是如下这样的错误，你仍然可以在 KVM 中运行访客虚拟机，但是它的性能将非常差。INFO: Your CPU does not support KVM extensions INFO: For more detailed results, you should run this as root HINT: sudo /usr/sbin/kvm-ok当然，还有其它的方法来检查你的 CPU 是否支持虚拟化。更多信息参考接下来的指南。如何知道 CPU 是否支持虚拟技术（VT）接下来，安装 KVM 和在 Linux 中配置虚拟化环境所需要的其它包。在 Ubuntu 和其它基于 DEB 的系统上，运行如下命令：$ sudo apt-get install qemu-kvm libvirt-bin virtinst bridge-utils cpu-checkerKVM 安装完成后，启动 libvertd 服务（如果它没有启动的话）：$ sudo systemctl enable libvirtd $ sudo systemctl start libvirtd创建虚拟机所有的虚拟机文件和其它的相关文件都保存在 /var/lib/libvirt/ 下。ISO 镜像的默认路径是 /var/lib/libvirt/boot/。首先，我们先检查一下是否有虚拟机。查看可用的虚拟机列表，运行如下的命令：$ sudo virsh list --all示例输出：Id Name State ----------------------------------------------------正如上面的截屏，现在没有可用的虚拟机。现在，我们来创建一个。例如，我们来创建一个有 512 MB 内存、1 个 CPU 核心、8 GB 硬盘的 Ubuntu 16.04 虚拟机。$ sudo virt-install --name Ubuntu-16.04 --ram=512 --vcpus=1 --cpu host --hvm --disk path=/var/lib/libvirt/images/ubuntu-16.04-vm1,size=8 --cdrom /var/lib/libvirt/boot/ubuntu-16.04-server-amd64.iso --graphics vnc请确保在路径 /var/lib/libvirt/boot/ 中有一个 Ubuntu 16.04 的 ISO 镜像文件，或者在上面命令中给定的其它路径中有相应的镜像文件。示例输出：WARNING Graphics requested but DISPLAY is not set. Not running virt-viewer. WARNING No console to launch for the guest, defaulting to --wait -1 Starting install... Creating domain... | 0 B 00:00:01 Domain installation still in progress. Waiting for installation to complete. Domain has shutdown. Continuing. Domain creation completed. Restarting guest.我们来分别讲解以上的命令和看到的每个选项的作用。–name：这个选项定义虚拟机名字。在我们的案例中，这个虚拟机的名字是 Ubuntu-16.04。–ram=512：给虚拟机分配 512MB 内存。–vcpus=1：指明虚拟机中 CPU 核心的数量。–cpu host：通过暴露宿主机 CPU 的配置给访客系统来优化 CPU 属性。–hvm：要求完整的硬件虚拟化。–disk path：虚拟机硬盘的位置和大小。在我们的示例中，我分配了 8GB 的硬盘。–cdrom：安装 ISO 镜像的位置。请注意你必须在这个位置真的有一个 ISO 镜像。–graphics vnc：允许 VNC 从远程客户端访问虚拟机。使用 VNC 客户端访问虚拟机现在，我们在远程桌面系统上使用 SSH 登入到 Ubuntu 服务器上（虚拟化服务器），如下所示。$ ssh sk@192.168.225.22在这里，sk 是我的 Ubuntu 服务器的用户名，而 192.168.225.22 是它的 IP 地址。运行如下的命令找出 VNC 的端口号。我们从一个远程系统上访问虚拟机需要它。$ sudo virsh dumpxml Ubuntu-16.04 | grep vnc示例输出：<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'> 记下那个端口号 5900。安装任意的 VNC 客户端应用程序。在本指南中，我们将使用 TigerVnc。TigerVNC 是 Arch Linux 默认仓库中可用的客户端。在 Arch 上安装它，运行如下命令：$ sudo pacman -S tigervnc在安装有 VNC 客户端的远程客户端系统上输入如下的 SSH 端口转发命令。$ ssh sk@192.168.225.22 -L 5900:127.0.0.1:5900再强调一次，192.168.225.22 是我的 Ubuntu 服务器（虚拟化服务器）的 IP 地址。然后，从你的 Arch Linux（客户端）打开 VNC 客户端。在 VNC 服务器框中输入 localhost:5900，然后点击 “Connect” 按钮。然后就像你在物理机上安装系统一样的方法开始安装 Ubuntu 虚拟机。同样的，你可以根据你的服务器的硬件情况配置多个虚拟机。或者，你可以使用 virt-viewer 实用程序在访客机器中安装操作系统。virt-viewer 在大多数 Linux 发行版的默认仓库中都可以找到。安装完 virt-viewer 之后，运行下列的命令去建立到虚拟机的访问连接。$ sudo virt-viewer --connect=qemu+ssh://192.168.225.22/system --name Ubuntu-16.04管理虚拟机使用管理用户接口 virsh 从命令行去管理虚拟机是非常有趣的。命令非常容易记。我们来看一些例子。查看运行的虚拟机，运行如下命令：$ sudo virsh list或者，$ sudo virsh list --all示例输出： Id Name State ---------------------------------------------------- 2 Ubuntu-16.04 running启动一个虚拟机，运行如下命令：$ sudo virsh start Ubuntu-16.04或者，也可以使用虚拟机 id 去启动它。正如在上面的截图所看到的，Ubuntu 16.04 虚拟机的 Id 是 2。因此，启动它时，你也可以像下面一样只指定它的 ID。$ sudo virsh start 2重启动一个虚拟机，运行如下命令： $ sudo virsh reboot Ubuntu-16.04示例输出：Domain Ubuntu-16.04 is being rebooted暂停一个运行中的虚拟机，运行如下命令：$ sudo virsh suspend Ubuntu-16.04示例输出：Domain Ubuntu-16.04 suspended让一个暂停的虚拟机重新运行，运行如下命令：$ sudo virsh resume Ubuntu-16.04示例输出：Domain Ubuntu-16.04 resumed关闭一个虚拟机，运行如下命令：$ sudo virsh shutdown Ubuntu-16.04示例输出：Domain Ubuntu-16.04 is being shutdown完全移除一个虚拟机，运行如下的命令：$ sudo virsh undefine Ubuntu-16.04 $ sudo virsh destroy Ubuntu-16.04示例输出：Domain Ubuntu-16.04 destroyed关于它的更多选项，建议你去查看 man 手册页：$ man virsh今天就到这里吧。开始在你的新的虚拟化环境中玩吧。对于研究和开发者、以及测试目的，KVM 虚拟化将是很好的选择，但它能做的远不止这些。如果你有充足的硬件资源，你可以将它用于大型的生产环境中。如果你还有其它好玩的发现，不要忘记在下面的评论区留下你的高见。谢谢！via: https://www.ostechnix.com/setup-headless-virtualization-server-using-kvm-ubuntu/作者：SK 选题：lujun9972 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
KVM（基于内核的虚拟机）是一款为类 Linux 系统提供的开源的全虚拟化解决方案，KVM 使用虚拟化扩展（如 Intel VT 或 AMD-V）提供虚拟化功能。无论何时我们在任何 Linux 机器上安装 KVM，都会通过加载诸如 kvm-intel.ko（基于 Intel 的机器）和 kvm-amd.ko（基于 amd 的机器）的内核模块，使其成为 管理程序 hyervisor （LCTT 译注：一种监控和管理虚拟机运行的核心软件层）。KVM 允许我们安装和运行多个虚拟机（Windows 和 Linux）。我们可以通过 virt-manager 的图形用户界面或使用 virt-install 和 virsh 命令在命令行界面来创建和管理基于 KVM 的虚拟机。在本文中，我们将讨论如何在 Ubuntu 18.04 LTS 服务器上安装和配置 KVM 管理程序。我假设你已经在你的服务器上安装了 Ubuntu 18.04 LTS 。接下来登录到您的服务器执行以下步骤。第一步：确认您的硬件是否支持虚拟化执行 egrep 命令以验证您的服务器的硬件是否支持虚拟化，linuxtechi@kvm-ubuntu18-04:~$ egrep -c '(vmx|svm)' /proc/cpuinfo 1 如果输出结果大于 0，就意味着您的硬件支持虚拟化。重启，进入 BIOS 设置中启用 VT 技术。现在使用下面的命令安装 kvm-ok 实用程序，该程序用于确定您的服务器是否能够运行硬件加速的 KVM 虚拟机。linuxtechi@kvm-ubuntu18-04:~$ sudo apt install cpu-checker 运行 kvm-ok 命令确认输出结果，linuxtechi@kvm-ubuntu18-04:~$ sudo kvm-ok INFO: /dev/kvm exists KVM acceleration can be used 第二步：安装 KVM 及其依赖包运行下面的 apt 命令安装 KVM 及其依赖项：linuxtechi@kvm-ubuntu18-04:~$ sudo apt update linuxtechi@kvm-ubuntu18-04:~$ sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager 只要上图相应的软件包安装成功，那么你的本地用户（对于我来说是 linuxtechi）将被自动添加到 libvirtd 群组。第三步：启动并启用 libvirtd 服务我们在 Ubuntu 18.04 服务器上安装 qemu 和 libvirtd 软件包之后，它就会自动启动并启用 libvirtd 服务，如果 libvirtd 服务没有开启，则运行以下命令开启，linuxtechi@kvm-ubuntu18-04:~$ sudo service libvirtd start linuxtechi@kvm-ubuntu18-04:~$ sudo update-rc.d libvirtd enable 现在使用下面的命令确认 libvirtd 服务的状态，linuxtechi@kvm-ubuntu18-04:~$ service libvirtd status 输出结果如下所示：第四步：为 KVM 虚拟机配置桥接网络只有通过桥接网络，KVM 虚拟机才能访问外部的 KVM 管理程序或主机。在Ubuntu 18.04中，网络由 netplan 实用程序管理，每当我们新安装一个 Ubuntu 18.04 系统时，会自动创建一个名称为 /etc/netplan/50-cloud-init.yaml 文件，其配置了静态 IP 和桥接网络，netplan 实用工具将引用这个文件。截至目前，我已经在此文件配置了静态 IP，文件的具体内容如下：network: ethernets: ens33: addresses: [192.168.0.51/24] gateway4: 192.168.0.1 nameservers: addresses: [192.168.0.1] dhcp4: no optional: true version: 2 我们在这个文件中添加桥接网络的配置信息，linuxtechi@kvm-ubuntu18-04:~$ sudo vi /etc/netplan/50-cloud-init.yaml network: version: 2 ethernets: ens33: dhcp4: no dhcp6: no bridges: br0: interfaces: [ens33] dhcp4: no addresses: [192.168.0.51/24] gateway4: 192.168.0.1 nameservers: addresses: [192.168.0.1] 正如你所看到的，我们已经从接口（ens33）中删除了 IP 地址，并将该 IP 添加到 br0 中，并且还将接口（ens33）添加到 br0。使用下面的 netplan 命令使更改生效，linuxtechi@kvm-ubuntu18-04:~$ sudo netplan apply 如果您想查看 debug 日志请使用以下命令，linuxtechi@kvm-ubuntu18-04:~$ sudo netplan --debug apply 现在使用以下方法确认网络桥接状态：linuxtechi@kvm-ubuntu18-04:~$ sudo networkctl status -a linuxtechi@kvm-ubuntu18-04:~$ ifconfig 第五步：创建虚拟机（使用 virt-manager 或 virt-install 命令）有两种方式创建虚拟机：virt-manager（图形化工具）virt-install（命令行工具）使用 virt-manager 创建虚拟机通过执行下面的命令启动 virt-manager：linuxtechi@kvm-ubuntu18-04:~$ sudo virt-manager 创建一个新的虚拟机：点击“下一步”然后选择 ISO 镜像文件，我使用的是 RHEL 7.3 iso 镜像。点击“下一步”。在接下来的几个窗口中，系统会提示要求您为 VM 分配内存，处理器数量和磁盘空间。并指定虚拟机名字和桥接网络名：点击“结束”。接下来只需要按照屏幕指示安装系统。使用virt-install命令从命令行界面创建虚拟机使用下面的 virt-install 命令从终端创建一个虚拟机，它将在命令行界面中开始安装，并根据您对虚拟机的名字，说明，ISO 文件位置和桥接配置的设置创建虚拟机。linuxtechi@kvm-ubuntu18-04:~$ sudo virt-install -n DB-Server --description "Test VM for Database" --os-type=Linux --os-variant=rhel7 --ram=1096 --vcpus=1 --disk path=/var/lib/libvirt/images/dbserver.img,bus=virtio,size=10 --network bridge:br0 --graphics none --location /home/linuxtechi/rhel-server-7.3-x86_64-dvd.iso --extra-args console=ttyS0 本文到此为止，我希望这篇文章能帮助你能够在 Ubuntu 18.04 服务器上成功安装 KVM。 除此之外，KVM 也是 Openstack 默认的管理程序。阅读更多：“如何使用 virsh 命令创建，还原和删除 KVM 虚拟机快照”。via: https://www.linuxtechi.com/install-configure-kvm-ubuntu-18-04-server/作者：Pradeep Kumar 选题：lujun9972 译者：wyxplus 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
我们又见面了，在上一篇 在 KVM 中测试 IPv6 网络：第 1 部分 中，我们学习了有关 IPv6 私有地址的内容。今天，我们将使用 KVM 创建一个网络，去测试上一星期学习的 IPv6 的内容。如果你想重新温习如何使用 KVM，可以查看 在 KVM 中创建虚拟机：第 1 部分 和 在 KVM 中创建虚拟机：第 2 部分— 网络。在 KVM 中创建网络在 KVM 中你至少需要两个虚拟机。当然了，如果你愿意，也可以创建更多的虚拟机。在我的系统中有 Fedora、Ubuntu、以及 openSUSE。去创建一个新的 IPv6 网络，在主虚拟机管理窗口中打开 “Edit > Connection Details > Virtual Networks”。点击左下角的绿色十字按钮去创建一个新的网络（图 1）。图 1：创建一个网络给新网络输入一个名字，然后，点击 “Forward” 按钮。如果你愿意，也可以不创建 IPv4 网络。当你创建一个新的 IPv4 网络时，虚拟机管理器将不让你创建重复网络，或者是使用了一个无效地址。在我的宿主机 Ubuntu 系统上，有效的地址是以绿色高亮显示的，而无效地址是使用高亮的玫瑰红色调。在我的 openSUSE 机器上没有高亮颜色。启用或不启用 DHCP，以及创建或不创建一个静态路由，然后进入下一个窗口。选中 “Enable IPv6 network address space definition”，然后输入你的私有地址范围。你可以使用任何你希望的 IPv6 地址类，但是要注意，不能将你的实验网络泄漏到公网上去。我们将使用非常好用的 IPv6 唯一本地地址（ULA），并且使用在 Simple DNS Plus 上的在线地址生成器，去创建我们的网络地址。拷贝 “Combined/CID” 地址到网络框中（图 2）。图 2：拷贝 "Combined/CID" 地址到网络框中虚拟机认为我的地址是无效的，因为，它显示了高亮的玫瑰红色。它做的对吗？我们使用 ipv6calc 去验证一下：$ ipv6calc -qi fd7d:844d:3e17:f3ae::/64 Address type: unicast, unique-local-unicast, iid, iid-local Registry for address: reserved(RFC4193#3.1) Address type has SLA: f3ae Interface identifier: 0000:0000:0000:0000 Interface identifier is probably manual set ipv6calc 认为没有问题。如果感兴趣，你可以改变其中一个数字为无效的东西，比如字母 g，然后再试一次。（问 “如果…？”，试验和错误是最好的学习方法）。我们继续进行，启用 DHCPv6（图 3）。你可以接受缺省值，或者输入一个你自己的设置值。图 3： 启用 DHCPv6我们将跳过缺省路由定义这一步，继续进入下一屏，在那里我们将启用 “Isolated Virtual Network” 和 “Enable IPv6 internal routing/networking”。虚拟机网络选择现在，你可以配置你的虚拟机去使用新的网络。打开你的虚拟机，然后点击顶部左侧的 “i” 按钮去打开 “Show virtual hardware details” 屏幕。在 “Add Hardware” 列点击 “NIC” 按钮去打开网络选择器，然后选择你喜欢的新的 IPv6 网络。点击 “Apply”，然后重新启动。（或者使用你喜欢的方法去重新启动网络，或者更新你的 DHCP 租期。）测试ifconfig 告诉我们它做了什么？$ ifconfig ens3: flags=4163 UP,BROADCAST,RUNNING,MULTICAST mtu 1500 inet 192.168.30.207 netmask 255.255.255.0 broadcast 192.168.30.255 inet6 fd7d:844d:3e17:f3ae::6314 prefixlen 128 scopeid 0x0 inet6 fe80::4821:5ecb:e4b4:d5fc prefixlen 64 scopeid 0x20 这是我们新的 ULA，fd7d:844d:3e17:f3ae::6314，它是自动生成的本地链路地址。如果你有兴趣，可以 ping 一下，ping 网络上的其它虚拟机：vm1 ~$ ping6 -c2 fd7d:844d:3e17:f3ae::2c9f PING fd7d:844d:3e17:f3ae::2c9f(fd7d:844d:3e17:f3ae::2c9f) 56 data bytes 64 bytes from fd7d:844d:3e17:f3ae::2c9f: icmp_seq=1 ttl=64 time=0.635 ms 64 bytes from fd7d:844d:3e17:f3ae::2c9f: icmp_seq=2 ttl=64 time=0.365 ms vm2 ~$ ping6 -c2 fd7d:844d:3e17:f3ae:a:b:c:6314 PING fd7d:844d:3e17:f3ae:a:b:c:6314(fd7d:844d:3e17:f3ae:a:b:c:6314) 56 data bytes 64 bytes from fd7d:844d:3e17:f3ae:a:b:c:6314: icmp_seq=1 ttl=64 time=0.744 ms 64 bytes from fd7d:844d:3e17:f3ae:a:b:c:6314: icmp_seq=2 ttl=64 time=0.364 ms 当你努力去理解子网时，这是一个可以让你尝试不同地址是否可以正常工作的快速易用的方法。你可以给单个接口分配多个 IP 地址，然后 ping 它们去看一下会发生什么。在一个 ULA 中，接口，或者主机是 IP 地址的最后四部分，因此，你可以在那里做任何事情，只要它们在同一个子网中即可，在那个例子中是 f3ae。在我的其中一个虚拟机上，我只改变了这个示例的接口 ID，以展示使用这四个部分，你可以做任何你想做的事情：vm1 ~$ sudo /sbin/ip -6 addr add fd7d:844d:3e17:f3ae:a:b:c:6314 dev ens3 vm2 ~$ ping6 -c2 fd7d:844d:3e17:f3ae:a:b:c:6314 PING fd7d:844d:3e17:f3ae:a:b:c:6314(fd7d:844d:3e17:f3ae:a:b:c:6314) 56 data bytes 64 bytes from fd7d:844d:3e17:f3ae:a:b:c:6314: icmp_seq=1 ttl=64 time=0.744 ms 64 bytes from fd7d:844d:3e17:f3ae:a:b:c:6314: icmp_seq=2 ttl=64 time=0.364 ms 现在，尝试使用不同的子网，在下面的示例中使用了 f4ae 代替 f3ae：$ ping6 -c2 fd7d:844d:3e17:f4ae:a:b:c:6314 PING fd7d:844d:3e17:f4ae:a:b:c:6314(fd7d:844d:3e17:f4ae:a:b:c:6314) 56 data bytes From fd7d:844d:3e17:f3ae::1 icmp_seq=1 Destination unreachable: No route From fd7d:844d:3e17:f3ae::1 icmp_seq=2 Destination unreachable: No route 这也是练习路由的好机会，以后，我们将专门做一期，如何在不使用 DHCP 情况下实现自动寻址。via: https://www.linux.com/learn/intro-to-linux/2017/11/testing-ipv6-networking-kvm-part-2作者：CARLA SCHRODER 选题：lujun9972 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何使用 virsh 命令创建、还原和删除 KVM 虚拟机快照
在虚拟化平台上进行系统管理工作时，经常需要在开始重大操作比如部署补丁和代码前先设置一个虚拟机 快照 snapshot 。虚拟机快照是特定时间点的虚拟机磁盘的副本。换句话说，快照保存了给定的时间点虚拟机的状态和数据。我们可以在哪里使用虚拟机快照？如果你在使用基于 KVM 的 虚拟机管理程序 （ hypervisor ） ，那么可以使用 virsh 命令获取虚拟机或域快照。快照在一种情况下变得非常有用，当你已经在虚拟机上安装或应用了最新的补丁，但是由于某些原因，虚拟机上的程序变得不稳定，开发团队想要还原所有的更改和补丁。如果你在应用补丁之前设置了虚拟机的快照，那么可以使用快照将虚拟机恢复到之前的状态。注意：我们只能对磁盘格式为 Qcow2 的虚拟机的进行快照，并且 kvm 的 virsh 命令不支持 raw 磁盘格式，请使用以下命令将原始磁盘格式转换为 qcow2。# qemu-img convert -f raw -O qcow2 image-name.img image-name.qcow2 创建 KVM 虚拟机（域）快照我假设 KVM 管理程序已经在 CentOS 7 / RHEL 7 机器上配置好了，并且有虚拟机正在运行。我们可以使用下面的 virsh 命令列出虚拟机管理程序中的所有虚拟机，[root@kvm-hypervisor ~]# virsh list --all Id Name State ---------------------------------------------------- 94 centos7.0 running 101 overcloud-controller running 102 overcloud-compute2 running 103 overcloud-compute1 running 114 webserver running 115 Test-MTN running 假设我们想创建 webserver 虚拟机的快照，运行下面的命令，语法：# virsh snapshot-create-as –domain {vm_name} –name {snapshot_name} –description “enter description here” [root@kvm-hypervisor ~]# virsh snapshot-create-as --domain webserver --name webserver_snap --description "snap before patch on 4Feb2018" Domain snapshot webserver_snap created 创建快照后，我们可以使用下面的命令列出与虚拟机相关的快照：[root@kvm-hypervisor ~]# virsh snapshot-list webserver Name Creation Time State ------------------------------------------------------------ webserver_snap 2018-02-04 15:05:05 +0530 running [root@kvm-hypervisor ~]# 要列出虚拟机快照的详细信息，请运行下面的 virsh 命令：[root@kvm-hypervisor ~]# virsh snapshot-info --domain webserver --snapshotname webserver_snap Name: webserver_snap Domain: webserver Current: yes State: running Location: internal Parent: - Children: 0 Descendants: 0 Metadata: yes 我们可以使用下面的 qemu-img 命令查看快照的大小：[root@kvm-hypervisor ~]# qemu-img info /var/lib/libvirt/images/snaptestvm.img 还原 KVM 虚拟机快照假设我们想要将 webserver 虚拟机还原到我们在上述步骤中创建的快照。使用下面的 virsh 命令将 Webserver 虚拟机恢复到其快照 webserver\_snap 时。语法：# virsh snapshot-revert {vm_name} {snapshot_name} [root@kvm-hypervisor ~]# virsh snapshot-revert webserver webserver_snap 删除 KVM 虚拟机快照要删除 KVM 虚拟机快照，首先使用 virsh snapshot-list 命令获取虚拟机的快照详细信息，然后使用 virsh snapshot-delete 命令删除快照。如下示例所示：[root@kvm-hypervisor ~]# virsh snapshot-list --domain webserver Name Creation Time State ------------------------------------------------------------ webserver_snap 2018-02-04 15:05:05 +0530 running [root@kvm-hypervisor ~]# virsh snapshot-delete --domain webserver --snapshotname webserver_snap Domain snapshot webserver_snap deleted 这就是本文的全部内容，我希望你们能够了解如何使用 virsh 命令来管理 KVM 虚拟机快照。请分享你的反馈，并不要犹豫地分享给你的技术朋友
在这个两篇的系列当中，我们将学习关于 IPv6 私有地址的知识，以及如何在 KVM 中配置测试网络。要理解 IPv6 地址是如何工作的，没有比亲自动手去实践更好的方法了，在 KVM 中配置一个小的测试实验室非常容易 —— 也很有趣。这个系列的文章共有两个部分，我们将学习关于 IPv6 私有地址的知识，以及如何在 KVM 中配置测试网络。QEMU/KVM/虚拟机管理器我们先来了解什么是 KVM。在这里，我将使用 KVM 来表示 QEMU、KVM、以及虚拟机管理器的一个组合，虚拟机管理器在 Linux 发行版中一般都内置了。简单解释就是，QEMU 模拟硬件，而 KVM 是一个内核模块，它在你的 CPU 上创建一个 “访客领地”，并去管理它们对内存和 CPU 的访问。虚拟机管理器是一个涵盖虚拟化和管理程序的图形工具。但是你不能被图形界面下 “点击” 操作的方式 “缠住” ，因为，它们也有命令行工具可以使用 —— 比如 virsh 和 virt-install。如果你在使用 KVM 方面没有什么经验，你可以从 在 KVM 中创建虚拟机：第 1 部分 和 在 KVM 中创建虚拟机：第 2 部分 - 网络 开始学起。IPv6 唯一本地地址在 KVM 中配置 IPv6 网络与配置 IPv4 网络很类似。它们的主要不同在于这些怪异的长地址。上一次，我们讨论了 IPv6 地址的不同类型。其中有一个 IPv6 单播地址类，fc00::/7（详细情况请查阅 RFC 4193），它类似于 IPv4 中的私有地址 —— 10.0.0.0/8、172.16.0.0/12、和 192.168.0.0/16。下图解释了这个唯一本地地址空间的结构。前 48 位定义了前缀和全局 ID，随后的 16 位是子网，剩余的 64 位是接口 ID：| 7 bits |1| 40 bits | 16 bits | 64 bits | +--------+-+------------+-----------+----------------------------+ | Prefix |L| Global ID | Subnet ID | Interface ID | +--------+-+------------+-----------+----------------------------+ 下面是另外一种表示方法，它可能更有助于你理解这些地址是如何管理的：| Prefix | Global ID | Subnet ID | Interface ID | +--------+--------------+-------------+----------------------+ | fd | 00:0000:0000 | 0000 | 0000:0000:0000:0000 | +--------+--------------+-------------+----------------------+ fc00::/7 共分成两个 /8 地址块，fc00::/8 和 fd00::/8。fc00::/8 是为以后使用保留的。因此，唯一本地地址通常都是以 fd 开头的，而剩余部分是由你使用的。L 位，也就是第八位，它总是设置为 1，这样它可以表示为 fd00::/8。设置为 0 时，它就表示为 fc00::/8。你可以使用 subnetcalc 来看到这些东西：$ subnetcalc fd00::/8 -n Address = fd00:: fd00 = 11111101 00000000 $ subnetcalc fc00::/8 -n Address = fc00:: fc00 = 11111100 00000000 RFC 4193 要求地址必须随机产生。你可以用你选择的任何方法来造出个地址，只要它们以 fd 打头就可以，因为 IPv6 范围非常大，它不会因为地址耗尽而无法使用。当然，最佳实践还是按 RFC 的要求来做。地址不能按顺序分配或者使用众所周知的数字。RFC 4193 包含一个构建伪随机地址生成器的算法，或者你可以找到各种在线生成器。唯一本地地址不像全局单播地址（它由你的因特网服务提供商分配）那样进行中心化管理，即使如此，发生地址冲突的可能性也是非常低的。当你需要去合并一些本地网络或者想去在不相关的私有网络之间路由时，这是一个非常好的优势。在同一个子网中，你可以混用唯一本地地址和全局单播地址。唯一本地地址是可路由的，并且它并不会因此要求对路由器做任何调整。但是，你应该在你的边界路由器和防火墙上配置为不允许它们离开你的网络，除非是在不同位置的两个私有网络之间。RFC4193 建议，不要混用全局单播地址的 AAAA 和 PTR 记录，因为虽然它们重复的机率非常低，但是并不能保证它们就是独一无二的。就像我们使用的 IPv4 地址一样，要保持你本地的私有名称服务和公共名称服务的独立。将本地名称服务使用的 Dnsmasq 和公共名称服务使用的 BIND 组合起来，是一个在 IPv4 网络上经过实战检验的可靠组合，这个组合也同样适用于 IPv6 网络。伪随机地址生成器在线地址生成器的一个示例是 本地 IPv6 地址生成器。你可以在线找到许多这样很酷的工具。你可以使用它来为你创建一个新地址，或者使用它在你的现有全局 ID 下为你创建子网。下周我们将讲解如何在 KVM 中配置这些 IPv6 的地址，并现场测试它们。通过来自 Linux 基金会和 edX 的免费在线课程 “Linux 入门” 学习更多的 Linux 知识。via: https://www.linux.com/learn/intro-to-linux/2017/11/testing-ipv6-networking-kvm-part-1作者：Carla Schroder 译者：qhwdw 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何下载并使用运行在 Ubuntu Linux 服务器上的 KVM 云镜像？如何在 Ubuntu Linux 16.04 LTS 服务器上无需完整安装即可创建虚拟机？如何在 Ubuntu Linux 上使用 KVM 云镜像？基于内核的虚拟机（KVM）是 Linux 内核的虚拟化模块，可将其转变为虚拟机管理程序。你可以在命令行使用 Ubuntu 为 libvirt 和 KVM 提供的虚拟化前端通过 KVM 创建 Ubuntu 云镜像。这个快速教程展示了如何安装和使用 uvtool，它为 Ubuntu 云镜像下载，libvirt 和 clout\_int 提供了统一的集成虚拟机前端。步骤 1 - 安装 KVM你必须安装并配置 KVM。使用 apt 命令/apt-get 命令，如下所示：$ sudo apt install qemu-kvm libvirt-bin virtinst bridge-utils cpu-checker $ kvm-ok ## [configure bridged networking as described here][3] $ sudo vi /etc/network/interfaces $ sudo systemctl restart networking $ sudo brctl show 参阅如何在 Ubuntu 16.04 LTS Headless 服务器上安装 KVM 以获得更多信息。（LCTT 译注：Headless 服务器是指没有本地接口的计算设备，专用于向其他计算机及其用户提供服务。）步骤 2 - 安装 uvtool键入以下 apt 命令/apt-get 命令：$ sudo apt install uvtool 示例输出：[sudo] password for vivek: Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: gksu libgksu2-0 libqt5designer5 libqt5help5 libqt5printsupport5 libqt5sql5 libqt5sql5-sqlite libqt5xml5 python3-dbus.mainloop.pyqt5 python3-notify2 python3-pyqt5 python3-sip Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: cloud-image-utils distro-info python-boto python-pyinotify python-simplestreams socat ubuntu-cloudimage-keyring uvtool-libvirt Suggested packages: cloud-utils-euca shunit2 python-pyinotify-doc The following NEW packages will be installed: cloud-image-utils distro-info python-boto python-pyinotify python-simplestreams socat ubuntu-cloudimage-keyring uvtool uvtool-libvirt 0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded. Need to get 1,211 kB of archives. After this operation, 6,876 kB of additional disk space will be used. Get:1 http://in.archive.ubuntu.com/ubuntu artful/main amd64 distro-info amd64 0.17 [20.3 kB] Get:2 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 python-boto all 2.44.0-1ubuntu2 [740 kB] Get:3 http://in.archive.ubuntu.com/ubuntu artful/main amd64 python-pyinotify all 0.9.6-1 [24.6 kB] Get:4 http://in.archive.ubuntu.com/ubuntu artful/main amd64 ubuntu-cloudimage-keyring all 2013.11.11 [4,504 B] Get:5 http://in.archive.ubuntu.com/ubuntu artful/main amd64 cloud-image-utils all 0.30-0ubuntu2 [17.2 kB] Get:6 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 python-simplestreams all 0.1.0~bzr450-0ubuntu1 [29.7 kB] Get:7 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 socat amd64 1.7.3.2-1 [342 kB] Get:8 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 uvtool all 0~git122-0ubuntu1 [6,498 B] Get:9 http://in.archive.ubuntu.com/ubuntu artful/universe amd64 uvtool-libvirt all 0~git122-0ubuntu1 [26.9 kB] Fetched 1,211 kB in 3s (393 kB/s) Selecting previously unselected package distro-info. (Reading database ... 199933 files and directories currently installed.) Preparing to unpack .../0-distro-info_0.17_amd64.deb ... Unpacking distro-info (0.17) ... Selecting previously unselected package python-boto. Preparing to unpack .../1-python-boto_2.44.0-1ubuntu2_all.deb ... Unpacking python-boto (2.44.0-1ubuntu2) ... Selecting previously unselected package python-pyinotify. Preparing to unpack .../2-python-pyinotify_0.9.6-1_all.deb ... Unpacking python-pyinotify (0.9.6-1) ... Selecting previously unselected package ubuntu-cloudimage-keyring. Preparing to unpack .../3-ubuntu-cloudimage-keyring_2013.11.11_all.deb ... Unpacking ubuntu-cloudimage-keyring (2013.11.11) ... Selecting previously unselected package cloud-image-utils. Preparing to unpack .../4-cloud-image-utils_0.30-0ubuntu2_all.deb ... Unpacking cloud-image-utils (0.30-0ubuntu2) ... Selecting previously unselected package python-simplestreams. Preparing to unpack .../5-python-simplestreams_0.1.0~bzr450-0ubuntu1_all.deb ... Unpacking python-simplestreams (0.1.0~bzr450-0ubuntu1) ... Selecting previously unselected package socat. Preparing to unpack .../6-socat_1.7.3.2-1_amd64.deb ... Unpacking socat (1.7.3.2-1) ... Selecting previously unselected package uvtool. Preparing to unpack .../7-uvtool_0~git122-0ubuntu1_all.deb ... Unpacking uvtool (0~git122-0ubuntu1) ... Selecting previously unselected package uvtool-libvirt. Preparing to unpack .../8-uvtool-libvirt_0~git122-0ubuntu1_all.deb ... Unpacking uvtool-libvirt (0~git122-0ubuntu1) ... Setting up distro-info (0.17) ... Setting up ubuntu-cloudimage-keyring (2013.11.11) ... Setting up cloud-image-utils (0.30-0ubuntu2) ... Setting up socat (1.7.3.2-1) ... Setting up python-pyinotify (0.9.6-1) ... Setting up python-boto (2.44.0-1ubuntu2) ... Setting up python-simplestreams (0.1.0~bzr450-0ubuntu1) ... Processing triggers for doc-base (0.10.7) ... Processing 1 added doc-base file... Setting up uvtool (0~git122-0ubuntu1) ... Processing triggers for man-db (2.7.6.1-2) ... Setting up uvtool-libvirt (0~git122-0ubuntu1) ... 步骤 3 - 下载 Ubuntu 云镜像你需要使用 uvt-simplestreams-libvirt 命令。它维护一个 libvirt 容量存储池，作为一个 简单流 simplestreams 源的镜像子集的本地镜像，比如 Ubuntu 云镜像。要使用当前所有 amd64 镜像更新 uvtool 的 libvirt 容量存储池，运行：$ uvt-simplestreams-libvirt sync arch=amd64 要更新/获取 Ubuntu 16.04 LTS (xenial/amd64) 镜像，运行：$ uvt-simplestreams-libvirt --verbose sync release=xenial arch=amd64 示例输出：Adding: com.ubuntu.cloud:server:16.04:amd64 20171121.1 通过 query 选项查询本地镜像：$ uvt-simplestreams-libvirt query 示例输出：release=xenial arch=amd64 label=release (20171121.1) 现在，我为 Ubuntu xenial 创建了一个镜像，接下来我会创建虚拟机。步骤 4 - 创建 SSH 密钥你需要使用 SSH 密钥才能登录到 KVM 虚拟机。如果你根本没有任何密钥，请使用 ssh-keygen 命令创建一个新的密钥。$ ssh-keygen 参阅“如何在 Linux / Unix 系统上设置 SSH 密钥” 和 “Linux / UNIX: 生成 SSH 密钥” 以获取更多信息。步骤 5 - 创建 VM是时候创建虚拟机了，它叫 vm1，即创建一个 Ubuntu Linux 16.04 LTS 虚拟机：$ uvt-kvm create vm1 默认情况下 vm1 使用以下配置创建：内存：512M磁盘大小：8GiBCPU：1 vCPU core要控制内存、磁盘、CPU 和其他配置，使用以下语法：$ uvt-kvm create vm1 \ --memory MEMORY \ --cpu CPU \ --disk DISK \ --bridge BRIDGE \ --ssh-public-key-file /path/to/your/SSH_PUBLIC_KEY_FILE \ --packages PACKAGES1, PACKAGES2, .. \ --run-script-once RUN_SCRIPT_ONCE \ --password PASSWORD 其中--password PASSWORD：设置 ubuntu 用户的密码和允许使用 ubuntu 的用户登录（不推荐，使用 ssh 密钥）。--run-script-once RUN_SCRIPT_ONCE : 第一次启动时，在虚拟机上以 root 身份运行 RUN_SCRIPT_ONCE 脚本，但再也不会运行。这里给出完整的路径。这对于在虚拟机上运行自定义任务时非常有用，例如设置安全性或其他内容。--packages PACKAGES1, PACKAGES2, .. : 在第一次启动时安装以逗号分隔的软件包。要获取帮助，运行：$ uvt-kvm -h $ uvt-kvm create -h 如何删除虚拟机？要销毁/删除名为 vm1 的虚拟机，运行（请小心使用以下命令，因为没有确认框）：$ uvt-kvm destroy vm1 获取 vm1 的 IP 地址，运行：$ uvt-kvm ip vm1 192.168.122.52 列出所有运行的虚拟机$ uvt-kvm list 示例输出：vm1 freebsd11.1 步骤 6 - 如何登录 vm1语法是：$ uvt-kvm ssh vm1 示例输出：Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-101-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Get cloud support with Ubuntu Advantage Cloud Guest: http://www.ubuntu.com/business/services/cloud 0 packages can be updated. 0 updates are security updates. Last login: Thu Dec 7 09:55:06 2017 from 192.168.122.1 另一个选择是从 macOS/Linux/Unix/Windows 客户端使用常规的 ssh 命令：$ ssh ubuntu@192.168.122.52 $ ssh -i ~/.ssh/id_rsa ubuntu@192.168.122.52 示例输出：一旦创建了 vim，你可以照常使用 virsh 命令：$ virsh list via: https://www.cyberciti.biz/faq/how-to-use-kvm-cloud-images-on-ubuntu-linux/作者：Vivek Gite 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 CnetOS 7 或 RHEL 7（Red Hat 企业版 Linux）服务器上安装和配置 KVM（基于内核的虚拟机）？如何在 CentOS 7 上设置 KVM 并使用云镜像 / cloud-init 来安装客户虚拟机？基于内核的虚拟机（KVM）是 CentOS 或 RHEL 7 的虚拟化软件。KVM 可以将你的服务器变成虚拟机管理器。本文介绍如何在 CentOS 7 或 RHEL 7 中使用 KVM 设置和管理虚拟化环境。还介绍了如何使用命令行在物理服务器上安装和管理虚拟机（VM）。请确保在服务器的 BIOS 中启用了虚拟化技术(VT)。你也可以运行以下命令测试 CPU 是否支持 Intel VT 和 AMD\_V 虚拟化技术。$ lscpu | grep Virtualization Virtualization: VT-x 按照 CentOS 7/RHEL 7 终端服务器上的 KVM 安装步骤进行操作。步骤 1： 安装 kvm输入以下 yum 命令:# yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install 启动 libvirtd 服务：# systemctl enable libvirtd # systemctl start libvirtd 步骤 2： 确认 kvm 安装使用 lsmod 命令和 grep命令 确认加载了 KVM 模块：# lsmod | grep -i kvm 步骤 3： 配置桥接网络默认情况下，由 libvirtd 配置基于 dhcpd 的网桥。你可以使用以下命令验证：# brctl show # virsh net-list 所有虚拟机（客户机）只能对同一台服务器上的其它虚拟机进行网络访问。为你创建的私有网络是 192.168.122.0/24。验证：# virsh net-dumpxml default 如果你希望你的虚拟机可用于 LAN 上的其他服务器，请在连接到你的 LAN 的服务器上设置一个网桥。更新你的网卡配置文件，如 ifcfg-enp3s0 或 em1：# vi /etc/sysconfig/network-scripts/ifcfg-enp3s0 添加一行：BRIDGE=br0 使用 vi 保存并关闭文件。编辑 /etc/sysconfig/network-scripts/ifcfg-br0：# vi /etc/sysconfig/network-scripts/ifcfg-br0 添加以下内容：DEVICE="br0" # I am getting ip from DHCP server # BOOTPROTO="dhcp" IPV6INIT="yes" IPV6_AUTOCONF="yes" ONBOOT="yes" TYPE="Bridge" DELAY="0" 重新启动网络服务（警告：ssh 命令将断开连接，最好重新启动该设备）：# systemctl restart NetworkManager 用 brctl 命令验证它：# brctl show 步骤 4： 创建你的第一个虚拟机我将会创建一个 CentOS 7.x 虚拟机。首先，使用 wget 命令获取 CentOS 7.x 最新的 ISO 镜像：# cd /var/lib/libvirt/boot/ # wget https://mirrors.kernel.org/centos/7.4.1708/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso 验证 ISO 镜像：# wget https://mirrors.kernel.org/centos/7.4.1708/isos/x86_64/sha256sum.txt # sha256sum -c sha256sum.txt 创建 CentOS 7.x 虚拟机在这个例子中，我创建了 2GB RAM，2 个 CPU 核心，1 个网卡和 40 GB 磁盘空间的 CentOS 7.x 虚拟机，输入：# virt-install \ --virt-type=kvm \ --name centos7 \ --ram 2048 \ --vcpus=1 \ --os-variant=centos7.0 \ --cdrom=/var/lib/libvirt/boot/CentOS-7-x86_64-Minimal-1708.iso \ --network=bridge=br0,model=virtio \ --graphics vnc \ --disk path=/var/lib/libvirt/images/centos7.qcow2,size=40,bus=virtio,format=qcow2 从另一个终端通过 ssh 配置 vnc 登录，输入：# virsh dumpxml centos7 | grep v nc <graphics type='vnc' port='5901' autoport='yes' listen='127.0.0.1'> 请记录下端口值（即 5901）。你需要使用 SSH 客户端来建立隧道和 VNC 客户端才能访问远程 vnc 服务器。在客户端/桌面/ macbook pro 系统中输入以下 SSH 端口转发命令：$ ssh vivek@server1.cyberciti.biz -L 5901:127.0.0.1:5901 一旦你建立了 ssh 隧道，你可以将你的 VNC 客户端指向你自己的 127.0.0.1 (localhost) 地址和端口 5901，如下所示：你应该看到 CentOS Linux 7 客户虚拟机安装屏幕如下：现在只需按照屏幕说明进行操作并安装CentOS 7。一旦安装完成后，请继续并单击重启按钮。 远程服务器关闭了我们的 VNC 客户端的连接。 你可以通过 KVM 客户端重新连接，以配置服务器的其余部分，包括基于 SSH 的会话或防火墙。使用云镜像以上安装方法对于学习目的或单个虚拟机而言是可行的。你需要部署大量的虚拟机吗？ 可以试试云镜像。你可以根据需要修改预先构建的云镜像。例如，使用 Cloud-init 添加用户、ssh 密钥、设置时区等等，这是处理云实例的早期初始化的事实上的多分发包。让我们看看如何创建带有 1024MB RAM，20GB 磁盘空间和 1 个 vCPU 的 CentOS 7 虚拟机。（LCTT 译注： vCPU 即电脑中的虚拟处理器）获取 CentOS 7 云镜像# cd /var/lib/libvirt/boot # wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2 创建所需的目录# D=/var/lib/libvirt/images # VM=centos7-vm1 ## vm name ## # mkdir -vp $D/$VM mkdir: created directory '/var/lib/libvirt/images/centos7-vm1' 创建元数据文件# cd $D/$VM # vi meta-data 添加以下内容：instance-id: centos7-vm1 local-hostname: centos7-vm1 创建用户数据文件我将使用 ssh 密钥登录到虚拟机。所以确保你有 ssh 密钥：# ssh-keygen -t ed25519 -C "VM Login ssh key" 请参阅 “如何在 Linux/Unix 系统上设置 SSH 密钥” 来获取更多信息。编辑用户数据如下：# cd $D/$VM # vi user-data 添加如下（根据你的设置替换 hostname、users、ssh-authorized-keys）：#cloud-config # Hostname management preserve_hostname: False hostname: centos7-vm1 fqdn: centos7-vm1.nixcraft.com # Users users: - default - name: vivek groups: ['wheel'] shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL ssh-authorized-keys: - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIMP3MOF2ot8MOdNXCpHem0e2Wemg4nNmL2Tio4Ik1JY VM Login ssh key # Configure where output will go output: all: ">> /var/log/cloud-init.log" # configure interaction with ssh server ssh_genkeytypes: ['ed25519', 'rsa'] # Install my public ssh key to the first user-defined user configured # in cloud.cfg in the template (which is centos for CentOS cloud images) ssh_authorized_keys: - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIMP3MOF2ot8MOdNXCpHem0e2Wemg4nNmL2Tio4Ik1JY VM Login ssh key # set timezone for VM timezone: Asia/Kolkata # Remove cloud-init runcmd: - systemctl stop network && systemctl start network - yum -y remove cloud-init 复制云镜像# cd $D/$VM # cp /var/lib/libvirt/boot/CentOS-7-x86_64-GenericCloud.qcow2 $VM.qcow2 创建 20GB 磁盘映像# cd $D/$VM # export LIBGUESTFS_BACKEND=direct # qemu-img create -f qcow2 -o preallocation=metadata $VM.new.image 20G # virt-resize --quiet --expand /dev/sda1 $VM.qcow2 $VM.new.image 用缩放后的镜像覆盖它：# cd $D/$VM # mv $VM.new.image $VM.qcow2 创建一个 cloud-init ISO# mkisofs -o $VM-cidata.iso -V cidata -J -r user-data meta-data 创建一个池# virsh pool-create-as --name $VM --type dir --target $D/$VM Pool centos7-vm1 created 安装 CentOS 7 虚拟机# cd $D/$VM # virt-install --import --name $VM \ --memory 1024 --vcpus 1 --cpu host \ --disk $VM.qcow2,format=qcow2,bus=virtio \ --disk $VM-cidata.iso,device=cdrom \ --network bridge=virbr0,model=virtio \ --os-type=linux \ --os-variant=centos7.0 \ --graphics spice \ --noautoconsole 删除不需要的文件：# cd $D/$VM # virsh change-media $VM hda --eject --config # rm meta-data user-data centos7-vm1-cidata.iso 查找虚拟机的 IP 地址# virsh net-dhcp-leases default 登录到你的虚拟机使用 ssh 命令：# ssh vivek@192.168.122.85 有用的命令让我们看看管理虚拟机的一些有用的命令。列出所有虚拟机# virsh list --all 获取虚拟机信息# virsh dominfo vmName # virsh dominfo centos7-vm1 停止/关闭虚拟机# virsh shutdown centos7-vm1 开启虚拟机# virsh start centos7-vm1 将虚拟机标记为在引导时自动启动# virsh autostart centos7-vm1 重新启动（软安全重启）虚拟机# virsh reboot centos7-vm1 重置（硬重置/不安全）虚拟机# virsh reset centos7-vm1 删除虚拟机# virsh shutdown centos7-vm1 # virsh undefine centos7-vm1 # virsh pool-destroy centos7-vm1 # D=/var/lib/libvirt/images # VM=centos7-vm1 # rm -ri $D/$VM 查看 virsh 命令类型的完整列表：# virsh help | less # virsh help | grep reboot 关于作者作者是 nixCraft 的创建者，也是经验丰富的系统管理员和 Linux 操作系统/ Unix shell 脚本的培训师。 他曾与全球客户以及 IT，教育，国防和空间研究以及非营利部门等多个行业合作。 在 Twitter，Facebook，Google + 上关注他。via: https://www.cyberciti.biz/faq/how-to-install-kvm-on-centos-7-rhel-7-headless-server/作者：Vivek Gite 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出