VPSKnow

存储与磁盘管理指南

中级
30分钟

对于刚购买 VPS 的新手,最容易忽略也是最致命的两个盲区就是"数据盘挂载"和"虚拟内存配置"。很多主机商(尤其是"大盘鸡")会将系统盘和数据盘分开,如果不手动挂载,您的数百 GB 空间永远是闲置的;而如果不设置 Swap,小内存机器跑几个 Docker 容器就会因为 OOM(内存溢出)而彻底死机。

🔍 盘点家当:查看磁盘状态

连上服务器的第一件事,就是搞清楚自己到底有几块硬盘,它们目前是什么状态。

# 1. 以树状图清晰查看系统所有磁盘及其分区情况
lsblk

# 2. 查看当前已经挂载的文件系统及可用空间
df -h

# 3. 使用 fdisk 查看详细的物理磁盘参数
sudo fdisk -l
💡

如何判断是否需要挂载?

运行 lsblk 后,如果您看到 vdbsdb 的容量很大,但右侧的 MOUNTPOINT(挂载点)是空的,说明这块"肥肉"系统还没吃着,需要您手动去激活。

lsblk 输出解读示例

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    252:0    0   20G  0 disk
└─vda1 252:1    0   20G  0 part /          ← 系统盘,已挂载到根目录
vdb    252:16   0  200G  0 disk             ← 数据盘,MOUNTPOINT 为空 = 待挂载!
vdc    252:32   0  100G  0 disk             ← 另一块数据盘,同样待挂载
vda / sda

虚拟/物理磁盘(vd=虚拟,sd=SCSI)

vda1 / vda2

磁盘分区,数字是分区序号

MOUNTPOINT 空

该磁盘/分区未挂载,需手动激活

💽 核心实战:格式化与挂载数据盘

在 Linux 中,新硬盘必须经过格式化(写入文件系统)并指定挂载路径后,才能存储文件。

⚠️ 极度危险操作警告:格式化操作会永久抹除磁盘数据!请务必确认设备号(如 /dev/vdb),不要格式化系统所在的 /dev/vda。

# 1. 格式化裸盘 (假设您的数据盘是 /dev/vdb)
# 推荐使用 ext4 (通用性强) 或 xfs (大文件处理强)
sudo mkfs.ext4 /dev/vdb

# 2. 创建挂载点
sudo mkdir -p /mnt/data

# 3. 临时挂载并测试
sudo mount /dev/vdb /mnt/data
df -h | grep data

# 4. 获取磁盘 UUID (开机自启的关键)
sudo blkid /dev/vdb

# 5. 写入 fstab 实现持久化挂载
# 注意将下面的 UUID 替换为您真实查到的 ID
echo "UUID=12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data ext4 defaults 0 2" | sudo tee -a /etc/fstab

# 6. 【救命步骤】验证配置,如果不报错则说明配置正确,可以放心重启
sudo mount -a

ext4 vs xfs:文件系统怎么选?

