☰
Linux操作基础入门:文件系统、权限体系与进程管理
2026/10/31 21:26:38 网站建设 项目流程

很多人第一次接触 Linux 操作基础,都是从一台没有图形界面的主机开始的。账号密码发到手里,SSH 连上去,屏幕黑底白字,光标一闪一闪,鼠标点下去毫无反应。我当年也是这样,第一反应是“是不是连错了”,第二反应是“这玩意儿怎么连个文件夹都没有”。后来才明白,Linux 的“基础”不是让你背下几百条命令,而是让你在没有图形界面的情况下,依然能搞清楚三件事:东西在哪儿、谁能动它、它现在是什么状态。这三件事对应的就是文件系统、权限体系和进程管理,剩下所有命令都是围绕这三点长出来的枝杈。

这篇内容面向的是刚接触 Linux、或者用了半年仍然只会ls和cd的朋友。我会把“Linux 操作基础”这一层需要打牢的东西拆开讲,包括目录结构怎么读、路径怎么写不会误删、权限数字怎么换算、文本和日志怎么快速定位问题、软件包和服务怎么管,最后给一份我自己踩坑攒下来的排查表。所有命令都给可以直接复制的写法,涉及参数的地方会说明为什么这么选,不追求覆盖全部,只追求你在地道实践中真的用得上。文中提到的主机、项目、同学都是代称,重点看方法本身。

1. 先把“基础”的边界划清楚

1.1 基础不等于背命令,而是建立坐标系

新人最常见的误区是拿一本命令手册从头背,背到chmod就卡住,背到awk直接放弃。问题不在记忆力,而在于没有坐标系。Linux 的一切操作都可以归到三个问题:这个文件在文件树的哪个节点、它的属主和权限位是什么、有没有进程正在占用它。你把这三个问题的答案找出来,命令只是把答案写下去的笔。

所以我的建议是先花两个小时把目录树的结构看明白,再花一个小时把权限位的读法搞懂,剩下的命令边用边查。真正需要肌肉记忆的命令其实不到三十条,其余的都是组合。我见过用了三年 Linux 的人,find的参数每次都要查,但这不影响他把活干完,因为他清楚自己要找什么、在哪个范围内找、找到之后要做什么。这就是坐标系的作用,它让你在忘记语法的时候依然知道下一步该查什么。

1.2 三条主线:文件、权限、进程

把 Linux 操作基础拆成三条线,学习路径会清晰很多。第一条是文件线,包括目录结构、路径写法、增删改查、查找与打包;第二条是权限线,包括属主属组、rwx 三种权限位、数字表示法、sudo 的边界;第三条是进程线,包括进程查看、信号发送、服务启停、端口占用排查。三条线不是并列的,而是互相咬合:文件有权限,进程有属主,服务背后是进程,日志写在文件里。

我通常建议按“文件 → 权限 → 进程”的顺序推进,因为权限是挂在文件上的,进程又经常需要你去查它打开了哪些文件。反过来先学进程,你会遇到大量看不懂的路径和权限报错,挫败感很强。等你把文件线走通,权限线的数字换算只是十分钟的事,进程线则更多是记住几个查看命令和信号编号。

1.3 图形界面能用,但别依赖

现在很多发行版的桌面环境做得很好,文件管理器、终端、设置面板一应俱全。我不反对用图形界面,日常办公场景下它确实快。但你要清楚一件事:远程连到一台服务器时,绝大多数情况下你只有命令行。而且图形界面会掩盖很多细节,比如复制文件时权限位是怎么继承的、软链接和硬链接有什么区别、删除一个目录时里面到底发生了什么。

我的做法是:本地开发机可以用图形界面提高效率,但涉及部署、排障、批量操作,一律走命令行。强迫自己在终端里完成文件操作三个月,你对路径和权限的敏感度会明显不一样。特别是rm这个命令,图形界面有回收站兜底,命令行没有,这种“没有后悔药”的压迫感恰恰是建立谨慎习惯的最好方式。

2. 文件系统:所有操作的坐标系

2.1 目录树里每个位置在管什么

Linux 没有 C 盘 D 盘的概念,一切从根目录/开始,挂载点决定了一块磁盘出现在树的哪个位置。刚上手最需要记住的是几个高频目录的职责划分,这张表我建议直接存下来:

