在 Linux 系统配置内存盘(Ramdisk)时,若想寻找最快、最稳妥的途径,tmpfs 无疑是最佳选择。它并非花哨的新技术,而是 Linux 内核中经过长期验证、广泛使用的文件系统。从底层看,tmpfs 直接基于虚拟内存(即页缓存)构建,无需格式化即可使用,不会一次性占用大量内存,还能优雅地利用交换空间(swap)。当物理内存紧张时,它占用的空间可被动态回收。操作也极为简便,一条 mount 命令即可完成。相比之下,像 /dev/ram0 这类古老的块设备方案,在当前内核中已基本被淘汰,配置复杂且容易出错,实在没有继续使用的必要。

实际上,tmpfs 并不模拟块设备,而是直接利用内核的内存页缓存机制。这意味着它无需格式化——不像传统硬盘那样需要先创建文件系统;它也不会固定占用内存,用多少占多少,未使用的空间会自动返还给操作系统。此外,它还支持回写至 swap,当物理内存不足时,tmpfs 的数据可被交换到磁盘,避免系统因内存耗尽而崩溃。最核心的操作,就是下面这一行命令:
sudo mkdir -p /mnt/ramdisk sudo mount -t tmpfs -o size=2G,mode=777 tmpfs /mnt/ramdisk
这里有几点值得留意:
• size=2G:该参数是硬性上限,告诉系统此内存盘最大占用 2GB 空间。若写入数据超过此值,会提示“No space left on device”,而非触发 Out-Of-Memory (OOM) killer,这是它非常友善的设计。
• mode=777:这使目录对所有用户开放读写权限,本地测试很方便。但在生产环境中,建议根据实际需求收紧权限,安全第一。
• 关于执行:若未加 noexec 参数,甚至可以直接在这个内存盘里运行二进制文件。加上 noexec 后更安全,能禁止执行其中的程序。
挂载后,可以用 df -h | grep tmpfs 来确认。如果看到一行 /mnt/ramdisk 且大小与设定一致,就说明成功了。
不过,若希望开机时自动挂载这个内存盘,直接写入 /etc/fstab 有时会出问题。因为系统启动早期,各服务、设备依赖关系尚未完全建立,直接挂载可能失败。此时,推荐配合 systemd 的 x-systemd.automount 选项。一个稳妥的 /etc/fstab 条目如下:
tmpfs /mnt/ramdisk tmpfs size=2G,mode=777,defaults,x-systemd.automount 0 0
这里,defaults 包含一系列基础选项,如 rw(读写)、exec(允许执行)等。而 x-systemd.automount 是关键——它告诉 systemd,不要急着在启动序列中硬挂载这个盘,而是当有程序首次访问 /mnt/ramdisk 目录时,再自动挂载。这巧妙绕过了启动早期的时序冲突。另外,像 noatime 这类参数无需添加,因为 tmpfs 本身不记录访问时间,加它反而多余,甚至可能干扰依赖时间戳的工具。修改完 /etc/fstab 后,记得执行 sudo systemctl daemon-reload,然后用 sudo systemctl restart local-fs.target 来测试,或者直接重启系统验证是否生效。
那为什么还要提 /dev/ram0 这个老古董呢?因为它确实还有极少数特殊用途。但必须清醒:时代已经变了。该方案依赖 brd(block ramdisk)内核模块,而大多数现代发行版默认不加载它。你不仅需要手动 modprobe brd 并指定大小,还得像操作真实硬盘一样,先用 mkfs.ext4 格式化,再挂载。步骤多不说,它还有一个致命短板:内存占用是刚性的。哪怕只存入一个 1KB 的文件,它也会牢牢锁住你分配的全部内存(比如 2GB),无法动态释放,这是对内存的巨大浪费。而且,在 /etc/fstab 里写 /dev/ram0 也很不靠谱,启动时设备节点可能还没出现,导致挂载失败,严重时甚至让整个系统初始化卡死。所以,除非万不得已——比如你真需要块设备的语义去做 dd 镜像、loop 设备测试,或者要兼容某个只认块设备的古老驱动程序——否则,请忘了它吧。所有现代场景,tmpfs 都是不二之选。
最后,也是大家容易纠结的问题:这个内存盘的容量到底设多大?答案很简单,完全看你的具体用途,而不是像以前某些教程所说的“预留物理内存的50%”。这种经验之谈已经过时,而且很危险,因为 Linux 的 page cache 和 tmpfs 共享同一片内存池,设得太大会严重挤压其他进程的可用空间。
那么,不同场景下如何估算?
• 如果是用来缓存编译生成的中间文件(比如 ccache),512MB 到 1GB 通常绰绰有余。
• 如果是放置 Web 服务的 session 数据,可以先粗略估算:假设每个 session 平均 100KB,有 1000 个并发,那就是 100MB,再加 50% 的余量,约 150MB 就够了。
• 如果数据库要用它来做临时表或排序区域,那就得参考数据库的 sort_buffer_size 等参数乘以并发数来算,一般向上取整到 512MB 或 1GB。
但这里要泼一盆冷水:无论你的内存盘跑得多快、多方便,有一个事实必须牢记——里面的数据是“断电即丢”的。所以,任何存进内存盘里的重要数据,都必须在磁盘或固态硬盘上有个落盘的备份机制。那种用 cp 命令做定时同步的做法,只是缓解,解决不了根本问题。真正的解决方案是,把内存盘当作一个快速缓存层,而数据的持久化存储,始终要依赖磁盘或其他非易失性存储。
