☰
Linux系统学习笔记:从基础命令到服务部署的完整知识框架
2026/10/2 10:23:20 网站建设 项目流程

2026年1月12日,我把过去一年多攒下的Linux知识重新整理了一遍。起因很直接:手边三台机器——一台跑业务的Rocky Linux 9服务器、一台装着Debian 13(Trixie)的退役笔记本、一台放在虚拟机里的Kali——每台上面都散落着半年前的笔记和终端历史。之前的学习方式基本属于"零散拾荒":今天搜一个linux常用命令,明天照着教程装个Docker,后天被面试题考倒再回去补概念。时间一长,知识点之间全是漏洞。

所以我决定花一整天把整个知识框架重过一遍:从虚拟机装系统开始,到常用命令、用户权限、网络存储,再到Docker部署和进程间通信,最后把Linux面试题里高频出现的考点和操作陷阱也顺了一遍。整理过程明显比预想中费劲,因为每个命令背后都能扯出一串"为什么",但也正是这些"为什么"让我从"会敲命令"变成了"理解系统"。这篇笔记就是当天的整理版,适合正在系统学习Linux的新手,也适合想查漏补缺的运维、开发,以及准备Linux岗位面试的人。

1. 这次整理的主线:从装系统到跑服务的五个阶段

1.1 触发整理的真实场景

很多人学Linux是"用到哪查到哪",我那天决定整理,是因为连续遇到了四件小事。第一件是帮同事排查一台新装的服务器,网卡怎么都起不来,前前后后折腾了一个多小时,最后发现是NetworkManager把接口接管了,而同事还在用老掉牙的ifcfg文件配置方式。第二件是参与了几场技术面试,发现不少候选人对ls、grep这些命令很熟,但一问到"进程间通信有哪几种方式""为什么/etc目录下的passwd命令带setuid位",就开始含糊其辞。第三件是公司内部要搞私有化部署,从Docker到数据库中间件,全都要自己在Linux上搭起来。第四件是那天顺手翻了翻网上的技术热搜,"linux常用命令""linux挂载nas存储""rocky linux网卡文件""kali linux安装教程"这些词条的热度一直很高,说明很多人都卡在同样的地方。

1.2 我的整理主线

当天整理时,我没有按命令字母表去列大全,而是给自己定了一条主线:环境(装系统)→ 基础(命令、用户、进程)→ 外围(网络、存储)→ 服务化(Docker、ClickHouse、私有服务)→ 延伸(嵌入式、安全)。

这条主线其实就是一套业务系统从无到有的步骤。沿着它去整理,每个知识点都有明确的使用场景,而不是孤立的命令行碎片。我用笔记软件建了五个目录,每个知识点记录四件事:是什么、怎么用、为什么、坑在哪。

1.3 给自学Linux的人三条建议

先说结论。第一,准备两台机器:一台"生产型"发行版(比如Rocky Linux),一台"折腾型"发行版(比如Debian或Kali)。生产型的让你习惯稳定维护,折腾型的让你敢于反复重装试错。第二,别只敲命令,遇到问题先man手册,再去看/proc目录下的运行时信息,很多底层知识都是从这里长出来的。第三,把每个命令从"我会用"变成"我知道它内部做了什么",比如rm不只是删除,而是unlink一个目录项;df和du统计维度的差异,背后是文件系统和块设备的区别。这样学出来的知识,才是能迁移的。

2. 环境准备:虚拟机装Linux的蓝屏问题与发行版选型

2.1 虚拟机安装蓝屏的完整排查链路

先说那天最早遇到的坑:在一台Windows 11笔记本上用VirtualBox安装Debian 13,虚拟机启动没几分钟,宿主机直接蓝屏重启。这不是客户机的问题,是宿主机内核层面被触发崩溃了。

排查链路是这样的。第一步先检验镜像完整性,去官网下载页面比对SHA256,排除安装镜像损坏。第二步打开任务管理器,性能选项卡里看CPU的虚拟化是否已启用,没启用就去BIOS里打开VT-x或AMD-V。这两步都没问题,那第三个原因就指向Windows的Hypervisor和第三方虚拟机软件的冲突。

Windows 10/11开启内核隔离(内存完整性)或WSL2功能时,Hyper-V会接管虚拟化层。VirtualBox在这种情况下虽然也能跑,但某些操作会触发嵌套虚拟化异常,轻则性能暴跌,重则直接蓝屏。我当时的管理员终端里执行了bcdedit /set hypervisorlaunchtype off,重启后蓝屏消失。

