泡泡资讯网

突破操作系统界限,掌握Linux的必备指南 Linux不是装完就能用的操作系统,

突破操作系统界限,掌握Linux的必备指南
Linux不是装完就能用的操作系统,它得一层层拆开看才明白为啥有时候命令不管用。我最近啃这个大纲,发现以前学的全是皮毛,连发行版和内核的区别都没搞清,就急着配环境、敲命令。光背`ps aux`和`top`有什么用?进程卡死了,根本不知道该翻`/proc/[pid]/status`还是去查cgroup限制。
原来Linux根本不是“一个东西”,而是三层堆起来的:最底下是Linus写的内核,中间是GNU那帮人写的命令和shell,最上面才是Ubuntu或者Arch这些发行版。我之前装了个Arch,以为自己很厉害,结果更新完系统起不来,才发现不是系统坏了,是我没搞懂pacman的滚动更新逻辑,它压根不保证兼容性,一切责任在用户。Debian的apt就不一样,包版本锁得死,升级稳当但可能太老。选哪个发行版,其实是选一套“做事规矩”,不是挑谁图标好看。
查问题也得换脑子。以前看到磁盘慢,第一反应是`iostat`,看个%util就下结论。后来一次IO卡死,`iostat`说没压力,`iotop`也空空如也,最后发现是NVMe盘用了新驱动,`io_uring`还没适配好,系统在内核里排队排队,根本没到磁盘那一层。这时候该看`/sys/block/nvme0n1/queue/io_poll_delay`,而不是死盯命令输出。每个命令背后,都是对内核某个子系统的调用,`ps`读的是`/proc`,`ss`调的是`netlink`,不懂这层,再熟的命令也是蒙的。
我试过用Yocto给自己做个小系统。不是下载镜像,是真从零写`conf/local.conf`,加`meta-intel`层,编译时改`linux-yocto`的配置,把不用的模块全关掉。过程中发现内核启动参数里一个`quiet splash`删错位置,就卡在early printk阶段。嵌入式不是“简化版Linux”,是把Linux当成零件,自己焊电路板。FIPS安全认证那边更硬核,RHEL9里开`CONFIG_FIPS=y`,还要配TPM2芯片、关掉内核lockdown的宽松模式,稍微漏一步,加密就形同虚设。
权限这事我也被坑过。`chmod 777`图省事,结果CI服务器被扫出漏洞,审计报告直接标红。后来学了`setfacl`,给部署用户加一条读权限,不碰组和所有者。再往后,发现`ping`根本不用root,`getcap /bin/ping`出来是`cap_net_raw+ep`,就照着给自己的服务加`cap_net_bind_service`,端口80不用sudo也能绑。SELinux策略更绝,不是设几个开关,是写规则——比如“nginx进程只准读`/var/www`,不准执行`/tmp`下的任何东西”,写错了系统直接拒绝,连日志都不打,必须靠`ausearch`翻审计日志。
自动化也不是写个shell脚本就行。`systemd-run --scope --scope --property=MemoryMax=512M bash`,一行就划出内存上限,比手动`cgroup.procs`加进程ID靠谱多了。udev规则我试过插USB自动备份照片,`ACTION=="add"`触发脚本,脚本里用`lsusb -d`识别设备型号,再挂载对应路径。这不是“让电脑听话”,是让电脑和你对话——内核发`uevent`,用户空间接住,马上响应。
vim和bash技巧现在看真不算啥。我发现最省时间的是读`man 7 capabilities`,不到两页纸,但解决了我半年里反复sudo的问题。还有`man 5 systemd.directives`,原来`RestartSec=5`后面还能跟`StartLimitIntervalSec=60`,不然服务狂崩,systemd早把启动功能关了。文档不是摆设,是说明书,不读就等于蒙眼换轮胎。
eBPF那段我还没敢动手,但看了个例子:`bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @ = count(); }'`,就一句,统计所有open系统调用次数,不用改代码、不用重启、不加日志。内核变得可观察,不是靠猜,是靠问。
这大纲不是教你怎么变高手,是告诉你哪条路是坑,哪句man是真话,哪个错误信息其实已经说清楚了原因。学Linux最累的不是命令多,是得把脑袋里那个“操作系统应该是什么样”的旧地图撕掉。