前言
在使用 ROS(Robot Operating System)进行开发时,catkin_make
是我们最常使用的编译命令之一。然而,在 Ubuntu 20.04 的虚拟机环境中,一些用户可能会遇到 catkin_make
编译过程中出现卡死、卡顿或内存不足的问题。
这类问题往往与系统的交换空间(Swap)配置不当有关。本文将从问题现象出发,详细讲解如何通过重建 Swap 文件来提升系统资源调度能力,从而解决编译过程中的卡顿问题。
水之积也不厚,则其负大舟也无力。
第一章:问题现象|为何 catkin_make 总是卡住?
当你在 Ubuntu 20.04 的虚拟机中执行 catkin_make
命令时,可能会遇到以下情况:
- 终端长时间无响应;
- 系统提示内存不足(Out of memory);
- CPU 使用率低,但进程不推进;
- 风扇狂转,系统变慢甚至崩溃;
这些表现背后,很可能是因为你的系统没有设置合理的 交换空间(Swap) 。当物理内存不足以支撑编译任务时,系统无法有效利用磁盘作为临时缓存,导致程序停滞。
ROS 项目通常包含大量依赖和并行编译任务,对内存需求较高。而虚拟机环境本身资源有限,如果没有合适的 Swap 支撑,很容易陷入“编译困局”。
第二章:什么是 Swap?为什么它对编译如此重要?
Swap 可以理解为操作系统用于补充物理内存的“备用仓库”。当内存吃紧时,系统会把一部分不常用的数据转移到 Swap 中,腾出空间给关键任务。
ROS 编译过程中,catkin_make
会同时运行多个编译任务,占用大量内存。如果没有足够的 Swap 支撑,轻则卡顿,重则崩溃。
“磨刀不误砍柴工。”
为你的 Ubuntu 设置合适的 Swap,是保障高效编译的第一步。
第三章:完整修复步骤|重建 Swap 文件,释放系统潜能
如果你当前的 Swap 配置不合理或文件损坏,建议按照以下步骤彻底重建 Swap 文件:
✅ 步骤1:禁用当前 Swap 文件
sudo swapoff /swapfile
这一步是为了确保你可以安全地移除旧的 Swap 文件,避免冲突。
✅ 步骤2:删除旧 Swap 文件
sudo rm /swapfile
清理掉可能已损坏或配置错误的旧文件,为新 Swap 文件腾出位置。
第四章:创建新的 Swap 文件|两种方式任选其一
🧱 方法一:使用 dd 创建(更兼容但较慢)
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
该方法通过逐块写入生成 Swap 文件,稳定性高,适合老旧系统或硬盘性能较好的场景。
🔨 方法二:使用 truncate 快速创建(推荐)
sudo truncate -s 4G /swapfile
该方法几乎瞬间完成,效率更高,适合大多数现代文件系统。
第五章:设置权限与格式化|让系统识别你的 Swap 文件
✅ 设置访问权限(仅 root 可读写)
sudo chmod 600 /swapfile
✅ 格式化为 Swap 空间
sudo mkswap /swapfile
这一步是关键,它将普通文件转化为系统可识别的交换空间。
✅ 启用 Swap 文件
sudo swapon /swapfile
此时系统即可立即使用新增的 Swap 空间。
第六章:永久生效|让 Swap 文件重启后依然可用
为了让 Swap 文件在每次开机后自动启用,请将其加入 /etc/fstab
文件:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
✅ 检查是否添加成功:
sudo swapon --show
free -h
如果输出中显示 /swapfile
已激活,并且大小为 4GB,说明配置已经生效。
第七章:一键部署|编写脚本快速完成所有操作
为了简化流程,你可以将上述命令整合为一个脚本,实现一键修复:
#!/bin/bash
sudo swapoff /swapfile
sudo rm /swapfile
# 推荐使用 truncate 快速创建
sudo truncate -s 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 写入 fstab,确保重启后生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 查看状态确认成功
sudo swapon --show
free -h
📌 将以上内容保存为 setup_swap.sh
,然后执行:
chmod +x setup_swap.sh
./setup_swap.sh
即可一次性完成全部配置。
总结
Ubuntu 虚拟机中运行 ROS 项目时,Swap 文件是不可或缺的一环。若 Swap 不足或配置异常,就会导致 catkin_make
编译过程频繁卡顿甚至失败。
“知己知彼,百战不殆。”
掌握系统的资源调度机制,才能真正掌控你的开发节奏。