跳转到主要内容

从命令行轻松管理虚拟机

项目描述

Minivirt

虚拟机应该很简单。

Discord

Minivirt 是一个轻量级的 QEMU 管理器,它提供类似 Docker 的用户体验。默认镜像基于 Alpine Linux,它很小且运行速度快:50MB 压缩磁盘镜像,几秒钟内启动到 SSH。

安装

  1. 安装 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
  2. 安装 Minivirt 并运行检查。

    pip3 install minivirt
    miv doctor
    
  3. 拉取镜像并启动虚拟机。

    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-imgsocattar,以及 /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 S3Backblaze B2MinIO 等)。设置以下环境变量

  • AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY:认证凭证。
  • AWS_ENDPOINT_URL (可选):如果对象存储不在 AWS 公共云上托管,则应指向适当的端点。

存储桶名称取自远程 URL 的最后一部分,例如默认存储库的 minivirt

运行 miv push 上传镜像

miv push default alpine-3.16 alpine-3.16-aarch64

开发

  1. 克隆存储库

    git clone https://github.com/mgax/minivirt
    cd minivirt
    
  2. 创建虚拟环境,以便您不会干扰全局安装的包

    python3 -m venv .venv
    source .venv/bin/activate
    
  3. 以编辑模式安装存储库并安装开发依赖项

    pip install -e '.[devel]'
    
  4. 运行测试套件

    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 运行器。每个运行器都是短暂的,并在自己的虚拟机中运行。

  1. 安装额外依赖项

    pip install -e minivirt[githubactions]
    
  2. 构建 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
    
  3. 运行服务器。要与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 (24.8 kB 查看哈希值)

上传时间 源代码

构建分发

minivirt-0.1-py3-none-any.whl (24.7 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面