从命令行轻松管理虚拟机
项目描述
Minivirt
虚拟机应该很简单。
Minivirt 是一个轻量级的 QEMU 管理器,它提供类似 Docker 的用户体验。默认镜像基于 Alpine Linux,它很小且运行速度快:50MB 压缩磁盘镜像,几秒钟内启动到 SSH。
安装
-
安装 QEMU 和其他依赖项。
- MacOS:
brew install qemu socat
- Debian:
apt install qemu-kvm qemu-utils qemu-efi-aarch64 socat
- Alpine:
apk add py3-pip qemu qemu-system-x86_64 qemu-img socat tar
- Arch:
pacman -S python-pip qemu-base socat
- MacOS:
-
安装 Minivirt 并运行检查。
pip3 install minivirt miv doctor
-
拉取镜像并启动虚拟机。
miv remote add default https://f003.backblazeb2.com/file/minivirt miv pull default alpine-{arch} alpine # {arch} is automatically replaced with your architecture. miv run alpine
miv run
命令将创建一个短暂的虚拟机并打开一个 SSH 会话。当你退出会话时,虚拟机将被销毁。
内部结构
实际模拟虚拟机的工作由 QEMU 完成。它在许多环境中运行,这意味着我们可以(主要)在所有地方提供相同的功能。
虚拟机作为用户进程运行,无需 root 权限。然而,用户需要硬件虚拟化的权限(例如,在 Linux 上访问 /dev/kvm
)。
可以以三种方式与虚拟机交互
- 串行控制台:这是
miv start
的默认选项。 - 图形显示:通过
--display
参数启用。 - SSH:
miv run
通过 SSH 连接,使用 Vagrant 公共 SSH 密钥。此外,miv ssh
可以登录到正在运行的虚拟机。
QEMU 虚拟机配置了 用户网络,这不会干扰主机的网络堆栈,并且客人 SSH 端口被转发到 localhost 上的随机端口。您可以使用 --port
选项转发更多端口。
Minivirt 管理以下内容:镜像,本质上只读、可重用的虚拟机 qcow2 磁盘;以及 虚拟机,它们拥有自己的 写时复制 磁盘,该磁盘使用镜像磁盘作为其底层文件。所有内容都存储在 ~/.cache/minivirt/
。
Doctor
miv doctor
命令执行检查以帮助故障排除。它会检查是否安装了 qemu-system-{arch}
、qemu-img
、socat
和 tar
,以及 /dev/kvm
是否可用。
持久虚拟机
使用 create
命令创建虚拟机
miv create alpine myvm
通过连接到其串行控制台启动虚拟机
miv start myvm
通过发送 ACPI 关闭命令优雅地停止虚拟机
miv stop myvm
销毁虚拟机以删除其磁盘镜像和其他资源
miv destroy myvm
检查虚拟机
miv ps
miv ps -a # also shows stopped VMs
图形
在后台启动虚拟机并将其连接到显示设备
miv create alpine myvm
miv start myvm --daemon --display
以 root
身份登录,然后运行
setup-xorg-base
apk add xfce4 xfce4-terminal dbus
startx
要使屏幕更大,右键单击桌面,将鼠标悬停在 应用程序 上,然后选择 设置,点击 显示。选择另一个分辨率,例如 "1440x900",然后点击 "应用"。
镜像
Minivirt 维护一个由其 SHA256 校验和标识的镜像数据库。它们可以有任意数量的标签。
显示数据库中的镜像
% miv images
5446f671 1.4G ubuntu-22.04
84200bbd 115M alpine-3.15
8ad24d9f 1.4G ubuntu-20.04
c86a9115 114M alpine alpine-3.16
构建镜像
Minivirt 可以从 食谱 构建镜像,这些食谱是受 GitHub Actions 工作流 启发的 YAML 文件。从 /recipes 目录 下载任何文件并运行
miv build alpine-3.16.yaml --tag alpine -v
-v
标志将构建的输出(串行控制台或 SSH)重定向到 stdout。
镜像现在已在数据库中
miv run alpine
其他镜像操作
将虚拟机提交为镜像
miv commit myvm myimage
将镜像保存为 TAR 归档
miv save myimage | gzip -1 > myimage.tgz
稍后,加载镜像
zcat myimage.tgz | miv load myimage
数据库维护
为确保镜像和虚拟机一致,请运行数据库检查
miv fsck
要删除镜像,首先取消其标签。这将仅删除标签,而不是镜像本身。
miv untag myimage
镜像在修剪过程中被删除
miv prune
镜像存储库
添加远程存储库
miv remote add default https://f003.backblazeb2.com/file/minivirt
拉取镜像。 {arch}
将被替换为机器架构。
miv pull default alpine-{arch} alpine
要托管镜像存储库,您需要一个对象存储(例如 Amazon S3、Backblaze B2、MinIO 等)。设置以下环境变量
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
:认证凭证。AWS_ENDPOINT_URL
(可选):如果对象存储不在 AWS 公共云上托管,则应指向适当的端点。
存储桶名称取自远程 URL 的最后一部分,例如默认存储库的 minivirt
。
运行 miv push
上传镜像
miv push default alpine-3.16 alpine-3.16-aarch64
开发
-
克隆存储库
git clone https://github.com/mgax/minivirt cd minivirt
-
创建虚拟环境,以便您不会干扰全局安装的包
python3 -m venv .venv source .venv/bin/activate
-
以编辑模式安装存储库并安装开发依赖项
pip install -e '.[devel]'
-
运行测试套件
pytest pytest --runslow # if you're not in a hurry
Python API
Minivirt 使用 Python 编写并提供了简单的 API
from minivirt.cli import db
alpine = db.get_image('alpine')
myvm = VM.create(db, 'myvm', image=alpine, memory=512)
with myvm.run(wait_for_ssh=30):
print(myvm.ssh('uname -a', capture=True))
GitHub Actions 自托管运行器
Minivirt 附带一个服务器,当工作流程作业排队时启动 GitHub Actions 运行器。每个运行器都是短暂的,并在自己的虚拟机中运行。
-
安装额外依赖项
pip install -e minivirt[githubactions]
-
构建 actions 运行器镜像
miv build recipes/alpine-3.15.yaml --tag alpine-3.15 -v miv build recipes/ci-alpine.yaml --tag ci-alpine -v miv build recipes/githubactions-alpine.yaml --tag githubactions-alpine -v
-
运行服务器。要与GitHub API交互,需要GitHub PAT,并通过运行
git credentials fill
来获取它。它使用ngrok来监听webhook事件;为了避免ngrok会话超时,请在NGROK_AUTH_TOKEN
环境变量中设置一个令牌。miv -v githubactions serve githubactions-alpine {repo}
取得联系
有关反馈、支持和贡献,请访问
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定该选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
minivirt-0.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1a5e4c52985bf08a83091cf4c976cf3641f1c9eb96eae57d0315b7dce04636b6 |
|
MD5 | 127907a19c2b63af33dfb365ccb93c99 |
|
BLAKE2b-256 | 62ce2a09196e4fe474b9ef00ac32fb21c85f703c467f6d704e4549a4a909df76 |
minivirt-0.1-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 699b62d91d76d3c88ad1b4bf0f53cbfdb61f952f39963f8ecc07ff8b85b8bc5b |
|
MD5 | 0aee08d03bcfd664a49463ebb60cade9 |
|
BLAKE2b-256 | 5265d61e5fd508d8b010f0effa03ce362cc487d9d5ab207062700a9b6999f882 |