影评周公子 2026-02-22 14:20 采纳率: 98.9%
浏览 0
已采纳

Ubuntu扩大swap分区时,为何系统重启后swap未生效?

在Ubuntu中通过`fallocate`或`dd`创建新swap文件并启用(`swapon`)后,若未同步更新`/etc/fstab`,系统重启后swap将无法自动挂载——这是swap未生效的最常见原因。此外,还可能存在:① fstab中swap条目格式错误(如缺少`sw`选项、UUID误用或路径不一致);② 新swap文件权限过于宽松(需`chmod 600`,否则内核拒绝启用);③ `swapon --show`显示未加载,但`cat /proc/swaps`为空,表明未被识别;④ 使用LVM或加密卷时未正确配置initramfs(需`update-initramfs -u`)。特别注意:Ubuntu 22.04+默认使用systemd-swap或zram,手动配置swap文件可能被覆盖。排查应按序执行:验证fstab语法(`sudo swapon --verify`)、检查日志(`journalctl -b | grep -i swap`)、确认文件权限与挂载状态。忽略任一环节均会导致“扩大了却没用”的典型现象。
  • 写回答

1条回答 默认 最新

  • 请闭眼沉思 2026-02-22 14:20
    关注
    ```html

    一、现象层:为什么“swap扩大了却没用”?

    典型症状包括:free -h 显示 swap 仍为 0,swapon --show 无输出,但 ls -lh /swapfile 确认文件存在且大小正确。该现象本质是运行时生效 ≠ 持久化生效——手动执行 sudo swapon /swapfile 仅作用于当前会话,重启即失效。

    二、配置层:/etc/fstab 是持久化挂载的唯一权威来源

    • ✅ 正确条目示例:/swapfile none swap sw 0 0
    • ❌ 常见错误:
      • 误写为 swap defaults(缺少 sw 挂载选项)
      • 使用 UUID 但未通过 blkid /swapfile 验证(swap 文件无 UUID!仅块设备有)
      • 路径不一致:创建时为 /swapfile,fstab 中写成 /var/swap

    三、安全层:内核强制执行的最小权限模型

    Linux 内核自 2.6.39 起要求 swap 文件必须满足:st_uid == 0 && st_mode & 077 == 0(即仅 root 可读写)。若执行过 chmod 644 /swapfilechown nobody:nogroup /swapfile,则 swapon 将静默失败——dmesg | grep -i swap 会输出 swapon: /swapfile: insecure permissions 0644, 0600 recommended

    四、状态验证层:双源交叉校验机制

    命令作用关键判据
    swapon --show列出已激活的 swap 设备空输出 = 未启用
    cat /proc/swaps内核级 swap 注册表空 = 未被识别(甚至未通过校验)
    sudo swapon --verify /swapfile语法+权限+格式预检返回 0 表示 fstab 条目可安全启用

    五、启动栈层:initramfs 与 systemd 的协同盲区

    当 swap 文件位于 LVM 卷(如 /dev/vg0/lv_swap)或加密设备(/dev/mapper/luks-swap)时,initramfs 必须包含对应模块及映射规则。否则,内核在 rootfs 挂载前无法访问 swap 设备。修复步骤:

    1. 确认 /etc/crypttab/etc/lvm/cache 已配置
    2. 执行 sudo update-initramfs -u -k all
    3. 验证 lsinitramfs /boot/initrd.img-$(uname -r) | grep -E "(lvm|crypt)"

    六、生态适配层:Ubuntu 22.04+ 的 systemd-swap 干扰机制

    Ubuntu 自 22.04 起默认启用 systemd-swap 服务(systemctl is-active systemd-swap),它会动态管理 zram、zswap 及 swap 文件。若用户手动创建 /swapfile 并写入 fstab,该服务可能在启动时:

    • 覆盖 fstab 解析逻辑(优先加载 /etc/systemd/swap.conf
    • 自动禁用传统 swap 文件(日志中可见 Ignoring swap file due to systemd-swap policy

    七、诊断流程图:结构化排错路径

    flowchart TD
      A[重启后 swap 未生效] --> B{swapon --show 为空?}
      B -->|是| C[journalctl -b | grep -i swap]
      B -->|否| D[检查 /proc/swaps 与 free -h 是否一致]
      C --> E[是否有 “insecure permissions” 或 “open failed”]
      E -->|权限问题| F[chmod 600 /swapfile && chown root:root /swapfile]
      E -->|fstab 错误| G[sudo swapon --verify /swapfile]
      G -->|失败| H[修正 /etc/fstab 格式]
      G -->|成功| I[sudo swapon /swapfile]
      I --> J[验证是否进入 /proc/swaps]
    

    八、加固实践:原子化部署脚本范式

    以下为生产环境推荐的一键部署片段(含幂等性与回滚):

    #!/bin/bash
    SWAPFILE="/swapfile"
    SWAPSIZE="4G"
    
    # 创建并校验
    sudo fallocate -l $SWAPSIZE $SWAPFILE || sudo dd if=/dev/zero of=$SWAPFILE bs=1M count=$(($SWAPSIZE/1M)) status=progress
    sudo chmod 600 $SWAPFILE
    sudo mkswap $SWAPFILE
    
    # 永久化 fstab(避免重复追加)
    if ! grep -q "$SWAPFILE" /etc/fstab; then
      echo "$SWAPFILE none swap sw 0 0" | sudo tee -a /etc/fstab
    fi
    
    # 启用并验证
    sudo swapon $SWAPFILE
    sudo swapon --verify $SWAPFILE &>/dev/null && echo "✓ Swap validated" || exit 1
    

    九、日志深挖:journalctl 的高价值过滤组合

    精准定位失败根因需组合过滤:

    • journalctl -b -u systemd-swap --no-pager —— 查看 systemd-swap 服务行为
    • journalctl -b | grep -E "(swapon|swapoff|Unable to activate|invalid argument)"
    • dmesg -T | grep -i -A2 -B2 swap —— 内核早期初始化阶段错误

    十、版本演进对照表:Ubuntu LTS 与 swap 管理策略变迁

    Ubuntu 版本默认 swap 策略关键变更点人工干预风险
    18.04 LTS纯 fstab + swapon无 systemd-swap低(直接编辑 fstab 即生效)
    20.04 LTSfstab 主导,可选 systemd-swapsystemd-swap 默认禁用中(需确认服务状态)
    22.04 LTS+systemd-swap 主导 + zram 优先swap 文件需显式在 /etc/systemd/swap.conf 中声明高(fstab 条目可能被忽略)
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 2月23日
  • 创建了问题 2月22日