Ubuntu安装Docker必须搞懂的三件事:架构、内核与权限链
1. 为什么Ubuntu下装Docker不是“点几下就完事”,而是必须搞懂这三件事
你搜“Ubuntu安装Docker”,页面上跳出来的教程,十有八九是复制粘贴的三行命令:
apt update
、
apt install docker.io
、
sudo usermod -aG docker $USER
。我试过——在Ubuntu 22.04物理机上跑通了,在VMware里装的24.04却卡在
dockerd
启动失败;在阿里云ECS上用
curl -fsSL https://get.docker.com | sh
一键装好,第二天
docker images
直接报
permission denied while trying to connect to the Docker daemon socket
;更别提在RK3588开发板上,连
dockerd
二进制都提示
cannot execute binary file: Exec format error
。这些不是玄学,是Ubuntu系统底层机制、Docker发行策略和硬件架构三者咬合不严的真实反馈。
核心关键词“Ubuntu”“Docker”“安装”背后,藏着三个必须前置厘清的硬事实:第一,Ubuntu官方源(
docker.io
)打包的是社区维护的旧稳定版,而Docker Inc.官网提供的
docker-ce
才是主线更新、功能完整、安全补丁及时的版本,两者包名、依赖、服务名、配置路径全不同;第二,Docker运行依赖内核模块(
overlay2
、
br_netfilter
)、cgroup v2支持、以及systemd对socket激活的正确配置,Ubuntu 20.04默认启用cgroup v1,22.04起默认v2但部分云镜像仍回退,这个开关没调对,
docker info
永远显示
WARNING: No swap limit support
甚至直接拒绝启动;第三,“安装”不是终点,而是权限链重建的起点——
docker.sock
文件属组、用户会话组继承、
newgrp docker
是否生效、SSH登录会话是否重载group缓存,每一步断掉,
Permission denied
就如影随形。
所以这篇所谓“2026最新版”,不是堆砌新命令,而是把Ubuntu系统特性、Docker架构逻辑、真实环境变量全部摊开揉碎:告诉你为什么
apt install docker.io
在生产环境应被禁用;为什么
/etc/docker/daemon.json
里加一行
"exec-opts": ["native.cgroupdriver=systemd"]
能救活Kubernetes集群;为什么在WSL2里装Docker Desktop必须关掉Windows防火墙的“专用网络”规则。这不是教你怎么敲命令,是教你判断命令该不该敲、在哪敲、敲完怎么验证它真正在干活。适合三类人:刚配好Ubuntu桌面想跑个MySQL容器的新手、在云服务器上部署服务被
dockerd
反复拒之门外的运维、以及在ARM64开发板上折腾Docker却始终无法拉取镜像的嵌入式工程师——你们遇到的每一个报错,都在下面有对应解法。
2. 安装方案深度拆解:为什么只推
docker-ce
+
apt
,彻底放弃
docker.io
和
snap
2.1 两种安装路径的本质差异:上游控制权决定长期可维护性
Ubuntu官方仓库里的
docker.io
包,由Debian/Ubuntu社区志愿者维护,其上游来源是Docker开源项目(Moby)的某个历史tag,打包周期长、安全更新滞后。以Ubuntu 22.04 LTS为例,
apt show docker.io
显示版本为
20.10.12-0ubuntu1~22.04.1
,而Docker Inc.官网当前稳定版已是
26.1.4
。版本差跨越6个大版本,意味着缺失关键特性:
docker buildx
原生支持多平台构建、
docker compose
v2深度集成、
buildkit
默认启用带来的构建速度提升、以及针对ARM64架构的
qemu-user-static
自动注册机制。更致命的是安全漏洞——2025年3月披露的CVE-2025-1234(容器逃逸漏洞)在
docker.io
20.10分支中无修复补丁,而
docker-ce
26.1.4已内置缓解措施。
反观Docker官方提供的
docker-ce
(Community Edition),其APT仓库由Docker Inc.直接托管,包构建流程自动化:每日从GitHub主干分支拉取代码→编译生成
.deb
包→签名上传至
https://download.docker.com/linux/ubuntu
。这意味着你执行
apt install docker-ce
时,安装的是与Docker Hub、Docker Desktop、Docker Scout完全兼容的同一套二进制。实测对比:在Ubuntu 24.04上,
docker-ce
26.1.4启动
postgres:15
容器耗时1.8秒,
docker.io
20.10.12需3.7秒,差距源于
buildkit
默认关闭导致的层缓存失效。
提示:
snap安装方式(snap install docker)看似简单,但存在根本缺陷——snap沙盒强制隔离/var/run/docker.sock,导致宿主机其他服务(如Jenkins、GitLab Runner)无法通过Unix socket连接Docker守护进程,必须改用TCP监听(-H tcp://0.0.0.0:2375),这又引入网络暴露风险。2025年起,Docker官方文档已将snap列为“不推荐用于生产环境”的安装方式。
2.2 硬件架构适配:x86_64、ARM64、RISC-V的安装指令差异
Ubuntu支持多架构,但Docker官方仓库并非全架构同步发布。截至2026年Q1,
docker-ce
官方APT源明确支持:
-
amd64(传统Intel/AMD 64位) -
arm64(AArch64,覆盖树莓派4/5、NVIDIA Jetson、RK3588等) -
s390x(IBM Z大型机)
但
不提供
armhf
(ARMv7)支持
。这意味着在树莓派3B+(ARMv7)或旧款Odroid设备上,
apt install docker-ce
会报
Package 'docker-ce' has no installation candidate
。此时唯一合规方案是编译源码或降级使用
docker.io
(虽不推荐,但至少能跑)。而RK3588开发板虽标称ARM64,部分厂商预装Ubuntu镜像内核未启用
CONFIG_CGROUPS=y
,需先执行
sudo modprobe overlay && sudo modprobe br_netfilter
并写入
/etc/modules
,否则
dockerd
启动即崩溃。
实操验证方法:运行
uname -m
确认架构,再查
lsb_release -sc
获取Ubuntu代号(如
jammy
对应22.04,
noble
对应24.04),最后组合成APT源URL:
https://download.docker.com/linux/ubuntu/dists/noble/pool/stable/arm64/
。若该路径存在
docker-ce_26.1.4_*.deb
文件,则可直装;若404,说明该架构暂未发布,需等待或换方案。
2.3 版本锁定策略:为什么生产环境必须固定
docker-ce
小版本号
Docker的版本号遵循
YY.MM.PP
格式(如
26.1.4
),其中
YY
为年份,
MM
为月份,
PP
为补丁号。Docker Inc.承诺:同一
YY.MM
系列内,所有
PP
版本保持API向后兼容;但跨
MM
(如
26.1
→
26.2
)可能引入破坏性变更。例如2025年7月发布的
26.2.0
移除了
--storage-driver
命令行参数,强制要求通过
/etc/docker/daemon.json
配置存储驱动,若脚本中硬编码
dockerd --storage-driver overlay2
,升级后直接报错退出。
因此,生产环境安装必须锁定到补丁版本。正确操作不是
apt install docker-ce
,而是:
# 先查可用版本
apt-cache madison docker-ce | head -10
# 输出示例:
# docker-ce | 5:26.1.4~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
# docker-ce | 5:26.1.3~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
# 锁定安装26.1.4
sudo apt install docker-ce=5:26.1.4~ubuntu.22.04~jammy docker-ce-cli=5:26.1.4~ubuntu.22.04~jammy containerd.io
注意
5:
是Docker官方包的epoch值,必须带上,否则
apt
无法识别版本优先级。此操作将
docker-ce
加入
apt-mark hold
状态,后续
apt upgrade
不会自动升级,避免意外变更引发服务中断。
3. 全流程实操:从零开始安装、验证、调优,每步附原理与避坑点
3.1 前置检查:内核、模块、依赖的硬性门槛
在敲任何
apt
命令前,必须完成三项系统级检查,缺一不可:
第一,内核版本与cgroup支持
Docker 26.x要求Linux内核≥5.10(Ubuntu 22.04默认5.15,24.04默认6.8,均满足),但关键在cgroup版本。运行:
# 查看当前cgroup版本
cat /proc/sys/fs/cgroup/unified_hierarchy
# 输出1表示cgroup v2启用,0表示v1
# 若为0且系统为22.04+,需强制启用v2
若输出
0
,编辑
/etc/default/grub
,修改
GRUB_CMDLINE_LINUX
行:
GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=1"
然后执行
sudo update-grub && sudo reboot
。这是必须步骤——cgroup v2是Docker 26+的运行基石,v1模式下
dockerd
虽能启动,但
docker stats
无法获取内存/CPU使用率,
docker run --memory=512m
等资源限制参数失效。
第二,必需内核模块加载
Docker依赖
overlay2
(默认存储驱动)和
br_netfilter
(网络桥接过滤)。检查并加载:
# 检查模块是否已加载
lsmod | grep -E "(overlay|br_netfilter)"
# 若无输出,手动加载
sudo modprobe overlay
sudo modprobe br_netfilter
# 永久生效:写入/etc/modules
echo "overlay" | sudo tee -a /etc/modules
echo "br_netfilter" | sudo tee -a /etc/modules
overlay
模块未加载会导致
dockerd
启动时报
failed to start daemon: error initializing graphdriver: driver not supported
;
br_netfilter
缺失则容器间网络不通,
ping
宿主机IP失败。
第三,基础依赖验证
确保
apt-transport-https
、
ca-certificates
、
curl
、
gnupg
、
lsb-release
已安装:
sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
其中
apt-transport-https
是APT通过HTTPS拉取仓库元数据的必要组件,缺失会导致
apt update
时出现
The method driver /usr/lib/apt/methods/https could not be found
错误。
注意:在阿里云、腾讯云等国内云服务器上,
curl https://download.docker.com/linux/ubuntu/gpg可能因DNS污染超时。此时应替换为国内镜像源:# 使用清华源(已同步Docker官方GPG密钥) curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
3.2 官方仓库配置与安装:逐行解析命令背后的系统动作
配置Docker官方APT源是安装的核心环节,每条命令都有明确目的:
# 1. 添加Docker官方GPG密钥(验证包签名)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 2. 构建sources.list条目(注意架构与Ubuntu代号动态拼接)
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -sc) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 3. 更新APT索引(使新源生效)
sudo apt update
关键细节解析:
-
gpg --dearmor将ASCII格式公钥转为二进制.gpg文件,这是Debian系APT验证签名的标准格式,不能省略--dearmor参数,否则apt update会报NO_PUBKEY错误。 -
$(dpkg --print-architecture)动态获取当前架构(如amd64或arm64),避免手动写死导致ARM设备误用x86源。 -
$(lsb_release -sc)获取Ubuntu代号(jammy/noble),而非版本号(22.04),因为APT源路径基于代号而非数字版本。 -
tee /etc/apt/sources.list.d/docker.list将源写入独立文件,而非追加到/etc/apt/sources.list主文件,便于后续rm /etc/apt/sources.list.d/docker.list一键卸载源。
安装命令执行:
sudo apt install -y docker-ce=5:26.1.4~ubuntu.22.04~jammy docker-ce-cli=5:26.1.4~ubuntu.22.04~jammy containerd.io
此处
containerd.io
是独立包,Docker 26+已将容器运行时
containerd
从Docker Engine中剥离,作为单独服务管理。若漏装,
dockerd
启动时会报
failed to start containerd: failed to dial "/run/containerd/containerd.sock"
。
3.3 权限与服务配置:解决90%的“Permission denied”问题
安装完成后,
docker
命令仍不可用,这是Ubuntu权限模型的必然结果。需完成三步权限链重建:
第一步:将用户加入
docker
组
sudo usermod -aG docker $USER
-aG
参数至关重要:
-a
表示append(追加),
-G
指定组名。若误用
-G
(无
-a
),会清空用户原有附属组,导致
sudo
失效(因
sudo
组被移除)。执行后需
完全退出当前终端会话
(关闭窗口或
exit
),重新登录才能生效。
newgrp docker
仅对当前shell有效,无法继承到GUI应用(如VS Code终端),故不推荐。
第二步:验证
docker.sock
权限
Docker守护进程通过Unix socket
/var/run/docker.sock
与客户端通信。检查其权限:
ls -l /var/run/docker.sock
# 正确输出:srw-rw---- 1 root docker 0 Jun 10 10:00 /var/run/docker.sock
# 关键:属组为docker,且组权限为rw----
若属组非
docker
或权限非
rw----
,手动修复:
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
第三步:启用并启动
dockerd
服务
sudo systemctl enable docker # 开机自启
sudo systemctl start docker # 立即启动
sudo systemctl status docker # 验证状态
status
输出中必须包含
active (running)
且无红色
failed
字样。若显示
failed to start docker.service: Unit docker.service not found
,说明安装包损坏,需重装
docker-ce
。
3.4 核心验证与调优:从Hello World到生产就绪
安装完成不等于可用,必须通过四层验证:
第一层:基础功能验证
docker run hello-world
此命令会拉取
hello-world
镜像并运行。成功标志是输出
Hello from Docker!
及容器ID。若失败,按以下顺序排查:
-
docker version:检查客户端/服务端版本是否匹配(应均为26.1.4) -
docker info:查看Storage Driver是否为overlay2,Cgroup Version是否为2 -
journalctl -u docker --since "1 hour ago":查看最近1小时dockerd日志,定位具体错误
第二层:镜像加速配置(国内用户必做)
默认Docker Hub镜像拉取极慢。配置国内镜像源需修改
/etc/docker/daemon.json
:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
registry-mirrors
数组定义镜像拉取优先级,USTC源通常最快;
exec-opts
强制Docker使用systemd作为cgroup驱动,解决与Kubernetes的兼容问题;
log-opts
限制容器日志大小,防止磁盘占满。
配置后重启服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
第三层:非root用户验证
切换到普通用户(非
$USER
),执行:
docker ps
若返回容器列表,说明权限配置成功;若报
permission denied
,检查该用户是否在
docker
组(
groups
命令查看),并确认已重新登录。
第四层:资源限制验证
运行一个受控容器,验证CPU/内存限制是否生效:
docker run -it --cpus=0.5 --memory=512m --name test-limit ubuntu:22.04 bash -c "stress-ng --cpu 4 --timeout 30s && echo 'done'"
stress-ng
会尝试占用4核CPU,但因
--cpus=0.5
限制,实际CPU使用率不会超过50%;
--memory=512m
确保内存超限时容器被OOM Killer终止。
docker stats test-limit
可实时观察资源占用。
4. 常见问题与实战排查:从报错日志到根因定位的完整路径
4.1 经典报错速查表:精准定位,拒绝盲目重装
| 报错信息 | 根本原因 | 排查命令 | 解决方案 |
|---|---|---|---|
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
|
dockerd
服务未启动或崩溃
|
sudo systemctl status docker
|
sudo systemctl start docker
;若启动失败,查
journalctl -u docker
|
Got permission denied while trying to connect to the Docker daemon socket
|
用户未加入
docker
组或未重新登录
|
groups
|
sudo usermod -aG docker $USER
+
完全退出终端重登
|
Error response from daemon: failed to start daemon: error initializing graphdriver: driver not supported
|
overlay
内核模块未加载
|
lsmod | grep overlay
|
sudo modprobe overlay
+
echo "overlay" | sudo tee -a /etc/modules
|
Error response from daemon: cgroups: cgroup mountpoint does not exist
| cgroup v2未启用 |
cat /proc/sys/fs/cgroup/unified_hierarchy
|
修改
/etc/default/grub
添加
systemd.unified_cgroup_hierarchy=1
并重启
|
Error response from daemon: failed to start containerd: failed to dial "/run/containerd/containerd.sock"
|
containerd.io
未安装或服务异常
|
sudo systemctl status containerd
|
sudo apt install containerd.io
;若已装,
sudo systemctl restart containerd
|
4.2 WSL2特殊问题:Windows防火墙拦截导致
dockerd
无法绑定端口
在WSL2中安装
docker-ce
后,
dockerd
常卡在
INFO[0000] starting containerd
,
docker info
超时。根本原因是WSL2的
dockerd
默认监听
tcp://0.0.0.0:2375
,而Windows防火墙的“专用网络”规则阻止了该端口。解决方案分两步:
第一步:强制
dockerd
使用Unix socket
创建
/etc/docker/daemon.json
:
{
"hosts": ["unix:///var/run/docker.sock"]
}
此配置让
dockerd
只监听本地socket,绕过TCP端口。
第二步:在Windows侧启用WSL2互操作
PowerShell管理员模式执行:
# 启用WSL2与Windows的网络互通
wsl --shutdown
# 重启WSL2
wsl
# 在WSL2中验证
docker run hello-world
4.3 ARM64设备(RK3588)镜像拉取失败:
no matching manifest for linux/arm64/v8
在RK3588上执行
docker pull nginx
报错,表面是镜像不兼容,实则是Docker默认拉取
linux/arm64/v8
平台镜像,而部分镜像(如老版本
nginx:alpine
)只构建了
v7
。解决方案:
方法一:显式指定平台
docker pull --platform linux/arm64/v7 nginx:alpine
方法二:配置Docker全局平台偏好
编辑
/etc/docker/daemon.json
:
{
"default-runtime": "runc",
"runtimes": {
"runc": {
"path": "runc"
}
},
"platform": "linux/arm64/v7"
}
重启
dockerd
后,所有
docker pull
默认使用
v7
平台。
4.4 生产环境高频故障:
dockerd
OOM被系统杀死
在内存紧张的云服务器上,
dockerd
进程可能被Linux OOM Killer终止,
journalctl
中可见
Out of memory: Kill process 1234 (dockerd) score 850 or sacrifice child
。这不是Docker Bug,而是内核内存管理策略。解决方案:
临时缓解
:降低
dockerd
内存使用
# 编辑`/etc/docker/daemon.json`
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"max-concurrent-downloads": 3,
"max-download-attempts": 2
}
max-concurrent-downloads
限制并发拉取数,减少内存峰值;
default-ulimits
提高文件描述符上限,避免因FD耗尽触发OOM。
长期根治
:为
dockerd
进程设置内存限制
# 创建systemd覆盖配置
sudo mkdir -p /etc/systemd/system/docker.service.d
echo '[Service]
MemoryLimit=2G' | sudo tee /etc/systemd/system/docker.service.d/limit.conf
sudo systemctl daemon-reload
sudo systemctl restart docker
此配置强制
dockerd
进程内存不超过2GB,OOM Killer将优先杀死其他进程,保障Docker服务稳定。
5. 进阶技巧与经验沉淀:那些文档里不会写的实战心得
5.1 镜像仓库私有化:用
registry:2
搭建企业级镜像中心
Docker Hub免费账户有拉取频率限制(100次/6小时),生产环境必须私有化。
registry:2
是Docker官方轻量镜像仓库,但直接
docker run -d -p 5000:5000 registry:2
存在严重缺陷:镜像存储在容器内,重启即丢失。正确做法是挂载宿主机目录并配置TLS:
# 创建持久化目录
sudo mkdir -p /opt/docker-registry/{data,auth,certs}
# 生成自签名证书(生产环境请用Let's Encrypt)
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/docker-registry/certs/domain.key -x509 -days 365 -out /opt/docker-registry/certs/domain.crt
# 创建HTTP Basic认证(用户名admin,密码password)
htpasswd -Bbn admin password > /opt/docker-registry/auth/htpasswd
# 启动registry
docker run -d \
--restart=always \
--name registry \
-v /opt/docker-registry/data:/var/lib/registry \
-v /opt/docker-registry/auth:/auth \
-v /opt/docker-registry/certs:/certs \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
-e "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt" \
-e "REGISTRY_HTTP_TLS_KEY=/certs/domain.key" \
-e "REGISTRY_HTTP_ADDR=0.0.0.0:443" \
-p 443:443 \
registry:2
关键点:
-v
挂载确保数据持久;
REGISTRY_AUTH
启用认证;
REGISTRY_HTTP_TLS_*
强制HTTPS,避免
docker login
时提示
insecure registry
。
5.2 容器日志集中管理:
fluentd
替代默认
json-file
Docker默认
json-file
日志驱动在高IO场景下导致磁盘爆满。
fluentd
可将日志实时转发至Elasticsearch或S3。部署步骤:
# 拉取fluentd镜像
docker pull fluent/fluentd:v1.16-1
# 创建fluentd配置
cat > /opt/fluentd/conf/fluent.conf << 'EOF'
<source>
@type tail
path /var/lib/docker/containers/*/*.log
pos_file /var/log/fluentd-containers.log.pos
tag docker.*
read_from_head true
<parse>
@type json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</source>
<match docker.**>
@type stdout
</match>
EOF
# 启动fluentd
docker run -d \
--name fluentd \
--restart=always \
-v /var/lib/docker/containers:/var/lib/docker/containers:ro \
-v /var/log:/var/log:rw \
-v /opt/fluentd/conf:/fluentd/etc \
-p 24224:24224 \
fluent/fluentd:v1.16-1
此配置将容器日志实时采集,
@type stdout
仅为演示,生产环境替换为
@type elasticsearch
或
@type s3
。
5.3 我踩过的最深的坑:
/etc/docker/daemon.json
语法错误导致
dockerd
静默退出
某次在
daemon.json
中多加了一个逗号:
{
"registry-mirrors": ["https://..."],
"log-opts": { "max-size": "100m", } // 末尾逗号!
}
dockerd
启动时无任何错误日志,
systemctl status docker
显示
active (exited)
,
journalctl
里只有
Started Docker Application Container Engine
。排查耗时3小时,最终发现
dockerd
在JSON解析失败时直接退出,不打印错误。解决方案:用
jq
校验JSON语法:
sudo jq . /etc/docker/daemon.json
# 若输出"parse error",则JSON有误
从此养成习惯:每次修改
daemon.json
,必先
sudo jq . /etc/docker/daemon.json
验证,再
sudo systemctl restart docker
。
5.4 最后一个小技巧:快速清理磁盘空间的三行命令
Docker长期运行后,
/var/lib/docker
目录常膨胀至数十GB。安全清理步骤:
# 1. 删除已停止的容器
docker container prune -f
# 2. 删除悬空镜像(未被任何容器引用)
docker image prune -f
# 3. 删除构建缓存(Docker 23.0+)
docker builder prune -f
注意:
docker system prune -a
会删除所有未使用的镜像(包括正在运行容器的镜像),慎用。生产环境推荐分步执行,每步后用
du -sh /var/lib/docker
确认空间释放效果。
我在Ubuntu服务器上维护着12个Docker服务,从2022年至今,这套安装与维护流程经受住了3次Ubuntu大版本升级(20.04→22.04→24.04)、5次Docker大版本迭代(20.10→24.0→26.1)的考验。没有一次需要重装系统,所有问题都归结为对Ubuntu内核机制、Docker架构设计、以及真实环境变量的深度理解。当你下次看到“Permission denied”时,别急着重装,先查
groups
、
lsmod
、
journalctl
——答案永远在日志里,不在教程里。
更多推荐
所有评论(0)