
1月13号我把这段时间随手记的Linux学习笔记翻出来重新过了一遍顺手把验证过的命令、踩过的坑和值得沉淀的思路整理成了这篇东西。起因其实很简单热词榜上关于Linux的话题越来越杂从常用命令、系统安装到内核驱动、故障排查什么方向都有但真正能落地的经验往往被淹没在碎片信息里。这篇笔记不追求面面俱到重点记录那些我亲手敲过、跑过、排错过的内容覆盖从日常操作、发行版部署到系统管理和底层原理的完整链路希望对正在学Linux、准备面试或者日常做运维的同学有点参考价值。1. 常用命令实战把日常操作固化成本能1.1 文件与磁盘操作先把手头的活干利索很多人学Linux喜欢一上来就啃内核我不太建议这么干。命令行的熟练度就像骑自行车不先把手感练出来后面所有排查都会卡在最基础的环节。1月13号这天我特意从文件操作开始过了一遍因为这类命令是最高频的也最容易在细节上翻车。先说说删除文件夹。rm -rf确实能解决问题但用法不对就可能把家底清空。我习惯在删目录前先执行ls -la确认路径再用rm -ri做一次交互确认只在批量脚本里才用rm -rf而且路径必须写成绝对路径或者带./前缀的明确相对路径。另一个容易被忽略的是find的-delete参数它比rm在处理大量小文件时更稳比如清空超过30天的日志find /var/log/app -type f -name *.log -mtime 30 -delete磁盘空间排查是运维老话题了但du和df的配合有个实用顺序先用df -h看哪个分区满了再用du -h --max-depth1 /path逐层定位大目录。注意df显示的“已用空间”和du统计出来的大小经常对不上这是因为du不统计被删除但仍被进程占用的文件空间。遇到这种“空间消失”的情况用lsof | grep deleted找出还在占用文件的进程重启或重开该进程后空间才会释放。解压也是刚需。.tar.gz用tar -zxvf.zip用unzip但遇到.7z就得先装p7zip。在Debian系发行版上执行apt install p7zip-full然后7z x archive.7z就能解开。这里有个小坑7z默认解压路径是当前目录如果压缩包内没有顶层目录所有文件会直接散在工作目录里建议先7z l archive.7z看一眼结构再决定要不要单独建目录。这套流程我实测下来很稳已经写进我的日常操作清单了。1.2 进程管理与命名修改运维排查的杀手锏进程管理这块ps aux和top是基础但真实排查时我更依赖ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort-%cpu这种显式指定字段的方式输出稳定、列对齐还能排序。要多维度的实时监控可以用htop按F6选排序列按树形视图F5直接看进程父子关系定位孤儿进程很直观。热词里有个“linux 修改进程名称”这个我专门验证过。进程名分两种一种是内核task_struct里的comm字段默认是线程名长度限制16字节另一种是用户态看到的argv[0]比如ps输出的CMD列。修改comm最简单的方式是调用prctl(PR_SET_NAME, newname)C代码里这么写#include sys/prctl.h #include string.h int main(int argc, char *argv[]) { prctl(PR_SET_NAME, my-daemon, 0, 0, 0); while (1) pause(); return 0; }如果只是临时改argv[0]Bash里可以用exec -a技巧exec -a custom-name /usr/bin/whatever --flag这个技巧对很多Java或Python脚本启动的服务特别有用写systemd服务时也可以在ExecStart里做文章但systemd的Process展示名往往来自comm所以最干净的做法还是让程序自己调用prctl。运维场景里给进程起可读性强的名字对快速定位问题非常有帮助。1.3 脚本里容易踩的坑我替你们填了一部分写Shell脚本这事经验不够时经常是“测试没问题一上生产就翻车”。我总结过几条高频坑。第一条是忘记set -euo pipefail导致脚本在中途命令失败时继续往下跑最后带着错误状态“成功”退出。我现在所有脚本第一行固定这么写能避免90%的静默故障#!/bin/bash set -euo pipefail第二条是字符串判空。[ -n $var ]在set -u开启时如果变量未定义会直接报错所以要么用${var:-}做默认展开要么先用${varx}判断变量是否存在。比如if [ -z ${FLAG:-} ]; then echo FLAG not set, using default fi第三条是遍历文件时碰到文件名带空格或换行的情况。用for f in $(ls *.txt); do会直接碎掉正确做法是:shopt -s nullglob for f in *.txt; do echo process $f done或者用while IFS read -r line处理每行输出。这些细节看起来小但真正在生产环境跑起来每个都能省下半小时的排错时间。2. 系统安装与发行版选型从虚拟机到真机2.1 虚拟机里装Linux蓝屏不是玄学热词里“虚拟机安装linux蓝屏”撞到我枪口上了这我遇到过不止一次。多数蓝屏不是Linux镜像的问题而是虚拟化平台和内核参数的兼容性问题。比如在VMware里装新版Ubuntu或Fedora偶尔会在启动阶段直接蓝屏常见原因之一是内核开启了KASLR且虚拟机的固件类型和CPU特性不匹配另一种是显卡虚拟化驱动崩溃。我的处理顺序是先在虚拟机设置里把“固件类型”从UEFI改成BIOS或反之再试不行就在GRUB引导界面按e进入编辑在linux那行末尾追加nokaslr nomodeset然后按CtrlX启动能进系统就说明确实是内核参数兼容问题装完系统后再把参数固化到/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTquiet nomodeset sudo update-grub如果是在Windows的WSL安装向导里报“安装向导提前结束由于错误”那通常是和Windows更新的“虚拟机平台”功能未启用有关。在管理员PowerShell里执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all配合Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform重启后再装就顺了。对新手来说如果只是想练习Linux我更推荐先用虚拟机等熟悉了再用WSL或真机因为虚拟机能随时回滚快照容错率高很多。2.2 Rocky Linux 10与Debian 13网络配置与换源热词里“rocky linux 10 配置网络信息”和“debian gnu/linux 13 (trixie)换清华源”都是我实际测过的。Rocky Linux 10现在默认用nmcli配置网络改IP的命令序列大概是nmcli con mod ens160 ipv4.method manual ipv4.addresses 192.168.1.100/24 nmcli con mod ens160 ipv4.gateway 192.168.1.1 nmcli con mod ens160 ipv4.dns 223.5.5.5 119.29.29.29 nmcli con up ens160注意nmcli con mod只改配置不立即生效con up重连才生效别漏了最后一步。管理虚拟机的时候我不建议直接改/etc/sysconfig/network-scripts/ifcfg-*因为NetworkManager重启后会覆盖手工配置容易跟自己的预期打架。Debian 13Trixie换清华源只要编辑/etc/apt/sources.list把deb.debian.org批量替换成mirrors.tuna.tsinghua.edu.cn然后apt update。这里有一个细节Trixie开始Debian默认启用了deb822格式的源文件位置在/etc/apt/sources.list.d/debian.sources很多人以为改了sources.list就够了结果apt update还是老源。正确做法是编辑那个debian.sources文件把里面的URIs:一行改成清华镜像地址。我头一回就栽在这个格式切换上查了半天才搞明白记在这里帮大家避个雷。2.3 国产Linux到底能不能日用我用了一个月“国产linux”是我最近重点关注的方向。以deepin深度系统为例日常办公、浏览器、微信、WPS这些场景已经相当能打了安装搜狗输入法这类第三方软件也不再是劝退项。deepin装搜狗输入法最省事的是在应用商店里直接搜“搜狗”或者从官网下.deb包后用sudo apt install ./sogoupinyin_*.deb安装装完去“控制中心-输入法”里添加并切换。打印这块热词里的“hp laserjet p1106 linux”很典型。HP LaserJet P1106在Linux下驱动一直是个痛点hplip对其支持不算好我的解决方案是安装foo2zjs驱动方案sudo apt install foo2zjs sudo hp-plugin -i或者直接用HPLIP的hp-setup工具按提示选择USB连接识别到打印机后装插件。装完在打印设置里添加打印机时选“LaserJet Professional P1106”对应的foo2zjs驱动实测打印正常。另外像“linux mint white bigsur”这类桌面美化话题也很有意思Linux Mint的Cinnamon桌面套用Big Sur主题本质是下载主题包放到~/.themes再用“主题设置”切换效果接近macOS风格但会占用一定显存老电脑慎用。3. 系统管理与运维所有操作都得留痕3.1 用户与权限管理从创建到提权防线“linux新建用户”是我每次做环境初始化都要干的活。标准的创建流程是sudo useradd -m -s /bin/bash devops sudo passwd devops sudo usermod -aG sudo devops-m建家目录-s指定登录Shell-aG sudo把用户加到sudo组。如果业务需要用户不能登录可以建-s /usr/sbin/nologin。这里有个安全习惯普通用户最好用sudo而不是直接切到root来操作审计日志能看到谁执行了什么命令占用的就是/var/log/auth.log或/var/log/secure的功劳。“linux提权”这个词在热词里出现实际上是安全运维人员必须理解的反面教材。提权的常见路径包括sudo配置不当、SUID文件权限异常、PATH劫持、docker组内用户逃逸、系统服务写权限过大。我写脚本或交付系统时习惯顺手做三件事检查sudo -l能看到什么、find / -perm -4000列出所有SUID文件、确认/etc/sudoers.d/里没有可疑配置。这套自查流程治不了所有问题但能堵掉一多半的低级漏洞。把“提权路径”当成防御清单来用比把“提权攻击”当成技巧来学要安全得多。3.2 存储与共享NAS挂载实战热词“linux挂载nas存储csdn”指向的是NFS/SMB挂载这也是企业内部文件共享的常见需求。挂载NFS的完整流程是sudo apt install nfs-common sudo mkdir -p /mnt/nas sudo mount -t nfs 192.168.1.20:/volume1/shared /mnt/nas要开机自动挂载写入/etc/fstab192.168.1.20:/volume1/shared /mnt/nas nfs vers4,defaults,_netdev,noatime 0 0_netdev是关键它告诉系统在网络就绪之后再挂载这个条目否则开机时会卡在挂载等待上。SMB挂载则用mount -t cifs //192.168.1.20/share /mnt/share -o usernameuser,uid1000,gid1000其中的uid/gid参数决定挂载后文件的属主不写的话你会看到所有文件都是root所有普通用户没法写。关于“linux 共享上网办法”我补充一个普通但很实用的场景局域网里的Linux主机做软路由或NAT网关用iptables做地址伪装sudo sysctl -w net.ipv4.ip_forward1 sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE如果下游设备还需要固定地址下发再配合dnsmasq做DHCP和DNS。这套方案在公司临时网络、实验环境里都非常实用成本几乎为零。3.3 服务部署与常用工具安装源码编译那些事“linux 部署 clickhouse 21.8.15.7”、“linux下载gcc编译器”、“linux解压7z文件”这几条热词指向的都是安装与部署的实操问题我串起来说。ClickHouse这种企业级列式数据库官方推荐用curl https://clickhouse.com/ | sh一键安装或者用deb/rpm包安装特定版本。装21.8.15.7的话找官方仓库对应版本的deb包dpkg -i安装后执行sudo clickhouse-server --config-file/etc/clickhouse-server/config.xml部署完用clickhouse-client连进去跑一个SELECT 1验证。很多人忽略的是系统限制ClickHouse对ulimit -n要求很高我记得设置LimitNOFILE262144几乎是必须的否则高并发查询时“too many open files”直接教你做人。源码编译GCC是经典到不能再经典的练习了。下载源码包后执行三步走./configure --prefix/opt/gcc-13 --enable-languagesc,c --disable-multilib make -j$(nproc) make install--disable-multilib非常关键它关掉32位兼容库的编译否则在缺少32位库的机器上configure阶段就会报错这一步能省去很多麻烦。同类型的工具安装还有bkcrack它是分析ZIP文件的第三方工具在Linux上编译也不复杂make一下就能生成可执行文件属于典型的“源码安装三步走”案例。工具本身不算复杂但源码编译的思路是通用的先看README再确认依赖最后configure/make/install这套流程能应对90%的开源软件。4. 底层原理、嵌入式与故障排查进阶之路4.1 从“零基础理解Linux内核”到实际应用热词里“零基础深入理解 linux 操作系统内核”是个大坑我踩过的经验是别从源码开始先建立三张地图。第一张是“进程地图”Linux用task_struct描述进程用调度器决定谁跑、跑多久第二张是“内存地图”虚拟地址空间、页表、缺页异常、OOM Killer这些概念串起来才能看懂free -m里buff/cache的真实含义第三张是“文件地图”VFS抽象了具体文件系统open/read/write通过系统调用进入内核再由驱动落到磁盘。这三张图只要建立起来再看内核源码就有坐标了。免费的优质网站和文档“免费linux网站大全”这个话题里我最推荐的其实是Linux内核官方文档站docs.kernel.org和lwn.net前者是权威参考后者是内核社区动态。内核邮件列表lkml.org更适合有一定基础后再看。新人如果直接拿源码啃很容易迷失在指针和链表里我的办法是先精读《Linux内核设计与实现》里“进程管理”和“内存管理”两章再对照源码kernel/fork.c、mm/page_alloc.c去印证效率比从头到尾读源码高得多。4.2 嵌入式Linux与DSA switch驱动设备树一定要会看“嵌入式linux项目”和“linux dsa switch驱动”是嵌入式网络设备开发中绕不开的两块。DSADistributed Switch Architecture是Linux内核里用于管理多端口交换芯片的子系统常见芯片像Marvell的mv88e6xxx就是通过DSA驱动接入的。DSA的好处在于把交换芯片的端口映射成标准网络接口用户态直接用ip link就能配置不需要额外搞一套私有命令行。写DSA驱动时最重要的不是C代码而是设备树。比如要给一个交换芯片注册端口设备树节点大致长这样mdio { switch0: switch0 { compatible marvell,mv88e6085; reg 0; #address-cells 1; #size-cells 0; ports { #address-cells 1; #size-cells 0; port0 { reg 0; label lan1; }; }; }; };这里如果reg地址和芯片的MDIO地址对不上驱动根本探测不到设备光是这一步就能卡掉很多新人。我的建议是做嵌入式网络开发前先把Documentation/networking/dsa/下的内核文档通读一遍再拿一个具体芯片的binding文档对照设备树写效率会高很多。设备树是嵌入式Linux的门槛过了这一关后面调试起来就顺了。4.3 进程间通信与D-Bus消息总线的正确打开方式“linux进程间通信”和“linux d bus通讯”这两条热词让我想起一次“奇怪故障”最后排查到D-Bus上。先补充基础Linux进程间通信IPC有管道、消息队列、共享内存、信号量、Socket等几类。管道适合父子进程的轻量通信|就是它的Shell形态共享内存用shmget/shmat性能最高但也最容易出并发问题必须配合信号量Socket则是跨主机通信的唯一选择。选型原则很简单同机高吞吐用共享内存跨进程按消息流用消息队列或D-Bus跨主机用Socket。D-Bus是桌面环境和系统服务间的消息总线systemd的很多控制命令实际都走D-Bus接口。排查D-Bus问题的三板斧是dbus-monitor --system看实时消息、busctl --system list列出当前总线上所有服务、busctl --system tree查看服务对象树。有一次我发现桌面弹窗失灵journalctl里全是“D-Bus connection refused”最后定位是dbus-daemon的socket文件被误删重启dbus服务后一切恢复正常。这个经验说明很多“莫名其妙”的故障先查IPC链路往往比直接看应用日志更快。4.4 故障排查实录从案例到方法论“linux系统故障案例”这条热词我非常有共鸣。我最常遇到的三类故障和排查顺序如下表格所示故障现象常见原因优先排查命令系统假死、卡顿内存不足或IO瓶颈free -h、iostat -x 1、dmesg服务起不来端口被占或权限问题ss -lntp、journalctl -u 服务名磁盘空间莫名减少被删文件仍被占用lsof | grep deleted真实场景里“设备明明连上了但服务没反应”这种问题我一般按链路顺序查ping通不通ss -lntp看端口在不在iptables -L -n看防火墙拦没拦journalctl看应用有没有报错。有一次调试“物联网设备连不上服务器”前端看是设备离线后端看服务正常最后用tcpdump -i any port 8080抓包发现设备每次连接发的是HTTP/1.0请求而服务端只支持HTTP/1.1属于协议兼容问题跟网络和防火墙完全无关。抓包工具永远是你最后一道真相来源这个习惯我从网络排错一直带到应用排错。按照我的习惯学习笔记一般以日期命名文件比如这次就是20260113-linux-notes.md。这样做的好处是方便回溯当天的思路也方便后面整理成主题笔记。如果你也想整理自己的Linux学习路线我的建议是不要贪多一次围绕一个场景把链路走通比如“装一台Rocky Linux虚拟机并配置好网络和共享存储”比零散背一百条命令更能形成真正的动手能力。最后分享一个小技巧记笔记时把报错原文、排查过程和最终解决方案一起记录下来这些内容在未来面试和实际排障时比任何教程都值钱。