对于刚购买 VPS 的新手,最容易忽略也是最致命的两个盲区就是"数据盘挂载"和"虚拟内存配置"。很多主机商(尤其是"大盘鸡")会将系统盘和数据盘分开,如果不手动挂载,您的数百 GB 空间永远是闲置的;而如果不设置 Swap,小内存机器跑几个 Docker 容器就会因为 OOM(内存溢出)而彻底死机。
🔍 盘点家当:查看磁盘状态
连上服务器的第一件事,就是搞清楚自己到底有几块硬盘,它们目前是什么状态。
# 1. 以树状图清晰查看系统所有磁盘及其分区情况
lsblk
# 2. 查看当前已经挂载的文件系统及可用空间
df -h
# 3. 使用 fdisk 查看详细的物理磁盘参数
sudo fdisk -l 如何判断是否需要挂载?
运行 lsblk 后,如果您看到 vdb 或 sdb 的容量很大,但右侧的 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 system df 已停止的容器、悬空镜像、匿名卷会悄悄占用数十 GB
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 原则防止数据丢失——参见数据备份实战指南。