这里要提醒一句:如果日常依赖WSL2或Docker Desktop,关掉Hypervisor会让它们无法工作。这种情况下更稳妥的方案是换VMware Workstation,它和Hyper-V的共存机制做得比VirtualBox成熟。装完系统后第一件事永远是装增强工具或VM Tools,共享剪贴板、拖拽文件、自适应分辨率都靠它,别省这一步。

2.2 发行版怎么选:Rocky、Debian、国产系与Kali

很多新手纠结"哪个发行版最好",其实没有标准答案,只有场景匹配。我整理了一张表格,直接按用途选:

发行版包管理适合场景我用来做什么
Rocky Linux 9dnf/rpm服务器生产环境、追求稳定部署Docker、ClickHouse、Gitea
Debian 13 (Trixie)apt/deb通用服务器、桌面学习网络配置、源替换、日常折腾
统信UOS / 银河麒麟apt/deb 或 yum/rpm企业国产化办公环境了解生态兼容性
Kali Linuxapt/deb安全审计、CTF授权测试环境下的工具学习

选型逻辑其实很简单:服务器尽量靠拢RHEL系,因为企业里存量系统、厂商支持、认证体系都围绕它展开,网上能查到的生产排错案例也最多。日常学习和桌面体验用Debian系,软件新、教程多、apt用起来顺手。至于统信UOS、银河麒麟这些国产发行版,它们本质上是基于Linux内核的完整操作系统,包管理方式与Debian或RHEL系同源,在政企环境里很常见。从技术学习角度看,你掌握标准Linux知识后,切换到这些系统基本是无痛的。

Kali则是安全领域的专用系统,后面单独讲。网上常年有人争论"生态最好的Linux系统",我的观点是:生态好不好,取决于你所在的技术圈子长期用哪套体系,而不是某个发行版本身。

2.3 安装后立刻要做的三件事

装完系统,先别急着敲命令,把三件事做了能省下后面很多麻烦。

第一件事是确认网络。Rocky Linux 9默认使用NetworkManager管理网络,登录后先执行nmcli device status看看网卡是否被识别,再nmcli connection show查看连接配置。很多人上来就翻/etc/sysconfig/network-scripts/ifcfg-*,在Rocky 9里这个老目录基本已经退居幕后,配置文件实际放在/etc/NetworkManager/system-connections/下。

第二件事是换软件源。Debian 13的一个大变化是:默认的软件源配置文件不再是你熟悉的/etc/apt/sources.list,而是/etc/apt/sources.list.d/debian.sources,采用deb822格式。如果只改旧文件不生效,别惊讶,先看看新文件。换清华源时,文件内容类似这样:

Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/debian/ Suites: trixie trixie-updates trixie-backports Components: main contrib non-free non-free-firmware Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

安全更新源要单独配,Suite写成trixie-security,URIs指向清华的debian-security路径。

第三件事是配置Anaconda环境变量。很多人在Linux下装完Anaconda,直接在终端敲conda却提示找不到命令,原因就是PATH里没有/opt/anaconda3/bin。在~/.bashrc末尾加上export PATH="/opt/anaconda3/bin:$PATH",然后source ~/.bashrc。需要注意,用sudo执行conda时PATH会被重置,如果不希望每次sudo都找不到python,就别在sudo环境下依赖conda,或者显式使用绝对路径。

3. 高频命令整理:把"常用命令大全"变成自己的肌肉记忆

3.1 按场景而非字母表整理命令

网上流传的linux常用命令大全几乎都是按字母排序,这种整理方式很低效。我按使用场景把命令分成五组,记忆负担小得多:

  • 文件操作:ls、cp、mv、rm、find、tar、rsync
  • 文本处理:grep、awk、sed、sort、uniq、head、tail
  • 进程管理:ps、top、htop、kill、pkill、nice、renice
  • 网络排查:ip、ss、netstat、ping、curl、wget、traceroute、nc
  • 磁盘存储:df、du、fdisk、lsblk、blkid、mount

