简介:面向零基础自学者的 Linux 操作系统入门讲义,以单个 PDF 文档形式呈现,适合刚接触命令行、需要建立系统认知的初学者。内容按教学教案组织,从 Unix 家族与 GNU 计划讲起,依次覆盖 Linux 与 GNU 的关系、多重系统引导装载器、四种安装类型,再落到 mkdir、mv、cd、rm、ls 等常用命令,/home、/etc、/var 等目录结构,以及 inode 文件链接、mount 磁盘挂载、用户组与 chmod、chown 权限管理。后半部分延伸到 bash 与 shell 机制、grep、find、tee 等文件查找统计工具、makefile 自动化编译,以及 ssh、samba、gcc 等网络通信与编译工具。压缩包约 915KB,仅含 1 个 PDF 文件,轻量易读,可离线查阅。目前已有 4417 人学习,适合通读入门,也宜作日常命令速查手册,帮助理解系统运作机制并在终端独立操作。
1. 一份把 Linux 操作系统基础课讲成教案的 PDF,为什么今天翻出来还管用
前阵子一个做嵌入式的朋友找我,说想要一份能把 Linux 操作系统基础课从头到尾串起来的材料,不要一上来就讲容器编排和云原生那一套。我把手边这份《Linux 操作系统基础教程.pdf》发给了他——它不像市面上的速查手册那样只罗列命令,而是按课程教案的写法,从 UNIX 家族谱系、GNU 与 GPL、内核版本号规则一路讲到分区方案、引导装载器、登录会话、ls -l 的七列输出、inode 链接和 mount 挂载。整份材料的骨架是“先讲清为什么这么设计,再给能敲的命令”,这也是我愿意把它当作入门底稿的原因。它更适合两类人:一类是刚接触 Linux、需要一个不跳步的完整坐标系的新手;另一类是从 Windows 运维转过来、命令会用但目录树和权限模型始终没理顺的熟手。教案定稿的年代偏早,里面不少具体做法和现在的发行版已经对不上,所以这篇笔记不打算复述它,而是把它当成一张老地图,讲清楚哪些路还在、哪些桥已经拆了、照着走会踩到什么。
2. 内核版本号、目录树与设备命名:三张表先把坐标系立住
学 Linux 最容易翻车的地方,其实是在还没建立起坐标系时就去背命令。这份教案聪明的一点是,它把版本号、目录树、设备命名这三件事放在最前面,因为后面所有的分区、挂载、权限操作,都要落在这三张表上。这一章我们把教案里的表述逐条对着现代系统验一遍,对不上的地方标出来。
2.1 内核版本号和发行版版本号:major.minor.patchlevel 的读法
教案里给的规则很明确:内核版本号由三段数字组成,主版本号、次版本号、修订序号,例如 2.4.20。约定是次版本号为奇数表示开发版、未必稳定,为偶数表示稳定版,所以当年看到 2.5.x 就知道那是给 2.6 铺路的测试分支。发行版版本号则完全由各家自己定,跟内核号没有对应关系——同一个发行版号下面,内核可能已经换过好几个小版本。
这条奇偶规则今天已经不作数了。2.6 之后内核长期停留在 2.6.x,后来改成 3.x、4.x、5.x、6.x 递增,次版本号不再承担“稳定/开发”的语义。所以读教案时要把这条当成历史知识,别拿它去判断一个 5.15 内核稳不稳。真正该看的是发行版自己维护的稳定分支和补丁策略。
验证只需要三条命令,注意uname -r给的是内核,os-release给的是发行版,两者不能混着看:
uname -r # 内核 release,例如 5.15.0-91-generic uname -a # 全量信息:内核、主机名、架构、编译时间 cat /etc/os-release | head -6 # 发行版标识,NAME/VERSION/ID 三个字段最有用uname -r里的-r只输出 release 字段,写脚本判断内核特性时用这个;uname -m输出架构(x86_64、aarch64),装二进制包前一定要对;uname -a适合人工排查,输出里还带着内核编译日期,能看出这台机器多久没更新过。
2.2 目录树:FHS 里每个目录到底该谁写
教案列的目录清单基本就是 FHS 的骨架,我把它整理成一张带“谁往里写”的表,因为新手最常见的误操作就是把该放 /var 的东西塞进 /usr,或者直接往 / 根下扔文件:
| 目录 | 用途 | 谁在写 | 常见误用 |
|---|---|---|---|
| /bin、/sbin | 用户命令、系统命令 | 包管理器 | 手动往里拷脚本 |
| /etc | 全局配置文件 | 管理员、软件包 | 把数据文件放这 |
| /var | 日志、缓存、假脱机 | 服务进程 | 分区给小了导致日志写满 |
| /usr | 应用程序与库 | 包管理器 | 当成用户主目录 |
| /proc | 内核暴露的虚拟文件系统 | 内核 | 试图往里面存文件 |
| /dev | 设备文件 | 内核与 udev | 手动 mknod 造设备节点 |
| /boot | 内核与 initramfs | 内核升级 | 分区只给 100M |
| /home、/root | 普通用户、超级用户主目录 | 用户 | 生产环境把服务数据放这 |
| /tmp | 临时文件,所有人可写 | 用户与程序 | 存放需要持久化的东西 |
| /opt | 第三方可选软件 | 管理员 | 和 /usr/local 混用 |
| /lost+found | fsck 找回的零散文件 | fsck | 手动清理前不确认 |
/proc是最容易被误解的一个。教案特意注明它是虚拟文件系统、不实际占用磁盘,这一点用df和ls -ld一起看最直观:
ls -ld / /boot /proc /dev # 注意 /proc 和 /dev 的大小显示为 0 df -hT | grep -E 'proc|devtmpfs' # 虚拟文件系统不占真实块设备 cat /proc/version # 内核版本 + 编译器信息 ls /proc | head -10 # 每个数字目录对应一个进程 PIDdf -hT里的-T显示文件系统类型,排查“为什么这块盘没空间了”时先看类型,tmpfs 满了和 ext4 满了处理方式完全不同。/proc/<pid>下能看到该进程的 cmdline、environ、fd,这是后来所有性能排查工具的数据源头。
2.3 磁盘命名:hd 变 sd、sd 变 nvme 之后怎么读
教案的设备命名规则只有三句话,但信息密度很高:前两个字母表示磁盘类型(hd 是 IDE、sd 是 SCSI 或 SATA 及 U 盘、fd 是软盘),第三个字母表示第几块盘(hda 第一块 IDE,sdb 第二块 SCSI),后面的数字表示分区,1 到 4 是主分区或扩展分区的编号,5 以上是逻辑分区。这条“1-4 与 5+”的分界来自 MBR 分区表只能有四个主分区项,最多一个扩展分区,逻辑分区从 5 开始编号。
今天在普通机器上几乎见不到 hda 了,SATA、USB 一律是 sd,NVMe 固态则是nvme0n1这种命名,分区写成nvme0n1p1,多出来的那个 p 是 NVMe 命名空间的分隔符,不是笔误。教案里“设备标识一般仅用在设备配置及挂载场合”这句话依然成立,而且更要紧——因为设备名会漂移,U 盘插拔一次、硬盘换一个接口,sdb 就可能变成 sdc。
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT # 树状展示磁盘、分区、文件系统、挂载点 sudo fdisk -l /dev/sda # 看单块盘的分区表和起始扇区 ls -l /dev/disk/by-uuid/ # UUID 软链接,fstab 里该用这个lsblk的-o后面跟字段列表,我用得最多的是NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT这一组,一眼能看出哪块盘还没挂、哪个分区是 swap。fdisk -l需要 root,输出里的 Start 扇区在恢复分区表时是救命信息。/dev/disk/by-uuid/目录下每个 UUID 都是一个指向真实设备的软链接,写 fstab 时从这里抄,比抄/dev/sda1靠谱得多。
3. 分区方案与引导装载器:装机前必须算清的三笔账
教案的安装章节是整份材料里最“有时效性”的部分,分区数目从 9 个减到 3 个、引导器从 LILO 换到 GRUB、安装介质从光盘转向网络,这些变化背后其实是同一套权衡:启动可靠性、空间利用率和恢复成本。这一章把三笔账算清楚,顺便说明哪些老规矩今天该改。
3.1 /、/boot、swap 三个分区各给多大
教案给的方案是根分区、/boot给 100M、swap给内存的两倍。这个方案在 2004 年合理,因为当时内核镜像加 initrd 也就十几兆,内存普遍 256M 到 512M,swap 大一点能兜住。放到今天,/boot100M 是明确的坑:一个现代内核加 initramfs 动辄 50M 到 80M,发行版默认保留两到三个旧版本,一次内核升级就可能写满,然后升级中断、机器起不来。
我的习惯是/boot给 1G,如果用了 LVM 或者加密根分区,再单独给/boot/efi留 512M。swap 则要分两种情况:如果不用休眠,swap 给 2G 到 8G 足够,它的作用已经从“扩大内存”变成“兜住偶发峰值”;如果要用休眠,swap 必须不小于物理内存。教案里“两倍内存”的说法可以当成上限参考,而不是必须。
lsblk # 先看清现有分区布局 free -h # 内存和 swap 的使用情况 swapon --show # 当前启用的 swap 设备和大小 cat /proc/swaps # 同上,纯文本格式,脚本里好解析 cat /proc/sys/vm/swappiness # 换出倾向,默认 60,服务器上常调到 10swappiness这个值在教案里没有,但它是理解“swap 分大了反而卡”的关键:内核不是等内存用光才换出,而是按这个权重提前把冷页挪到 swap,值越高越积极。数据库机器上把它调低到 1 到 10,能明显减少不必要的磁盘 IO。
3.2 挂载点写设备名还是写 UUID
教案说磁盘标识“一般仅用在设备配置及挂载场合”,这句话在 fstab 里体现得最直接。早期写法是/dev/sda1 /boot ext4 defaults 0 2,问题是设备名会变,一旦变,开机就进 emergency mode。现代做法统一用 UUID 或 LABEL。
# /etc/fstab 片段,UUID 用 blkid 查,别照抄 UUID=1a2b3c4d-0001 /boot ext4 defaults 0 2 UUID=1a2b3c4d-0002 / xfs defaults 0 1 UUID=1a2b3c4d-0003 none swap sw 0 0六列的含义依次是:设备标识、挂载点、文件系统类型、挂载选项、dump 备份标志、fsck 检查顺序。根分区那一行最后写 1,表示开机时优先检查;/boot写 2;swap 和不需要检查的写 0。挂载选项里defaults等价于 rw、suid、dev、exec、auto、nouser、async 这一组,生产环境经常要加noatime减少元数据写入。改完 fstab 千万别急着重启,先跑mount -a验证,没有报错再重启,这是避免开不了机的后悔药。
3.3 GRUB 装 MBR 还是装分区引导扇区
教案把引导装载器的作用讲得很清楚:让多个操作系统、多个内核版本共存,由用户在启动时选择。安装位置有两个选择——主引导记录 MBR,或者 Linux 分区自己的引导扇区。选 MBR 的好处是开机直接进 GRUB 菜单;选分区引导扇区则要求那个分区是活动的主分区,否则只能靠软盘或 U 盘启动。教案特别提醒“安装完毕后应马上制作一张系统启动软盘”,放到今天就是把救援 U 盘准备好。
LILO 配置文件在/etc/lilo.conf,改完必须执行lilo才生效;GRUB 则是读配置,教案里写的/boot/grub/grub.conf是老版本 GRUB 的路径,现在 BIOS 机器上通常是/boot/grub2/grub.cfg,Debian 系是/boot/grub/grub.cfg。
# 看当前默认启动项和等待时间 grep -E 'GRUB_DEFAULT|GRUB_TIMEOUT' /etc/default/grub # 改完重新生成,路径随发行版不同,认准自己系统里存在的那个 sudo grub2-mkconfig -o /boot/grub2/grub.cfg sudo update-grub # Debian/Ubuntu 系的封装脚本注意:不要手改
grub.cfg,它每次生成都会被覆盖。要改默认启动项、超时、内核参数,改/etc/default/grub和/etc/grub.d/下的脚本。
GRUB 相比 LILO 的几个优势教案列得很准:支持大硬盘、支持开机画面、能在选择前动态改内核参数、分区位置变了不用重装。最后一条在实操里价值最高,用e键临时进编辑模式改ro为rw或者加single,是进不去系统时的第一手操作。
3.4 四种安装类型与三种安装方法现在还剩什么
教案的四种安装类型是个人桌面、工作站、服务器、定制,对应的是不同软件包组的勾选组合。今天在安装器里看到的是“最小安装”“带 GUI 的服务器”“工作站”“自定义”,本质没变,只是服务器类型默认不再装图形环境。
三种安装方法——光盘、硬盘、网络(HTTP/FTP/NFS)——中,光盘基本退场,硬盘安装 ISO 的做法还留着,而且教案里那段命令今天依然能用,只是路径要改成自己的:
sudo mkdir -p /mnt/iso sudo mount -t iso9660 -o loop /opt/some-distro.iso /mnt/iso ls /mnt/iso | head sudo umount /mnt/iso-t iso9660指定文件系统类型,-o loop让内核用一个回环设备把普通文件当块设备用,这条命令在处理文档光盘、离线软件源时非常常用。umount报 device is busy 时,用lsof /mnt/iso或fuser -vm /mnt/iso找出哪个进程还占着目录,别硬来。
4. 登录会话与六个高频命令:把教案里的例子逐条跑通
教案第三章是整份材料里最像“作业本”的一章,登录提示符长什么样、who 输出怎么读、mkdir 和 cd 的参数怎么写,全都带着示例。这一章我按它的顺序在终端里重跑一遍,把每个示例背后的边界条件补上,因为新手照着抄最容易在参数上翻车。
4.1 提示符、tty 和多用户会话
教案给的登录提示符示例是[z3@localhost z3]$,三段分别是用户名、主机名、当前目录。root 登录后提示符是#,普通用户是$,这个区别在复制粘贴网上命令时特别重要,看到#开头的命令就知道要加 sudo。教案还强调 Linux 区分大小写、输密码时屏幕不显示光标,这两条新手至少要各踩一次。
六个虚拟终端 TTY1 到 TTY6 加一个图形终端的说法,现在的实际情况是:systemd 默认把图形会话放在 tty1 或 tty2,文本终端从 tty2 或 tty3 开始,Ctrl+Alt+F1到F6的对应关系不再固定。用loginctl看比自己数更准:
who # 谁登录了、哪个终端、登录时间 w # 多一列当前执行的命令和负载 tty # 我当前在哪个终端 loginctl list-sessions # systemd 下的会话列表,带 seat 信息who的输出里,终端名 tty1 表示本地文本终端,:0表示本地图形终端,pts/0表示伪终端,后面的括号里如果有 IP,说明是远程登录。这条信息在排查“谁把我的机器占了”时最直接。
用户之间的通信命令write、wall、mesg教案花了不小篇幅,现在同机多用户场景少了,但这些命令在多人在同一台跳板机上作业时仍然可用。mesg n拒绝接收 write 信息,mesg y允许,向一个已经拒绝的用户发消息会收到write: xxx messages disabled。教案里还提到一个小细节:在某些版本上输入完消息要回车再按 Ctrl+D,这种版本差异只能靠试。
4.2 关机和重启:init 0 背后的对应关系
教案给的关机方式有两组,一组是init 0关机、init 6重启,另一组是shutdown系列。前一组适合远程维护,一条命令干脆利落;后一组会给所有登录用户发广播,是更规范的做法。
| 教案写法 | systemd 下的等价操作 | 适用场景 |
|---|---|---|
| init 0 | systemctl poweroff | 远程快速关机 |
| init 6 | systemctl reboot | 远程快速重启 |
| shutdown -h now | systemctl poweroff | 需要通知在线用户 |
| shutdown -r +10 | shutdown -r +10 | 预约重启,留保存时间 |
| shutdown -c | shutdown -c | 取消预约 |
| reboot | systemctl reboot | 立即重启 |
教案里还有一条容易忽略的操作:去掉/etc/inittab里的ca::ctrlaltdel:/sbin/shutdown -t3 -r now可以屏蔽 Ctrl+Alt+Del 误重启。这个文件在 systemd 系统上已经不存在了,对应的做法是:
sudo systemctl mask ctrl-alt-del.target # 屏蔽三键重启 sudo systemctl unmask ctrl-alt-del.target # 恢复mask比改配置文件更彻底,它建一个指向 /dev/null 的软链接,让这个 target 无法被启动。机房里的物理机我一般都会做这一步,血泪经验是有人误碰键盘导致整机重启。
4.3 mkdir、cd、pwd、cp、rm、touch、ls 的边界
教案对这几个命令的示例写得很细,但示例之外的参数才是真正决定会不会出事的地方。下面这段脚本把常见参数串了一遍,可以在/tmp下直接跑:
mkdir -p /tmp/lab/{conf,log,data} # -p 递归创建,已存在不报错 cd /tmp/lab && pwd # pwd 打印当前绝对路径 cp -a /etc/hostname ./data/ # -a 保留权限、时间戳、软链接 cp -r conf conf.bak # 目录必须 -r,否则报 omitting directory touch -t 202401010101 log/app.log # -t 指定时间戳,格式 YYYYMMDDhhmm ls -li # -i 显示 inode,-l 长格式 rm -rf conf.bak # 目录递归删,-f 不再逐条确认mkdir -p的-p不只是“父目录不存在就建”,它还能让“目录已存在”不报错,写幂等脚本时必须加。cp -a等价于-dR --preserve=all,备份时用它,别用裸cp -r,后者会丢掉权限位和软链接属性。rm -rf是这份教案里唯一一个我建议先想三秒再敲的命令,路径里带变量时一定要先 echo 一遍。
4.4 ls -l 的七列与通配符表
教案把ls -l的输出拆得很干净,这是整份材料里最值钱的一段。以-rwxr-xr-x 2 root root 737 Oct 7 18:42 a.txt为例,七列依次是:文件属性、硬链接计数、所有者、所属组、文件长度、最后修改时间、文件名。属性那十位里,第一位是文件类型,后面九位按所有者、组、其他人的顺序各三位,分别对应读、写、执行。
| 首位字符 | 类型 | 说明 |
|---|---|---|
| - | 普通文件 | 文本、二进制、压缩包都算 |
| d | 目录 | 目录的执行位表示能否进入 |
| l | 符号链接 | 指向另一个路径 |
| b | 块设备 | 硬盘、分区 |
| c | 字符设备 | 终端、串口 |
| s | 套接字 | 进程间通信 |
| p | 命名管道 | FIFO |
通配符那张表同样值得抄下来:*匹配任意字符,?匹配单个字符,[abc]匹配括号内任一字符,[b-e]匹配范围,[^b-d]对范围取反,{a1,b2}匹配花括号里的字符串。最后这个花括号展开是 bash 做的,不是 ls 做的,所以ls a{a1,b2}在文件不存在时也会先展开成两个参数再报错。
教案末尾有个练习很实用:当前目录下有 kkk 子目录,ls -l kkk显示的是子目录里的内容,想看目录本身要用ls -ld kkk,-d表示只列目录名不展开。还有file命令,用文字形式告诉你文件真实类型,比看后缀可靠。
5. 权限、inode 与挂载的避坑清单:五条踩坑记录和它们的解法
教案后半段讲文件链接、磁盘挂载、用户组和权限,这几块是新手最容易“看懂了但一动手就错”的地方,因为它们的错误往往不报错、只是行为不对。这一章先把权限位和 inode 的实验做一遍,再给五条我实际踩过的记录,每条按现象、原因、解决写。
5.1 权限位与 chmod、chown:数字法和符号法的分工
权限的数值映射是 r=4、w=2、x=1,三位一组相加,644 就是所有者读写、组和其他人只读,755 是可执行文件或目录的常见值。这里的重点不是记数字,而是理解目录上三个位的语义和文件不同:目录的 r 决定能不能列出里面有什么,目录的 x 决定能不能进去(cd)和访问里面的已知路径,目录的 w 决定能不能在里面增删文件。
mkdir -p /tmp/perm && cd /tmp/perm printf 'hello\n' > f.txt chmod 644 f.txt # 数字法:rw-r--r-- ls -l f.txt chmod u+x f.txt # 符号法:给所有者加执行位 chmod -R 755 ./sub # 递归,注意会连文件一起变成可执行 chown -R z3:z3 ./sub # 改所有者和组,需要 root umask # 看新建文件的默认权限掩码,常见 022umask 022意味着新建目录是 755、新建文件是 644,因为文件默认不带执行位。chmod -R 755是典型误用:目录要 x 才能进,文件要 x 就变成可执行,一堆文本文件被标成可执行,看着不报错,但备份、审计、安全扫描都会报异常。
5.2 inode 与硬链接、软链接:三个实验看明白
inode 是文件系统里描述一个文件的所有元数据(权限、属主、大小、数据块位置、时间戳)的结构,文件名只是目录项里指向 inode 的一个指针。硬链接就是在另一个目录项里再写一个指向同一 inode 的指针,所以链接计数加一;软链接则是新建一个文件,内容是目标路径字符串。
cd /tmp/perm printf 'inode test\n' > a.txt ln a.txt hard.txt # 硬链接,不占新 inode ln -s a.txt soft.txt # 软链接,内容是指向 a.txt 的路径字符串 ls -li # 看第一列 inode 号和第二列链接计数 stat a.txt | head -6 # 直接看 inode 号、链接数、块数 rm a.txt cat hard.txt # 还能读到,因为 inode 还在 cat soft.txt # 报 No such file,软链接断链三个结论要记住:硬链接不能跨文件系统,因为 inode 号是文件系统内唯一的;硬链接不能指向目录,防止目录树出现环;删掉源文件后硬链接数据还在,软链接则立刻断掉。ls -li的-i就是为了看 inode 号,判断两个路径是不是同一个文件,这是排查“复制了一份但磁盘没涨”的第一招。
5.3 mount 与 fstab:挂载点、类型和回环设备
mount 的本质是把一个文件系统的根接到目录树的某个点上,挂载点必须是已存在的空目录。教案给的文档光盘挂载示例用了-t iso9660 -o loop,这两个参数今天还在用,只是 ISO 文件的场景更多了,比如挂载一个离线源镜像。
sudo mkdir -p /mnt/iso sudo mount -t iso9660 -o loop ./doc.iso /mnt/iso findmnt /mnt/iso # 结构化查看挂载来源、类型、选项 mount | grep /mnt/iso # 传统写法,输出更啰嗦 sudo umount /mnt/iso # 卸载,注意是 umount 不是 unmountfindmnt比mount好用,输出是树状结构,-no TARGET,SOURCE,FSTYPE可以按字段取,写脚本时直接解析。卸载报target is busy时,用lsof +D /mnt/iso或fuser -vm /mnt/iso找出占用进程,先停进程再卸。
5.4 五条踩坑记录
第一条:现象是内核升级到一半失败,提示/boot空间不足,重启后还是老内核。原因是当年按教案给的/boot100M,一个内核加 initramfs 就占了大半。解决是先把/boot扩到 1G,或者每次升级前清理旧内核,包管理器一般有installonly_limit之类的配置项控制保留几个版本。
第二条:现象是在 fstab 里写了/dev/sdb1,插拔一次 U 盘后开不了机,掉进 emergency shell。原因是设备名会随枚举顺序变。解决是全部改成UUID=或LABEL=,改完先mount -a验证,再systemctl daemon-reload,最后才重启。
第三条:现象是chmod -R 777之后 SSH 免密登录突然要输密码。原因是私钥文件权限被放宽,SSH 客户端认为密钥不安全直接拒绝使用。解决是把~/.ssh目录设成 700,私钥设成 600,公钥和 known_hosts 设成 644,然后重新登录验证。
第四条:现象是rm -rf删掉一个大日志目录,df显示空间没释放。原因是有进程还持有已删除文件的句柄,数据块没真正回收。解决是用lsof +L1找出链接数为 0 但仍被打开的文件,对应的进程重启或者用> /proc/<pid>/fd/<n>清空。
第五条:现象是按“内存两倍”分了 32G swap,机器反而变卡,磁盘灯常亮。原因是内存够用的时候内核仍按 swappiness 把冷页往 swap 挪,回收路径上多了磁盘 IO。解决是free -h确认内存余量,把 swappiness 调到 10 以下,或者直接缩小 swap 到 4G 到 8G。
6. 用一份自检脚本验证:教案里的知识点你到底吃透了几条
读这种老教案最容易出现的错觉是“看的时候都懂,一动手全忘”。我的办法是把它压缩成一个可以反复跑的自检脚本,每跑一次,对不上的地方就是没吃透的地方。脚本不追求功能完整,只要求每条输出都能对应到教案里的某一节。
#!/usr/bin/env bash # linux-selfcheck.sh —— 对照基础教案核心知识点做一次体检 set -u echo "== 1. 内核与发行版 ==" uname -r grep -E '^(NAME|VERSION_ID)=' /etc/os-release echo "== 2. 根、启动、家目录挂载 ==" findmnt -no TARGET,SOURCE,FSTYPE / /boot /home 2>/dev/null echo "== 3. 磁盘与分区命名 ==" lsblk -dno NAME,SIZE,TYPE | head -5 echo "== 4. 内存与 swap 策略 ==" free -h | awk 'NR<=3' echo "swappiness=$(cat /proc/sys/vm/swappiness)" echo "== 5. inode 使用率 ==" df -i / | tail -1 echo "== 6. 当前登录会话 ==" who这个脚本里,第 1 段验证版本号读法,第 2 段验证目录树与挂载点,第 3 段验证设备命名,第 4 段验证 swap 的取舍,第 5 段验证 inode 是会耗尽的——很多人只知道磁盘满,不知道 inode 满同样写不进文件。第 6 段验证多用户会话,顺便确认自己到底在 tty 还是 pts 上。
一个我坚持了很多年的习惯:每接一台新机器,先跑一遍这类脚本,把输出贴进运维记录,然后再动配置。从那以后我每次改 fstab、改分区、调内核参数之前,都会强制先让这个脚本跑一遍留底——出问题时,那份“改之前长什么样”的记录就是唯一的后悔药。希望帮到你。
本文还有配套的精品资源,点击获取