先交代背景。“ubunru (linux) 问题解决”这个标题看着有点眼熟又有点奇怪——ubunru 是 Ubuntu 的笔误但这篇整理并不只是 Ubuntu 专属更像是这些年在各种 Linux 发行版上踩坑、救火、拆轮子的真实记录。从 Debian 到 Rocky从 Kali 到容器里的精简系统凡是能遇到的操作系统级问题基本都折腾过一遍。这份笔记里没有宏大理论有的只是具体到命令行的排障流程虚拟机装 Linux 突然蓝屏、WSL 安装向导提前结束、NAS 挂不上、网口转串口不通、密码过期提醒没生效、GCC 版本不对导致编译失败……每一条后面都跟着当时的现场日志、排查路径和最终解决手段。适合刚转 Linux 的运维新人也适合被某个罕见问题卡住半天却说不清缘由的开发、测试和嵌入式工程师。1. 排障第一步先定位再动手1.1 先收集环境信息别急着执行命令很多人拿到 Linux 问题第一反应是搜报错关键字这个习惯没错但搜之前最好先把环境信息收集齐。同一个报错在 Ubuntu 22.04 和 Rocky 9 上的成因完全不一样在 x86 和 ARM 上的表现也不一样。我遇到过一个特别典型的案例同事在 Debian 上装同一个软件包他这边报缺某个依赖我这边一次过查了半天才发现他用的 bullseye 版本自带库太旧。所以接到问题后我先跑三个命令cat /etc/os-release看系统版本uname -r看内核还有对应软件包的--version确认版本。把这些信息记下来再搜索命中率会高非常多。尤其是遇到驱动、编译类问题内核版本和 GCC 版本几乎就是排障的第一把钥匙。此外还有 locale 和 systemd 版本这类容易被忽略的环境因素不要等到排查中后期才发现是它的锅。cat /etc/os-release uname -r gcc --version systemctl --version1.2 日志是唯一可信的现场思路比方法重要所以先讲日志。Linux 出问题的第一现场很少直接留在错误提示里更多时候要去日志里翻。journalctl -xe看 systemd 最近的错误服务启不来、启动超时这类问题第一站就在这里dmesg -T看内核输出硬件、驱动、磁盘问题基本都在这tail -f /var/log/syslog或/var/log/messages看应用日志大部分业务程序都会往这里写我自己调试网口转串口服务器时发现 ttyUSB0 总是不出现光看应用层输出死活找不到原因后来dmesg里一行usb 1-1: device descriptor read/64, error -71直接点明是 USB 信号线接触问题。这个经验后来反复验证大多数诡异问题答案都写在日志里问题是很多人不看日志或者不知道该看哪条日志。1.3 复现与最小化思路定位问题还有一个关键技巧把偶发问题变成可复现问题。如果你能让问题稳定出现解决只是时间问题。之前处理过一个虚拟机内存偶发飙升的问题系统监控面板上内存曲线每隔一段时间就跳一次高峰但又看不出是哪个进程。后来把监控范围缩小到 cgroup 级别再逐容器排查才发现是某个容器内日志轮转没触发日志文件无限增长占满了 page cache。遇到问题可以尝试去掉非必要组件用最小配置重试或者把触发条件记录下来脚本循环执行抓现场。搜索引擎也要会用报错信息、版本号、软件名组合搜索比单独搜报错强十倍。我搜问题时的固定套路是“错误信息前三行 系统版本 软件名”这样筛出来的结果十有八九是同一个场景的救火帖。2. 系统与日常运维从装系统到日常管理2.1 虚拟机装 Linux 蓝屏与 WSL 安装失败这两个问题几乎每天都有人在问。虚拟机装 Ubuntu 蓝屏大多数人第一反应是镜像坏了但实测下来镜像问题只占少数更多是宿主机 BIOS 的虚拟化开关没打开或者 Hyper-V 与 VirtualBox/VMware 冲突。排查顺序建议是打开任务管理器看 CPU 虚拟化是否已启用没启用就去 BIOS 开启 VT-x/AMD-V关闭 Windows 的“虚拟机监控程序平台”Windows 功能里它和别的虚拟机软件抢 CPU 指令集很容易造成蓝屏分配内存别低于 2GBCPU 核数别超过物理机逻辑核数的一半磁盘类型选 VDI 比 VHD 更稳顺带提一下 Kali 的安装。Kali 的安装过程和 Ubuntu 几乎一样只是装完以后别急着跑工具第一件事是 apt update 换国内源然后安装 vmware-tools 或增强工具否则虚拟机里分辨率上不去菜单栏也拉不出来用起来非常别扭。WSL 安装向导提前结束报错“由于错误而提前结束”八成是 Windows 更新组件注册表损坏或者虚拟化平台功能没开全。先检查 Windows 功能里有没有勾选“适用于 Linux 的 Windows 子系统”和“虚拟机平台”然后管理员身份运行 DISM 修复系统映像再把 Windows Update 跑一遍多数情况下能解决。这里有个容易忽略的点WSL 的发行版安装路径最好放在 D 盘这种非系统盘C 盘空间紧张时也会触发各种奇怪错误。2.2 用户与权限管理新建用户、sudo 与密码策略新建用户这个操作看似简单坑都在细节里。见过太多直接useradd创建完用户连 home 目录都没有的情况。我在生产机器上的习惯是创建用户useradd -m -s /bin/bash usernameDebian 系直接adduser username更省心设置密码passwd username加入 sudo 组Ubuntu 是usermod -aG sudo usernameRocky/CentOS 是usermod -aG wheel username密码过期提醒也是高频需求。系统默认 99999 天不过期如果你想让用户在 30 天后必须改密执行chage -M 30 username下次登录就会收到提醒。排查“为什么改了密码策略没生效”时先确认/etc/login.defs里的PASS_MAX_DAYS是否还被注释如果 chage 和 login.defs 配置冲突以 chage 为准。还有一个容易被忽略的点用户主目录权限必须严格控制。默认没有加-m参数创建的用户可能连登录后写不了历史记录直接报Permission denied很多人排查半天结果就是目录归属不对。2.3 网络配置实战netplan、Rocky 网卡文件与共享上网网络这块是 Linux 运维的重灾区不同发行版的网络配置方式完全不同。Ubuntu 从 18.04 开始用 netplan 管理网络配置文件在/etc/netplan/下通常是01-network-manager-all.yaml或99-config.yaml。静态 IP 的写法大概是network: version: 2 renderer: networkd ethernets: ens33: dhcp4: false addresses: - 192.168.1.100/24 gateway4: 192.168.1.1 nameservers: addresses: [223.5.5.5, 119.29.29.29]配置完记得netplan apply。特别注意不要在远程连着的会话里乱改网卡配置配错了连不上机器就只能去物理现场恢复了。Rocky Linux 的网卡配置文件在/etc/sysconfig/network-scripts/ifcfg-ens33里核心参数BOOTPROTO、IPADDR、GATEWAY、DNS1一个都不能少改完执行nmcli con reload再重启 NetworkManager。共享上网的需求也很常见。一台 Linux 当软路由让局域网其他机器通过它上网核心就三步开启 IP 转发sysctl -w net.ipv4.ip_forward1iptables 配置 NAT 规则iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE确保 forward 链默认放行。实测最简单的方式是写成 systemd 服务开机执行省得每次重启后重新配。2.4 NAS 挂载、软件源与 Anaconda 环境变量NAS 挂载是办公环境的高频需求。Linux 挂载 NAS 最常用的两种协议是 NFS 和 CIFS/SMB。NFS 挂载命令简单但要注意版本兼容Debian 系装nfs-commonRocky 装nfs-utils。CIFS 挂载的坑在于协议版本和凭据mount -t cifs //192.168.1.10/share /mnt/nas -o usernamexxx,passwordxxx,vers3.0如果报mount error(13) Permission denied多半是 vers 版本不对或者凭据格式问题。建议把凭据写到/etc/fstab或单独的 credential 文件里并把文件权限设置为 600。软件源这块Debian 13 (trixie) 换清华源是近期很多用户都要做的操作。编辑/etc/apt/sources.list把deb.debian.org批量替换为mirrors.tuna.tsinghua.edu.cn然后apt update就能提速不少。Ubuntu 同样可以换清华或阿里云源。pip 源可以建~/.pip/pip.conf把 index-url 指向国内镜像。Anaconda 环境变量的问题也很典型装完 conda 之后命令行找不到 conda 命令原因是路径没写进~/.bashrc。正确做法是安装目录下执行conda init自动配置或者手动在~/.bashrc里加一行export PATH/home/username/anaconda3/bin:$PATH然后source ~/.bashrc。注意不要把 conda 的目录放在 PATH 最前面它会影响系统自带 Python 和库的调用很多“Python 版本诡异”问题就是这么来的。3. 开发与进阶场景剖开看 Linux3.1 修改进程名称不只是改名Linux 修改进程名称这个需求单机场景下容易被忽略但在容器、分布式任务监控里很有用。默认情况下进程名就是程序的可执行文件名但有时候你想让同一个程序的不同实例在ps或top里显示不同的名字方便定位。改进程名有几个层级按适用场景选Shell 层面exec -a new_name ./my_program这种方法最简单但对当前终端有效C 语言层面调用prctl(PR_SET_NAME, new_name)注意长度限制是 15 字节超过会被截断修改/proc/PID/commroot 权限下echo new_name /proc/PID/comm立刻生效但进程重启后失效实际场景里用 systemd 启动服务时可以通过ExecStart/usr/bin/exec -a custom_name /path/program的方式自动设置比手动改方便很多。还有一个冷知识进程名和命令行参数是两回事用ps aux看到的 COMMAND 列往往是命令行参数拼起来的内容真正影响显示的是进程名属性和 comm 文件。3.2 进程间通信不只是基本功进程间通信是 Linux 开发绕不开的课题也是面试高频题。从最简单的管道到复杂的共享内存每个方案都有适用场景管道pipe适合父子进程之间传递流式数据命令行的|就是管道命名管道FIFO适合两个不相关进程通信用mkfifo创建消息队列适合小数据量、有优先级的通信msgsnd/msgrcv即可共享内存适合大数据量、高吞吐场景Linux 下常用 POSIX 共享内存shm_openmmap 信号量配合使用实际生产里我踩过一个共享内存的坑两个进程一个写、一个读读写速度不匹配导致数据错乱。后来加了互斥机制用 pthread mutex 或 semaphore 保护共享内存区域的读写问题才解决。还要注意共享内存的生命周期管理进程崩溃后残留的 shm 文件会占用内存要定期清理/dev/shm下的对象不然明明内存没满df -h却显示满了。3.3 Docker 与 ClickHouse把部署变成一道命令现在很少有人在裸机上直接装数据库了容器化部署已经成为 Linux 运维的基本功。安装 Docker 在 Ubuntu 上基本是四步走sudo apt update sudo apt install docker.io docker-compose sudo systemctl enable --now docker sudo usermod -aG docker $USER重登一下用户docker 命令就不需要 sudo 了。装 ClickHouse 时我用官方镜像分两步先跑一个临时容器生成配置再正式启动并挂载数据目录。部署版本 21.8.15.7 时新版镜像默认配置和这个老版有些差异主要注意两点数据目录按需挂载/var/lib/clickhouse必须持久化时区设置不要用 UTC容易导致统计时间错位。docker run -d --name clickhouse --ulimit nofile262144:262144 \ -p 8123:8123 -p 9000:9000 \ -v /data/clickhouse:/var/lib/clickhouse \ -e TZAsia/Shanghai \ clickhouse/clickhouse-server:21.8.15.7验证部署是否成功curl http://localhost:8123/看到Ok.就是正常的。如果端口被占用检查防火墙规则和 selinux这是新手最容易忽略的两个地方。3.4 硬件外设与驱动适配网口转串口、打印机、DSA 驱动Linux 一直在往桌面生态靠拢但硬件适配依然有不少坑。网口转串口服务器是最典型的例子。这种设备本质是一个以太网转串口的网关Linux 下识别它需要确认使用的是 usb 转串口芯片还是网络转串口协议。如果用 usb 转串口插上后dmesg看是否有 cp210x 或 ch341 识别信息这两个是主流的国产芯片如果按网络转串口用则需要在 Web 后台配置好 IP 和端口然后用socat做透明传输或者直接对接业务程序的 TCP 客户端。HP LaserJet P1106 打印机在 Linux 下的驱动问题也很经典。官方驱动实际上是 hplip 插件包Ubuntu 直接apt install hplip能装但装完不一定能识别打印机需要运行hp-setup走一遍网络或 USB 发现流程。Rocky 系还要先装hplip-gui。DSA switch 驱动适合嵌入式工程师。这类驱动的核心是让内核识别芯片型号需要确认设备树里 switch 节点的 compatible 属性和驱动源码一致一般dmesg里出现DSA: switch xxxxx detected就说明驱动加载成功。板级调试时常见的不是驱动本身报错而是引脚复用冲突这时要去查 pinctrl 的配置。4. 常见问题与排查技巧实录4.1 高频问题速查表遇到问题时先翻这张表能省下不少搜索时间问题现象常见原因处理方式虚拟机装 Linux 蓝屏BIOS 虚拟化未开启 / Hyper-V 冲突开启 VT-x/AMD-V关闭 Windows 虚拟机监控程序WSL 安装向导提前结束Windows 功能未开全 / 系统组件损坏开启 WSL 与虚拟机平台DISM 修复系统映像挂载 NAS 提示 Permission deniedSMB 协议版本或凭据问题指定 vers3.0检查账号权限和凭据文件网口转串口设备不识别芯片驱动未加载或协议配置错误用 dmesg 看芯片型号安装对应驱动密码过期提醒未生效login.defs 或 chage 配置冲突执行 chage -M 30并确认 PASS_MAX_DAYSconda 命令找不到PATH 未配置conda init 或手动添加 ~/.bashrcGvim 全选无效快捷键与终端映射冲突使用 ggVG 替代 CtrlADocker 容器重启后数据丢失数据目录未挂载用 -v 挂载持久化目录到宿主4.2 几个容易踩但很少被写进文档的坑有些坑是文档不会告诉你的我挑几个印象最深的分享。第一个是 GCC 版本问题。编译老内核模块或者某些依赖特定 GCC 的项目时版本差一点就编译失败。在 Ubuntu 上装多个 GCC 版本可以用update-alternatives切换把 gcc-12 和 gcc-9 都注册进去需要哪个就执行update-alternatives --config gcc。编译时看清 Makefile 里的 CC 变量很多老项目写死了 gcc你要手动改成 gcc-9。搜索时看到535.54.03(linux)gcc这类版本信息别被绕晕先确认要匹配的 GCC 主版本即可。第二个是 bkcrack 在 Linux 上的安装。这个工具主要用于 ZIP 密码分析源码编译时依赖 libcrypto但新版 OpenSSL 对老接口的兼容性很差编译报错很正常。解决方法是装 libssl-dev 的低版本兼容包或者直接下 release 的二进制。总之别死磕源码能用现成的就用现成的。第三个是 Gvim 里全选文本。很多人都试过 CtrlA 不行Gvim 的正确操作是ggVGgg 回到第一行V 进入可视模式G 跳到文件末尾。如果要复制全部就是ggVGy。这属于 vim 用户的基本功但真心很多人不知道。第四个是 Anaconda 环境变量配完后终端出现一堆 base。因为conda init会把基础环境激活写进.bashrc不想每次打开终端就自动进入 base执行conda config --set auto_activate_base false就好。4.3 把 Linux 用起来Gitea 与云桌面环境问题解决了很多人会发现 Linux 其实可以做很多正经事。两个我觉得很值得尝试的方向。一是 Gitea。它是一款轻量级的 Git 服务端部署在 Linux 上比 GitLab 省资源得多。官方提供二进制包下载后直接gitea web就能跑起来配合 Nginx 做反向代理和 HTTPS 证书一个团队级的代码托管平台半小时就能搭完。域名、端口、仓库路径这类配置在 app.ini 里都能调整。轻量到什么程度一台 1 核 2G 的小机器带十几个人日常使用完全没问题。二是云桌面。云平台搭建云桌面听着高大上本质上就是 Linux VNC/RDP 认证体系。最朴素的方案是给每台虚拟机装 xrdpWindows 远程桌面直接连更工程化的做法是用 Guacamole 做 Web 网关浏览器里访问 Linux 桌面权限、会话管理都在服务端控制。我自己用 Guacamole 搭过一个内部测试云桌面最大的感受是只要基础系统稳定桌面应用部署反而比前期环境配置简单得多。最后再分享一个这些年跟 Linux 打交道体会最深的事遇到问题不要慌先确认环境再看日志最后动手。90% 的问题不是有多难而是信息不足或者方法顺序错了。Linux 的排障能力本质上是一个信息整合能力——你越快拿到准确的环境信息、日志、复现步骤问题的解决速度就越快。如果这份“ubunru (linux) 问题解决”笔记里有一个场景能帮你少折腾一个小时那它就没白写。以后遇到新的坑我会继续往这里补也希望你自己的排障记录能慢慢攒成一本专属的“运维红宝书”。