2026年1月12日,我把过去一段时间攒下的Linux学习笔记重新整理了一遍。标题写得很朴素,就叫“Linux学习笔记”,但里面装的东西并不只是几条命令,而是把命令、系统管理、环境搭建、嵌入式调试和一堆踩坑记录凑到了一块。身边不少朋友问我,都2026年了,为什么还在手记Linux基础?因为服务器、容器、嵌入式设备的底座依然是Linux,云原生再热闹,底下跑的还是内核和systemd。不管你是刚入行的运维、准备转嵌入式开发的工程师,还是打算把Linux作为第二工作台的技术爱好者,这份笔记都能当一份“查着就能用”的参考。
1. 这篇学习笔记在学什么:先看懂任务边界
1.1 为什么这个阶段值得系统整理Linux笔记
很多新手学Linux的典型状态是:今天记一条ls,明天看一篇博客讲grep,过两周全忘光。我也经历过这个阶段,后来发现问题的根源不是记性差,而是知识没有挂到场景上。
我对自己的要求是:每一条记录都要能回答“我在什么时候需要它”。比如ss -tlnp这条命令,单纯背“查看监听端口”没意义,但如果你遇到“端口被占用,不知道哪个进程占着”,这条命令马上就有用了。整理这份笔记时,我特意保留了这种“现场感”:把命令、症状、解决过程写在一起,而不是抄一本命令大全。
1.2 用什么主线把零散的知识串起来
我的笔记分了四个大模块,这也是我建议你采用的索引方式。
| 模块 | 核心问题 | 对应内容 |
|---|---|---|
| 常用命令 | 文件、进程、网络怎么操作 | ls、find、ps、ss、systemctl、curl |
| 环境搭建 | 怎么把开发环境跑起来 | 虚拟机、Docker、Python、JDK、Anaconda |
| 系统管理 | 用户、密码、存储、网络怎么管 | useradd、chage、mount、nmcli、iptables |
| 专项与嵌入式 | 设备调试和选型怎么做 | PHY、DSA、串口服务器、发行版选择 |
每次学习新内容,我会先判断它放到哪个模块,然后给条目加标签。比如“Linux系统安装Python”这条,标签就是“环境搭建/解释器”。面试题我也会顺手记,但不会单独开一个大章节,而是在对应知识点旁边写一句“面试口径”,比如讲权限时补一句chmod 755的含义。
这样整理的好处是,知识从“碎片”变成了“地图”。遇到问题先定位模块,再顺着模块找对应命令和案例,效率比翻浏览器历史高得多。
2. Linux常用命令:把高频操作练成肌肉记忆
2.1 文件与权限:一切操作的地基
Linux下所有问题最后都会落到文件和权限上。我每天都会用到的基础组合是cd、ls、mkdir、cp、mv、rm,这些不用多说,真正需要花心思的是权限。
chmod 755和chown root:root谁都会敲,但是为什么要这样设计?权限数字用 4、2、1 表示读、写、执行,是因为它们是二进制位,rwx加起来是 7,r-x是 5。新手容易忽略的是umask,它决定了新建文件的默认权限。比如umask 022表示新建文件要去掉组和其他用户的写权限。调权限之前先ls -l看一眼当前属主和属组,比直接sudo chmod -R 777靠谱得多。
find命令是文件管理里最有价值的,没有之一。举例:我想找出所有大于 100MB 的日志文件,可以这样写:
find /var/log -type f -size +100M -exec ls -lh {} \;这里-exec把找到的文件传给后面的命令逐个处理。唯一要注意的是{}和\;的写法,很多人漏掉反斜杠导致命令报错。这条命令背后的思路是:不用先ls再人工找,让系统替你做筛选。
2.2 进程与服务:知道现在机器在干什么
进程管理是 Linux 和 Windows 体验差异最大的地方。我常用的套路是ps、top、systemctl三件套。
ps aux --sort=-%mem:按内存占用排序查看所有进程。top -p PID:只看指定进程的资源占用。systemctl status 服务名:看服务状态、日志和主进程 PID。journalctl -u 服务名 --since "1 hour ago":看服务最近一小时日志。
有一次排查网站响应慢,我用top没看出问题,换ps aux --sort=-%cpu才发现有个 Python 进程 CPU 一直飙在 300%。点进去看日志,是某个定时任务没有退出,由此意识到kill虽有用,但找到“为什么这个进程还活着”更关键。
systemd现在几乎是所有主流发行版的服务管理器,systemctl enable --now这种组合参数很实用,一次完成“开机自启”和“立即启动”两件事。排查问题别只看服务是否 running,还要看它最近的报错日志。
2.3 网络与端口:定位连接,别瞎抓
网络排查常用的命令我在笔记里单独列了一页:ip addr、ping、ss、netstat、curl。老教程总爱用netstat,但现在更推荐ss,它更快、信息更全。
想查看某个端口被谁占用:
ss -tlnp | grep 8080想测试本机到目标地址的连通性:
curl -v http://192.168.1.10:3000curl -v见过的坑很多,它能直接显示 TLS 握手、HTTP 状态码和响应头,比到处ping有用得多。网络不通时要按层次拆:先看网卡有没有 IP,再 ping 网关,再 ping 外网,最后才查服务端口。一次性往前跳,永远定位不到问题。
2.4 把重复操作写成脚本,别让自己变成打字员
整理这份笔记时我顺手写了不少小脚本,比如每天登录看磁盘、内存、端口三件事:
cat > ~/bin/daily_check.sh <<'EOF' #!/bin/bash echo "=== 磁盘占用 ===" df -h | grep -v tmpfs echo "=== 内存情况 ===" free -h echo "=== 监听端口 ===" ss -tlnp EOF chmod +x ~/bin/daily_check.sh把~/bin加进PATH,之后敲daily_check就能看到结果。这种脚本的价值不只是省事,而是把“我知道要查什么”固定成了流程,避免每次临时发挥。
GitHub 这类代码平台也有 CLI 工具,比如gh,登录后可以直接在终端管理仓库、看 Issue,不用切到网页。命令行不是给极客的玩具,它是把操作串成流程的桥。
3. 环境搭建:虚拟机、Docker和开发组件一次配齐
3.1 虚拟机安装Linux以及蓝屏的避坑处理
很多人第一次接触 Linux 是从虚拟机开始的。我推荐先装 VMware Workstation 或 VirtualBox,再下载一个你喜欢的发行版 ISO 镜像。镜像下载后先对照官方 SHA256 校验,不要拿到什么就装什么,这一步能避免很多莫名其妙的安装失败。
虚拟机装 Linux 时,硬件设置里至少给到 2 核 CPU、8GB 内存、80GB 磁盘,别拿 512MB 内存去跑桌面环境,那体验会劝退不少人。比较常见的坑是“虚拟机安装 Linux 蓝屏”。蓝屏很少是 Linux 本身导致的,多半是电脑开启了 Hyper-V、内核隔离或者设备防护,和虚拟机软件的虚拟化层冲突。解决办法分两步。
- 重启用 BIOS/UEFI,确认 VT-x 或 AMD-V 虚拟化已开启。
- 在 Windows 的“启用或关闭 Windows 功能”里检查 Hyper-V 相关组件,如果日常不用就关掉。
如果电脑必须开 Hyper-V,考虑直接用 WSL2 或 Hyper-V 虚拟机,换一种虚拟化方案比硬扛蓝屏靠谱。
3.2 装好Python、JDK 1.8与Anaconda环境变量
现在很多工具都有图形界面,但服务器上不会有对话框。装 Python 时我一般优先用发行版自带的包管理:
# Debian/Ubuntu sudo apt update && sudo apt install -y python3 python3-pip # Rocky/RHEL 系 sudo dnf install -y python3如果版本太老要源码编译,就下载源码包,然后:
./configure --enable-optimizations make -j$(nproc) sudo make installJDK 1.8 在不少老项目里仍是硬需求,用包管理器安装最省事,然后通过环境变量指定版本:
sudo apt install openjdk-8-jdk export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH环境变量放进/etc/profile.d/java.sh,别写在交互终端的临时会话里,否则一重启就没了。
Anaconda 的安装同样是环境变量问题。安装时用-b -p参数可以静默指定目录:
bash Anaconda-latest-Linux-x86_64.sh -b -p $HOME/anaconda3 export PATH=$HOME/anaconda3/bin:$PATH conda init bash我踩过的坑是 PATH 顺序。如果系统自带 Python 出现在 Anaconda 前面,python --version仍然是老版本。用which python检查一下最直接。
3.3 用Docker把Gitea和WorkBuddy这类工具跑起来
Docker 现在是装应用最省心的方式。官方提供了一行安装脚本:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo systemctl enable --now docker sudo usermod -aG docker $USER最后一步把当前用户加入 docker 组,否则每次都要 sudo。加完后重新登录再执行docker ps。
Gitea 是一款轻量 Git 服务,非常适合内网团队自用。我用 docker-compose 维护了一个配置:
version: "3" services: gitea: image: gitea/gitea:latest container_name: gitea restart: always ports: - "3000:3000" - "2222:22" volumes: - ./data:/data保存为docker-compose.yml,然后docker compose up -d。访问时注意数据目录权限,容器里的git用户和宿主机的 UID 不一定一致,我因为这个问题写好配置后一直 500,最终chown -R 1000:1000 ./data解决。
WorkBuddy 这类面向 Linux 的桌面协作工具,如果官方提供 AppImage 或 deb 包,安装思路也类似:下载安装包、给执行权限、运行。AppImage 不需要真正“安装”,chmod +x后直接执行,缺依赖时再看运行日志补库。这类工具最怕的是乱放文件,我习惯都丢到~/Applications,方便统一备份。
4. 系统管理的几个硬细节:用户、密码、进程、存储、网络
4.1 新建用户并让密码过期前有提醒
生产环境里经常遇到“这台机器是上个同事创建的,密码过期了,人不在,我进不去”的尴尬。新建用户时就要考虑密码周期:
sudo useradd -m -s /bin/bash alice sudo passwd alice sudo chage -M 90 -W 7 alice sudo chage -l alice-M 90表示密码 90 天过期,-W 7表示过期前 7 天提醒。能用chage的账户不会突然锁死,至少给你缓冲时间。
不过很多系统并不会主动把你的密码过期通知发到邮箱或 IM,所以我会写一个简单的巡检脚本,每天检查一次所有普通用户的状态:
for user in $(awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd) do days=$(sudo chage -l "$user" 2>/dev/null | grep -E "Password expires|密码过期" | awk -F: '{print $2}') echo "$user: $days" done这个脚本适合放在 crontab 里每天跑,发现结果异常再人工处理。权限管理上,最忌讳随手sudo chown -R,临时提权能解决问题,但不代表这个权限设计是对的。
4.2 修改进程名,让监控一眼看清
正常情况下进程名就是启动它的可执行文件名,但总有例外:脚本跑起来显示的是解释器的名字,比如所有 Python 程序都叫python3。运维同事看图都觉得头大。解决办法是启动时改进程名。
exec -a my-worker python3 /opt/app/worker.pyexec -a是 Bash 提供的方式,进程名显示为my-worker。如果是 C 程序,可以用prctl(PR_SET_NAME)"或写/proc/self/comm实现。Python 程序还可以装setproctitle库,在代码里直接设置:
import setproctitle setproctitle.setproctitle("my-worker")进程名不只是好看。系统出问题时,ps aux输出一眼就知道哪个服务在跑,排查时间会明显缩短。我列过一张进程和端口的对照表:先ss -tlnp看端口,再去/proc/$PID/cmdline确认启动参数,这是定位问题最快的路径。
4.3 挂载NAS存储和给局域网做共享上网
数据量大了以后,单机磁盘往往不够用,挂载 NAS 是常见操作。
NFS 挂载:
sudo mount -t nfs 192.168.1.10:/volume/nas /mnt/nasWindows 和 Linux 之间更常用 CIFS:
sudo mount -t cifs //192.168.1.10/share /mnt/nas -o username=backup,vers=3.0,noperm挂载后不要忘记写入/etc/fstab,否则重启就丢了。fstab 条目里建议加_netdev,表示网络设备就绪后再挂载,避免开机时网络还没起来导致等待超时。
局域网里还有一类需求是“让这台 Linux 帮内网机器转发上网”。Linux 做共享上网的核心是开启 IP 转发和 NAT:
echo 1 > /proc/sys/net/ipv4/ip_forward sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE这条命令把内网流量伪装成 eth0 的地址往外送。注意,生产环境的 NAT 规则必须经过审慎配置,配合防火墙白名单,不能一开就把整个内网裸奔出去。
4.4 Rocky Linux网络配置与常见的网卡文件
Rocky Linux 的网卡管理现在基本走 NetworkManager。ip addr看到的是运行时状态,配置文件才是持久化状态。Rocky 9 以前的惯例是/etc/sysconfig/network-scripts/ifcfg-*,到了 Rocky 10 这类较新版本,默认走/etc/NetworkManager/system-connections/下面的 keyfile。
用 nmcli 改 IP 是最不容易出错的:
nmcli con mod ens18 ipv4.addresses 192.168.1.200/24 nmcli con mod ens18 ipv4.gateway 192.168.1.1 nmcli con mod ens18 ipv4.method manual nmcli con up ens18改完后用nmcli con show ens18核对。别手动编辑 keyfile 又忘记nmcli con reload,否则改半天不生效。网卡配置文件相关的坑基本集中在“文件写了,服务没重载”和“UUID 冲突”这两类。
5. 嵌入式Linux笔记:PHY、DSA、串口服务器与发行版选择
5.1 为什么PHY芯片可以不走MDIO而用I2C
看笔记的人可能会奇怪,嵌入式底层这些“校数据手册”的活儿,普通运维也需要看吗?需要。网口问题在服务器和嵌入式设备上都会遇到,区别只是管理方式不同。
以太网 PHY 芯片默认可以通过 MDIO 总线读取寄存器,MDIO 只有两根线,很适合管理 PHY。但现实中并不是所有设计都把 MDIO 接到主控上,有时是引脚复用冲突,有时是PHY本身只提供 I2C 接口。I2C 同样是低速管理总线,功能类似,都能读写 PHY 内部寄存器,只是协议不同。
遇到“PHY 不使用 MDIO,使用 I2C”的设备树配置时,要重点看compatible、reg和复位引脚,例如:
&i2c2 { phy0: ethernet-phy@1 { compatible = "ethernet-phy-id0043.0e10"; reg = <1>; reset-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>; }; };这里reg = <1>是 I2C 地址,要根据硬件原理图确认。调试时先用i2cdetect -y 2扫总线,能看到 PHY 地址,再进内核和驱动匹配。如果探测不到,优先检查供电和复位引脚,而不是追着驱动代码分析。
5.2 DSA交换机驱动的整体认识
DSA 是 Linux 内核里一种交换机驱动框架,全称 Distributed Switch Architecture,它让“带交换芯片的路由器/开发板”能像普通网卡一样管理多个网口。理解 DSA 的关键是记住一句话:交换机内部有多个端口,其中一个接 CPU,叫 CPU port,其余端口是普通用户口。
DSA 驱动主要做两件事:一是在报文进出交换机口时打上或去掉 tag,让内核知道这个包从哪个物理口进来;二是把交换芯片的寄存器访问封装成标准接口。排查 DSA 问题时,别一开始就扎进源码,先看dmesg里的 probe 日志,确认驱动有没有成功识别交换芯片型号,再确认 tag 协议是否匹配。
很多嵌入式项目,比如网口扩展到 5 口、8口,都会遇到 DSA 或者 switchdev 两种选择。DSA 适合固定端口拓扑,switchdev 更适合灵活卸载转发。内核日志里出现DSA: switch 0 detected这类信息,基本说明芯片识别成功,剩下的问题是端口使能。
5.3 网口转串口服务器:当UART要被带到远处
工业现场常遇到“串口设备离主机几十米”的情况,那就需要网口转串口服务器。本质上它把 RS232/RS485 信号转成以太网帧,把串口变网络端口。Linux 主机这边,往往只要把网络端口再映射回一个本地串口设备就能继续用旧程序。
软件层面一个实用工具是socat。假设串口服务器把串口映射到 TCP 4001,我在主机上把这个 TCP 接到本地虚拟串口:
socat pty,link=/dev/ttyS5,raw,echo=0 TCP:192.168.1.30:4001之后程序读写/dev/ttyS5就好像在操作远程串口。这里最大的坑是波特率、数据位、停止位必须两端一致,否则收到的都是乱码。别小看这条命令,很多嵌入式设备接入物联网网关时都用类似思路。
5.4 生态最好?别迷信,看场景选发行版
“生态最好的Linux系统”是一个经常被讨论的问题。我的经验是:生态好坏取决于你用在什么场景。
| 场景 | 推荐方向 | 理由 |
|---|---|---|
| 日常开发/桌面 | Debian、Ubuntu 系 | 软件包多,社区资料全,遇到问题搜得到 |
| 服务器稳定运行 | Rocky Linux、AlmaLinux | 生命周期长,更新保守,更适合生产 |
| 安全测试与排查 | Kali Linux | 预装大量安全工具,但不要把它当日常桌面 |
| 嵌入式设备 | Buildroot、Yocto | 面向裁剪和固化,不是给你装一堆软件包的 |
Kali Linux 安装时如果遇到图形界面起不来,可以在启动菜单加nomodeset参数,先关闭显卡内核驱动,进入系统后再安装合适驱动。很多人觉得 Kali 就是“高级黑客系统”,其实它只是一套工具集,内核还是那个 Linux。
6. 问题排查速查表:这次踩过的坑都在这
6.1 SSH登录因密码过期失败
故障现象:SSH 登录提示密码过期,但你怎么输入都不对。原因多数是账户密码已经到期,且系统强制要求修改。
解决办法:
sudo chage -M 99999 用户名 sudo passwd 用户名如果 SSH 本身被锁定,只能通过本机控制台或物理终端进入维护模式。我的建议是把密码过期时间设置得足够宽松,再用外部脚本做提醒,不要等到锁死再想对策。
6.2 GCC与工具链版本混乱
编译程序遇到 “gcc: error” 时,第一反应不是改代码,而是看版本。gcc --version和which gcc两步就能判断当前用的是系统路径还是某个自带工具链。有的开发包显示类似535.54.03(linux)gcc的版本号,这个字符串通常是厂商编译工具链的定制标识,不代表标准 GCC 版本,直接对比会有误导。
多版本并存时用update-alternatives管理默认版本:
sudo update-alternatives --config gcc必要时在环境变量里指定CC=/usr/bin/gcc-13,避免 Makefile 沿用旧编译器路径。
6.3 虚拟机蓝屏和Kali安装引导问题
虚拟机蓝屏的核心排查点在上文已经说过:BIOS 虚拟化开关和 Windows 虚拟化功能冲突。真到蓝屏之后,先看蓝屏代码是不是VIDEO_TDR_FAILURE或HYPERVISOR_ERROR,是前者就试驱动,是后者就关 Hyper-V。
Kali 安装引导和普通发行版有些差异,遇到花屏或卡在 logo,先加nomodeset进内核参数,再进系统装驱动。ISO 文件也要先核对哈希,我遇到过下载不完整导致安装到一半崩溃的,一切排查的起点都是“镜像没错”。
6.4 输入法、打印机和日常桌面细节
Linux 桌面输入法切换中英文,是新手问得最多的问题。现在主流是 fcitx5 或 ibus。安装后执行:
im-config -n fcitx5再重新登录,中英文切换快捷键通常默认是Ctrl+Space或Super+Space。如果你刚配置完没反应,先打开输入法设置里看是否有添加中文拼音引擎,很多问题是引擎没装。
打印机这类硬件最常踩坑。例如 HP LaserJet P1106 这类老型号,官方驱动支持不够,社区方案是foo2zjs。先安装 CUPS,再把打印机接到系统,用lpinfo -l看系统识别到的型号,按型号装驱动。多半不会像 Windows 那样即插即用,但配置好后基本稳定。
杂项工具里,bkcrack这类针对 ZIP 压缩包做离线密码恢复的工具有时也会被翻出来,我在这里不展开具体用法。但有一点要提醒:这类工具只允许用在你自己拥有或已授权测试的数据上,别拿别人压缩包乱试,权限边界要先想清楚。
写在最后:一点个人心得
这份笔记整理完,我自己最大的体会是:学 Linux 不能靠“收藏”,要靠“使用”。每一条命令只有在你亲手解决过一个报错之后,才会真正变成你的东西。我现在写笔记的习惯是,每个条目必须写“当时发生了什么”,哪怕只是顺手记一句“运行时报 Permission denied,检查后发现是挂载目录的属主不对”,过两周再看也能立刻想起来。下一阶段我打算把这份笔记里的脚本和配置搬到一个 Git 仓库里,版本管理起来,每次踩坑更新一版,比存一堆 Markdown 文件更可控。如果你也在整理自己的 Linux 学习笔记,不妨从一个解决过的小问题开始,把它写下来,慢慢积累,你会发现自己比想象中更能坚持。