惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
GRAHAM CLULEY
T
Tenable Blog
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
S
Security Affairs
NISL@THU
NISL@THU
O
OpenAI News
Attack and Defense Labs
Attack and Defense Labs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Schneier on Security
Schneier on Security
S
SegmentFault 最新的问题
S
Schneier on Security
G
Google Developers Blog
V
V2EX
C
Check Point Blog
U
Unit 42
Google DeepMind News
Google DeepMind News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
M
MIT News - Artificial intelligence
S
Secure Thoughts
博客园 - 司徒正美
Recorded Future
Recorded Future
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
K
Kaspersky official blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
AI
AI
博客园 - 聂微东
N
News and Events Feed by Topic
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
Recent Commits to openclaw:main
Recent Commits to openclaw:main
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
Project Zero
Project Zero
W
WeLiveSecurity
博客园 - Franky

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Reeds-Shepp 曲线 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 手眼标定 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误 Ubuntu 使用 Clash For Linux 客户端
Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录
Yiwei Zhang · 2025-07-09 · via 又见苍岚

Ubuntu 的内核自动升级导致 Mongodb 无法正常启动,没有找到解决方案,本文记录问题出现和解救的过程。

问题描述

服务器在 2025.07.08 Ubuntu 22.04 自动升级系统内核,从 6.8.0-52-generic 升级到 6.8.0-60-generic

之后 MongoDB 7.0.12 便无法正常启动

  • 日志中显示 WiredTiger 存储引擎遇到了严重的损坏问题,关键错误信息

    1
    2
    3
    WiredTiger error: WT_TRY_SALVAGE: database corruption detected
    __wt_turtle_read: fatal turtle file read error
    WT_PANIC: WiredTiger library panic

    核心问题是WiredTiger存储引擎无法读取WiredTiger.turtle文件,这是存储元数据的关键文件。

  • 在 Docker 的错误日志中最后一句,错误码 6:

    1
    subprocess.CalledProcessError: Command '['mongod', '--configsvr', '--directoryperdb', '--replSet', 'fates-mongo-config', '--bind_ip_all']' died with <Signals.SIGABRT: 6>.

挣扎过程记录

Mongo 啊,崩了啊,天塌了

  1. 尝试修复 MongoDB
1
docker run -it --rm   -v /data/mongo/db:/data/db mongodb/mongodb-community-server:7.0.12-ubuntu2204   mongod --repair --directoryperdb 

依然报错。

  1. 尝试更加激进的修复
1
docker run -it --rm   -v /data/mongo/db:/data/db mongodb/mongodb-community-server:7.0.12-ubuntu2204   mongod --repair --directoryperdb --wiredTigerEngineConfigString="salvage=true"

修复没有成功,修复报错检测到硬件级的数据损坏(checksum 不匹配):

1
potential hardware corruption, read checksum error for 4096B block at offset 16384

多次尝试恢复失败:

1
2
Failed to start up WiredTiger under any compatibility version
Failed to salvage WiredTiger metadata

最终错误:

1
2
-31809: WT_TRY_SALVAGE: database corruption detected

重新运行 MongoDB 依然报错,但是错误信息变了,错误码 14。

