ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Multipass 核心概念解析:从架构、实例到安全与性能的完整指南

Multipass 核心概念解析:从架构、实例到安全与性能的完整指南 虚拟化开发工具云原生【免费下载链接】multipassMultipass orchestrates virtual Ubuntu instances项目地址https://gitcode.com/gh_mirrors/mu/multipass点击查看免费下载本文基于docs/explanation/系列概念指南整理而成系统梳理了 Multipass在 Linux、macOS 与 Windows 上编排虚拟 Ubuntu 实例的工具的核心设计思想客户端/守护进程架构、平台与驱动差异、实例与镜像机制、exec/mount/snapshot 等日常操作背后的原理以及安全认证、ID 映射与性能调优建议。读完本文你将理解 Multipass 各组件之间的调用关系并能准确解释local.driver、local.privileged-mounts、client.primary-name等关键设置的作用以及multipass exec与 SSH 在命令解析上的本质区别。架构Architecture架构类主题解释 Multipass 在宿主机上如何运转包括客户端、守护进程、存储、实例与网络等高层结构。整体概览参见 参考架构平台差异见 Platform、Service 与 Driver。Multipass 是一套客户端/服务器client/server模型客户端负责提供用户界面并把请求委托给守护进程daemon守护进程则负责实际管理实例、认证、设置存储与文件系统共享等所有繁重工作。用multipass命令或 GUI 操作实例时本质上都是在向后台的multipassd进程发送请求。客户端ClientsCLI 与 GUIMultipass 提供两种用户界面客户端均与守护进程通信并委托操作CLI命令行界面即multipass可执行程序通过multipass launch、multipass start等命令在终端中控制实例。CLI 的实现在 src/client/cli 目录中其中 cli.cpp 负责解析命令行参数并建立与守护进程的连接。GUI图形界面基于 Flutter 构建的独立桌面应用源码位于 src/client/gui提供可视化、点选式的实例管理界面与 CLI 一样通过 RPC 与守护进程交互。从源码结构看两者共享同一套 gRPC 协议定义src/rpc/multipass.proto与相同的 RPC 客户端逻辑差异仅在于用户交互层的表现形式。守护进程 / 服务Daemon / Service守护进程multipassd是长期运行的后台进程负责实例生命周期管理、客户端认证、配置存储与文件系统共享。它以特权用户身份运行因此能直接访问系统资源并控制哪些用户有权使用 Multipass 的实例。关于客户端与守护进程的分离架构其核心优势是灵活性理论上守护进程可以与客户端运行在不同机器上从而支持远程使用 Multipass。守护进程的自动启动在 Multipass 安装完成后即被触发并配置为随系统开机自启。这保证了客户端无需手动启动守护进程即可立刻操作实例并在系统重启后自动恢复持久化的实例。multipassd的实现集中在 src/daemon 目录如 daemon.cpp、daemon_main.cpp。从 cli.cpp 的源码注释可以看到守护进程的监听端点可通过unix:socket_file的形式指定——在 Linux/macOS 上这是 Unix 域套接字而在 Windows 上platform_win.cpp 返回localhost:50051即 TCP 套接字。存储 / 挂载Storage / MountsMount 是宿主机与客户实例之间的文件系统共享把宿主目录暴露到虚拟机内部用于双向文件传输。底层技术取决于挂载类型与宿主平台可以是 SSHFS/SFTP、9P 或 SMB详见后文 Mount 一节。实例Instances实例是由宿主机承载的 Linux 虚拟机。Multipass 使用与用户原生操作系统匹配的 hypervisor 技术来模拟运行实例。镜像主机Image Hosts镜像主机是获取磁盘镜像的远程来源——目前是公开的云 Linux 镜像在线仓库。Multipass 会周期性抓取并更新来自镜像主机的元数据同时清理旧镜像、按需下载新镜像。镜像抓取与解析的相关实现见 src/image_host如 ubuntu_image_host.cpp与 src/simplestreams。网络NetworkingMultipass 在宿主机上利用专用子网创建一个虚拟网络。每个实例通过 DHCP 从该私有网络获得 IP 地址。在此私有网络内实例可以发起出站连接egress、相互通信并能被宿主机访问但无法被宿主机外部访问。如需入站连接ingress可以将实例桥接到宿主机的物理网络例如家庭局域网中的其他电脑。网络相关实现见 src/network如 subnet.cpp。WebMultipass 实例默认在线只要宿主机联网即可它们既可通过私有网络也可通过公共网络访问互联网守护进程本身也会从网络获取信息尤其是镜像主机。平台Platform平台指宿主机操作系统——Windows、macOS 或 Linux。尽管 Multipass 力求跨平台提供统一的界面但并非所有特性在所有平台都可用主要差异如下特性仅在以下平台支持说明Windows 终端集成Windows影响设置client.apps.windows-terminal.profilesMountsLinux、macOS、Windows默认禁用Windows 上可通过设置local.privileged-mounts启用影响mount、umount与launch命令全局 IPv6QEMULinux、macOS使用 QEMU 驱动时全局 IPv6 地址仅在 macOS 上可用驱动DriversLinux、macOS、Windows不同平台可用驱动不同影响local.driver设置详见下文驱动功能差异桥接 Wi-Fi 网络macOS在 Linux 和 Windows 上networks命令的输出不会显示 Wi-Fi 网络驱动Driver驱动driver是 Multipass 模拟运行机器的技术对应某个 hypervisor 或中间层技术有时也被称为后端backend。Multipass 依赖驱动才能运行支持多种驱动但同一时刻只使用一种通过设置local.driver选择未手动设置时使用平台合适的默认驱动。从源码看驱动是插件化的multipassd通过工厂factory创建具体后端并使用后端相关的数据/缓存目录来隔离实例数据见 daemon.cpp 中对backend_directory_path的使用不支持的特性会抛出not_implemented_on_this_backend_exceptiondaemon.cpp。各平台支持的驱动LinuxQEMU。自 Multipass 1.16 起LXD 和 libvirt 不再可用。macOSQEMU、Apple Virtualization frameworkAppleVZ和 VirtualBox。自 1.13 起Hyperkit 不再可用。WindowsHyper-V仅 Windows Pro 可用或 VirtualBox。默认驱动Linux 和 macOS 默认使用 QEMUWindows 取决于系统版本Windows Pro 使用 Hyper-VWindows Home 使用 VirtualBox。实例作用域Instance scopes一般情况下实例与单一驱动绑定。用某驱动启动的一组实例只有在该驱动启用时可见切换驱动后 Multipass 进入独立的实例作用域该作用域内实例集合初始为空因此可以在不同驱动下用同名启动实例且彼此互不影响。不过实例在驱动之间是保留的切回此前用过的驱动时Multipass 会恢复对应的实例作用域并尝试恢复切换前的实例状态。例外在 macOS 上由 Multipass 1.12 或更高版本已停止的 Hyperkit 实例会被自动迁移到 QEMU参见 如何在 macOS 上从 Hyperkit 迁移到 QEMU。驱动功能差异特性不支持的驱动说明原生挂载Native mountsAppleVZ、VirtualBox影响mount命令的--type选项快照SnapshotsAppleVZ影响snapshot命令挂起SuspendAppleVZ影响suspend命令除驱动差异外还存在宿主平台导致的功能差异见 Platform。实例Instances实例类主题解释所创建虚拟机的生命周期、身份与资源。相关指南包括 Instance、Image 与 Settings keys and values。实例Instance实例是由 Multipass 创建和管理的虚拟机其命名约定详见 实例名称格式。主实例Primary instanceMultipass CLI 借助一个特殊实例——主实例默认名为primary提供若干快捷键行为不带位置参数调用状态转换命令时start、restart、stop、suspend均作用于该特殊实例shell命令同样如此。start和shell在主实例不存在时会自动创建它。创建主实例时Multipass CLI 会自动把用户主目录挂载进实例如同任何其他挂载一样可用multipass umount卸载。例如multipass umount primary会卸载primary实例内由 Multipass 建立的所有挂载包括自动挂载的Home。注意在 Windows 上挂载默认因安全原因被禁用详见后文安全一节。除此之外主实例与其他实例完全一样其属性等同于手动执行multipass launch --name primary创建的实例。主实例的名字可通过设置client.primary-name修改。该设置决定 Multipass 作为主实例创建和操作的实例名既可以把任意已有实例设为主实例也可以彻底禁用主实例功能。镜像ImageMultipass 使用针对云环境调优的磁盘镜像/系统镜像来启动虚拟机。可用multipass find查看可用镜像列表。镜像来源包括Ubuntu Cloud Imageshttps://cloud-images.ubuntu.com/Ubuntu CD Imageshttps://cdimages.ubuntu.com/以及其他来源也可以从文件或 URL 启动镜像前提是镜像提供云部署所需的工具核心要求是cloud-initSSH具体某个镜像的系统要求请参阅对应镜像的官方文档。设置键与值Settings keys and valuesMultipass 设置以树状结构组织每个设置由唯一的key标识在任一时刻取单一value。相关的Settings类实现见 src/settings/settings.cpp其keys()/get()/set()通过注册的 handlers 解析键路径settings.cpp未识别的键抛出UnrecognizedSettingException。设置键是形如点分隔路径的字符串如client.primary-name指定从设置树根到叶子的路径每个叶子对应一个独立设置。通配符可用来一次性指代多个设置例如local.instance-name.*影响特定实例的全部设置local.*.cpus所有 Multipass 实例的 CPU 数量。设置值是字符串其语法可能的取值与表示形式和语义解释方式由具体设置决定。值通常表达常见概念如true、false、42内部按对应数据类型布尔、整数等解释也可能更复杂如一个按键组合但始终通过字符串表示与显示例如CtrlAltU。使用 MultipassUsing Multipass与实例交互和扩展功能相关的概念包括 exec 与 shells、Mount、Alias 与 Snapshot。multipass exec与 Shellexec 如何解析命令当你从 shell 调用multipass exec时命令首先由你所在的 shell 解析解析结果是 multipass 客户端在参数列表argv中看到的内容。例如在 Linux shell 中输入multipass exec primary -- ls ~波浪号会先被翻译成调用用户的本地主目录再传给 Multipass但在 Windows PowerShell 中并非如此因为那里~没有同样的含义。引号处理同样取决于调用 shell在大多数 Linux/macOS shell 中单引号界定字符串并逐字传给程序。而 Windows PowerShell 不这样处理单引号——传入abc def会得到两个参数abc和def。可改用双引号abc def但双引号内的字符串会经受 shell 展开。例如set USERme multipass exec -n rich-zorilla -- bash -c echo %USER%输出为me。而在 Linux 上展开语法不同multipass exec -n rich-zorilla -- bash -c echo $USER此例输出为ubuntu。SSH 如何解析命令Multipass 会在给定实例中执行--之后的命令仿佛中间没有额外的 shell这是简化说法实际情况稍复杂。这与使用 SSH 时有所不同。考虑在bashshell 中执行multipass exec mp-builder -- python3 -c import sys; print(sys.argv) foo bar输出为[-c, foo, bar]。若改用 SSH则整个命令需要用引号包裹ssh -i /var/root/Library/Application\ Support/multipassd/ssh-keys/id_rsa ubuntu192.168.66.34 python -c import sys; print(sys.argv) foo bar示例输出报错bash: -c: line 1: syntax error near unexpected token sys.argv bash: -c: line 1: python -c import sys; print(sys.argv) foo bar用 shell 解析命令要解决上述multipass exec的问题可以在实例内显式调用一个 shell 来解析命令。例如multipass exec calm-woodcock -- sh -c ls -a ~示例输出. .. .bash_logout .bashrc .cache .profile .sshWindows 命令提示符下的等价写法注意用适合调用 shell 的引号multipass exec calm-woodcock -- sh -c ls -a ~只要调用 shell 的引号使用得当这种写法在跨平台行为上保持一致而不加sh -c时在所有平台上都会失败失败方式因是否引用嵌套命令而不同。sh -c技巧提供了更一致的跨平台体验。输入/输出重定向multipass exec可与管道配合在宿主与实例命令之间重定向输入/输出。例如把宿主机当前目录内容写入实例rich-zorilla中的文件savels -la | multipass exec -n rich-zorilla -- bash -c cat save反过来把实例rich-zorilla主目录内容保存到宿主文件multipass exec -n rich-zorilla -- bash -c ls -la | cat save其他 shell 技巧其他 shell 特性可与multipass exec组合使用。例如 bash 的 here-stringmultipass exec -n primary -- bash EOF hostname whoami EOF示例输出primary ubuntu再如命令替换command substitutionping $(multipass exec rich-zorilla -- hostname -I)示例输出PING 10.239.73.39 (10.239.73.39) 56(84) bytes of data. 64 bytes from 10.239.73.39: icmp_seq1 ttl64 time0.371 ms 64 bytes from 10.239.73.39: icmp_seq2 ttl64 time0.304 ms 64 bytes from 10.239.73.39: icmp_seq3 ttl64 time0.439 ms ^C --- 10.239.73.39 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2054ms rtt min/avg/max/mdev 0.304/0.371/0.439/0.055 msMount挂载mount是从宿主到实例的目录映射使挂载目录的内容及变更在两端同时可用。Multipass 有两种挂载类型classic经典默认和native原生。Classic mounts使用 SSHFSSSH 文件系统实现文件/目录共享在所有后端都可用。SSHFS 基于 SSH因安全通信而付出一定性能代价。Native mounts使用驱动相关的技术以获得高性能仅在以下场景可用Hyper-V基于 SMB/CIFS 实现QEMU基于 9P 协议实现。具体支持情况也受驱动功能差异影响见上文 Driver 一节。挂载的安全考虑Security considerations挂载的安全影响因平台而异Linux由于挂载以root身份执行除非通过 snap 安装见下理论上允许写入整个宿主机操作系统。但因为只有特权用户sudo、wheel、admin组成员能使用 Multipass因此不是问题。若通过 snap 包安装snap 约束 会阻止挂载/home目录之外的路径以及/home内的隐藏文件/文件夹并可能限制可移动介质取决于所连接接口。但仍需注意有 Multipass 权限的用户A可以访问另一用户B挂载到 B 主目录的挂载点。macOS挂载同样以root执行允许写整个宿主机 OS但由于只有特权用户sudo、wheel、admin组成员能使用 Multipass因此不是问题。Windows挂载以特权用户SYSTEM执行允许写整个宿主机操作系统。由于历史原因Windows 上挂载默认禁用即使当前版本的 Multipass 要求用户先通过认证才能获得服务。如需启用参见local.privileged-mounts。Alias别名在 Multipass 中别名alias是在指定实例内运行的命令的快捷方式。别名通过multipass alias创建见 alias 命令参考使用与维护方法参见 如何使用实例命令别名。别名的数据模型与解析逻辑在 src/utils/alias_definition.cpp 中实现。Snapshot快照快照是实例在某一时刻的概念性映像可用于把实例恢复到该时刻的状态。为此快照记录实例的所有可变属性——即通过 Multipass 交互可能变化的属性包括磁盘内容与大小、CPU 数量、内存大小和挂载。别名不被视为实例的一部分因此不记录。用法用snapshot命令创建快照用restore恢复创建和恢复快照要求实例处于停止状态。用multipass list --snapshots查看可用快照列表用multipass info instance.snapshot查看某个快照详情用delete删除快照。父子关系Parents实例的磁盘内容以分层方式记录在快照中每个新快照记录相对其父快照的变化。某快照的父快照是创建该快照时最近一次被创建或恢复的快照。删除某快照后其父/子快照仍保留一致的实例记录。Multipass 会提供快照的父子关系信息帮助识别其角色或内容。注意事项长链条快照对性能有不利影响由于依赖磁盘 diff 层序列中的快照越多读取最古老层记录的数据所需的跳数就越多。快照虽便于保存和恢复实例状态但作为安全备份的用途有限它们与原始镜像存储在同一介质上同样可能受磁盘故障影响。安全与性能Security and performance相关概念指南包括 About security、Authentication、ID mapping 与 About performance。关于安全About security警告Multipass 主要面向开发、测试和本地环境不适用于生产环境。在部署 Multipass 虚拟机前请仔细审阅本页安全考虑。Multipass 运行一个守护进程在 Linux/macOS 上通过Unix socket本地访问在 Windows 上通过TLS socket访问。任何能访问该 socket 的人都可以完全控制 Multipass包括挂载宿主机文件系统或篡改所有实例的安全特性。因此务必把守护进程访问限制在可信用户范围内。守护进程的本地访问守护进程以 root 运行并提供 Unix socket 用于本地通信。Multipass 的访问控制首先基于组成员身份之后由用户在被接受提供的 passphrase 时获得的 TLS 证书决定。第一个连接的用户若属于sudo组或视 OS 为wheel/adm其 TLS 证书会自动导入守护进程并被认证此后其他用户连接时需要先用管理员设置的 passphrase 执行authenticate。认证Authentication执行任何命令前Multipass 都要求用户与服务完成认证。认证流程基于由椭圆曲线EC密钥签名的x509 证书由 OpenSSL 驱动用户连接时Multipass 验证证书以确保只有经过验证的用户能访问服务。相关实现可参考 src/cert/client_cert_store.cpp 与 src/cert/ssl_cert_provider.cpp。按平台区分Linux 与 macOS客户端与守护进程通过 Unix 域 socket 通信。首次使用时socket 只允许属于其所属组的用户连接例如sudo、admin或wheel用户需属于该组否则连接被拒绝。当第一个属于管理员组的客户端连接后其 OpenSSL 证书被守护进程接受此后 socket 对所有用户开放。其他用户连接 Multipass 服务时需要用先前设置的local.passphrase进行认证。WindowsWindows 宿主使用监听50051 端口的 TCP socket 与客户端通信对应 platform_win.cpp 中的localhost:50051。由于 TCP socket 没有文件所有权概念该 socket 对所有人开放——这并不安全任何 Multipass 用户都能连接并执行任意命令。为弥补这一缺口用户现在必须通过认证才能使用服务为减轻负担安装更新版 Multipass 的用户会自动完成客户端认证其他用户则需用先前设置的 passphrase 认证。ID 映射ID mappingID 映射指挂载目录时在宿主系统与实例之间对齐用户或组 ID 的过程确保从宿主挂载到实例的文件保留一致的属主和权限属性。由于 ID 映射同时作用于宿主到实例和反向必须定义为一对一关系宿主上的每个用户/组 ID 应直接映射到虚拟机内的单个用户/组 ID反之亦然。例如把用户 ID501映射到 foo 实例中的用户 ID1000multipass mount ~/Documents foo:Documents -u 501:1000反之不允许把同一用户映射到实例内的第二个用户 ID因为 Multipass 无法确定把宿主上 ID 为501的文件在实例内分配给哪个用户 ID。以下命令是无效挂载宿主多个 ID 映射到实例同一 IDmultipass mount ~/Documents foo:Documents -u 501:1000 -u 502:1000正确做法是映射两个不同用户 IDmultipass mount ~/Documents foo:Documents -u 501:1000 -u 502:1001同理把实例内的单个用户/组 ID 映射到宿主的两个不同 ID 也不允许。ID 映射的挂载实现见 src/utils/vm_mount.cpp 与挂载处理逻辑 src/sshfs_mount。关于性能About performance考虑 Multipass 性能时需兼顾两个对象Multipass 实例与宿主机。宿主机系统CPU/核心/线程规划实例时需考虑宿主 CPU 速度、核心数与线程数以及同时运行的实例数量。分配给实例的核心数与运行实例数会显著影响宿主机上的进程。一般建议至少预留两个不分配给运行实例的线程。内存使用分配给实例的内存量也会显著影响宿主。不要过度分配运行实例的内存否则可能让宿主变慢甚至无响应。建议为宿主至少预留4GB内存具体取决于宿主自身负载可能需要更多。Multipass 实例CPU分配给实例的 CPU 数量直接影响实例性能。通常 CPU 越多、实例性能潜力越大但这高度依赖实例预期的工作负载。内存与核心一样分配给实例的内存直接影响其性能同样取决于预期工作负载。内存密集型负载在分配更多内存时通常能获得更大的性能提升。实例资源的实际分配通过launch命令的--cpus、--memory、--disk等选项完成相关数据结构见 src/utils/vm_specs.cpp。术语表GlossaryAlias别名在 Multipass 中别名是在指定实例内运行的命令的快捷方式。参见 alias 命令参考 与 如何使用实例命令别名。Host宿主指 Multipass 实际运行所在的物理机器。延伸阅读若想深入实践可继续阅读同一文档体系中的相关内容操作指南安装 Multipass、管理实例、设置驱动、与实例共享数据、认证 Multipass 服务用户命令参考命令行界面索引、实例状态设置参考设置索引、local.driver、local.privileged-mounts、local.passphrase、client.primary-name概念指南入口docs/explanation/index.md赞分享虚拟化开发工具云原生【免费下载链接】multipassMultipass orchestrates virtual Ubuntu instances项目地址https://gitcode.com/gh_mirrors/mu/multipass点击查看免费下载相关推荐Trick Simulation Environment实战用Cannon示例学习数据记录与实时同步核心技术Trick Simulation Environment实战用Cannon示例学习数据记录与实时同步核心技术 Trick Simulation EnvironFresh 核心概念全解析从请求生命周期到 Islands 架构的完整技术指南Fresh 核心概念全解析从请求生命周期到 Islands 架构的完整技术指南 本篇技术指南以 Fresh 官方文档 docs/latest/concepts后端前端CodexGuide × 飞书CLI高效处理飞书数据的实用技巧CodexGuide × 飞书CLI高效处理飞书数据的实用技巧 CodexGuide是面向全球初学者、创作者、开发者与团队的Codex实践指南而飞书CLI则文档教程知识库上一篇netscan网络扫描的终极指南5分钟掌握网络探测技巧下一篇终极指南如何在Mac上免费获得完整的NTFS读写权限创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表