ARTICLE DETAIL

资讯详情

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

Multipass 实例磁盘容量配置指南:local.\<instance-name\>.disk 详解

Multipass 实例磁盘容量配置指南:local.\<instance-name\>.disk 详解 虚拟化开发工具云原生【免费下载链接】multipassMultipass orchestrates virtual Ubuntu instances项目地址https://gitcode.com/gh_mirrors/mu/multipass点击查看免费下载本篇指南围绕 Multipass 的实例级设置项local.instance-name.disk系统讲解其键格式、允许值范围、单位解析规则、默认行为以及通过multipass set/multipass get调整实例磁盘大小的完整实操方法。读完本文你将掌握如何在 Multipass 中安全地扩容实例磁盘理解只能增不能减的底层原因并能依据源码确认大小解析与校验的真实行为。设置项总览Key 与作用对象local.instance-name.disk是 Multipass 暴露在设置树settings tree中的实例级属性设置用于查询与修改某个已存在实例的磁盘大小。Key 格式local.instance-name.disk占位符说明instance-name必须替换为 Multipass 实例的实际名称例如handsome-ling、primary。设置根Key 以local.为根表明它属于本地 Multipass 守护进程管辖的实例设置。从源码看Multipass 的守护进程daemon在解析这类 Key 时会按local.instance.cpus|memory|disk|bridged的固定模板进行正则匹配constexpr auto disk_suffix disk; constexpr auto mem_suffix memory; constexpr auto bridged_suffix bridged; // src/daemon/instance_settings_handler.cpp 中的 make_key_regex() const auto prop_pattern prop_template.arg( QStringList{cpus_suffix, mem_suffix, disk_suffix, bridged_suffix}.join(|));如果 Key 不符合该模式解析会抛出UnrecognizedSettingException。也就是说local.instance-name.disk与 cpus、memory、bridged 共同构成了 Multipass 的实例属性设置族。完整的可用设置列表可以通过multipass get --keys随时查看参见 Settings 参考。核心语义磁盘大小且只允许扩容该设置的值表示实例磁盘的大小。与launch时通过--disk指定磁盘空间的语义一致launch的-d, --disk选项描述为 Disk space to allocate. Positive integers, in bytes, or decimals, with K, M, G suffix. Minimum: 1G, default: 5G见 launch 参考。local.instance-name.disk则是在实例创建之后对这份分配进行在线调整的入口。为什么只能增大、不能缩小Multipass 明确规定磁盘大小只能增加不允许减少。文档中的警告原文如下The disk size can only be increased. Decreasing the disk size is not permitted since it could cause data loss and the VM might break.磁盘大小只能增加不允许减少磁盘大小因为可能导致数据丢失且虚拟机可能损坏。这条约束不是文档单方面的说法而是写死在守护进程设置处理逻辑中的硬性校验。在 instance_settings_handler.cpp 的update_disk()中if (size spec.disk_space) throw mp::InvalidSettingException{key, val, Disk can only be expanded}; else if (size spec.disk_space) // NOOP if equal { instance.resize_disk(size, messages); spec.disk_space size; }解读这段逻辑可以得到三条可验证的行为新值小于当前磁盘→ 抛出InvalidSettingException报错信息为 Disk can only be expanded且不执行任何实际扩容操作。新值大于当前磁盘→ 调用instance.resize_disk(size, messages)执行真正的磁盘扩容并把新的磁盘大小写回spec.disk_space实例的 VMSpecs 记录。新值等于当前磁盘→ 视为 NOOP空操作既不报错也不触发扩容。对应的单元测试也覆盖了这三种分支见 test_instance_settings_handler.cpp增大时resize_disk恰好被调用一次、相同时调用零次、缩小时调用零次且原大小保持不变。扩容的底层调用链update_disk()调用的resize_disk()最终落在BaseVirtualMachine的公共接口上base_virtual_machine.cppvoid mp::BaseVirtualMachine::resize_disk(const MemorySize new_size, mp::UserMessages messages) { resize_disk_impl(new_size); if (is_core()) messages.add_message(core_image_disk_resize_message()); }它会委托给各后端QEMU、Hyper-V、Apple Virtualization 等自行实现的resize_disk_impl()因此实际扩容动作由具体虚拟化后端完成若实例运行的是 Core 镜像还会附加一条提示消息。这也解释了为什么只能增底层镜像/虚拟磁盘通常只支持向文件尾部追加空间缩小会破坏文件系统与分区结构。允许值单位、大小写与取值范围允许值的总原则是不小于当前磁盘大小的任意容量。具体而言可以是一个正整数或小数后接可选的单位后缀单位后缀不区分大小写以下是所有可接受的单位语义均为二进制倍数即 1K 1024 字节而非 1000后缀大小写任意含义字节数B1 字节1KiB、KB、K1024 字节1024MiB、MB、M1024 × 1024 字节1048576GiB、GB、G1024 × 1024 × 1024 字节1073741824这些单位常量在 memory_size.cpp 中有对应定义kibi 1024LL、mebi kibi * kibi、gibi mebi * kibi。小数的特殊规则十进制字节被拒绝大单位向下取整Multipass 对小数有两处值得注意的限定原文 noteDecimal bytes (e.g. 1.1B) are refused, unless specified with larger units ( KiB), in which case the amount is floored (e.g. 1.2KiB is interpreted as 1228B, even though 1.2 x 1024 1228.8).十进制字节如1.1B会被拒绝小数只有在搭配K/M/G及以上这类大单位时才被允许。大单位小数向下取整floor例如1.2KiB会按1228B处理——虽然数学上1.2 × 1024 1228.8Multipass 会丢掉小数部分得到整数字节数。从解析器的正则表达式可以印证这一点memory_size.cppQRegularExpression regex{QRegularExpression::anchoredPattern( \\s*(\\d)(?:\\.(\\d)(?[KMG]))?(?:([KMG])(?:i?B)?|B)?\\s*), QRegularExpression::CaseInsensitiveOption};正则中(?:\\.(\\d)(?[KMG]))?表示小数部分只有在其后紧跟K、M、G单位时才会被捕获B单独出现时不允许带小数点。随后在计算时return val (long long)(mantissa / pow(10, matcher.captured(2).size()));整数部分与小数部分分别按单位换算后相加(long long)强制转换实现了向下取整与文档描述完全一致。另需注意值若被解析为 0 字节会抛出 Need a positive size. 的InvalidSettingException见 get_memory_size因此大小必须是正数。大小写不敏感的实例正则启用了CaseInsensitiveOption且单位字符在解析时统一转小写比较unit.at(0).toLower()所以7.5G、7.5g、7.5GB、7.5GiB都是等价的。查询与设置get / set 命令用法local.instance-name.disk与其他所有设置一样通过multipass set和multipass get命令读写参见 set 参考 与 get 参考。设置磁盘大小multipass set local.handsome-ling.disk7.5G这是文档给出的标准示例把名为handsome-ling的实例磁盘设置为7.5G。set命令的参数格式为keyvalue如果只给 Key 不给值则会交互式提示输入值。查询磁盘大小multipass get local.handsome-ling.diskget返回的是当前实例规格VMSpecs中记录的磁盘大小且以人类可读格式输出。从源码看查询路径是instance_settings_handler.cppassert(property disk_suffix); return QString::fromStdString(spec.disk_space.human_readable()); // TODO idem而human_readable()会选择GiB/MiB/KiB中合适的单位见 memory_size.cpp例如某测试中规格为12345KiB时get输出为12.1MiB对应 test_instance_settings_handler.cpp。这意味着你查询到的值可能与当初set输入的字面形式不同但字节数等价。修改前的必要条件在调用set修改实例设置时守护进程还会做两项前置校验instance_settings_handler.cpp实例不能被正在准备preparing否则抛出 instance is being prepared 异常实例必须处于 stopped 或 off 状态运行中的实例会被拒绝修改报错 Instance must be stopped for modification见check_state_for_updateinstance_settings_handler.cpp。因此扩容磁盘前应先停止实例multipass stop。此外已删除deleted实例无法修改磁盘设置但查询get对已删除实例是允许的。默认值与启动时分配的磁盘一致local.instance-name.disk的默认值就是该实例启动launch时分配的磁盘大小即 VMSpecs 中记录的disk_space。这意味着新建实例后不显式设置该键multipass get local.name.disk会返回launch时--disk指定的值launch若不指定--disk则采用后端默认值QEMU 等后端默认 5G最小 1G见 launch 参考每当通过set扩容成功spec.disk_space会被同步更新因此下一次的默认值/当前值就是扩容后的新大小再次扩容时以此为基准。常见用法与边界场景综合文档与源码实际使用中值得留意的几个场景合法扩容实例已停止multipass set local.name.disk20G将磁盘从当前大小例如 5G扩到 20G命令成功且无报错。设置相同大小multipass set local.name.disk5G当前恰好是 5G不会报错但也不会触发任何扩容操作NOOP 分支。尝试缩小multipass set local.name.disk3G当前 5G会失败收到InvalidSettingException错误信息为 Disk can only be expanded规格记录保持不变。大小写与单位混用2Gb、2048M、2GiB、2GB均可正常解析为同一大小但1.1B会被拒绝1.2KiB会按1228B向下取整处理。实例运行中修改会收到 Instance must be stopped for modification 错误需先multipass stop name。小结local.instance-name.disk是 Multipass 用于查询和调整实例磁盘容量的核心设置项。理解它的关键有三点只允许扩容、不允许缩容由守护进程硬校验并伴随数据安全考量大小写不敏感的单位体系B/K/M/G 及其变体均按 1024 进制换算小数仅限大单位且向下取整默认值跟随实例启动规格查询结果以人类可读形式返回。配合multipass stop、multipass set、multipass get三步操作即可安全完成实例磁盘的在线扩容管理。延伸阅读Settings 总览全部可用设置的完整清单Settings keys and values 说明设置树与取值规则set 命令参考 与 get 命令参考命令行读写方式launch 命令参考创建实例时通过--disk指定初始磁盘同族实例设置cpus、memory、bridged赞分享虚拟化开发工具云原生【免费下载链接】multipassMultipass orchestrates virtual Ubuntu instances项目地址https://gitcode.com/gh_mirrors/mu/multipass点击查看免费下载相关推荐Multipass 实例 CPU 配置指南local.\instance-name\.cpus 设置键的完整解析Multipass 实例 CPU 配置指南local.\instance name\ .cpus 设置键的完整解析 本指南围绕 Multipass 提供的实虚拟化开发工具云原生如何在 macOS 上从源码构建 Lynx Explorer 并打包 LynxSDK如何在 macOS 上从源码构建 Lynx Explorer 并打包 LynxSDK 在 macOS 上从 Lynx 源码构建可运行的 LynxExplorer虚拟化开发工具云原生Dagster GraphQL API 调用返回 UnauthorizedError 怎么排查Dagster GraphQL API 调用返回 UnauthorizedError 怎么排查 调用 Dagster 的 GraphQL API 时即使虚拟化开发工具云原生上一篇Hugo 模板函数 math.Sin 详解计算弧度参数的正弦值下一篇OLMo-7B环境影响分析全球首个零碳足迹7B模型背后的技术故事创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表