光列命令没有意义,我给你一个真实排查案例。那天一台服务器磁盘满了,我先df -h发现根分区100%,再用du -sh /var/log/*逐级找大目录,定位到journal日志占了20G,执行journalctl --vacuum-size=500M清理。整个过程没有用一个高深命令,全是基础工具的组合,但比任何命令大全都实用。

3.2 文本处理三剑客的一句话记忆

grep负责过滤,awk负责取列和统计,sed负责替换和流编辑。记住各自的定位,组合起来威力很大。

统计日志里每个IP的出现次数,一行搞定:

awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

去掉配置文件里的注释行:

sed -i '/^#/d' config.conf

找进程但排除掉grep自身:

ps aux | grep sshd | grep -v grep

这三个例子覆盖了90%的日常场景。学awk不要一上来啃几百页文档,先记{print $列号}这个模式,再逐步掌握内置变量NR、NF,足够应付绝大多数处理需求。

3.3 用户管理:从新建用户到密码过期提醒

用户管理是Linux系统管理的基础课,也是面试题的重灾区。完整的新建用户流程是这样:

useradd -m -s /bin/bash alice echo "alice:初始密码" | chpasswd usermod -aG wheel alice

-m创建家目录,-s指定登录Shell,chpasswd批量设置密码比交互式passwd更适合脚本。RHEL系管理员组是wheel,Debian系是sudo组,别搞混。

密码过期提醒是运维里经常被问到的一个点。单用户策略用chage命令:

chage -M 90 -W 7 alice chage -l alice

-M 90表示密码最长使用90天,-W 7表示提前7天开始提醒。全局限定在/etc/login.defs里修改PASS_MAX_DAYS和PASS_WARN_AGE,注意这个文件只影响新用户,存量用户要单独chage。如果想让用户首次登录必须改密码,执行chage -d 0 alice,效果是密码马上过期,登录时强制改密。

"linux密码过期提醒通知"是网上搜得很热的问题。Linux自带的提醒是在登录时终端里显示"密码即将到期",如果要真正发邮件通知,需要配合pam_exec脚本或者cron定时扫描chage -l输出,属于进阶玩法,生产环境里不少公司就是这么做的。

3.4 进程管理进阶:修改进程名称到底改了什么

热搜里有一条"linux 修改进程名称",这个需求很实际:监控面板上看到的进程名太笼统,或者Python脚本默认显示python3,你希望它显示成业务名。

从原理上说,进程名有两个来源。一个在/proc/ /cmdline,是启动时传入的参数,反映的是argv[0]和参数列表;另一个在/proc/ /comm,是内核记录的进程名,会被截断为15个字符。ps命令显示的NAME列,不同参数下取的是不同来源。

实际操作有三种方式。Shell内建命令exec -a可以直接改argv[0]:

exec -a my_monitor python3 /opt/app.py

Python代码里用setproctitle库:

import setproctitle setproctitle.setproctitle("my_monitor")

C语言里调用prctl:

prctl(PR_SET_NAME, "my_monitor");

如果你用systemd管理服务,进程名的控制更简单,ExecStart里直接写清楚命令,再加--参数即可。这块知识在调试多worker进程、容器内识别业务进程时特别有用。

4. 网络与存储:把Linux放进真实环境

4.1 Rocky Linux网卡配置与NetworkManager

网络配置是Linux入门的一道坎,把Rocky系讲清楚,其他发行版就举一反三了。Rocky Linux 9和10都默认走NetworkManager,推荐用nmcli命令操作,而不是手工改文件。

配置静态IP的完整流程:

nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.1.10/24 nmcli connection modify ens33 ipv4.gateway 192.168.1.1 nmcli connection modify ens33 ipv4.dns 223.5.5.5 nmcli connection up ens33

改完立即生效,但要注意:如果你是通过SSH远程操作,改IP会导致连接瞬间断开,这是非常经典的翻车场景。正确做法是改完配置后先起一个新会话测试,没问题再断旧连接。Debian系则习惯用/etc/network/interfaces,或者装NetworkManager后用配置目录管理,两种体系差异不小,网上关于"rocky linux 10 配置网络信息"的搜索热度高,说明大家都在这上面踩过坑。

4.2 挂载NAS存储的完整链路

"linux挂载nas存储"能挂上热搜,说明这是企业环境里的高频需求。挂载NAS主要分NFS和SMB/CIFS两种协议。

NFS方式在Linux之间用,先装依赖:RHEL系dnf install nfs-utils,Debian系apt install nfs-common。查看服务器导出路径:

showmount -e 192.168.1.100

挂载:

mount -t nfs 192.168.1.100:/volume/share /mnt/nas -o nfsvers=4

要在重启后自动挂载,写入/etc/fstab:

192.168.1.100:/volume/share /mnt/nas nfs defaults,_netdev,noatime 0 0

SMB/CIFS方式适合挂载Windows或群晖这类NAS:

mount -t cifs //192.168.1.100/NAS /mnt/nas -o credentials=/etc/nas.cred,vers=3.0,uid=1000,gid=1000

强烈建议把用户名密码放进credentials文件并chmod 600,不要在fstab里明文写密码。两个高频坑:一是uid/gid参数,容器服务以特定用户运行时,挂载目录如果权限对不上会写入失败;二是_netdev,这个参数确保系统在网卡就绪后才尝试挂载,能避免开机时因网络未就绪导致的挂载失败。重启后发现挂载丢失,多半就是没加这个参数。

4.3 局域网共享上网与网口转串口的实践

热搜里"linux 共享上网 办法",从技术上讲指的是Linux充当内网网关,把局域网内其他机器通过NAT转发上外网。这个场景在企业内网、实验室里很常见。

一台Linux双网卡机器,eth0接外网,eth1接内网,开启转发和NAT:

sysctl net.ipv4.ip_forward=1 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

把第一句写进/etc/sysctl.conf持久化,iptables规则用iptables-save > /etc/sysconfig/iptables保存,或者安装iptables-persistent。内网机器的网关指向Linux的内网IP即可。如果想顺便做DHCP,装个dnsmasq就行。

网口转串口的场景主要出现在工业设备调试:一个串口服务器盒子把串口转成网络接口,Linux上访问它有两种姿势,一种是直接用IP和端口访问,另一种是socat把TCP端口映射成本地tty设备:

socat -d -d TCP-LISTEN:4001,fork PTY,link=/dev/ttyS10,raw,echo=0

映射出来之后,程序照常读写/dev/ttyS10,完全无感。这种思路在做物联网设备调试时能省掉很多物理串口的折腾。

5. 服务部署实战:Docker到ClickHouse再到私有代码托管

5.1 安装Docker的标准姿势

服务器装Docker,我现在基本固定用国内镜像源安装。RHEL系先加仓库:

dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/docker-ce.repo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin systemctl enable --now docker

Debian系把仓库地址里的rhel换成debian即可。装完先别急着用,docker run hello-world验证一下。这里说个细节:如果服务器上配了自定义端口或代理,docker pull可能会失败,需要检查/etc/docker/daemon.json。如果公司有内网镜像仓库,也可以在daemon.json的registry-mirrors里配置。生产环境我建议把docker-compose-plugin一起装上,后面部署应用都用compose文件编排,比裸docker run可控得多。

5.2 用Docker部署ClickHouse 21.8.15.7

热搜里有个很具体的版本号"linux 部署 clickhouse 21.8.15.7",这说明很多人部署时需要在特定版本上复现行为。我的实践是用固定tag拉取镜像:

docker run -d --name clickhouse-server --restart=always \ -p 8123:8123 -p 9000:9000 \ -e CLICKHOUSE_PASSWORD=安全密码 \ -v /data/clickhouse/data:/var/lib/clickhouse \ -v /data/clickhouse/logs:/var/log/clickhouse-server \ clickhouse/clickhouse-server:21.8.15.7

ClickHouse默认端口要记清楚:9000是客户端TCP端口,8123是HTTP端口,9009用于集群复制。验证是否启动成功:

curl http://localhost:8123/

返回Ok就是没问题的。生产环境推荐再加一个clickhouse-client容器,或者直接HTTP接口执行查询。部署时有个坑:容器重建后,有时候CLICKHOUSE_PASSWORD环境变量的处理在不同版本镜像里不一致,表现为新容器不认旧密码。稳妥的方案是把users.xml挂载进去,密码在XML里显式配置,绕开环境变量这个黑盒。数据目录挂载到宿主机是必须的,不然容器一删数据全没,别问我怎么知道的。

5.3 Gitea:Linux下的私有代码托管

团队小、又不想依赖外部平台,Gitea是最轻量的选择。二进制方式部署也就三步。

创建系统和目录:

useradd -r -s /usr/sbin/nologin git mkdir -p /var/lib/gitea /etc/gitea chown -R git:git /var/lib/gitea /etc/gitea

下载二进制放到/usr/local/bin/gitea后,写systemd服务:

[Unit] Description=Gitea After=network.target [Service] User=git Group=git WorkingDirectory=/var/lib/gitea ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini Restart=always [Install] WantedBy=multi-user.target

最后配置nginx反代到80端口,一个私有代码托管平台就起来了。整个部署过程不超过半小时,Gitea不吃内存,一台2G的云主机跑起来毫无压力。

5.4 周边服务:云桌面、打印机驱动的Linux化

云桌面在Linux环境里部署,本质上是给用户提供远程图形界面。常见路线有xrdp(Windows远程桌面连接Linux)、Apache Guacamole(浏览器访问)、KasmVNC(容器化流式桌面)。其中xrdp最省事,装完配置好端口就能用,适合内部办公场景。

另一个搜索量很高的问题是"HP LaserJet P1106 linux"。这是个经典的老打印机,Linux下驱动方案是hplip。USB直连时装hplip后跑hp-setup -i,网络打印则用hp-setup -a自动发现。很多人在这一步卡住是因为缺少依赖库,建议先装好libcups2和cups-common再装hplip,成功率会高很多。

5.5 部署里最容易忽略的三个细节

RHEL系服务器部署服务,SELinux是第一道坎。默认Enforcing状态下,容器卷目录的上下文不对,服务就直接拒绝访问。遇到这类问题,先getenforce看状态,再用restorecon -Rv修正目录上下文,别急着setenforce 0。自定义端口也要登记,比如nginx监听8080,需要semanage port -a -t http_port_t -p tcp 8080。

防火墙是第二道坎。firewalld管理端口要执行firewall-cmd --permanent --add-port=8123/tcp再reload。这里有个隐蔽问题:Docker的iptables规则和firewalld重启会互相干扰,重启firewalld后Docker规则经常丢失,需要重启Docker服务。

第三是端口占用排查。这个万能用命令是ss -lntp,看清谁在监听哪个端口,比netstat输出更清晰。服务起不来的排查顺序永远是:看日志、看状态、看端口、看SELinux,这四步走完,绝大多数问题都能定位。

6. 进程间通信与Shell脚本:把零散命令串起来

6.1 进程间通信六种方式

"linux进程间通信"是面试里出现频率极高的考点,也是一个系统从业者的基本功。Linux下的IPC方式主要有六种:管道、信号、共享内存、消息队列、信号量、套接字。我用一个表格对比它们的特点:

方式特点典型场景
管道一端写一端读,内存缓冲,单向命令组合、父子进程通信
信号异步事件通知,轻量kill、Ctrl+C、配置reload
共享内存速度最快,需要配合锁高频大数据交换
消息队列有格式的消息,顺序处理简单的生产消费模型
信号量解决互斥与同步多进程竞争共享资源
套接字支持跨主机,TCP/UDP/Unix域C/S架构、分布式通信

理解它们最好的方式是结合场景。管道就是你天天在用的ls /var/log | grep journal;信号的经典例子是kill -HUP 进程号,很多守护进程收到这个信号会重新加载配置,这不叫重启,是优雅的reload;共享内存可以用ipcs -m查看当前系统里的共享内存段;Unix域套接字则被Docker、数据库大量使用,比TCP少了网络协议栈开销。

6.2 Shell脚本的实用骨架

命令学得再好,不会串成脚本,工作效率就上不去。我常用的脚本骨架很简单:变量、条件、循环,再加一点防御性开关。

磁盘告警脚本是每个运维都写过的入门项目:

#!/bin/bash set -euo pipefail THRESHOLD=80 usage=$(df -h / | awk 'NR==2{print $5}' | tr -d '%') if [ "$usage" -gt "$THRESHOLD" ]; then echo "磁盘使用率已达 $usage%" | mail -s "磁盘空间告警" admin@example.com fi

set -euo pipefail这一行是血泪教训:-e让脚本出错即停,-u防止变量未定义,-o pipefail让管道中任何一环失败都算失败。调试脚本时记住两个武器:bash -x script.sh逐个跟踪每一步,以及尽量多用echo打印中间变量。批量改名、日志轮转、定时备份,这些都是练手的好项目。

6.3 学习过程中的零碎问题记录

顺手记录几个搜索热度不低的小问题。"linux下gvim怎么全选":普通模式输入ggVG,gg跳到文件头,V进入可视行模式,G选中到文件尾,字母y复制。如果你想要更直接的方式,:1,$y的命令同样能做到。

"linux系统安装python"这个需求也很常见。优先推荐用conda/micromamba管理Python环境,系统Python只留给系统工具使用。如果非要编译安装Python 3.12,记得先装好gcc、make、zlib-devel、openssl-devel这些依赖,否则装完缺ssl模块,pip连源都连不上。另外网上有些包名带有"535.54.03(linux)gcc"之类看起来很奇怪的版本号,正规gcc版本号是类似13.2.0这种三段式,碰到不熟悉的版本字符串,先查这个项目自己的Release Notes,别急着装。

7. 权限与安全:从提权原理反推系统加固

7.1 权限模型的底层逻辑

Linux权限模型看起来简单,其实藏了不少容易混淆的细节。rwx三个位对文件和目录的含义不同:对文件,r是读内容,w是修改内容,x是作为程序执行;对目录,r是列出目录内容,w是创建删除文件,x是进入目录。真正理解这个差异,很多权限问题一眼就能看穿,比如你明明有目录的r权限却进不去,多半是缺x权限。

特殊权限位也是面试高频。setuid位最经典的例子就是passwd命令:普通用户能修改自己的密码,就是因为passwd二进制文件带setuid,执行时临时获得root权限。sticky位则在/tmp目录上最典型,权限显示为drwxrwxrwt,它的作用是:目录里任何人都能写文件,但只有文件属主和root能删除别人的文件。这两个机制解释了为什么系统里的权限设计不是一刀切。

7.2 从防御视角看常见提权路径

"linux提权"这个词在网络热搜里热度不低。我这边从系统加固和审计的视角去理解它,因为弄清攻击者的提权路径,是防守的前提。

第一条路径是sudo配置过宽。visudo打开配置,如果看到username ALL=(ALL) NOPASSWD: ALL这种行,基本等于把root交出去了。防御做法是最小化授权,只给需要的那几条命令。第二条路径是SUID文件利用。定时排查本机有哪些文件带setuid位:

find / -perm -4000 -type f 2>/dev/null

逐个确认白名单,发现可疑程序立刻处理。第三条路径是内核漏洞,uname -r查内核版本后跟上官方安全公告,生产环境及时打补丁。第四条路径是cron和PATH劫持,比如可写的cron脚本被植入了恶意命令,或者PATH里出现当前目录且存在同名命令。防御要点是:脚本目录收紧写权限,PATH里不放入当前目录。

所有防御动作归纳起来就是四个词:最小权限、及时补丁、日志审计、边界隔离。auditd打开关键目录的审计,SELinux/AppArmor保持开启,都能把提权路径堵掉大半。

7.3 Kali Linux装完后的基本操作流程

Kali是安全审计领域的专用Linux发行版。先说清楚边界:它只应在授权环境中使用,比如自己的靶机、CTF比赛、公司授权的渗透测试。合规使用的前提下,Kali确实是学习Linux安全体系的最好教材。

装完Kali后的第一件事是更新源并升级系统:

apt update && apt full-upgrade -y

注意是full-upgrade不是upgrade,因为Kali的滚动更新模式下两者的区别很明显。然后建议创建普通用户,日常操作别用root,需要管理员权限时sudo执行。工具按需安装,Kali自带数千个工具,全装没意义,按方向装:信息收集用nmap、masscan,Web方向用burpsuite、sqlmap,密码方向用hydra、john,无线方向用aircrack-ng。虚拟机装Kali一定要打快照,因为涉及内核更新、工具实验时,一个快照能让你几秒钟回到安全状态,这个习惯比任何教程都实用。

8. 嵌入式Linux:从桌面系统到开发板的跃迁

8.1 嵌入式Linux到底在学什么

热搜里"嵌入式linux"和"嵌入式linux项目"都是常青词。嵌入式Linux和桌面Linux用的是同一个内核,差异在于前者要针对特定硬件做裁剪和定制。学习嵌入式Linux的核心是四件事:交叉编译工具链、Bootloader、内核配置、根文件系统。

交叉编译是第一个门槛:开发机上编译,目标板上运行,工具链前缀通常是arm-linux-gnueabihf-这类。写个hello world:

#include <stdio.h> int main() { printf("hello embedded\n"); return 0; }

交叉编译命令:

arm-linux-gnueabihf-gcc hello.c -o hello

文件不能直接在PC上跑,要用qemu模拟或拷贝到板子执行。之后是内核配置,make menuconfig能让你直观地看到内核模块的开关,裁剪到只剩目标板需要的驱动。根文件系统可以用Buildroot或BusyBox生成,一条命令构建出完整的/目录结构。没有真实板子的情况下,qemu-system-arm -M vexpress-a9是个不错的替代,至少能把启动流程跑通。

8.2 驱动与网络子系统:DSA Switch带来的启发

"linux dsa switch驱动"也有人搜,这里简单说两句。DSA(Distributed Switch Architecture)是内核里用于管理多端口交换芯片的框架,家用路由器和工业交换机的Linux系统里经常见到。它通过Linux网络子系统的标准接口,把交换芯片的每个端口抽象成独立的网络设备,上层应用完全无感。

我提这个不是为了讲驱动细节,而是想说清一个学习方法:Linux的能力边际远超桌面场景,很多硬件外设都有对应的内核子系统。遇到一个陌生设备,先去内核文档里找有没有现成的framework,比如DSA、IIO、V4L2,带着这个思路去啃源码,比对着驱动代码逐行看效率高得多。学习嵌入式Linux的路线我建议是:先跑通一个最小系统,再回头研究设备树和驱动模型,最后才碰具体外设驱动。

9. 踩坑日志:一下午的报错与排查

9.1 WSL安装时提示"安装向导提前结束"

网上一搜"windows linux更新子系统安装",能看到很多人遇到同样的问题。安装WSL时弹窗提示"安装向导提前结束,由于错误",常见原因和解决路径比较固定。

第一,确认Windows功能里"适用于Linux的Windows子系统"和"虚拟机平台"都已启用,启用后必须重启。第二,手动更新WSL内核:wsl --update,因为新版WSL2需要内核组件,旧版安装包往往不带。第三,检查默认版本设置,wsl --set-default-version 2。如果还不行,打开服务管理器确认LxssManager服务在运行。处理过程不需要重装系统,按这个顺序排查,我还没见过解决不了的。

9.2 改了密码却登录不进去

有段时间我调密码策略,给测试用户设置了首次登录强制改密码,结果用户反馈按照提示改了新密码,却依然被拒之门外。这个问题的根源在于我没搞清楚两个机制的区别:chage -d 0是让密码立即过期,用户登录后被强制改密,但新密码必须符合密码复杂度策略,比如长度、字符种类,pam_pwquality这一关过不了就会拒绝。另一个可能是多次输错触发faillock账号锁定。

正确的思路是区分使用场景:首次登录强制改密,用chage -d 0;周期性提醒改密,用chage -M 90 -W 7。测试时先关掉复杂度策略验证流程通不通,再逐步打开策略。

9.3 改完网卡IP,SSH当场断连

在4.1节提过这个问题,但值得单独记录。现象是:远程SSH到服务器,执行nmcli connection modify改静态IP,紧接着up连接,瞬间断连。原因很简单,你把自己的通信地址改了。我现在的标准操作是:改配置之前,先另开一个不需要这个网卡的通道,比如带外管理或另一块网卡;如果没有第二通道,就写一个定时恢复脚本:

sleep 60 && nmcli connection up ens33

万一新配置有问题,60秒后自动回滚。这个脚本救过我很多次。

9.4 排查问题时的固定检查顺序

踩坑多了之后,我给自己定了一个固定排查流程,现在分享出来。看到任何服务异常,按这个顺序走:

  1. 看日志:journalctl -xe、/var/log/messages、应用自己的日志文件
  2. 看服务状态:systemctl status 服务名,关注Active行和最近日志
  3. 看端口:ss -lntp确认监听状态
  4. 看权限上下文:RHEL系执行getenforce,再用ausearch -m avc -ts recent查拒绝记录
  5. 看网络:ping、curl -v逐层验证

这个顺序能覆盖80%的问题。很多人一上来就查网络或者怀疑代码,反而漏掉了最明显的日志信息。

最后再说一个我自己坚持的小习惯:每次踩坑解决后,立刻在笔记里记三行——现象、根因、修复命令。不要只记命令,一定要写根因,因为命令会过时,根因不会。这次整理Linux学习笔记时,我翻出过去一年记的几十条踩坑记录,发现大部分问题其实都是同一批底层概念没吃透:权限模型、网络栈、systemd的依赖关系。把这些概念补上之后,很多新问题不用查文档也能推断出方向了。这份笔记对我来说是一次彻底的查漏补缺,也希望对你正在进行的Linux学习有一点参考价值。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询