虚拟化是一种技术,它允许在一个物理服务器上托管多个虚拟计算机,这些虚拟计算机在实际硬件上具有不同程度的独立性,并且可以单独工作。通过使用Debian虚拟化技术,可以在单个机器上同时运行多个系统。
一、虚拟化和模拟器工具
有几个虚拟化和模拟器工具平台:
1、完全的硬件模拟软件包,比如通过 games-emulator 元软件包安装的软件包。
2、大部分 CPU 层的模拟,加上一些 I/O 设备的模拟,比如 QEMU。
3、大部分 CPU 层的虚拟化,加上一些 I/O 设备的模拟,比如 Kernel-based Virtual Machine (KVM)。
4、操作系统级的容器虚拟化,加上内核级的支持,比如 LXC (Linux Containers), Docker, systemd-nspawn(1), …
5、操作系统级的文件系统访问虚拟化,加上在文件路径上的系统库调用,比如 chroot。
6、操作系统级的文件系统访问虚拟化,加上在文件所有者权限上的系统库调用,比如 fakeroot。
7、操作系统 API 模拟器,比如 Wine。
8、解释器级的虚拟化,加上它的执行选择和运行时库忽略,比如 Python 的 virtualenv 和 venv。
下面列出了一些帮你搭建虚拟化系统的软件包:
虚拟化工具列表:
软件包 | 流行度 | 大小 | 说明 |
coreutils | V:881, I:999 | 18307 | GNU 核心工具包含 chroot(8) |
systemd-container | V:53, I:60 | 1328 | systemd container/nspawn 工具包含 systemd-nspawn(1) |
schroot | V:5, I:7 | 2579 | 在 chroot 下执行 Debian 二进制包的特异工具 |
sbuild | V:1, I:3 | 242 | 从 Debian 源码构建 Debian 二进制包的工具 |
debootstrap | V:5, I:55 | 314 | 搭建一个基本的 Debian 系统 (用 sh 写的) |
cdebootstrap | V:0, I:1 | 115 | 搭建一个 Debian 系统 (用 C 写的) |
cloud-image-utils | V:1, I:17 | 66 | 云镜像管理工具 |
cloud-guest-utils | V:3, I:12 | 71 | 云客户机工具 |
virt-manager | V:11, I:44 | 2296 | 虚拟机管理器: 用于管理虚拟机的桌面应用 |
libvirt-clients | V:47, I:65 | 1241 | libvirt 的库程序 |
lxd | V:0, I:0 | 52119 | LXD: 系统容器和虚拟机管理器 |
podman | V:13, I:15 | 41928 | podman:在 Pods 里面运行基于 OCI 容器的引擎 |
podman-docker | V:0, I:0 | 248 | 在 Pods 里面运行基于 OCI 容器的引擎 — docker 封装器 |
docker.io | V:40, I:43 | 150003 | docker: Linux 容器运行时 |
games-emulator | I:0 | 21 | games-emulator: Debian 的游戏模拟器 |
bochs | V:0, I:0 | 6956 | Bochs: IA-32 PC 仿真器 |
qemu | I:15 | 97 | QEMU: 快速的通用处理器仿真器 |
qemu-system | I:22 | 66 | QEMU: 全功能系统的模拟二进制 |
qemu-user | V:1, I:6 | 93764 | QEMU: 用户模式的模拟二进制 |
qemu-utils | V:13, I:107 | 10635 | QEMU: 工具集 |
qemu-system-x86 | V:35, I:92 | 58128 | KVM: x86 硬件上有 硬件辅助虚拟化的全虚拟化 |
virtualbox | V:7, I:8 | 126272 | VirtualBox:i386 和 amd64 上 x86 的虚拟化解决方案 |
gnome-boxes | V:1, I:7 | 6691 | Boxes:用于访问虚拟机系统的简单的 GNOME 应用程序 |
xen-tools | V:0, I:2 | 719 | 用于管理 debian XEN 虚拟服务器的工具 |
wine | V:14, I:61 | 133 | Wine: Windows 应用程序编程接口实现(标准套件) |
dosbox | V:1, I:15 | 2696 | DOSBox:有 Tandy/Herc/CGA/EGA/VGA/SVGA 显卡,声音和 DOS 的 x86 模拟器 |
lxc | V:9, I:12 | 25889 | Linux 容器用户层工具 |
python3-venv | I:86 | 6 | venv 创建虚拟的 python 环境(系统库) |
python3-virtualenv | V:9, I:51 | 356 | virtualenv 创建隔离的虚拟 python 环境 |
pipx | V:3, I:16 | 3308 | pipx 在隔离的环境中安装 python 应用程序 |
二、虚拟化工作流
自从 lenny 之后,默认的 Debian 内核就是支持 KVM 的。典型的虚拟化工作流涉及以下几个步骤。
1、创建空文件系统 (目录树或磁盘映像)。
- 目录树可以通过 “mkdir -p /path/to/chroot” 创建;
- 原始的磁盘映像文件能够使用 dd(1) 创建;
- qemu-img(1) 能够创建和转化 QEMU 支持的磁盘映像文件;
- 原始的格式和 VMDK 文件格式,能够作为虚拟化工具的通用格式。
2、使用 mount(8) 挂载磁盘映像到文件系统 (可选)。
- 对于原始磁盘映像文件,把它作为回环设备或设备映射设备挂载;
- 对于 QEMU 支持的磁盘映像,把它们作为 network block device 网络块设备挂载。
3、在目标文件系统上部署需要的系统数据。
- 使用 debootstrap 和 cdebootstrap 之类的程序来协助处理这个过程;
- 在全功能系统模拟器下使用操作系统安装器。
4、在虚拟化环境下运行一个程序。
- chroot 提供基本的虚拟化环境,足够能在里面编译程序,运行控制台应用,运行后台守护程序 daemon;
- QEMU 提供跨平台的 CPU 模拟器;
- QEMU 和 KVM 通过 hardware-assisted virtualization硬件辅助虚拟化来提供全功能系统的模拟;
- VirtualBox 可以在 i386 和 amd64 上,使用或者不使用 hardware-assisted virtualization硬件辅助虚拟化来提供全功能系统模拟。
三、挂载虚拟磁盘映像文件
对于其它虚拟磁盘映像文件,你能够用使用 network block device网络块设备 协议的 qemu-nbd(8) 来导出他们,并使用内核模块 nbd 来挂载它们.
qemu-nbd(8) 支持 QEMU 所支持的磁盘格式: QEMU 支持下列磁盘格式: raw, qcow2, qcow, vmdk, vdi, bochs, cow (user-mode Linux copy-on-write), parallels, dmg, cloop, vpc, vvfat (virtual VFAT)和主机设备。
网络块设备能够用和回环设备一样的方式支持分区,你能够按下面的方式挂载 “disk.img” 的第一个分区.
# modprobe nbd max_part=16 # qemu-nbd -v -c /dev/nbd0 disk.img ... # mkdir /mnt/part1 # mount /dev/nbd0p1 /mnt/part1
注意:可以给 qemu-nbd(8) 使用 “-P 1” 选项来导出”disk.img”的第一个分区.
四、Chroot系统
如果你希望从终端控制台尝试一个新的 Debian 环境,推荐使用 chroot。这使你能够运行 unstable 和 testing 的控制台应用程序,不会有通常的相关风险,并且不需要重启。
下面的列子假设根源系统和 chroot 系统都共享相同的 amd64 CPU 架构。
虽然你能够手工使用 debootstrap(1)来创建一个 chroot(8) 环境,这要求琐碎的工作。sbuild 软件包从源代码构建一个 Debian 软件包,使用 schroot 软件包管理的 chroot 环境。它和帮助脚本 sbuild-createchroot(1) 一起。让我们按如下所示的方式运行它,来学会它是怎样工作的。
$ sudo mkdir -p /srv/chroot $ sudo sbuild-createchroot -v --include=eatmydata,ccache unstable /srv/chroot/unstable-amd64-sbuild http://deb.debian.org/debian ...
你能够看到 debootstrap(8) 是如何在 “/srv/chroot/unstable-amd64-sbuild” 下部署 unstable 环境的系统数据,用于一个最小的构建系统。
你可以使用 schroot(1) 来登录到这个环境。
$ sudo schroot -v -c chroot:unstable-amd64-sbuild
你可以看到一个运行在 unstable 环境的系统 shell 是如何创建的。
注意:
- “/usr/sbin/policy-rc.d” 文件总是用 101 退出,阻止在 Debian 系统上自动启动后台守护程序;
- 一些在 chroot 下的程序,需要访问比上面根源系统上的 sbuild-createchroot 能够提供的文件之外的更多文件才能够运行。例如,”/sys”, “/etc/passwd”, “/etc/group”, “/var/run/utmp”, “/var/log/wtmp”等等.也许需要使用 bind-mounted 或拷贝;
- sbuild 软件包帮助建立一个 chroot 系统来构建一个软件包,在 chroot 内使用 schroot 作为它的后端。它是一个检查构建依赖(build-dependencies)的理想系统;
- systemd-nspawn(1) 命令使用 chroot 类似的方法帮助运行一个命令,或者轻量级容器内的操作系统。它更强大,因为它使用命名空间来完全虚拟化进程树、进程间通讯、主机名、域名,并可选网络和用户数据库。
五、多桌面系统
如果想尝试任一操作系统的一个新的 GUI 桌面环境,我推荐在 Debian 稳定版 系统上使用 QEMU或者KVM ,这些软件应用虚拟化技术安全的运行多桌面系统。这能让你运行任何桌面应用,包括 Debian 不稳定版和测试版上的桌面应用,并且没有与之相关的通常意义上的风险,并且不需要重启。因为单纯的 QEMU 工具是非常慢的,当主机系统支持 KVM 的时候,建议使用它来加速。
虚拟机管理器,也被称为 virt-manager,它是一个便利的管理 KVM 虚拟机的 GUI(图形用户界面)工具,它调用 libvirt。按下面的方法,能够创建一个可以用于QEMU 的包含有 Debian 系统的虚拟磁盘映像 “virtdisk.qcow2″,这个 Debian 系统使用 debian 安装器:小 CD安装。
$ wget https://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso $ qemu-img create -f qcow2 virtdisk.qcow2 5G $ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256 ...
注意:在虚拟化下运行 Ubuntu 和 Fedora 之类的其它 GNU/Linux 发行版,是一个不错的学习其配置技巧的方法。其它专有操作系统也可以在这个 GNU/Linux 虚拟化下很好的运行。