ext4 ✅ 新手首选
  • Linux 最通用的文件系统,兼容性最强
  • 支持在线扩容(resize2fs
  • 文件恢复工具丰富(extundelete
  • 适合:通用存储、系统盘、小文件多的场景
xfs 🚀 大文件首选
  • 大文件读写性能优于 ext4(视频、数据库)
  • 支持在线扩容(xfs_growfs
  • 不支持缩小,一旦格式化容量是单向的
  • 适合:媒体存储、数据库盘、大盘鸡场景

💡 不知道选哪个就选 ext4。两者性能差距在日常使用中几乎感知不到。

关于 fstab 的重要说明

/etc/fstab 是系统开机自动挂载的配置文件。写错了会导致系统无法启动!黄金法则:写入 fstab 后必须执行 sudo mount -a 验证语法正确性,无报错才能安心重启。如果不确定,可以用设备路径代替 UUID(如 /dev/vdb /mnt/data ext4 defaults 0 2),但注意:设备名可能在重启后改变,UUID 更稳定可靠。

🧱 进阶玩法:LVM 动态逻辑卷

LVM (Logical Volume Manager) 是高级运维的必修课。它允许您将多块物理磁盘合并成一个巨大的虚拟磁盘,并支持在不丢失数据的情况下动态扩容。

LVM 三层结构

PV 物理卷

实际磁盘或分区
/dev/vdb, /dev/vdc

VG 卷组

PV 的资源池
data_vg

LV 逻辑卷

挂载使用的虚拟磁盘
lv_storage

多块物理磁盘 合并为卷组 切割为逻辑卷使用

初次创建 LVM

# 1. 初始化物理卷
sudo pvcreate /dev/vdb /dev/vdc

# 2. 创建卷组 data_vg
sudo vgcreate data_vg /dev/vdb /dev/vdc

# 3. 创建逻辑卷 lv_storage
sudo lvcreate -l 100%FREE -n lv_storage data_vg

# 4. 格式化并挂载
sudo mkfs.xfs /dev/data_vg/lv_storage
sudo mount /dev/data_vg/lv_storage /mnt/storage

后期在线扩容(新增磁盘时)

# 新增磁盘后扩展 LVM 卷组
sudo pvcreate /dev/vdd
sudo vgextend data_vg /dev/vdd
sudo lvextend -l +100%FREE /dev/data_vg/lv_storage
# xfs 文件系统在线扩容(无需卸载)
sudo xfs_growfs /mnt/storage
# ext4 文件系统在线扩容
# sudo resize2fs /dev/data_vg/lv_storage

💡 xfs 和 ext4 文件系统均支持在线扩容,无需卸载挂载点,服务不中断。

适用于需要后期频繁调整分区大小的大容量存储型服务器。

🧠 保命神器:设置 Swap 虚拟内存

Swap 是当物理内存(RAM)不足时,硬盘临时充当内存的缓冲区域。虽然硬盘慢,但有了它,您的 Web 服务或数据库就不会因为瞬间的流量峰值而直接"暴毙"。

物理内存

512 MB

推荐 Swap

1 GB

轻量代理、学习

物理内存

1 GB

推荐 Swap

2 GB

WordPress、小 API

物理内存

2 GB

推荐 Swap

2 GB

Docker、数据库

物理内存

4 GB+

推荐 Swap

可选

内存充足时非必须

创建并启用 Swap

# 1. 创建 2GB 交换文件 (适合 1GB 内存 VPS)
sudo fallocate -l 2G /swapfile
# 若提示 fallocate 失败,请使用: sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

# 2. 锁定权限 (仅 root 可读写)
sudo chmod 600 /swapfile

# 3. 格式化为 Swap
sudo mkswap /swapfile

# 4. 启用并写入自启配置
sudo swapon /swapfile
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab

# 5. 调优:降低对 Swap 的依赖积极性 (服务器推荐设为 10)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

验证与日常管理

# 查看 Swap 使用情况
free -h
# 查看 Swap 详细信息
swapon --show
# 临时关闭 Swap(维护时用)
sudo swapoff /swapfile
💡

vm.swappiness 参数详解

swappiness 控制内核使用 Swap 的积极性,取值 0-100。桌面系统推荐 60(默认),服务器推荐 10。设为 10 意味着只有物理内存剩余 10% 以下才开始使用 Swap,避免不必要的磁盘 I/O 拖慢服务。设为 0 并不会禁用 Swap,只是内核在内存即将耗尽时才会迫不得已使用。

🧹 日常维护:深度清理磁盘空间

如果您发现服务器 / 根目录莫名其妙爆满,通常是 Nginx 日志或 Docker 的"旧尸体"占用了空间。以下是专业运维的清理脚本:

# 清理 apt 缓存与冗余包
sudo apt clean && sudo apt autoremove -y

# 清理 3 天前的系统日志
sudo journalctl --vacuum-time=3d

# Docker 全量清理 (清理无用镜像、容器、卷)
docker system prune -a -f --volumes

# 可视化分析磁盘占用
sudo apt install ncdu -y
sudo ncdu /

磁盘爆满常见元凶排查清单

🪵
系统日志 du -sh /var/log/*

Nginx、syslog 等日志文件无限增长,journalctl --vacuum-size=200M 限制大小

🐳
Docker 残留 docker system df

已停止的容器、悬空镜像、匿名卷会悄悄占用数十 GB

📦
apt 缓存 du -sh /var/cache/apt

每次 apt install 都会缓存 deb 包,apt clean 一键清理

🗂️
用户家目录 du -sh /root/* | sort -h

上传的压缩包解压后原文件忘记删除

🔄
旧内核 dpkg --list | grep linux-image

apt autoremove 会自动清理,但有时需要手动确认

常见问题解答

lsblk 看到了数据盘 /dev/vdb,但格式化前需要先分区吗?

对于 VPS 上的单块数据盘,可以直接格式化整块磁盘而不分区,即对 /dev/vdb 直接执行 mkfs.ext4。这是最简单的方式,推荐新手使用。只有在以下情况才需要先分区:① 需要同一块磁盘划分多个不同用途的区域;② 需要使用 GPT 分区表支持超过 2TB 的磁盘;③ 系统要求引导分区单独划分。普通数据存储需求直接格式化整盘即可,省事且不影响性能。

写完 fstab 重启后系统起不来了,怎么救援?

fstab 写错导致开机挂载失败,系统会进入紧急模式(Emergency Shell)。救援步骤:① 登录商家控制面板,使用 VNC/Console 带外连接到服务器(无需 SSH);② 系统会提示输入 root 密码进入维护模式;③ 执行 nano /etc/fstab 注释掉有问题的那行(行首加 #);④ 保存后执行 mount -a 验证,无报错后 reboot根本预防:写入 fstab 后、重启前,必须先执行 sudo mount -a——这个命令会验证配置语法并尝试挂载,有任何错误立即提示,不会影响当前运行状态。

Swap 和直接加内存有什么区别?Swap 能替代真实内存吗?

Swap 无法替代真实内存,差距在速度:DDR4 内存读写速度约 30,000 MB/s,而 NVMe SSD 约 3,000 MB/s,HDD 仅 100 MB/s——差距高达 10-300 倍。Swap 的作用是安全网而非性能提升:防止进程因内存不足被 OOM Killer 强制杀死(导致服务崩溃),给系统留出喘息空间。如果您的服务频繁使用 Swap(free -h 中 Swap 使用率持续超 50%),说明物理内存确实不够,应该升级配置而不是加大 Swap。Swap 只适合应对偶发的内存峰值,不适合长期大量使用。

Docker 的数据存在哪里?清理 Docker 会删掉我的数据吗?

Docker 数据默认存储在 /var/lib/docker/。执行 docker system prune -a 会删除:所有已停止的容器、所有未被任何容器引用的镜像、所有未使用的网络。加上 --volumes 标志会额外删除匿名卷(没有名字的数据卷)。不会删除的内容:正在运行的容器、有名字的 Named Volume(如 docker volume create mydata 创建的)、通过 -v /host/path:/container/path 绑定挂载到宿主机的数据。操作前务必先执行 docker volume ls 确认哪些卷有重要数据。

LVM 适合什么场景?普通用户需要用 LVM 吗?

普通个人 VPS 用户通常不需要 LVM,直接格式化挂载即可。LVM 的价值在以下场景才凸显:① 多盘合并:购买了多块独立数据盘(常见于大盘鸡),希望呈现为一个大目录统一管理;② 动态扩容:不确定未来存储需求,希望能灵活追加磁盘而不迁移数据;③ 快照备份:LVM 支持创建文件系统级快照,可在不停机的情况下做一致性备份;④ 企业级部署:需要在多个服务之间灵活分配存储空间。单块数据盘的个人站长选择直接挂载,更简单且维护成本更低。

df -h 显示磁盘 95% 已用,但找不到大文件,空间去哪了?

这是经典的"已删除但仍占用"问题:某个进程(如 Nginx、MySQL)正在写入一个文件,您用 rm 删除了它,但因为进程还持有文件句柄,inode 没有释放,磁盘空间并未回收。用以下命令定位:lsof +L1 | grep deleted,这会列出所有"已删除但仍被占用"的文件及持有它的进程。解决方法:重启对应服务(如 systemctl restart nginx)让进程重新打开新文件,原来的 inode 才会真正释放。如果仍找不到,用 ncdu / 进行交互式可视化分析,能精准定位每个目录的占用大小。

数据盘已挂载使用,如何安全卸载?会丢数据吗?

正确卸载不会丢数据。步骤:① 停止所有正在访问该挂载点的进程和服务(如 systemctl stop nginx);② 确认没有进程在使用:lsof /mnt/data,无输出则安全;③ 执行卸载:umount /mnt/data;④ 如果提示"device is busy",先用 fuser -mv /mnt/data 查看是哪个进程占用,逐一停止后再卸载。永远不要强制 umount -f 一个有数据写入的磁盘,可能导致文件系统损坏。同时记得注释掉 /etc/fstab 中对应的条目,避免下次开机自动挂载失败。

想把 Docker 的存储目录迁移到数据盘,怎么操作?

这是大盘鸡用户最常见的需求。步骤如下:① 停止 Docker:systemctl stop docker;② 将现有数据迁移到新位置:rsync -aP /var/lib/docker/ /mnt/data/docker/;③ 修改 Docker 配置,创建或编辑 /etc/docker/daemon.json,添加:{"data-root": "/mnt/data/docker"};④ 重启 Docker:systemctl start docker;⑤ 验证容器和镜像正常后,删除原目录:rm -rf /var/lib/docker。迁移完成后系统盘会立刻释放大量空间。

数据盘满了但没有其他磁盘,怎么在不迁移数据的情况下扩容?

有以下几种方案:① 商家控制面板扩容磁盘(最推荐):部分 VPS 商家(如 Vultr、Hetzner)支持在线扩容磁盘容量。在控制面板调整磁盘大小后,登录系统执行 growpart /dev/vdb 1 扩展分区,再执行 resize2fs /dev/vdb1(ext4)或 xfs_growfs /mnt/data(xfs)扩展文件系统;② 使用对象存储卸载冷数据:将不常访问的文件(如备份、历史日志)通过 Rclone 迁移到 Cloudflare R2、Backblaze B2 等对象存储;③ 清理 + 压缩:先用 ncdu 深度分析后清理冷数据,再用 zstd 对大文件压缩存储。参见数据备份指南了解冷数据迁移方案。

完成磁盘管理后,下一步应该做什么?

磁盘管理是服务器基础建设的重要一环,完成后建议按以下顺序继续:① Linux 系统调优:调整内核参数(TCP 缓冲区、文件句柄数、BBR 加速),让系统整体性能更上一层楼——参见Linux 系统调优指南;② 防火墙加固:UFW 和 iptables 基础配置,保护已挂载的数据盘不被外部攻击者访问——参见防火墙配置教程;③ 数据备份策略:磁盘有了,数据备份计划要跟上,遵循 3-2-1 原则防止数据丢失——参见数据备份实战指南