1
subprocess.CalledProcessError: Command '['mongod', '--repair', '--dbpath', '/data/db', '--directoryperdb', '--wiredTigerEngineConfigString=salvage=true', '--bind_ip_all']' returned non-zero exit status 14.
  1. 硬件状态检查

    此时怀疑硬件出错,检查了半天硬盘、Raid,都没有问题。

  2. 数据回溯

    无奈没有检查到问题原因,启动群晖的数据恢复功能,回档了一个月,我确定那时候的数据库是可以用的。

    当数据回溯结束后再次启动 MongoDB 时,却依然报错 !!!! ???

    • 错误码还是 14

    此时基本可以确定不是 MongoDB 、文件、硬盘的问题,八成是内核升级导致的不兼容问题。

  3. 检查系统内核升级记录

    查看已安装的内核:

    1
    2
    3
    4
    5
    6
    7
    8
    apt list --installed | grep linux-image

    -->
    WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

    linux-image-6.8.0-52-generic/jammy-updates,jammy-security,now 6.8.0-52.53~22.04.1 amd64 [已安装,自动]
    linux-image-6.8.0-60-generic/jammy-updates,jammy-security,now 6.8.0-60.63~22.04.1 amd64 [已安装,自动]
    linux-image-generic-hwe-22.04/jammy-updates,jammy-security,now 6.8.0-60.63~22.04.1 amd64 [已安装,自动]

    发现有多个版本,存在版本切换的可能

    查看内核启动日志

    1
    2
    3
    4
    5
    6
    7
    8
    $ sudo journalctl -k --list-boots

    -->
    -5 e1093f0931924eea9f9ea8649be2d057 Wed 2025-02-05 05:45:33 CST—Fri 2025-02-07 10:24:25 CST
    -4 7d68ae798d8746c1bca73101205d7f95 Fri 2025-02-07 10:28:20 CST—Tue 2025-02-11 09:30:08 CST
    -3 ca1b8e8e753e4e15993b193dfc1e79fc Tue 2025-02-11 09:33:52 CST—Thu 2025-02-13 12:28:32 CST
    -2 7ba7c096953445eebb8191bff3897ec5 Thu 2025-02-13 12:32:14 CST—Thu 2025-06-26 18:32:10 CST
    -1 05b99060b7894fdb8c91c6c58dbfcbea Tue 2025-07-08 09:19:50 CST—Wed 2025-07-09 13:12:58 CST

    我的问题就是出现在 2025-07-08,当时确实出现了内核版本切换

    查看某次启动的内核版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sudo journalctl -k -b  | grep "Linux version"    # 当前内核
    Jul 09 13:14:44 bolight-PowerEdge-T640 kernel: Linux version 6.8.0-52-generic (buildd@lcy02-amd64-099) (x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 (Ubuntu 6.8.0-52.53~22.04.1-generic 6.8.12)

    sudo journalctl -k -b -1 | grep "Linux version" # 上次切换
    Jul 08 09:19:50 bolight-PowerEdge-T640 kernel: Linux version 6.8.0-60-generic (buildd@lcy02-amd64-098) (x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #63~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 22 19:00:15 UTC 2 (Ubuntu 6.8.0-60.63~22.04.1-generic 6.8.12)

    sudo journalctl -k -b -2 | grep "Linux version" # 上上次
    Feb 13 12:32:14 bolight-PowerEdge-T640 kernel: Linux version 6.8.0-52-generic (buildd@lcy02-amd64-099) (x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 (Ubuntu 6.8.0-52.53~22.04.1-generic 6.8.12)

    可以看到,原本 2月份的内核 (6.8.0-52) 在 7月8日 切换到了 6.8.0-60,导致问题出现,直到我切换回 6.8.0-52。

  4. 切换回原来的内核后重启 MongoDB

    • 方法一:临时方法(推荐先尝试)
    1
    2
    sudo grub-reboot 'Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-52-generic'
    sudo reboot

    这会让你下次启动时使用 6.8.0-52 内核。

    • 方法二:永久方法

    编辑 /etc/default/grub 文件:

    1
    sudo vim /etc/default/grub

    找到 GRUB_DEFAULT 行,修改为:

    1
    GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-52-generic"

    然后更新 GRUB:

    1
    2
    sudo update-grub
    sudo reboot

    仍然报错 14

    此时是因为数据恢复后数据本是正确的,但是我用过高版本的内核启动过这些 MongoDB,又给改坏了,导致降低内核版本后仍无法读取

  5. 再次回溯数据

    MongoDB 仍然无法正常运行,这是一次失败的抢救,记录于此 …

关闭内核升级

方法一:使用 apt-mark hold 锁定内核版本

  • 查看当前内核版本
1
2
3
uname -r

6.8.0-52-generic

  • 锁定内核相关包,防止自动升级
1
2
3
4
5
6
7
8
sudo apt-mark hold linux-image-generic linux-headers-generic
sudo apt-mark hold linux-image-$(uname -r) linux-headers-$(uname -r)

-->
linux-image-generic 设置为保留。
linux-headers-generic 设置为保留。
linux-image-6.8.0-52-generic 设置为保留。
linux-headers-6.8.0-52-generic 设置为保留。

  • 验证是否锁定成功:
1
2
3
4
5
$ apt-mark showhold
linux-headers-6.8.0-52-generic
linux-headers-generic
linux-image-6.8.0-52-generic
linux-image-generic

这样 apt upgradeunattended-upgrades 就不会自动升级内核。

方法二:禁用 unattended-upgrades 自动更新内核

Ubuntu 默认启用 unattended-upgrades 自动更新,我们可以配置它不更新内核。

  • 编辑 unattended-upgrades 配置
1
sudo vim /etc/apt/apt.conf.d/50unattended-upgrades
  • 找到以下行:
1
2
3
4
5
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}ESM:${distro_codename}";
};
  • Allowed-Origins 后面添加:
1
2
3
4
5
Unattended-Upgrade::Package-Blacklist {
"linux-image-*";
"linux-headers-*";
"linux-modules-*";
};
  • 重启 unattended-upgrades
1
sudo systemctl restart unattended-upgrades
  • 验证是否生效
1
sudo unattended-upgrade --dry-run --debug

检查输出是否跳过了 linux-image-*linux-headers-* 相关包。

文章链接:
https://www.zywvvd.com/notes/coding/dataset/ubuntu-kernel-mongo-error/ubuntu-kernel-mongo-error/