路径职责新手最容易踩的点
/etc系统和服务的配置文件改配置前不备份,改完服务起不来
/var可变数据,日志和数据库常在这里/var/log涨满导致系统异常
/home普通用户的家目录误以为~就是根目录
/tmp临时文件,重启可能被清把重要文件放这里当代存储
/usr用户态程序和库和/usr/local混淆,装错位置
/opt第三方独立软件手动安装的软件散落各处
/proc内核和进程的虚拟文件系统以为里面的文件可以随便改

理解这张表的价值在于:当你在文档里看到“修改/etc下的配置”或者“查看/var/log下的日志”,你不会茫然。更进一步,/proc这个虚拟文件系统值得单独提一句,它不是真实存在于磁盘上的,而是内核暴露出来的窗口。/proc/cpuinfo能看 CPU 信息,/proc/meminfo能看内存,/proc/<进程号>下面能看到某个进程打开了哪些文件描述符。很多排障场景下,这个目录比任何工具都直接。

2.2 路径写法与几个高危误操作

路径分绝对路径和相对路径。绝对路径从/写起,任何时候都指向同一个位置;相对路径从当前目录写起,会随着cd变化。这不是难点,难点在于几个特殊符号:.表示当前目录,..表示上一级,~表示当前用户家目录,-在cd里表示上一次所在的目录。cd -这个用法在需要来回切换两个目录时特别省事,我用得非常多。

