free -h 输出的 Swap 行 total 值即系统休眠可用的交换区总容量,必须 ≥ 当前内存中所有匿名页总和才能成功休眠;若为 0 则无法休眠,多设备时为累加值,且需配合正确的 resume= 内核参数。

free -h 输出的 Swap 行 total 值就是休眠交换区大小
Linux 中没有独立叫“休眠交换区”的概念——系统休眠(hibernate)依赖的是已启用的 swap 分区或 swap 文件,且其容量必须 ≥ 当前内存中所有匿名页(含进程堆、栈、私有匿名映射等)的总和。所谓“休眠交换区大小”,实际就是当前 swapon 激活的 swap 总容量,也就是 free -h 输出中 Swap 行的 total 列数值。
这个值决定了你能否成功休眠:如果 total 小于 MemAvailable(或更严格地说,小于内核估算的需保存页数),systemctl hibernate 会直接失败并报错 Not enough swap space for hibernation。
-
free -h最快,一眼可见:Swap: 2.0Gi 0B 2.0Gi→ 休眠可用空间为 2.0Gi - 若输出中
Swap行total为 0,则说明没启用任何 swap,休眠不可用 - 多个 swap 设备时,
free -h的total是它们的累加值,即系统整体可用来休眠的上限
swapon --show 显示每个 swap 设备的实际 size,确认是否为文件或分区
休眠对 swap 类型有隐含要求:swap 文件在某些内核版本或引导配置下不支持休眠(尤其未用 resume= 参数指定文件 offset 时),而 swap 分区更可靠。用 swapon --show 能看清每个设备的 TYPE 和 SIZE:
例如输出:
NAME TYPE SIZE USED PRIO /dev/sda2 partition 2G 0B -2 /swapfile file 1G 0B -3
这里总容量是 3G,但只有 /dev/sda2 默认可用于休眠;/swapfile 是否生效,取决于内核命令行是否带 resume=/dev/sda2 或 resume=UUID=... —— 它不认文件路径。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 检查
cat /proc/cmdline是否含resume=,且值匹配某个swapon --show中的NAME或UUID -
lsblk -f | grep swap可辅助验证分区是否有 UUID,findmnt -t swap能显示挂载源与标签 - swap 文件即使
swapon成功,也大概率无法用于休眠,除非你手动配置resume_offset并重装 initramfs
/proc/swaps 的 Used 字段单位是 KB,别误当 MB 算
/proc/swaps 是原始数据源,字段对齐严格,但单位容易看错。它的 Size 和 Used 列单位都是 KB(千字节),不是 MB:
$ cat /proc/swaps Filename Type Size Used Priority /dev/sda2 partition 2097148 0 -2
上面 Size 是 2097148 KB ≈ 2.0 GiB,不是 2097 MB。直接除以 1024² 才得 GiB。
- 脚本里解析该文件时,务必用
awk '{print $3/1024/1024 " GiB"}'这类计算,别硬除 1000 -
swapon --show和free -h已自动换算并加单位,更防错 - 若看到
Used非零,说明已有页面被换出,但这和休眠能力无关——休眠只关心Size是否够存整个内存镜像
休眠前必须确保 swap 总量 ≥ 当前内存使用峰值(非实时 used)
很多人误以为只要 free -h 的 Swap used 是 0 就安全,其实不然。休眠需要保存的是 *可能存在的最大匿名内存页集合*,内核用 /sys/power/state 触发前会检查 nr_swap_pages 是否足够,这个值基于 Swap total - Swap used,但还受 vm.swappiness 和内存碎片影响。
- 运行
grep -i "hibernate\|suspend" /var/log/syslog或dmesg | grep -i swap,常能看到类似hibernate: Not enough free swap的提示 - 临时扩容方法:用
dd if=/dev/zero of=/extra-swap bs=1G count=2创建新 swap 文件,再mkswap /extra-swap && swapon --priority 100 /extra-swap - 优先级(
PRIO)越高越先用,设高一点能确保休眠走这块区域;但resume=参数仍需指向它对应的设备路径或 UUID
真正卡住休眠的,往往不是 swap 太小,而是 resume= 指向了不存在或未激活的设备——那个路径必须在 initramfs 启动早期就可访问。

















