DigitalOcean Volumes 指南 2026 — 块存储扩展
当 Droplet 附带的 SSD 空间不足时,与其将整个 Droplet 升级到更昂贵的计划,DigitalOcean Volumes 是独立的块存储,可以通过 DigitalOcean 的内部网络按需附加到任何 Droplet。本文将引导您了解概念、定价、创建、附加、挂载、格式化,一直到调整大小和快照,并提供真实的 doctl 命令供您立即使用。
目录
什么是 Volumes?与 Droplet 磁盘有何不同
DigitalOcean Volumes 是完全独立于 Droplet 的基于 SSD 的块存储服务。它通过 DigitalOcean 的私有网络连接到 Droplet,而不是物理插入机器中的磁盘。与 Droplet 磁盘(Droplet 计划附带的磁盘)的关键区别在于,Droplet 磁盘在其整个生命周期内绑定到 Droplet,大小固定,取决于您选择的计划。例如,$6/月的 Droplet Basic 计划(1 GiB RAM,1 vCPU)附带 25 GB SSD,$12/月的计划(2 GiB RAM)附带 50 GB,$24/月的计划(4 GiB RAM,2 vCPU)附带 80 GB,删除 Droplet 后该磁盘上的数据会立即丢失。相反,Volume 是一个独立的资源,具有自己的生命周期。它可以单独创建、附加到同一地区的任何 Droplet、与不同 Droplet 分离和重新附加,即使您删除正在使用它的 Droplet,Volume 及其所有数据也会保持完整,直到您明确删除它。这个概念类似于 AWS 的 EBS 或 Google Cloud 的 Persistent Disk——它将计算与存储分离,因此您可以扩展或移动数据而不会影响 Droplet 本身。 开发人员选择 Volumes 而不是升级整个 Droplet 计划的主要原因是 CPU/RAM 已经足够但需要更多存储容量的场景。例如,存储用户上传的文件、存储数据库的数据目录、归档长期日志或用作 Web 应用程序的媒体存储。将 Volumes 与主磁盘分离还使得能更清晰地规划备份和存储扩展,独立于计算规划。
- Volumes 是通过私有网络连接到 Droplet 的独立基于 SSD 的块存储
- Droplet 磁盘每个计划有固定大小,例如 $6/月=25GB、$12/月=50GB、$24/月=80GB,删除 Droplet 时消失
- Volumes 具有自己的生命周期——删除 Droplet 后 Volume 保留,直到您明确删除它
- 只能附加到同一地区的 Droplet
定价:每月 $0.10/GiB
值得强调的是——DigitalOcean 对 Volumes 的收费为每 GiB 每月 $0.10,根据实际使用情况按小时计费,就像 Droplet 一样。这意味着如果您创建 100 GiB Volume,成本大约是每月 $10;创建 500 GiB 的成本大约是每月 $50;创建 1,000 GiB(1 TiB)的成本大约是每月 $100。此费率固定,不因地区而异,并与 Droplet 成本分开列项,但在同一张发票中一起显示。 需要考虑的成本是 Volumes 在创建完成的那一刻起就开始产生费用,无论是否已附加到 Droplet。即使 Volume 从 Droplet 分离,费用也会继续。因此,如果不再需要 Volume,应该删除它以停止产生费用,因为系统不会自动删除它。另一个需要提前规划的是 Volumes 可以稍后扩展大小,但不能缩小。因此,估计初始大小尽可能接近实际需求有助于更好地控制成本,而不是主动创建过大的 Volumes。对于需要预算预测的团队,请直接从 DigitalOcean 网站验证当前定价,因为本文中的数据来自 2026 年 7 月。
- 固定费率每月 $0.10 per GiB,按小时计费
- 示例:100 GiB ≈ $10/月,500 GiB ≈ $50/月,1,000 GiB ≈ $100/月
- 从 Droplet 计费中单独列项,但显示在同一张发票中
- 费用从创建时立即开始,即使尚未附加或已分离
- 数据截至 2026 年 7 月——在预算前从提供商处验证当前定价
创建 Volume 并附加到 Droplet
创建 Volume 有两种方式:通过 Control Panel 网络界面和通过 doctl 命令进行自动化。在 Control Panel 中,进入 Volumes 菜单,选择 Create Volume,指定大小,选择与您的 Droplet 匹配的地区(因为 Volumes 无法跨地区附加),选择您希望系统自动格式化的文件系统(ext4 或 XFS),并在一个步骤中选择目标 Droplet 以附加它。
对于 CLI 方法,使用 doctl compute volume create data-volume-01 --region sgp1 --size 100GiB --fs-type ext4 在新加坡地区创建 100 GiB Volume 并预先格式化为 ext4。然后使用 doctl compute volume-action attach <volume-id> <droplet-id> 将其附加到 Droplet,您需要先使用 doctl compute volume list 和 doctl compute droplet list 查找 volume-id 和 droplet-id。需要注意的一个约束是 Volume 通常被设计为一次附加到一个 Droplet,而不是多个 Droplet 可以同时访问的共享存储。如果需要多个 Droplet 同时访问相同的文件集,请考虑使用 Spaces Object Storage 或 Network File Storage。
Volume 命名应该具有描述性——在名称中包含环境和地区,例如 db-data-prod-sgp1 这样当您在同一帐户中有多个 Volumes 时更容易管理。始终在点击创建前验证地区与您的 Droplet 相匹配,因为这是一个必需的约束,之后无法更改而不使用快照。
- 必须在与您将附加到的 Droplet 相同的地区创建 Volume
- Control Panel 让您选择文件系统格式(ext4/XFS)并在一个步骤中附加 Droplet
- 创建命令:
doctl compute volume create <name> --region <region> --size <size> --fs-type ext4
在 Linux 上挂载和格式化
将 Volume 附加到 Droplet 后,操作系统会将其视为新的块设备,但您必须先挂载它才能使用。SSH 到 Droplet 并使用 lsblk 检查设备或通过 ls -l /dev/disk/by-id/ 查看,它显示格式为 scsi-0DO_Volume_<volume-name> 的名称。使用来自 /dev/disk/by-id/ 的路径而不是直接引用 /dev/sda 或 /dev/sdb 至关重要,因为如果您有多个 Volume,sdX 等设备名称在重启后可能会改变。
如果您创建 Volume 时没有让系统自动格式化它,您必须先使用 sudo mkfs.ext4 -F /dev/disk/by-id/scsi-0DO_Volume_data-volume-01(或 XFS 使用 mkfs.xfs)进行格式化,在空白 Volume 上仅运行此命令一次。永远不要在已有数据的 Volume 上重新运行它,因为它会删除所有内容。然后使用 sudo mkdir -p /mnt/data-volume-01 创建挂载点,使用 sudo mount -o discard,defaults /dev/disk/by-id/scsi-0DO_Volume_data-volume-01 /mnt/data-volume-01 挂载它。
这种方式的挂载在 Droplet 重启后消失,所以将其添加到 /etc/fstab 以在每次启动时自动挂载,添加一行如 /dev/disk/by-id/scsi-0DO_Volume_data-volume-01 /mnt/data-volume-01 ext4 defaults,nofail,discard 0 0。关键点是始终包含 nofail 选项以防止如果 Volume 分离或在启动时临时不可用,Droplet 不会陷入紧急模式。discard 选项帮助文件系统支持基于 SSD 存储的 TRIM 命令。编辑 fstab 后,在重启前使用 sudo mount -a 测试以确保没有语法错误。
- 挂载前使用
lsblk或ls -l /dev/disk/by-id/检查设备 - 仅在首次使用
mkfs.ext4或mkfs.xfs格式化空白 Volume - 使用
mount -o discard,defaults /dev/disk/by-id/... /mnt/...挂载 - 添加到 /etc/fstab 时包含
nofail,discard选项以便在重启时安全自动挂载
调整大小和在 Droplet 之间移动 Volume
根据我们的实测——当 Volume 开始空间不足时,您可以从 Control Panel 和通过 doctl compute volume-action resize <volume-id> --region <region> --size <new-size> 扩展其大小。一个关键约束是调整大小仅单向进行——您只能扩展,永远不能缩小 Volume。如果您真的需要更小的 Volume,您必须创建一个新的并使用 rsync 之类的工具自己迁移数据。
当 DigitalOcean 调整大小时,它只会扩展块设备本身;内部的文件系统不会识别新空间,直到您明确告诉它。对于 ext4,运行 sudo resize2fs /dev/disk/by-id/scsi-0DO_Volume_data-volume-01,或对于 XFS 使用 sudo xfs_growfs /mnt/data-volume-01(注意:XFS 采用挂载点,而不是设备路径)。如果您跳过此步骤,新空间将不可用,即使调整大小成功。
要将 Volume 移动到不同的 Droplet,首先使用 doctl compute volume-action detach <volume-id> <droplet-id> 从旧 Droplet 分离它,然后附加到同一地区的目标 Droplet。所有数据完好传输。但如果您需要直接跨地区移动,这是不可能的,因为 Volumes 与创建它们的地区绑定。解决方法是先对原始 Volume 进行快照,然后使用该快照在目标地区创建新 Volume。提前规划分离/附加窗口,因为使用 Volume 数据的应用程序在其分离时将无法访问它。
- 调整大小仅向上进行,永远不向下
- 调整大小后,运行
resize2fs(ext4)或xfs_growfs(XFS)以扩展文件系统以匹配新大小 - 通过先分离然后附加到新机器,在 Droplet 之间移动 Volume
- 跨地区移动需要先创建快照,然后从该快照在目标地区创建新 Volume
- 提前规划分离/附加窗口,因为 Volume 在移动期间不可访问
Volume 快照:每月 $0.06/GiB
Volume Snapshot 是 Volume 数据的时间点副本,保留用于备份或稍后克隆到新 Volume。快照与活跃 Volumes 分开计费,每 GiB 每月 $0.06,比活跃 Volume 费率 $0.10 per GiB 每月便宜,使通过快照进行长期备份存储比保持待机 Volumes 更具成本效益。
通过 Control Panel 在 Volume 页面上创建快照,点击 Take Snapshot 并命名它,或使用 doctl compute volume snapshot create <volume-id> --snapshot-name data-volume-01-2026-07-17 自动化。对于通过脚本或 cron 工作的自动化,始终在快照名称中包含时间戳,这样当快照累积时您可以轻松管理保留和审查历史。
拥有快照后,使用 doctl compute volume create data-volume-restored --region sgp1 --size 100GiB --snapshot-id <snapshot-id> 从它创建新 Volume,这给您一个具有与源快照相同数据的新 Volume。这适用于在失败后恢复、克隆数据到另一个 Droplet 进行测试或跨地区迁移 Volume,如前面提到的。最佳实践是在有风险的更改(例如数据库版本升级或大型迁移)前快照,这样您就有明确的回滚点以防万一。
- 快照定价每 GiB 每月 $0.06,比活跃 Volumes 的 $0.10 per GiB 便宜
- 通过 Control Panel 或
doctl compute volume snapshot create创建 - 使用快照通过
doctl compute volume create --snapshot-id创建新 Volumes - 在 Droplet 之间克隆数据或跨地区迁移 Volumes
- 在风险操作(如数据库升级或大型迁移)前进行快照作为安全网
常见错误及其修复方法
最常见的错误是在将 Volume 添加到 /etc/fstab 时忘记 nofail 选项。后果是如果 Volume 因任何原因分离或在启动时出现临时连接问题,Droplet 将陷入紧急模式并且无法正常启动。预防很简单:在添加的每个 fstab 条目中始终包含 nofail。
第二个错误是直接按名称引用设备,如 /dev/sda 或 /dev/sdb,而不是使用来自 /dev/disk/by-id/ 的路径。对于一个 Droplet 附加多个 Volumes 或重复分离/附加周期,sdX 设备名称可能在重启后改变,导致您挂载错误的 Volume 并冒险意外覆写数据。
第三个错误是不监控 Volume 上的可用空间。这导致磁盘突然满了,没有警告,导致应用程序无法写入文件或数据库停止工作。您应该启用 Monitoring Agent 并设置 Alert Policies 以在空间使用接近容量时通知您,这样您可以提前规划调整大小。
第四个错误是尝试将 Volume 附加到不同地区的 Droplet,这总是失败,因为 Volumes 绑定到创建它们的地区。第五个常见错误是误解调整大小可以缩小 Volume,而它只能扩展。如果您真的需要缩小,您必须创建更小的 Volume 并使用 rsync 之类的工具手动迁移数据。
- fstab 中忘记
nofail→ 如果 Volume 分离或有连接问题,Droplet 无法启动 - 直接使用
/dev/sdX而不是/dev/disk/by-id/→ 重启后挂载错误的设备 - 未监控可用空间 → 磁盘突然满了,没有警告
最佳实践
对于生产工作负载,始终将数据 Volumes 与 Droplet 的主 OS 磁盘分离,这样您可以独立备份、调整大小或移动数据,而不会影响 Droplet 的操作系统和配置。例如,保持数据库的数据目录在单独的 Volume 上,而 OS 和应用程序照常位于主磁盘。
清晰地命名和标记 Volumes 以指示其目的——在名称中包含环境(dev/staging/prod)和地区,这样您的团队可以更容易地管理一个帐户中的许多 Volumes,并降低意外删除或分离错误的风险。
在备份方面,通过 cron 工作设置自动快照计划,调用 doctl compute volume snapshot create 定期进行——取决于数据重要性的每天或每周一次——并建立保留策略以删除不再需要的旧快照以控制成本,因为快照像 Volumes 一样按大小连续计费。
在您的 Droplet 上启用 Monitoring Agent 并配置 Alert Policies 以在 Volume 空间使用接近容量时通知您,这样您可以在问题发生前提前规划调整大小。也避免在 Volumes 上放置交换文件,因为内部连接的网络延迟比本地磁盘高,使其不适合交换需求的高随机访问速度。
最后,即使没有紧急情况,也要定期测试从快照恢复的过程以确保快照在您需要时实际工作,并保持映射 Volumes 到其 Droplet 的文档,这样您的团队在增长和积累更多 Volumes 时可以轻松找到这些信息。
- 在生产系统上将数据 Volumes 与 OS 磁盘分离
- 命名和标记 Volumes 以清晰显示环境和地区
- 使用 cron + doctl 设置自动快照计划并定义保留策略
- 启用 Monitoring Agent 和 Alert Policies 以在空间即将满时警告