1. 从“知道Linux”到“理解Linux”的关键一步
如果你看过“前篇(1)”,应该已经对Linux是什么、为什么服务器上几乎都是它、以及怎么在虚拟机里装一个最小化系统有了基本概念。这篇文章的重点不在安装,而在安装完系统之后的第一脚——把这个黑乎乎的终端窗口用起来,搞清楚文件系统是怎么组织的、用户和权限到底是怎么回事、常用的命令到底该在什么时候用。换句话说,前篇(1)帮你把Linux“跑起来”,这一篇帮你“活下来”——在纯命令行环境里不再迷路。
标题里我把这篇叫“前篇(2)”,是因为它依然属于入门序列,不牵扯Shell脚本编程、网络服务搭建、内核参数调优这类进阶主题。适合刚装完系统、面对命令行还有点头大的新手,也适合用过一阵子但始终觉得命令是死记硬背、想搞明白背后逻辑的同学。这篇文章里出现的所有操作,都可以在虚拟机里的CentOS、Ubuntu或者Debian上直接复现,不需要额外购买服务器。我会尽量把操作背后的“为什么”讲清楚,而不是只扔给你一串命令。
我一直认为,Linux入门最大的门槛不是记不住命令,而是不理解设计者的思路。一旦想通Linux“一切皆文件”“多人多任务”这两个核心理念,你会发现命令其实不是记出来的,是推导出来的。
2. 目录结构:为什么Linux没有C盘
2.1 一切从根“/”开始
Windows用户刚接触Linux,最不适应的就是盘符消失了。D盘、E盘统统不存在,所有文件都挂在一个叫“/”的根目录下面。这个“/”是整个文件系统的起点,跟Windows的“此电脑”地位类似,但机制完全不同:Windows里C盘是独立的树,D盘又是另一棵树,两棵树之间的路径是物理隔离的;Linux则是一棵单一大树,你插入一块U盘、挂载一块新硬盘,都是在“/”这棵树的某个分支节点上长出新枝叶。这个节点就是你选择的“挂载点”,比如常见的/mnt或/media。
理解了这个设计,很多常识就能自然推导出来。比如你发现某块磁盘空间不够,但另一块很大的磁盘还空着,这时候的正规做法是:把新磁盘格式化,然后在“/”下建一个目录作为挂载点,用mount命令把它挂上去。从此你写文件到这个目录,实际写进了新磁盘,但对用户和程序来说,路径没有任何变化。这种“逻辑路径与物理设备解耦”的设计,正是服务器可以不断扩容的基础。
再比如你用ls -l /看到的那一堆目录,是FHS(文件系统层次标准,Filesystem Hierarchy Standard)约定好的结构。我用一个生活类比来帮你记:把Linux系统想象成一栋大楼——/etc是管理科(所有软件的配置文件都在这),/var是档案室(日志、队列、临时数据),/usr是公共图书馆(系统自带的软件和库文件),/home是员工宿舍(每个用户的家目录),/tmp是前台接待区的便签纸(临时文件,重启就清理)。这套布局一旦在大脑里建立了画面,找什么文件都不会再没头绪。
2.2 你必须认识的几个关键目录
不是所有目录都需要第一时间搞懂,但下面这几个是高频出现的,建议尽快混个脸熟:
- /etc:系统级配置文件的大本营。改主机名、配IP地址、设DNS,全都绕不开它。里面最有名的是passwd、shadow和fstab三个文件,分别管用户信息、用户密码、开机自动挂载磁盘。注意区分:很多初学者以为改配置就是“随便编辑”,但这里的文件一旦写错语法,可能导致系统启动异常,所以动手前先备份一份cp /etc/xxx /etc/xxx.bak是职业习惯。
- /var:存放变化的数据,尤其是日志。/var/log/messages或syslog记录了系统运行的各种事件,排查故障时这是第一现场。运维圈有个梗:“日志在手,天下我有”,真出问题的时候,/var/log比搜索引擎好使得多。
- /home:普通用户的家目录集合。你在/home下能看到的每个用户名,就是系统里的一个“人”。用户登录后默认停在自己的家目录里,权限上也是自己家随便折腾,别人家不能乱闯。
- /root:管理员root用户的家目录。它独立在/home之外,是因为系统维护时即使其他分区挂掉了,root依然要能登录做修复。
- /tmp:临时文件存放处,任何用户都有权限写,但系统会在重启时定期清理。你下载个临时安装包、解压个东西放这里挺方便,但别指望它存持久化数据。
还有个细节值得注意:你执行pwd命令看到的当前路径,开头那个“/”指的是根目录;而相对路径(比如cd ..)里“..”代表当前目录的上级目录,“.”则代表当前目录本身。这些看似不起眼的符号,在Shell里天天要用,打好基础后面写脚本才不慌。
2.3 用tree和ls看清目录结构
光说理论容易忘,动手看一眼就熟了。在终端输入:
tree -L 2 /这条命令会以树的形状展示根目录下两层的内容。如果你的系统没装tree,用ls -R /也行,就是输出会密集一些。对比着看一遍,你会发现刚才提到的那些目录都在眼前。还有一个很实用的自查思路:安装一款新软件后,想知道它把文件都放哪了,可以用rpm -ql(CentOS系)或dpkg -L(Debian系)列出来,这比满世界找安装目录高效得多。
3. 文件操作:和文件打交道的基本功
3.1 查看、创建、移动、删除的常用组合
Linux的文件操作核心命令不多,翻来覆去就是ls、cd、touch、mkdir、cp、mv、rm这几个。真正体现水平的是参数组合和防止误操作的习惯。
先看查看类的ls,它有三个高频参数:ls -l显示详细信息(权限、属主、大小、时间),ls -a显示隐藏文件(以点开头的文件),ls -lh则是把文件大小转成人类易读的格式。我经常看到新手打成ls -la,没问题,但如果你想知道目录自身的详细信息而不展开内容,记得加-d参数:ls -ld /etc。
创建目录用mkdir -p /tmp/test/a/b,-p参数可以一次性创建多级目录,省去一层层mkdir的麻烦。创建空文件用touch file.txt,它还有个冷门用场:改文件时间戳。如果要复制目录,必须加-r递归参数:cp -r dir1 dir2;移动或重命名目录用mv就没有这个限制,mv dir1 dir2直接搞定——mv既是移动又是重命名,这个双重身份常让新手困惑,记住“在同一个目录下mv就是改名,跨目录mv就是搬运”。
删除命令rm是个容易翻车的高危操作。rm -rf /tmp/test里的-r是递归(删除目录),-f是强制(不提示)。很多重大线上事故都是手快敲成rm -rf /导致的。我个人的铁律是:敲rm之前,先pwd确认自己在哪;删除目录时尽量先ls看看里面的内容;回收站思路也行——mv到/tmp下而不是直接rm,批量删除前用echo先输出一遍文件名确认范围。
3.2 文件查看五兄弟:cat、less、more、head、tail
查看文件内容恐怕是日常操作里最频繁的。cat适合看短文件,但长文件会把终端刷得乱七八糟,这时用less更合适,支持上下翻页、按/搜索关键字、按q退出,几乎可以当成Windows记事本的终端版来用。more是less的前辈,功能少一些,但在某些精简系统里仍然存在。
看开头和结尾用head和tail:head -n 20 /var/log/syslog显示前20行,tail -n 20显示后20行。真正惊艳的是tail -f(follow),它可以持续跟踪文件末尾新增的内容。排查日志时,开一个终端tail -f实时观察,另一个终端复现操作,这种感觉就如同开了上帝视角——错误一发生,日志那边马上滚出来。
这里分享一个运维中极高频的组合用法:我们要在几百MB的日志里查某个时间段的报错,cat整个文件显然不行,less直接打开等半天的服务器大日志也痛苦,正确做法是用grep在管道里过滤:cat app.log | grep "ERROR" | tail -n 50,或者干脆tail -f app.log | grep "ERROR"——实时过滤错误日志,只把感兴趣的滚出来。管道这个符号“|”后面专章讲,你先在这里记住一个认识:它能把左边命令的输出连续传给右边命令。
3.3 软链接:Linux里的“快捷方式”
Windows有快捷方式,Linux对应的是软链接(symbolic link)。创建方式十分简单:
ln -s /var/log/nginx/access.log /home/user/nginx-log之后你在家目录访问nginx-log,就等于在访问那个真实日志文件。软链接在运维中使用率极高,比如把编译后的程序目录做一个软链到/usr/local/bin,就能实现“升级程序时切换链接指向”的效果。还有一个需要理解的同门命令:硬链接(ln不带-s)。硬链接比较特殊,它跟原文件共享同一个inode,删除原文件后硬链接依然有效;软链接则是指针,原文件没了它就悬空断裂。日常使用中,软链接出现的频率远超硬链接,但面试时考官总爱问两者的区别,建议你把这段话读两遍。
4. 用户与权限:多人系统的安全基石
4.1 Linux的用户体系设计思路
Linux从诞生起就是多用户、多任务操作系统。所谓多用户,就是同一台机器上可以同时有很多人登录使用,各自的文件互不干扰,各人的操作也不能随便影响别人。这套体系靠两个东西支撑:一个是“用户”,一个是“权限位”。
在Linux里,用户被区分成root和普通用户。root是超级管理员,UID是0,拥有压倒一切的力量;普通用户的UID通常从1000开始。还有一个概念叫“组”,把一部分用户归到一个组里,配合后续讲的权限位,就能实现“队内资源共享、队外隔离”。
所有的用户信息都存在/etc/passwd文件里,密码则加密存在/etc/shadow里(这就是“影子文件”,普通用户不可读,防止暴力破解)。新增用户有两个命令可选:useradd -m -u 1001 -s /bin/bash alice,-m是自动创建家目录,-u指定UID,-s指定登录Shell;adduser是更友好的交互式命令,会引导你设置密码、填写信息。删除用户用userdel -r alice,加-r同时删掉家目录,注意这个操作不可逆。
4.2 rwx权限位:读、写、执行是怎么分配的
在终端执行ls -l,每行开头有10个字符,例如drwxr-xr--。第1位是文件类型:d代表目录,-代表普通文件,l代表软链接。后面9位分成三组,每组三位,分别对应“属主(文件主人)”“属组(拥有组)”“其他用户”的权限。每组里r代表可读(4)、w代表可写(2)、x代表可执行(1)。
为什么要强调这三个数字?因为chmod支持数字法写权限。比如chmod 750 script.sh,7=4+2+1表示属主可读可写可执行,5=4+1表示属组可读可执行,0表示其他人啥都不能干。这种数字表示法是所有Linux考试的必考项,也是日常操作最常用的写法。符号法chmod u+x script.sh(给属主加执行权限)也很实用,尤其只改一项权限时比数字法更清晰。
这里有个新手常忽略的细节:删除一个文件,看的是你对这个文件所在目录是否有写权限,而不是对文件本身的权限。也就是说,对文件有rwx权限,不代表你有权把它删了;真正的“生杀大权”在目录的w权限上。这个认知差异曾让很多初学者在共享目录里莫名其妙删不掉别人的文件——其实是他们自己对目录没有写权限。反过来也提醒你:对某个目录开放w权限时,等于把目录内的文件“删除权”也交出去了。
4.3 用chmod、chown和sudo把权限管好
除了chmod,另一个高频命令是chown(变更属主和属组)。典型场景是软件需要运行在某个用户身份下,或者你把自己的文件移交给同事。用法:chown alice:devops app.log,表示属主改成alice、属组改成devops。只改属主就chown alice file,只改属组就chgrp devops file。
再来说sudo。它的作用是用另一个用户(通常是root)的身份执行单条命令,而不用切换登录身份。比如当前用户没有权限查看root目录,可以sudo ls /root。sudo之所以“安全”,是因为它的管控规则写在/etc/sudoers里:哪些用户能执行什么命令、要不要输入密码、在哪些主机上生效,全都可以精确配置。想给新用户sudo权限,在配置里加一行“用户名 ALL=(ALL) ALL”就行,但我不建议随便给,原则上“最小权限,刚刚够用”。
这里必须单独强调一下:能用sudo执行单条命令就别用su切到root身份。因为sudo是“白名单式授权”,日志会记录每一笔操作;su一旦切过去,所有命令都以root身份跑,误操作无记录、无约束。生产环境里,许多安装脚本被要求严禁直接用root跑,正是为了减少事故半径。
5. 命令实操:把零散命令组合成工作流
5.1 管道、重定向与通配符
我前面说“命令不是背出来的,是推导出来的”,很大程度上靠的就是管道、重定向和通配符这三样组合工具。
管道符“|”把左边命令的标准输出接到右边的标准输入。一个典型例子:ps aux | grep nginx,从所有进程里过滤含nginx的行——这是排查服务是否启动的最常用写法。重定向符号“>”(覆盖写入)和“>>”(追加写入)把命令输出写到文件里:echo "hello" > readme.txt,或者ls /etc > etc-list.txt。还有错误重定向“2>”:command 2> error.log,只把错误信息存下来。这三者的组合可以让你从只会看终端输出,进化到能对输出做筛选、落盘、归档。
通配符则是Shell的模糊匹配工具:代表任意长度字符,?代表单个字符,[abc]代表括号中的任一字符。rm test.log可以一次性删除所有以test开头、.log结尾的文件;ls /etc/ssh/ssh*_config能精确抓住目标配置文件。大量文件操作场景下,通配符能省下大半时间,但也要注意:通配符是在Shell展开的,如果当前目录下没有匹配的文件,它会原样传给命令,导致你以为删了文件实际没删。
5.2 查找文件与内容:find和grep是兄弟
find用于按文件名、类型、时间、大小找文件。它的基本能力:
find /var/log -name "*.log" -mtime +7这条命令的含义:在/var/log下找出所有以.log结尾、修改时间超过7天的文件。你可以把-mtime换成-size +100M找大文件、换-user alice找指定用户的文件。在生产环境里,“找出三天前生成、已归档的备份并清理”这类定时任务,几乎就是find的标准应用。
grep用于按文件内容过滤。比如在应用日志里搜关键字:
grep -r "OutOfMemory" /var/log/app/-r递归搜索目录下所有文件,常搭配-n显示行号。感觉信息量太大时,grep可以再接管道:grep "OutOfMemory" /var/log/app/app.log | head -20,只看前20行。这两个命令的联用频率,在你日常操作里绝对排得进前三。
5.3 查看进程、端口和服务状态
入门阶段最刚需的运维三连就是进程、端口和服务。查看进程用ps,最常用的是ps -ef(显示全部进程完整信息),管道过滤出自己关心的:ps -ef | grep java。看端口占用用netstat或ss(新系统默认推荐ss):ss -tlnp,其中-t是TCP协议、-l是监听状态、-n用数字端口显示、-p显示对应进程PID。服务管理方面,现代系统多用systemctl:systemctl status nginx查看服务状态、systemctl start nginx启动、systemctl enable nginx设为开机自启。遇到服务启动失败时第一件事就是systemctl status,它通常会给出失败原因或提示用journalctl -xe查细节。
5.4 安装软件:apt与yum的简明对照
不同Linux发行版用不同包管理器。Debian/Ubuntu系用apt:sudo apt update更新软件包索引,sudo apt install nginx安装软件,sudo apt remove nginx卸载但保留配置,sudo apt purge nginx彻底卸载并把配置一起删干净。CentOS/RHEL系用dnf或yum:sudo dnf install nginx、sudo dnf remove nginx。另外还有通用安装方式:源码编译(./configure && make && make install)、二进制包(.rpm或.deb直接装)、容器镜像(docker pull),但初学者只需掌握包管理器就足以应付绝大多数场景。这里有个小提示:装完软件后命令找不到,多半是安装过程没把可执行文件放到PATH里,或者是CentOS里nginx服务名叫nginx、但可执行文件是/usr/sbin/nginx,用which nginx验证一下即可。
5.5 一个综合实操场景演练
纸上谈兵没有感觉,我模拟一个新手最常见的操作流给你走一遍,你在自己的虚拟机上跟着敲就能体验完整:
# 第一步:创建一个临时项目目录,进入其中 mkdir -p ~/my-project/logs cd ~/my-project # 第二步:生成一个测试文件并写入内容 echo "2025-01-01 10:00:01 ERROR connection refused" >> logs/app.log echo "2025-01-01 10:00:02 INFO request ok" >> logs/app.log # 第三步:查看末尾日志,再过滤只留下报错行 tail -f logs/app.log grep "ERROR" logs/app.log | wc -l # 第四步:把这个日志文件做一个软链接放到/tmp下,便于其他程序读取 ln -s ~/my-project/logs/app.log /tmp/my-app.log # 第五步:把整个项目目录打包备份 tar -czf my-project-backup.tar.gz ~/my-project # 第六步:清理演练环境 cd ~ && rm -rf my-project my-project-backup.tar.gz /tmp/my-app.log这套流程囊括了创建、追加写入、查看、过滤统计、链接、打包归档、清理,几乎每一步都是一线操作里会反复用到的。tar的-z是gzip压缩、-c创建归档、-f指定文件名,解包对应tar -xzf,你可以在练习中多敲两遍形成肌肉记忆。
6. 常见问题与排查技巧实录
6.1 command not found是初学者头号问题
分析一下原因:要么命令没安装,要么命令不在PATH里。方案是先用which命令名确认路径,如果没有任何输出说明确实没装;如果输出了路径但执行还是报错,那就是PATH配置问题,可以临时export PATH=$PATH:/新路径试一下。还有个误区分辨:有些命令在root用户下能执行,普通用户下不行,最典型的就是ifconfig,它位于/sbin目录,普通用户PATH里默认不含/sbin,所以提示command not found。解决方式是直接用/sbin/ifconfig,或者用ip addr(新系统的替代命令)。
6.2 Permission denied:不是命令错了,是身份或权限不对
处理思路分三步:先ls -l看文件权限和属主;然后确认当前用户是谁(whoami);再判断是自己该用sudo、还是文件属组不对、还是目录缺少执行权限挡了路。这中间有个隐藏坑:目录至少有r-x权限你才能进入并列出内容,如果只有r而缺x,ls可能能列出部分文件名但cd进不去,和你预期的行为完全不一样。这类权限问题在检查时别只盯文件本身,一层层往上把父目录权限都排查一遍。
6.3 磁盘满但du看不出大文件
这是典型的inode耗尽了,磁盘还有空间但文件系统的小文件数量达到上限,导致创建不了新文件。症状是df -h显示还有几百G空闲,但写文件时提示No space left on device。排查思路:用df -i看inode使用率,用find / -xdev -type f | wc -l统计文件数量。常见元凶是临时目录和邮件队列里积压了海量小文件,清理策略是分批删:先列目录再删、一边删一边df -i观察,别贪快一把梭。这类故障在真实生产环境里能让人抓狂,提前知道你就赢了一半。
6.4 软链接断裂:ls时标红、访问时显示No such file
处理方法是先ls -l确认链接指向哪里,再用ls -l验证目标路径是否存在。如果目标被移动或删除就成了悬空链接,删掉重建ln -s即可。需要特别说明:删除软链接本身用rm linkname,这里绝不能带斜杠;如果误敲rm linkname/,它会尝试删除链接指向的目录内容,性质就变了。
6.5 定时任务crond不执行
先确认crond服务在运行:systemctl status crond;再查看用户的crontab:crontab -l;确认脚本本身有执行权限:ls -l script.sh。还有个极易忽略的细节:定时任务的环境变量和你登录的用户环境不同,脚本里用到自定义PATH或全局变量时,务必写成绝对路径或脚本内自行export。我曾见过一个备份脚本在手动执行时一切正常,放到crontab里就一直失败,最后发现是脚本里用了相对路径,在定时任务的工作目录下找不到文件——把路径改绝对后立刻稳定运行。
6.6 需要永久记住的命令三兄弟:man、whatis、history
遇到不熟悉的命令,man命令名可以打开官方手册,按q退出,按/搜索关键词。想快速回忆命令用途,用whatis命令名能给出简短说明。history能查看自己敲过的全部命令,配合“!编号”可重复执行。这三个工具不需要刻意背,但要在遇到问题的瞬间想到它们,你的Linux之旅会顺畅很多。
7. 入门之后:下一步该往哪里走
这一篇的内容覆盖了从目录结构到用户权限、从文件操作到命令组合、从常见故障到排查手法的入门闭环。如果你认真把上面的命令在自己的虚拟机里过了一遍,此刻已经能独立完成很多基础操作了。但这只是第一步,接下来的学习路线可以按兴趣选:
如果目标是日常开发,建议下一步学Vim编辑器的常用操作和Shell脚本基本语法(变量、循环、条件判断),之后尝试写一个自动备份脚本,或做一个监控磁盘阈值的报警脚本。如果目标是运维,建议系统看一遍systemd服务管理、网络配置(ip、ss、firewalld)、日志轮转与journald,然后把前文提到的技术栈再深耕一层。如果目标是嵌入式,建议把编译工具链、交叉编译、文件系统制作与烧写纳入日程,这些内容都建立在你对Linux文件系统的理解之上。
有一点我特别想对新手说:Linux学习的反馈周期很短,命令敲下去立刻就有结果,所以多动手比多收藏强。每次遇到不会的操作,先man、再搜索、再记录,形成自己的笔记体系。我最初学Linux时把踩过的坑都写在一个Markdown文件里,后来它成了我再也不怕服务器故障的底气。你也可以试试。
最后分享一个我自己养成的习惯:每周选一天,把常用命令的用法不看任何参考地默写一遍,顺便在虚拟机里重新搭一遍环境。几次下来你会发现,那些当初要查半天才敢敲的命令,早就变成了下意识的操作。Linux不像别的技术那样有那么多“看起来的高级感”,它讲究的就是手里有活、心里有数——只要你顺着上面这些基础一步步走,后面的路自然就通了。