高危操作集中在rm上。rm -rf ./和rm -rf /的区别就是多了一个点,但后果完全不同。还有一个经典坑是变量为空的情况,比如脚本里写rm -rf $DIR/*,如果$DIR因为某种原因没赋上值,这条命令就变成了rm -rf /*。我的习惯是涉及变量删除时,先echo出来确认,或者用${DIR:?}这种写法让变量为空时直接报错退出。

注意:删除前先看清路径这一点,说一百遍都不为过。我自己的规矩是,只要命令里带rm -rf,敲完回车之前一定把光标移到行首重新读一遍路径,这个动作已经变成条件反射了。

另外,mv也有坑。如果目标路径已经存在同名目录,mv会把源目录整个塞进目标目录里,而不是覆盖。很多人以为自己在“重命名”,结果文件跑到两层目录下面去了。覆盖行为还需要注意别名,不少发行版默认给cp和mv加了-i参数,会询问是否覆盖,但在脚本里执行时这个询问可能被跳过,行为就不一致了。

2.3 增删改查的核心命令组合

文件操作的核心命令其实就那几个,但要组合出效率,得知道几个关键参数:

# 查看目录,按时间倒序,显示隐藏文件,人类可读的大小 ls -lht --time-style=long-iso # 递归复制并保留权限、时间戳、软链接本身 cp -a /data/app /backup/ # 移动并强制覆盖,不做交互询问 mv -f new.conf /etc/app/app.conf # 删除目录,务必先确认路径 rm -rf /tmp/build-cache

ls -lht这个组合我用得最多,-l出详情,-h把字节数换成 K/M/G,-t按修改时间排序,找最新改过的文件一眼就能看到。cp -a里的-a等价于-dR --preserve=all,它会保留权限、属主、时间戳和软链接本身,而不是跟随软链接复制目标内容。备份场景下这个参数非常关键,用cp -r备份出来的文件权限往往会变,恢复的时候就会出问题。

还有两个命令容易被忽略但极其有用。stat能看文件的完整元信息,包括三个时间戳:访问时间 atime、修改时间 mtime、状态变更时间 ctime。排查“文件到底有没有被改过”时,mtime 和 ctime 的对比经常能给出线索。file命令则用于判断文件真实类型,别被扩展名骗了,一个叫.jpg的文件可能是文本,一个没有扩展名的文件可能是可执行程序,file一秒就能告诉你答案。

3. 命令行效率:补全、历史、通配符、重定向

3.1 终端快捷键决定你的手感

命令行用得快不快,很大程度上取决于你按不按 Tab。文件名补全、命令补全、参数补全,能补全的一律不手打,这是减少拼写错误最直接的办法。连续按两次 Tab 会列出所有候选,路径有歧义时这个功能能帮你快速看清目录里到底有什么。

历史命令的用法也值得专门练。history列出全部历史,Ctrl+R进入反向搜索,输入片段就能匹配到之前执行过的命令。我排障时经常用Ctrl+R搜“上次那条带 grep 的命令”,比翻记录快得多。!!表示上一条命令,!$表示上一条命令的最后一个参数,!grep表示最近一条以 grep 开头的命令。有一个高频场景:执行了一条命令发现缺 sudo,直接sudo !!就补上了,不用重新敲一遍。

其他几个快捷键属于用了就回不去的类型。Ctrl+A跳到行首,Ctrl+E跳到行尾,Ctrl+U删掉光标前的内容,Ctrl+K删掉光标后的内容,Ctrl+W按单词删除,Ctrl+L清屏。编辑长命令时这几个键能省下大量左右移动光标的时间。还有Ctrl+Z把当前任务挂到后台,fg调回前台,Ctrl+C发送中断信号,这三个在处理“命令卡住了”的场景时很有用。

3.2 通配符和 find 的分工

通配符是 shell 展开的,*匹配任意长度字符,?匹配单个字符,[]匹配括号内任一字符。注意*默认不匹配以点开头的隐藏文件,这是很多人执行rm *之后发现隐藏文件还在的原因。真要连隐藏文件一起处理,得用.*或者开启dotglob选项。

通配符适合处理当前目录下模式简单的一批文件,一旦涉及按时间、大小、权限、深度查找,就得上find。find的参数多,但常用的就那几个组合:

# 找出 /var/log 下 7 天以前、大于 100M 的普通文件 find /var/log -type f -mtime +7 -size +100M # 找出权限为 777 的文件,这类权限通常有问题 find /data -type f -perm 0777 # 找出所有软链接,并打印它指向哪里 find /usr/local -type l -exec ls -l {} \; # 批量删除 30 天前的日志,先打印确认再删 find /var/log/app -name "*.log" -mtime +30 -print

-exec后面跟命令,{}代表找到的文件,\;是结束符,这个写法每次都要写对,漏掉反斜杠就会报错。如果找到的文件很多,-exec ... +比\;效率高,因为它会把多个文件名拼成一批传给命令,减少进程创建次数。我处理几万个文件时踩过这个坑,改成+之后耗时从几分钟降到十几秒。

3.3 重定向和管道的组合思维

重定向分输入和输出。>覆盖写入,>>追加写入,2>重定向错误输出,&>把标准输出和错误输出一起重定向,2>&1表示把错误输出合并到标准输出。这几个符号的组合是脚本里最容易出错的地方,顺序很关键:command > file 2>&1是先重定向标准输出再合并错误输出,顺序反过来效果就不一样。

管道|把前一个命令的输出交给后一个命令当输入,这是 Linux 最优雅的设计之一。一条典型的日志分析链路是这样的:

# 统计访问量前 10 的 IP awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

拆开看每一步:awk取第一列,sort排序让相同 IP 相邻,uniq -c统计连续重复次数,sort -rn按数字倒序,head -10取前十。每一段都很简单,组合起来就完成了原本要写脚本才能做的事。这种“小工具串起来”的思路,比学一个大而全的工具更符合 Linux 的哲学。

还有tee这个命令值得提一下。它把输入同时写到文件和标准输出,适合“既要看结果又要存日志”的场景。command | tee output.log就能在屏幕上看到输出的同时存一份到文件,加上-a是追加模式。

4. 权限体系:最容易卡住新手的一关

4.1 rwx 与数字权限的换算逻辑

权限位分三组:属主 user、属组 group、其他 other,每组三个位:读 r、写 w、执行 x。数字表示法里 r=4、w=2、x=1,三组相加就是三位八进制数。755拆开是7(4+2+1,读写执行)、5(4+1,读和执行)、5,常见于目录和可执行程序。644拆开是6(4+2,读写)、4、4,常见于普通文本文件。

这个换算一定要练到条件反射,因为大量排错场景都和它有关。比如网站访问报 403,八成是目录缺了x权限或者文件缺了r权限;脚本执行报“Permission denied”,先看有没有x位。目录的权限位含义和文件不一样,这一点新手特别容易混:目录的r是允许列出内容,x是允许进入和访问其中的文件,w是允许在目录内创建和删除文件。只有r没有x的目录,你能看到文件名但打不开;只有x没有r的目录,你知道路径能进去但列不出里面有什么。

注意:目录的w权限意味着可以删除目录里的任何文件,哪怕你对那个文件本身没有写权限。这是很多人不理解为什么自己“明明文件是只读的却被删了”的原因,问题出在父目录的权限上。

4.2 chmod 和 chown 的实际用法与禁忌

chmod改权限,两种写法:数字法和符号法。数字法直观,chmod 755 file;符号法灵活,chmod u+x file给属主加执行权限,chmod g-w file给属组去掉写权限,chmod o=r file把其他用户设为只读。批量处理时符号法配合-R更容易控制,比如chmod -R u+rwX,go-w dir,这里大写的X是个巧妙设计,它只给目录加执行权限,不给普通文件加,避免把一堆文本文件变成可执行文件。

chown改属主和属组,格式是chown 用户:组 文件,只改属组可以写成chown :组 文件。递归改属主用-R,但要注意软链接,默认chown -R会跟随软链接改到目标文件上,如果不想跟随得加-h。这个细节在做部署时很关键,尤其目录里有指向系统库的软链接时,改错一次可能影响一大片。

几个我踩过的权限坑值得记录下来。第一,改配置文件的权限不要图省事用777,看起来问题解决了,实际上把写权限开放给了所有人,安全和审计上都过不去。第二,umask决定了新建文件的默认权限,默认值通常是022,也就是新建文件是644、新建目录是755。如果发现新建文件权限不对,先查umask,别急着一条条chmod。第三,/etc/sudoers这个文件绝对不要用普通编辑器直接改,语法写错会导致 sudo 完全不可用,正确做法是用visudo,它会在保存时做语法检查。

4.3 用户、用户组与 sudo 的边界

用户管理的基础操作不多:useradd建用户,passwd设密码,usermod改属性,userdel删用户,groupadd建组,groups看用户属于哪些组。建用户时-m表示同时创建家目录,-s指定登录 shell,这两个参数建议每次都显式写上,避免不同发行版默认行为不一致。

sudo 的设计意图是“以最小必要权限完成操作”,而不是“人人都是超级用户”。给一个用户 sudo 权限,常见做法是把他加进wheel或sudo组,具体组名看发行版。这个组在/etc/sudoers里通常已经配好了一条规则,直接用就行,比自己写规则安全。真要写细粒度规则,格式大概是“谁 在哪台机器上 以谁的身份 执行哪些命令”,四个字段缺一不可。

关于 root 直接登录,我的习惯是关掉远程 root 登录,日常操作用普通用户加 sudo。这不是多余的小心,而是为了留痕:sudo 会记录谁在什么时候执行了什么命令,一旦出问题能查到源头。万一误操作,有日志可查和完全查不到,处理起来差别很大。切换用户用su - 用户名,注意中间那个短横线,加了它才会加载目标用户的环境变量和家目录,不加的话你人切过去了但环境还是原来的,很多“命令找不到”的怪问题就是这么来的。

5. 文本处理与日志查看

5.1 grep 用对了能省一半时间

grep是查日志的主力,但很多人只会grep 关键词 文件,遇到大文件就卡住。几个参数值得记住:-i忽略大小写,-n显示行号,-r递归目录,-v反向匹配(排除),-c只输出匹配行数,-A n显示匹配行后 n 行,-B n显示前 n 行,-C n前后各 n 行。查异常堆栈时-A 20特别好用,因为错误信息后面往往跟着几十行调用栈。

# 排除健康检查的日志噪音,只看真正的请求 grep -v "health" app.log | grep -n "ERROR" -A 5 # 递归在配置目录里找某个参数 grep -rn "max_connections" /etc/app/

-r配合-n是查配置的黄金组合,能直接定位到文件和行号。需要注意的是grep -r会尝试读取目录下的所有文件,包括二进制文件,遇到大目录会慢,加--include="*.conf"限定后缀能明显提速。另外,grep的正则默认是基础正则,+、?、|这些符号要转义或者加-E才生效,这个细节坑过很多人。

5.2 sed 和 awk 的最小可用集

sed主要用来做替换和删除。最常用的是sed -i 's/旧/新/g' 文件,-i表示直接改文件,g表示每行所有匹配都替换。不加-i时只是把结果输出到屏幕,原文件不动,这个区别在第一次用的时候容易搞混。安全做法是先不加-i看一眼输出,确认无误再加。

# 先预览替换结果 sed 's/8080/9090/g' app.conf | head -20 # 确认后原地替换,并备份原文件 sed -i.bak 's/8080/9090/g' app.conf

-i.bak这个写法会自动生成app.conf.bak备份,改配置文件时我基本都这么干,成本极低但能救命。

awk的强项是按列处理。awk '{print $1}'取第一列,$NF取最后一列,NR是行号,NF是列数。默认分隔符是空格或制表符,用-F可以指定,比如处理 CSV 用-F,。一个实用例子是筛选某个字段大于阈值的行:

# 找出响应时间超过 1 秒的请求,假设耗时在第 7 列 awk -F' ' '$7 > 1000 {print $1, $7}' access.log

5.3 日志追踪的三种姿势

看日志分三种场景。第一种是实时追踪,用tail -f,日志一有新增就滚出来。加上-n 100先显示最后一百行作为上下文,排查正在发生的故障时这个命令几乎是标配。第二种是翻阅历史,用less打开大文件,/搜索、G跳末尾、g跳开头、F进入跟随模式(类似 tail -f),q退出。less不会一次性把整个文件读进内存,几个 G 的日志也能开。第三种是系统级日志,如果系统用 systemd,journalctl -u 服务名 -f看某个服务的实时日志,--since "10 min ago"按时间过滤,-p err只看错误级别。

我个人的习惯是把tail -f和grep组合起来:tail -f app.log | grep --line-buffered "ERROR"。这里的--line-buffered不能省,否则 grep 会攒一批才输出,看起来像日志卡住了。这个细节没有文档强调,但实际用起来体验差别很大。

6. 软件包与服务管理

6.1 包管理器的差异与统一心智

不同发行版的包管理器不一样,Debian 系用apt,RHEL 系用yum或dnf。命令写法有差异,但心智模型是统一的:更新索引、搜索包、安装、卸载、查已安装列表。把这几个动作和两套命令对应起来,切换发行版时就不会慌。

动作Debian 系RHEL 系
更新索引apt updatednf makecache
搜索apt search 关键词dnf search 关键词
安装apt install 包名dnf install 包名
卸载apt remove 包名dnf remove 包名
已安装列表apt list --installeddnf list installed
查包信息apt show 包名dnf info 包名

一个高频误解是apt update和apt upgrade的区别。update只是刷新本地索引,不安装任何东西;upgrade才会升级已安装的包。只敲update然后抱怨“怎么没升级”,是新手常见的问题。另外,apt install之前最好先update一次,否则索引太旧会报“找不到包”。

至于软件源,各个发行版都有自己的默认源配置位置,Debian 系在/etc/apt/sources.list,RHEL 系在/etc/yum.repos.d/下的.repo文件。修改源之前先备份,改完执行一次索引刷新,出现 GPG 校验错误时优先检查密钥是否导入,别急着乱改配置。这是我自己踩过的坑,曾经因为密钥过期排查了一下午,最后发现只是没导入新的签名密钥。

6.2 服务管理与进程查看

systemd 系的机器用systemctl管服务,几个高频操作:start启动、stop停止、restart重启、status看状态、enable开机自启、disable取消自启。注意enable和start是两件事,前者管开机行为,后者管当前状态,很多人enable完发现服务没跑,就是漏了start。

# 启动并设为开机自启,一步到位 systemctl enable --now 服务名 # 看服务状态和最近日志 systemctl status 服务名 -l --no-pager # 重载配置但不重启进程 systemctl reload 服务名

reload和restart的区别值得强调。reload是让进程重新读配置,连接不断,适合改完配置想平滑生效的场景;restart是杀掉进程再拉起来,连接会断。生产环境上改配置,优先试reload,服务不支持 reload 时再考虑 restart。

进程查看方面,ps aux列出所有进程,ps -ef换个格式,两者都能用。找特定进程用ps aux | grep 关键词,但更推荐pgrep -af 关键词,它不会把 grep 自己也算进去。top和htop看实时资源占用,htop更直观还能鼠标点。查端口占用是排障高频动作,ss -lntp列出所有监听端口和对应进程,比老的netstat快。结束进程用kill 进程号,默认发 TERM 信号给进程一个清理的机会,kill -9是强制杀死,除非进程完全没响应,否则不建议直接用-9,因为它不给进程保存数据和释放资源的机会。

7. 排查实录与问题速查

7.1 高频问题速查表

下面这张表是我这几年被问得最多的问题,基本覆盖了新手 80% 的卡点:

现象常见原因排查命令
命令找不到PATH 里没有该路径,或包没装which 命令、echo $PATH
权限拒绝文件缺 x 位,或父目录缺 x 位ls -l、namei -l 路径
磁盘写满日志膨胀、临时文件堆积df -h、du -sh /*
端口被占用已有进程监听该端口ss -lntp | grep 端口
服务起不来配置语法错、依赖服务没起systemctl status 服务 -l
修改不生效忘了重载配置或重启服务systemctl reload 服务
中文乱码终端编码与文件编码不一致locale、file -i 文件
软链接失效目标被移动或删除ls -l、readlink -f 链接

namei -l 路径这个命令很多人不知道,它会把路径上每一级目录的权限都列出来,排查“为什么我进不去这个目录”特别高效。因为权限问题往往不在最后一层,而在中间某一层目录上。

7.2 三条最实用的排查链路

第一条是“命令找不到”的链路。先which 命令看有没有找到,再看echo $PATH确认路径在不在搜索范围里,然后确认包是否安装,最后检查是不是用了su而不是su -导致环境变量没加载。这条链路按顺序走,基本三分钟内能定位。

第二条是“权限拒绝”的链路。先ls -l看目标文件权限,再namei -l看路径上每一级目录,然后id看当前用户的 uid、gid 和所属组,最后确认 SELinux 或 AppArmor 这类强制访问控制有没有拦截。很多人排查半天权限位都是对的,最后发现是强制访问控制策略的问题,用getenforce一看就明白了。

第三条是“磁盘满”的链路。df -h先确认哪个分区满了,然后du -sh /*逐层往下钻,通常能定位到具体目录。如果df显示满了但du加起来对不上,多半是有进程占着已被删除的文件没释放,用lsof | grep deleted能找到,重启对应进程就能释放空间。这个现象我第一次遇到时完全懵了,明明删了文件空间却没回来,后来才理解文件描述符还开着的时候,磁盘块不会真正释放。

7.3 几条不写在文档里的实操心得

第一条,改任何配置文件之前先备份,备份文件名带上时间戳,比如app.conf.20250101。这个动作花三秒,但能让你在改崩之后三十秒内恢复。我见过太多人改配置改到服务起不来,又没有备份,只能重装。

第二条,执行危险命令之前先echo一遍。涉及变量、通配符、rm -rf的场景,先把要执行的命令打印出来看看展开结果对不对,确认无误再执行。这个习惯救过我至少三次。

第三条,善用man和--help,但别指望从头读到尾。我的做法是遇到不熟悉的命令先命令 --help | head -30看常用参数,需要细节再man,在 man 里用/搜关键词直接跳到相关段落。中文资料和英文文档冲突时,以本机man为准,因为版本差异会很大。

第四条,把常用命令做成别名。在~/.bashrc里加几行alias,比如把ls -lht设成ll,把带颜色的 grep 设成默认,日积月累能省下大量敲键盘的时间。别名不要设太多,设到自己都记不住就适得其反了。

第五条,保持一台可以随便折腾的机器。学 Linux 操作基础最大的障碍不是难,而是怕弄坏。准备一台虚拟机或者容器环境,在里面随便删随便改,坏了就重建,这种无压力的环境才能真正把命令练成肌肉记忆。

最后分享一个我自己一直在用的习惯:每次解决完一个问题,把命令和思路记在一个纯文本文件里,按场景分类。时间长了这个文件就是你自己的一本排障手册,比任何教程都贴合你的实际工作。我现在翻自己三年前记的几条记录,依然能快速解决同类问题,这种积累的复利效应,比一次性看完多少篇教程都实在。

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

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

立即咨询