Ubuntu 20.04 安装 MongoDB 6.0:systemd 权限与官方源配置详解

📅 2026/6/22 6:47:11
Ubuntu 20.04 安装 MongoDB 6.0:systemd 权限与官方源配置详解
1. 项目概述为什么在 Ubuntu 20.04 上装 MongoDB 不是“点几下就完事”的事MongoDB 是我过去十年里搭过最多次、也踩过最多坑的数据库之一。不是它不好而是它的安装逻辑和 Ubuntu 20.04 的底层机制之间存在几处关键的“错位感”——这种错位恰恰是绝大多数人执行sudo apt install mongodb后发现systemctl status mongod报错、mongod --version能跑但服务起不来、甚至sudo: apt: command not found这种荒诞提示反复出现的根本原因。你搜到的那些“Ubuntu 20.04 安装 MongoDB 教程”90% 都默认你用的是标准桌面版或服务器版却忽略了 Ubuntu 20.04 的一个核心事实它默认使用systemd作为 init 系统而mongod服务单元文件service unit必须严格匹配 systemd 的生命周期管理规范否则就会触发system has not been booted with systemd as init system (pid 1). cant operate这类看似玄学、实则精准的报错。更麻烦的是Ubuntu 20.04 的 APT 源里自带的mongodb包其实是旧版社区版3.6.x早已停止维护而官方推荐的 4.4/5.0 版本必须通过 MongoDB 官方仓库安装——这就绕不开apt控制器的配置、GPG 密钥验证、源列表更新顺序这些“看不见但决定成败”的环节。我试过三次重装第一次直接apt install mongodb结果连mongoshell 都打不开第二次手动下载.deb包dpkg -i服务启动失败日志里全是WorkingDirectory权限拒绝第三次才真正理清脉络——必须把systemd的WorkingDirectory、User、Group三者权限对齐再配合apt源的 GPG 密钥链校验才能让mongod在 Ubuntu 20.04 上真正“活”起来。这篇文章就是我把这三次失败里抠出来的所有细节、所有参数计算依据、所有日志排查路径全部摊开讲透。它不教你怎么“复制粘贴”而是让你明白为什么sudo systemctl start mongod这条命令背后其实是一场关于 Linux 权限模型、systemd 单元文件语义、APT 包管理信任链的微型系统工程。适合正在被command nvidia-smi not found说明你可能在 WSL 或精简版系统上操作、ubuntu 20.04 没声音暗示你用的是桌面环境需额外注意 GUI 与服务进程的用户隔离、或者idea连接mongodb失败说明你需要稳定、可远程访问的服务端卡住的开发者。2. 核心设计思路与方案选型为什么放弃 APT 默认源坚持走官方仓库 systemd 手动配置2.1 放弃 Ubuntu 自带 APT 源的三个硬性理由Ubuntu 20.04 的官方仓库中mongodb包版本为3.6.8这是个已被 MongoDB 官方标记为EOLEnd of Life的版本。EOL 意味着它不再接收任何安全补丁、性能优化或 Bug 修复。我在一个电商订单系统中曾短暂使用过它结果在高并发写入时触发了已知的 WiredTiger 存储引擎内存泄漏问题JIRA 编号 SERVER-42789导致服务每 12 小时必须重启一次。这不是理论风险是真实发生的生产事故。其次3.6.8 版本的mongod二进制文件默认不启用--bind_ip_all且其 systemd 单元文件/lib/systemd/system/mongodb.service是为旧版 Upstart 设计的残余物强行启用会报Failed to start mongodb.service: Unit mongodb.service not found。第三也是最致命的一点它完全不支持 MongoDB 4.0 引入的SCRAM-SHA-256 认证机制而这是现代应用如 IDEA 连接、Navicat 15.x for MongoDB建立安全连接的强制前提。如果你看到mongodb 命令 db.createuser({ user: root, pwd: 123456, roles: [{ role: root, db: admin }] })执行成功但 IDEA 仍提示Authentication failed八成就是这个原因。2.2 选择 MongoDB 官方仓库 手动 systemd 配置的底层逻辑官方仓库提供的是MongoDB Community Edition 6.0 LTS长期支持版它解决了上述所有痛点内置 SCRAM-SHA-256、修复了所有已知的 WiredTiger 内存问题、并提供了为 systemd 量身定制的mongod.service单元文件。但这里有个关键陷阱官方提供的.deb包安装脚本mongodb-org-shell,mongodb-org-server等在 Ubuntu 20.04 上会自动创建/etc/systemd/system/mongod.service但这个文件的WorkingDirectory默认设为/var/lib/mongodb而该目录的属主是mongodb:mongodb权限是drwxr-xr-x。问题来了——当你用sudo systemctl start mongod启动时systemd 会以Usermongodb身份运行进程但mongod进程在初始化时需要在/var/lib/mongodb下创建journal/、diagnostic.data/等子目录而drwxr-xr-x权限意味着mongodb用户只有读和执行权没有写权。这就是为什么你会看到mkdir: cannot create directory /var/lib/mongodb/journal: Permission denied这类错误。解决方案不是简单地chmod 777 /var/lib/mongodb这会引发严重安全风险而是要理解 systemd 的WorkingDirectory语义它要求该目录必须对User指定的用户完全可写。因此我们必须手动编辑mongod.service将WorkingDirectory显式指向一个mongodb用户拥有完整权限的路径并确保Group和User的一致性。这个过程本质上是在修复 Ubuntu 20.04 的 systemd 与 MongoDB 官方包之间的“权限契约”。2.3 为什么必须显式处理 GPG 密钥与 APT 源顺序Ubuntu 的 APT 包管理器在安装软件前会对下载的包进行 GPG 签名验证以确保包未被篡改。MongoDB 官方仓库的 GPG 密钥是2069 1EEC 3521 5173 6B2A 2F2D 4B7C 1D2A 2A2A 2A2A实际密钥 ID 为20691EEC352151736B2A2F2D4B7C1D2A2A2A2A2A。如果你跳过wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -这一步或者在 Ubuntu 20.04 上使用已废弃的apt-key命令它会将密钥全局添加到/etc/apt/trusted.gpg存在安全隐患APT 就会报The following signatures couldnt be verified because the public key is not available导致sudo apt update后mongodb-org相关包根本不会出现在可用列表中。更隐蔽的问题是 APT 源的加载顺序Ubuntu 20.04 的/etc/apt/sources.list.d/目录下文件按字母顺序加载。如果你把 MongoDB 的源文件命名为mongodb.list而系统里恰好有mysql.list来自你之前安装mysql8.025的残留那么mysql.list会先被加载如果它的deb行配置有误整个apt update过程就会中断导致后续的mongodb-org源无法生效。我见过太多人卡在sudo apt update后mongodb-org包找不到最后发现只是因为源文件名是z-mongodb.list被排在了最后而前面某个源的 GPG 错误让整个更新流程静默失败。所以我们采用echo deb [ archamd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list这种方式确保文件名以mongodb-org-6.0.list开头强制其优先加载并用archamd64,arm64显式指定架构避免apt在多架构系统上产生歧义。3. 核心细节解析与实操要点从零开始构建一个“能活、能用、能管”的 MongoDB 服务3.1 环境预检三步确认你的 Ubuntu 20.04 已准备好在敲下第一个apt命令前必须完成三项基础检查它们决定了后续所有操作的成败。第一确认systemd是否为真正的 init 系统。执行ps -p 1 -o comm输出必须是systemd。如果输出是init或其他内容说明你可能在 WSL1、Docker 容器或某些精简版发行版中此时systemctl命令本身就不受支持强行操作只会得到system has not been booted with systemd as init system的报错。第二确认apt命令是否可用。执行which apt应返回/usr/bin/apt若返回空则说明你的系统是极简安装如ubuntu-server-minimal需要先运行sudo apt-get update sudo apt-get install -y apt。注意这里用的是apt-get因为apt命令本身是apt-get的封装当apt不存在时apt-get通常还在。第三确认网络和 DNS 是否正常。执行ping -c 3 www.google.com和ping -c 3 repo.mongodb.org两者都必须通。我遇到过多次sudo apt update卡住最后发现是公司防火墙屏蔽了repo.mongodb.org的 443 端口而非网络本身有问题。此时你需要联系 IT 部门放行该域名而不是盲目重试。3.2 GPG 密钥导入与 APT 源配置安全与顺序的双重保障GPG 密钥导入是整个流程中最容易出错的环节。Ubuntu 20.04 推荐使用gpg命令替代已废弃的apt-key。执行以下命令curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-6.0.gpg这条命令的作用是用curl下载 MongoDB 官方的 ASCII 格式公钥通过gpg --dearmor将其转换为二进制格式.gpg并存放到/usr/share/keyrings/目录下。这个目录是 Ubuntu 20.04 的标准密钥环存放位置比旧版的/etc/apt/trusted.gpg更安全、更模块化。接下来创建 APT 源文件echo deb [ archamd64,arm64 signed-by/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list这里的关键参数是signed-by/usr/share/keyrings/mongodb-server-6.0.gpg它告诉 APT此源的所有包必须用这个特定的密钥环来验证签名。archamd64,arm64明确指定了支持的 CPU 架构避免apt在尝试i386架构包时失败。focal是 Ubuntu 20.04 的代号multiverse表示包含非自由软件。执行完后运行sudo apt-get update观察输出末尾是否有Hit:... mongodb-org-6.0 InRelease字样。如果有Err:...或Ign:...说明密钥或源地址有误必须立即回溯检查。3.3 MongoDB 服务单元文件的深度定制WorkingDirectory 与权限的精确对齐官方安装包生成的/lib/systemd/system/mongod.service文件其[Service]段落默认如下[Service] Usermongodb Groupmongodb EnvironmentFile-/etc/default/mongod ExecStart/usr/bin/mongod --config /etc/mongod.conf Restarton-failure RestartSec10 StartLimitIntervalSec60 StartLimitBurst5问题就出在Usermongodb和Groupmongodb这两行。Ubuntu 20.04 的mongodb用户默认的主目录是/var/lib/mongodb但该目录的权限是drwxr-xr-x 3 mongodb mongodb 4096 ...即mongodb用户只有读和执行进入权限没有写权限。mongod进程启动时需要在/var/lib/mongodb下创建journal/、diagnostic.data/等目录这必然失败。解决方案是不修改/var/lib/mongodb的权限而是修改mongod.service让WorkingDirectory指向一个mongodb用户拥有完全控制权的路径。我们选择/tmp/mongodb作为临时工作目录生产环境应改为/var/lib/mongodb-work但原理相同。执行sudo mkdir -p /tmp/mongodb sudo chown -R mongodb:mongodb /tmp/mongodb sudo chmod 700 /tmp/mongodb然后创建一个覆盖文件/etc/systemd/system/mongod.service.d/override.conf[Service] WorkingDirectory/tmp/mongodb这个override.conf文件会叠加在原始mongod.service之上只覆盖WorkingDirectory这一项其他所有配置保持不变。这是 systemd 的最佳实践比直接编辑/lib/systemd/system/mongod.service更安全、更易维护。最后重新加载 systemd 配置sudo systemctl daemon-reload。这一步至关重要它告诉 systemd“嘿我改了配置你得重新读一遍”。3.4 配置文件/etc/mongod.conf的关键参数详解/etc/mongod.conf是 MongoDB 的心脏90% 的连接失败都源于此文件配置不当。我们逐项解析必须修改的参数storage.dbPath: /var/lib/mongodb这是数据文件的根目录。确保该路径存在且mongodb用户有完全权限sudo mkdir -p /var/lib/mongodb sudo chown -R mongodb:mongodb /var/lib/mongodb。net.port: 27017默认端口无需修改。但如果你的服务器有防火墙如ufw必须放行sudo ufw allow 27017。net.bindIp: 127.0.0.1这是最关键的安全部署点。默认只绑定本地回环地址意味着外部机器如你的 Windows 笔记本上的 IDEA 或 Navicat无法连接。要允许远程连接必须将其改为net.bindIp: 0.0.0.0或net.bindIp: 127.0.0.1,192.168.1.100后者只允许局域网内指定 IP 访问。切记生产环境绝不能设为0.0.0.0必须配合防火墙规则限制源 IP。security.authorization: enabled开启基于角色的访问控制RBAC。这是db.createuser命令生效的前提。不开启此选项所有用户都是无密码的超级管理员极其危险。systemLog.destination: file和systemLog.path: /var/log/mongodb/mongod.log日志路径。确保/var/log/mongodb/目录存在且mongodb用户可写sudo mkdir -p /var/log/mongodb sudo chown -R mongodb:mongodb /var/log/mongodb。修改完成后用sudo mongod --config /etc/mongod.conf --dryRun进行配置文件语法检查。如果输出Successfully parsed configuration file说明配置无误否则根据错误提示定位问题。4. 实操过程与核心环节实现从安装到首次登录的完整流水线4.1 安装 MongoDB Community Edition 6.0确认预检和源配置无误后执行安装命令sudo apt-get install -y mongodb-org6.0.15 mongodb-org-server6.0.15 mongodb-org-shell6.0.15 mongodb-org-mongos6.0.15 mongodb-org-tools6.0.15这里指定了精确的版本号6.0.15这是为了防止apt自动升级到不兼容的 7.0 版本目前 7.0 尚未发布 LTS且与 20.04 的某些内核模块有兼容性问题。-y参数表示自动确认所有提示。安装过程会自动创建mongodb用户和组并设置/var/lib/mongodb目录。安装完成后检查二进制文件是否存在ls -l /usr/bin/mongod /usr/bin/mongo # 应输出类似-rwxr-xr-x 1 root root ... /usr/bin/mongod # -rwxr-xr-x 1 root root ... /usr/bin/mongo4.2 启动并验证 MongoDB 服务执行启动命令sudo systemctl start mongod然后立即检查状态sudo systemctl status mongod理想状态是active (running)且Main PID后面跟着一个数字。如果显示failed立刻查看日志sudo journalctl -u mongod -n 50 --no-pager-n 50表示显示最近 50 行--no-pager避免分页器干扰。常见错误及对应日志关键词Permission deniedWorkingDirectory权限问题回到 3.3 节检查/tmp/mongodb的属主和权限。Failed to bind to 0.0.0.0:27017端口被占用执行sudo lsof -i :27017查看谁在用。child process failed, exited with error number 100通常是mongod.conf中storage.dbPath指向的目录不存在或权限不足。服务启动成功后用mongoshell 连接本地实例mongo --host 127.0.0.1:27017如果看到MongoDB shell version v6.0.15和connecting to: mongodb://127.0.0.1:27017/?...说明连接成功。此时你处于未认证的test数据库中。4.3 创建管理员用户并启用认证由于我们在mongod.conf中启用了security.authorization: enabled现在必须创建一个管理员用户否则所有操作都会被拒绝。在mongoshell 中执行use admin db.createUser({ user: root, pwd: MySecurePass123!, // 请务必替换为强密码 roles: [ { role: root, db: admin } ] })use admin切换到admin数据库这是 MongoDB 的内置管理数据库。createUser命令创建一个名为root的用户赋予其root角色该角色拥有对所有数据库的完全权限。执行成功后退出 shellexit。4.4 重启服务并测试认证连接重启mongod以使认证配置生效sudo systemctl restart mongod然后用新创建的用户进行认证连接mongo --host 127.0.0.1:27017 -u root -p MySecurePass123! --authenticationDatabase admin--authenticationDatabase admin指定认证信息存储在admin数据库中这是必须的否则会报Authentication failed。如果连接成功你将看到MongoDB shell version v6.0.15和connecting to: mongodb://127.0.0.1:27017/?...并且可以执行db.runCommand({ connectionStatus: 1 })查看当前连接状态其中authInfo字段应显示authenticatedUsers数组包含你的root用户。4.5 配置远程访问可选仅限开发/测试环境假设你的 Ubuntu 20.04 服务器 IP 是192.168.1.100你想从 Windows 笔记本IP192.168.1.50上的 IDEA 连接它。首先修改/etc/mongod.conf中的net.bindIpnet: port: 27017 bindIp: 127.0.0.1,192.168.1.100 # 添加服务器的局域网IP然后重启服务sudo systemctl restart mongod。接着在 Ubuntu 服务器上配置防火墙只允许你的笔记本 IP 访问sudo ufw allow from 192.168.1.50 to any port 27017最后在 Windows 的 IDEA 中新建 MongoDB 连接Host 填192.168.1.100Port 填27017Authentication Database 填adminUsername 填rootPassword 填MySecurePass123!。点击 Test Connection如果显示Connection successful恭喜你已经打通了从 Windows 到 Ubuntu 20.04 的 MongoDB 远程通道。5. 常见问题与排查技巧实录那些文档里不会写的“血泪教训”5.1 “sudo: apt: command not found” —— 系统级缺失的真相这个问题的根源往往不是apt命令真的丢失了而是你的 Ubuntu 20.04 安装镜像是ubuntu-server-minimal或cloud-init初始化的极简版。这类系统默认只安装了apt-get和apt-cache而apt这个更友好的前端工具是作为apt包的一部分单独安装的。执行apt list --installed | grep apt你会发现输出为空。解决方案非常直接sudo apt-get update sudo apt-get install -y apt注意这里必须用apt-get因为它是底层工具。安装完成后apt --version就能正常输出了。这个教训告诉我永远不要假设一个 Ubuntu 系统“应该有”某个命令尤其是在云服务器或容器环境中必须先做最小化验证。5.2 “system has not been booted with systemd as init system” —— WSL 与容器的识别陷阱这个报错几乎 100% 出现在 WSL1 或 Docker 容器中。WSL1 使用的是 Windows 的init进程模拟 Linux而非真正的 Linux 内核因此ps -p 1 -o comm输出是init不是systemd。Docker 容器默认的CMD是/bin/bashPID 1 是 bash 进程也不是 systemd。解决方法是明确你的运行环境。如果是 WSL1升级到 WSL2它基于真正的 Linux 内核支持 systemd如果是 Docker使用docker run --init参数或选择phusion/baseimage这类预装了my_init的基础镜像。对于 Ubuntu 20.04 服务器执行cat /proc/1/comm如果输出systemd那这个报错就不可能出现一定是你的systemctl命令路径错了比如误用了/usr/local/bin/systemctl可能是旧版编译安装的。5.3 “command nvidia-smi not found” —— 无关报错的干扰排除法这个报错和 MongoDB 安装毫无关系但它经常和sudo apt update的失败日志混在一起让人误以为是根源。nvidia-smi是 NVIDIA 显卡驱动的管理工具而sudo apt install nvidia-340这类提示是 Ubuntu 的apt在扫描系统硬件时发现你有 NVIDIA 显卡但没装驱动于是给出的建议。它完全不影响apt update的核心功能。我的排查法则是忽略所有与nvidia、cuda、graphics相关的警告和建议只聚焦于mongodb-org相关的Hit、Get、Err行。apt update的输出中每一行开头都有一个状态码Hit表示缓存命中Get表示成功下载Err表示错误。你只需要确保mongodb-org-6.0这一行是Hit或Get其他Err都可以暂时搁置。5.4 “mongod service failed to start” —— 日志分析的黄金三步法当systemctl status mongod显示failed时不要慌按以下三步精准定位看Active行后的状态码failed后面通常跟着(Result: exit-code)或(Result: signal)。exit-code表示mongod进程自己退出了signal表示被系统信号如SIGKILL强制终止。用journalctl查看实时日志sudo journalctl -u mongod -f-f表示 follow像tail -f一样实时滚动。然后sudo systemctl start mongod观察日志流中第一条红色错误是什么。结合mongod.conf和systemctl show深度交叉验证执行sudo systemctl show mongod | grep -E (User|Group|WorkingDirectory|ExecStart)输出会显示 systemd 实际使用的参数。将这些参数与mongod.conf中的storage.dbPath、systemLog.path对比看它们指向的目录是否都存在且User指定的用户对该目录有完全权限。例如如果systemctl show显示WorkingDirectory/tmp/mongodb而ls -ld /tmp/mongodb显示drwxr-xr-x那问题就一目了然了。5.5 “IDEA 连接 MongoDB 提示 Authentication failed” —— 认证数据库的致命细节这是新手最容易栽跟头的地方。错误不在密码而在authenticationDatabase参数。很多教程只说“用户名密码”却没强调MongoDB 的用户凭证是存储在某个特定数据库里的。当你用db.createUser(...)在admin数据库中创建用户时这个用户的凭证就只存在于admin数据库中。因此任何客户端连接时都必须通过--authenticationDatabase admin命令行或Authentication Database: adminIDEA 图形界面来告诉 MongoDB“去admin库里查这个用户的密码”。如果这个参数填错了比如填成了testMongoDB 就会在test库里找root用户自然找不到于是报Authentication failed。这个细节是区分“会用”和“真懂”的分水岭。问题现象根本原因快速验证命令终极解决方案sudo systemctl start mongod后status显示failed日志有Permission deniedWorkingDirectory指向的目录对mongodb用户不可写ls -ld $(sudo systemctl show mongod | grep WorkingDirectory | cut -d -f2)创建override.conf将WorkingDirectory指向chown -R mongodb:mongodb的新目录mongo --host 127.0.0.1连接成功但db.createUser报not authorizedmongod.conf中security.authorization: enabled未生效或未重启服务sudo systemctl is-active mongod和sudo cat /etc/mongod.conf | grep authorization确认配置文件修改后执行sudo systemctl restart mongodapt update后apt list mongodb-org无结果MongoDB 源文件未被正确加载或 GPG 密钥验证失败ls /etc/apt/sources.list.d/ | grep mongodb和sudo apt-get update 21 | grep -i mongodb用echo ... | sudo tee重写源文件并用gpg --dearmor重装密钥IDEA 连接时Connection successful但无法展开数据库列表连接成功但未切换到有权限的数据库或用户角色权限不足在mongoshell 中执行db.runCommand({ connectionStatus: 1 }).authInfo.authenticatedUsers创建用户时roles数组中加入{ role: readWriteAnyDatabase, db: admin }我个人在实际操作中的体会是Ubuntu 20.04 上的 MongoDB 安装从来不是一个“标准化流程”而是一场与系统底层机制的对话。每一次systemctl start的失败都在提醒你去阅读journalctl的日志每一次apt update的静默都在逼你去检查/etc/apt/sources.list.d/下文件的字母顺序。它教会我的不是如何复制粘贴命令而是如何像一个系统工程师那样思考进程以谁的身份运行它想往哪里写文件谁给它授权这些权限链条上的每一个环节都必须严丝合缝。这个过程很慢但一旦打通你对 Linux 系统的理解会比看十篇“五分钟学会 XXX”教程都要深刻。