Ubuntu服务器SWAP分区扩容实战:从原理到无损调整

📅 2026/8/12 15:45:06
Ubuntu服务器SWAP分区扩容实战:从原理到无损调整
1. 项目缘起为什么需要调整SWAP分区最近在折腾一台跑在Ubuntu 20.04上的老旧服务器主要用来跑一些数据处理的脚本和一个小型数据库。机器内存是8GB当初安装系统时图省事SWAP分区就按默认的2GB来设置了。一开始相安无事但最近任务量上来后系统监控频繁告警htop一看SWAP使用率长期在80%以上物理内存更是吃紧。虽然系统还没到卡死的地步但那种“内存不足”的红色警告和偶尔的进程被OOM Killer内存溢出杀手干掉的情况实在让人心烦。这让我意识到那个默认的、小小的SWAP分区已经成了性能瓶颈。对于很多从Windows转过来或者习惯了“内存够大就不用SWAP”观念的朋友来说SWAP可能有点陌生。简单来说SWAP就是硬盘上划出来的一块空间当物理内存不够用时操作系统会把一些暂时不用的内存数据“交换”到这里腾出物理内存给更紧急的任务用。你可以把它理解成内存的“后备仓库”。仓库太小货物内存页周转不开整个系统的吞吐量就会下降严重时就会触发OOM Killer直接终止占用内存最多的进程来保命——这往往是灾难性的比如你的数据库服务突然没了。所以调整SWAP容量不是一个可做可不做的“优化”而是在特定场景下的“必需操作”。尤其是对于内存不宽裕的机器、需要处理突发大内存负载的服务器或者像我这样跑着内存消耗型应用如Java服务、机器学习训练、大型编译任务的情况。网上搜“Ubuntu SWAP”相关你会发现大量关于“SWAP应该设多大”、“SWAP用光了怎么办”的讨论这恰恰说明了它的普遍性和重要性。本次操作的目标就是在Ubuntu 20.04系统上安全、无损地扩大SWAP分区的容量让系统的“内存后备仓库”更充裕。2. 前期准备风险评估与方案选择在动手调整任何磁盘分区尤其是涉及系统关键组件如SWAP时鲁莽行事是最大的忌讳。数据无价第一步永远是评估风险并规划退路。2.1 理解你的磁盘分区布局调整SWAP本质上是在调整磁盘分区。因此你必须先搞清楚你的磁盘是怎么分的。打开终端输入命令lsblk -f或sudo fdisk -l。NAME FSTYPE LABEL UUID MOUNTPOINT nvme0n1 ├─nvme0n1p1 vfat 67E3-17ED /boot/efi ├─nvme0n1p2 ext4 830b0b9c-... / ├─nvme0n1p3 ext4 a1b2c3d4-... /home └─nvme0n1p4 swap 12345678-... [SWAP]以我的机器为例这是一块NVMe固态硬盘nvme0n1分了四个区EFI引导分区、根目录/、家目录/home以及最后的SWAP分区nvme0n1p4。关键点在于SWAP分区后面还有没有未分配的空间或者它紧邻的分区比如我这里的/home是否可以调整大小理想情况SWAP分区位于磁盘末尾且其后有未分配的“空闲空间”。这是最简单的我们可以直接扩大这个分区。常见情况SWAP分区不在末尾但相邻分区通常是/home有充裕空间且可以卸载。这需要先调整相邻分区腾出空间再扩大SWAP。棘手情况SWAP是逻辑卷LVM的一部分。这需要操作逻辑卷管理器步骤不同但原理相通。最坏情况SWAP是单独的分区但前后都没有调整空间。这时可能需要考虑替代方案比如创建一个额外的SWAP文件。通过lsblk和df -h命令结合图形化工具gnome-disksDisks分区工具你可以清晰地看到分区布局。务必记下你的SWAP分区设备名如/dev/nvme0n1p4和其UUID。2.2 备份备份备份这不是老生常谈这是血泪教训。任何磁盘分区操作都有理论上的风险可能导致数据丢失。请至少确保以下几点重要数据备份将/home目录下的个人文件、服务器配置文件、数据库数据等备份到外部硬盘、另一台服务器或云存储。系统快照如果可用如果你是在VMware、VirtualBox等虚拟机中安装的Ubuntu强烈建议在操作前创建一个完整的虚拟机快照。这是最快捷的“后悔药”。准备Live USB准备一个Ubuntu安装U盘。万一操作失误导致系统无法启动你可以通过U盘启动尝试修复或至少抢救数据。2.3 方案选择分区扩容 vs. SWAP文件这是两个主流方案各有优劣调整原有SWAP分区优点是“正统”做法性能通常稍好取决于硬盘类型管理直观一个单独的分区。缺点操作涉及分区表修改风险较高且受限于现有分区布局。需要系统有未分配空间或可调整的相邻分区。适用场景物理服务器、长期运行的虚拟机、磁盘分区布局允许调整的情况。创建新的SWAP文件优点极其灵活。可以在任何支持的文件系统如ext4上创建指定大小的文件作为SWAP无需调整分区。增加、删除、调整大小都非常方便。缺点性能可能略低于分区对于现代SSD差距很小。需要占用根目录或其他挂载点的空间。适用场景云服务器磁盘通常不可分区调整、分区布局复杂、临时需要大SWAP、想快速测试的情况。我的选择鉴于我的SWAP分区在磁盘末尾且/home分区有充足空间可以调整我决定采用调整原有SWAP分区的方案。这更符合服务器环境的整洁性。如果你的情况不符合那么“创建SWAP文件”是更推荐也更安全的选择。网上很多教程一上来就教删分区、新建风险极大我不推荐。我们的原则是能调整就不重建。3. 实战操作无损调整SWAP分区容量假设我的磁盘布局如前所述SWAP分区/dev/nvme0n1p4在末尾前面是/home分区/dev/nvme0n1p3。我的目标是将SWAP从2GB扩大到8GB。这意味着我需要从/home分区“借”6GB空间给SWAP。注意以下操作需要在系统重启后进入一个“离线”环境进行因为我们要操作的分区/home和SWAP在系统运行时是挂载且被使用的。我们将使用Ubuntu安装U盘启动到“Try Ubuntu”模式来操作。请再次确认备份已完成。3.1 步骤一启动至Live环境并安装工具将Ubuntu安装U盘插入电脑重启并从U盘启动。选择“Try Ubuntu without installing”进入Live桌面环境。打开终端。Live环境自带的工具有限我们首先需要安装功能强大的分区工具gparted。连接网络后执行sudo apt update sudo apt install gparted -y同时我们也安装e2fsprogs和util-linux包确保后续文件系统调整命令可用。sudo apt install e2fsprogs util-linux -y3.2 步骤二使用GParted进行分区调整gparted是图形化工具更直观但理解其背后的命令行操作逻辑至关重要。在Live环境中打开GParted通常在菜单里搜索。在右上角选择你的系统硬盘例如/dev/nvme0n1。务必看清楚别选成U盘了你会看到类似之前lsblk展示的分区图。找到你的/home分区例如/dev/nvme0n1p3。右键点击/home分区 - Resize/Move。在弹窗中你可以用鼠标拖动分区条两端的箭头或者直接输入数字。我们的目的是在分区尾部释放出6GB的空间。在“Free space following”后输入6144因为6GB 6 * 1024 6144 MiB。GParted默认使用MiB单位。点击“Resize/Move”。此时图形上会显示/home分区后面多出了一块6GB的“未分配空间”。现在找到你的SWAP分区例如/dev/nvme0n1p4。它应该紧挨着刚才释放出的未分配空间。右键点击SWAP分区 - Resize/Move。拖动分区条左端的箭头向左拉满或者直接调整“Free space preceding”为0让SWAP分区吞并掉前面所有的未分配空间。同时你也可以拖动右端如果磁盘末尾还有空间可以一并吞并。我们的目标是让SWAP分区大小变成约8GB原有2GB 新增6GB。点击“Resize/Move”。关键一步以上操作只是“预演”GParted界面顶部的工具栏按钮还是灰色的。现在点击绿色的“√”Apply All Operations按钮确认执行所有操作。GParted会弹窗列出将要执行的所有步骤先调整/home再调整SWAP确认无误后点击“Apply”。等待进度条完成这个过程取决于数据量大小可能需要几分钟到十几分钟。操作成功后关闭GParted。命令行原理透视 GParted图形操作背后其实是调用了resize2fs调整ext4文件系统大小和parted调整分区表等命令。例如调整/home分区大小的核心命令逻辑是# 首先检查文件系统必须步骤 sudo e2fsck -f /dev/nvme0n1p3 # 然后缩小文件系统本身注意顺序先缩文件系统再缩分区 sudo resize2fs /dev/nvme0n1p3 新的大小如200G # 最后使用parted调整分区表边界 sudo parted /dev/nvme0n1 resizepart 3 新的结束扇区而调整SWAP分区则更简单因为SWAP没有复杂的文件系统结构直接修改分区表边界即可。但绝对不要在分区调整后忘记重新格式化SWAP分区下一步否则系统将无法识别它。3.3 步骤三重新格式化并启用新的SWAP分区分区边界调整了但SWAP分区内部的“格式”还没变。我们需要用新的容量重新初始化它。首先确认新SWAP分区的设备名没有变还是/dev/nvme0n1p4。可以在终端用sudo lsblk查看。关闭可能被误启用的旧SWAP在Live环境里通常未启用但安全起见sudo swapoff -a使用mkswap命令用新的容量重新创建SWAP区域sudo mkswap /dev/nvme0n1p4这个命令会输出新的UUID。请务必记下这个新的UUID它看起来像12345678-1234-1234-1234-123456789abc。这是下一步更新系统配置的关键。临时启用一下新SWAP测试是否成功sudo swapon /dev/nvme0n1p4然后用sudo swapon --show或free -h检查应该能看到SWAP的总容量已经变为约8GB。3.4 步骤四更新系统配置fstab系统启动时会根据/etc/fstab文件的配置来自动挂载分区包括SWAP。现在SWAP分区的UUID已经变了我们必须更新这个配置否则系统重启后找不到SWAP。在Live环境中我们需要挂载原系统的根分区/来修改其下的fstab文件。假设你的根分区是/dev/nvme0n1p2。# 创建一个挂载点 sudo mkdir /mnt/root # 挂载根分区 sudo mount /dev/nvme0n1p2 /mnt/root现在编辑原系统的fstab文件sudo nano /mnt/root/etc/fstab在文件中找到关于SWAP的那一行。它通常长这样UUID旧的UUID值 none swap sw 0 0将UUID后面的旧UUID值替换为你刚才用mkswap命令记下的新UUID。UUID12345678-1234-1234-1234-123456789abc none swap sw 0 0重要提示也可以使用设备路径如/dev/nvme0n1p4代替UUID但强烈推荐使用UUID。因为设备名如/dev/sda2在添加新硬盘后可能会变而UUID是全局唯一的更稳定。保存并退出编辑器在nano中按CtrlX然后按Y确认再按回车。卸载根分区sudo umount /mnt/root3.5 步骤五重启并验证从电脑上拔掉Ubuntu安装U盘。重启电脑进入你原来的Ubuntu 20.04系统。打开终端运行以下命令进行最终验证# 查看内存和SWAP使用情况 free -h # 或更详细地查看SWAP信息 sudo swapon --show你应该能看到SWAP的总大小已经变成了8GiB。# 检查fstab配置是否生效 cat /proc/swaps这里应该显示你的SWAP分区设备并且大小正确。为了确保万无一失可以轻微地触发一下SWAP的使用观察是否正常。比如你可以用stress命令需要安装stress包临时消耗大量内存sudo apt install stress -y stress --vm 1 --vm-bytes 7G --timeout 30s这个命令会尝试分配7GB内存超过我的物理内存迫使系统使用SWAP。同时用htop或watch -n 1 ‘free -h‘观察SWAP使用量的变化。30秒后进程结束内存应被释放SWAP使用率可能会下降取决于内核的交换策略。如果系统运行平稳没有崩溃或异常说明新的SWAP分区工作正常。4. 避坑指南与进阶思考操作虽然完成了但过程中和后续使用可能遇到的问题才是真正体现经验价值的地方。4.1 常见问题与排查问题一重启后SWAP显示为0swapon --show无输出。排查首先检查sudo fdisk -l /dev/nvme0n1确认SWAP分区是否存在且大小正确。如果分区存在检查sudo blkid /dev/nvme0n1p4是否输出TYPEswap以及UUID是否与fstab中一致。解决最常见原因是/etc/fstab中的UUID写错了。用blkid查到的正确UUID修改fstab。也可能是SWAP分区未格式化执行sudo mkswap /dev/nvme0n1p4后再sudo swapon -a。教训mkswap后输出的UUID一定要复制粘贴不要手打。问题二使用GParted调整大小时选项是灰色的无法操作。排查该分区正在被挂载使用。在Live环境中确保你已经卸载了所有相关分区特别是/home。在GParted中右键点击分区如果有“Unmount”选项先卸载它。解决在Live环境中操作本就是为了避免挂载。如果还不行尝试在终端用sudo umount -l /dev/nvme0n1p3强制卸载。问题三调整/home分区后重启进入系统发现/home目录为空或报错。排查极有可能是在调整分区后没有成功运行resize2fs来扩展文件系统。分区变大了但里面的ext4文件系统还停留在原来的大小。解决重新进入Live环境挂载该分区然后执行sudo e2fsck -f /dev/nvme0n1p3检查并修复再执行sudo resize2fs /dev/nvme0n1p3不接大小参数表示扩展到分区最大容量。这个顺序很重要先调整分区parted再调整文件系统resize2fs。问题四系统变慢了尤其是操作时有明显卡顿。排查SWAP是用硬盘空间模拟内存速度比物理内存慢几个数量级尤其是机械硬盘。如果系统频繁使用SWAPsi/so值在vmstat 1命令中持续很高说明物理内存严重不足扩大SWAP只是延缓了OOM并非治本之策。解决监控工具如htop,vmstat,sar是你的朋友。真正应该做的是1优化应用程序内存使用2增加物理内存3调整内核的swappiness参数/proc/sys/vm/swappiness默认值60降低系统使用SWAP的积极性比如设为10-30但这不是万能药。4.2 SWAP大小设置的经验法则“SWAP应该设多大”没有唯一答案但有一些广泛参考的经验法则传统经验内存2GB时代SWAP大小 物理内存的2倍。现代服务器建议红帽、Ubuntu等内存 2GBSWAP 2 * 内存内存 2GB - 8GBSWAP 内存大小内存 8GB - 64GBSWAP 至少4GB内存 64GBSWAP 至少4GB用于休眠和应对极端情况休眠Hibernate需求如果你要用休眠功能SWAP必须大于或等于物理内存以便保存所有内存状态。云服务器/容器很多云平台最佳实践是禁用SWAP因为磁盘性能差频繁交换反而影响整体性能靠监控和快速弹性伸缩来应对内存不足。但在自有服务器上保留一定SWAP作为安全缓冲是明智的。我的选择对于我的8GB内存服务器处理中等负载我选择8GB SWAP1:1。这给了系统足够的缓冲空间来处理内存峰值又不会因为过大而浪费过多的SSD写入寿命SWAP频繁读写对SSD有磨损。4.3 替代方案SWAP文件的灵活运用如前所述SWAP文件在某些场景下是更优解。创建步骤非常简单# 1. 创建一个指定大小的空文件例如4GB sudo fallocate -l 4G /swapfile # 如果fallocate有问题可以用dd sudo dd if/dev/zero of/swapfile bs1M count4096 # 2. 设置正确的权限只有root可读写 sudo chmod 600 /swapfile # 3. 格式化为SWAP空间 sudo mkswap /swapfile # 4. 立即启用 sudo swapon /swapfile # 5. 写入fstab使其永久生效 echo /swapfile none swap sw 0 0 | sudo tee -a /etc/fstabSWAP文件的优势你可以随时用fallocate和mkswap调整其大小甚至创建多个SWAP文件。用swapoff和swapon即可轻松启用/禁用。对于“分区布局锁死”的VPS这是唯一的选择。调整SWAP分区容量是一次对Linux存储管理基础的深入实践。它串联起了分区表、文件系统、内核内存管理等多个知识点。操作本身不难难的是在每一步做出正确的判断和备份。经过这次调整我的服务器再也没出现过因SWAP不足导致的告警系统在应对内存压力时从容了许多。记住在Linux系统管理中胆大心细永远敬畏数据才是长久之道。