很多人刚开始接触Linux的时候,都会有一个共同的感受:这目录怎么这么多?看着乱七八糟的,完全搞不清每个地方放什么。
打开根目录一敲ls,出来一堆名字短得奇怪的目录:/etc、/var、/usr、/tmp、/home……每个名字都没头没尾,背了忘忘了背,最后还是记不住谁是谁。于是很多人都会问:这些目录到底有什么用?工作里真的会用到吗?
我刚学Linux那会也觉得,这些东西就是考试用的,工作哪用得着纠结每个目录放啥?出问题直接搜不就行了?直到我遇到那次生产事故,才真正明白:Linux目录结构真不是拿来应付笔试的,关键时候是拿来救命的。
那是我刚参加工作半年多的时候,负责维护公司几个面向C端的业务站点。那天早上刚到公司,就收到了监控报警:服务器负载持续走高,页面响应时间从几百毫秒涨到了十几秒,最后干脆直接502打不开了。
我赶紧登上VPN,SSH连上服务器,敲命令都卡得半天出不来字,心里咯噔一下:肯定是出大问题了。
当时脑子里第一个念头就是:是不是磁盘满了?毕竟刚接手的服务器,之前没做过磁盘容量告警,这种基础问题反而最容易出问题。于是我敲下了入行以来最刻进DNA的命令:
回车之后,结果出来的瞬间我就明白了问题在哪——根分区下的/var目录,使用率已经100%了。
Filesystem Size Used Avail Use% Mounted on/dev/vda1 50G 50G 0 100% /var
那一瞬间,之前背过的所有目录功能突然就活了:/var是variable的缩写,就是存放可变数据的目录,什么日志、缓存、运行时数据都会放这。磁盘满了十有八九就是日志爆了。
接下来排查思路就顺了,先看看/var下面到底哪个目录占了这么多空间:
结果一目了然:/var/log直接占了40多个G,剩下所有文件加起来还不到5G。再往下挖:
核心问题找到了:/var/log/messages这个文件已经快40G了,正常来说这个文件就算轮转完也就几百M,这明显不对。
最后查原因,原来是我们新上线的一个服务,日志级别开成了debug,代码里还有一个死循环一直在打错误日志,上线一天不到直接把磁盘给撑爆了。找到原因就好解决了:先清空日志释放空间,临时把服务重启,业务很快就恢复了,后续再改日志级别、配置日志轮转,问题就彻底解决了。
从那之后我才真正意识到:Linux目录结构真不是书本上的死知识,它是Linux系统给你留的“地图”。系统出问题的时候,能不能快速顺着地图找到问题根源,直接决定了你排障的速度,而在生产环境,排障速度就是钱——晚恢复一分钟,可能就有成千上万的损失。
很多人刚学的时候会吐槽:Windows不就分C盘D盘,所有东西都放一起不好吗?为什么Linux要搞这么多目录分的清清楚楚?
其实这恰恰是Unix/Linux设计哲学的体现:一个目录只做一件事,所有文件各归其位。这种设计的好处,这么多年用下来我感受特别深:
第一,方便管理权限。比如系统配置文件只有管理员能改,那放在/etc,统一配置权限就好了;用户自己的数据放在/home,用户自己说了算,不会影响到系统文件。
第二,方便备份和迁移。如果我只需要备份用户数据,直接打/home的包就好了;如果我要备份系统配置,只需要备份/etc,不用管其他地方。要是所有东西混在一起,备份都不知道该挑哪些。
第三,方便故障隔离。就像我遇到的那次事故,日志把磁盘撑爆了,如果日志放在根目录和系统文件混在一起,可能根分区直接满了,系统都没法正常操作,排障都没法排。现在/var单独分区,就算满了,系统核心目录还是正常的,至少你能登上去操作排障。
很多人说Linux目录结构像一座城市,我觉得这个比喻太对了:每个区域都有自己明确的功能,就像城市里市中心、居民区、工业区、仓库划分清清楚楚,你要办什么事就去对应的区域,不会瞎跑。我们接下来就按照这个思路,把工作中最常用的几个目录一个个说清楚,保证你看完之后不会再记混。
/etc:整个系统的“管理中心”
/etc这个名字最早是“etcetera”(等等,附加物)的缩写,发展到现在,它已经成了Linux系统当之无愧的配置中心——几乎所有系统层面和服务层面的配置文件,全都放在这里。
你在工作中遇到的绝大多数问题,只要和配置相关,第一反应去/etc找肯定没错。给大家举几个最常见的场景:
- 你改了服务器的hosts,想要配置域名本地解析,文件在哪?
/etc/hosts - 你装了Nginx,想要改网站配置,配置文件在哪?
/etc/nginx/ - 你装了MySQL,想要改数据库端口和数据目录,配置文件在哪?
/etc/my.cnf或者/etc/mysql/ - 你要给系统加一个开机自启的服务,配置文件写在哪?
/etc/systemd/system/ - 你想要配置普通用户的sudo权限,在哪改?
/etc/sudoers
甚至可以这么说:/etc目录改明白了,Linux你就会了一半了。我平时排障,一半以上的问题,最终都能追到/etc里的某个配置错了——要么是配置写错了,要么是权限不对,要么是路径写错了。
而且这里有个小技巧:绝大多数服务的配置,都会遵循一个规律,就是在/etc下面会建一个自己同名的目录,比如nginx就是/etc/nginx/,apache就是/etc/httpd/,docker就是/etc/docker/,这个规律几乎不会错,找不到配置的时候按这个找,一找一个准。
/var:系统的“动态数据中心”
就是我那次事故的主角,/var是variable的缩写,意思就是“可变的”,专门放系统运行中会不断变化的文件。这里面最重要的两个子目录,每个运维天天都要碰:
第一个就是/var/log,整个系统的“监控室”——所有系统日志和应用日志默认都放在这里。刚才说了,出问题先看日志,看日志就来/var/log。
/var/log下面几个核心文件你一定要记住:
messages:系统主日志,绝大多数系统层面的报错都会往这里写,比如硬件报错、系统服务报错,排障第一步先看这个syslog:和messages差不多,部分发行版会把系统日志存在这dmesg:内核日志,开机启动过程的日志、硬件相关的日志都在这,查硬件问题必看- 各个应用自己的日志,一般会在
/var/log下面建一个自己的目录,比如nginx会有/var/log/nginx/,apache会有/var/log/httpd/,mysql会有/var/log/mysqld.log
除了日志,/var下面还有几个常用的目录:
/var/lib:放应用运行时需要的固定数据,比如docker的镜像和容器数据默认就存在/var/lib/docker/,很多数据库的数据也会存在这里/var/tmp:存放需要长期保留的临时文件,和/tmp不一样的是,/tmp重启会被清空,/var/tmp不会/var/www:默认的网站根目录,很多web服务器默认会把网站放在这
/home:所有用户的“居民区”
这个应该是最好理解的,/home就是每个用户的家目录,每个用户登陆系统之后,默认都会在自己的家目录里,用户自己的文件、代码、配置全都存在这。
比如系统上有一个用户叫zhangsan,那他的家目录就是/home/zhangsan/,只有zhangsan自己和root能进去,其他用户看不了,非常安全。
工作中常用的场景:
- 用户自己上传的文件、写的代码,默认都存在家目录,找用户数据先来这
- 每个用户的个人配置,比如
.bashrc、.vimrc这些用户自己改的shell配置,都存在家目录根下 - 如果是开发服务器,开发人员的代码一般都会放在自己的
/home下面,不会放在系统目录里,既安全又好管理
这里提醒一个新人很容易踩的坑:不要把大量数据放在root用户的家目录/root,更不要把业务数据放在根目录,一方面权限不对,另一方面如果根分区满了,你的数据就拿不出来了,用户数据统一放/home,一般运维都会给/home单独分一个大分区,不容易出问题。
/usr:系统的“用户程序仓库”
很多人会搞混/usr和/user,其实/usr最早是Unix System Resources的缩写,不是用户的意思。现在/usr这个目录,主要是用来存放安装的系统级应用程序、库、文档这些东西。
我们平时用yum或者apt装软件,大部分都会把可执行文件放到/usr/bin/,库文件放到/usr/lib/,配置文件虽然大部分在/etc,但是程序本身的主体都在/usr下面。
常用的子目录:
/usr/bin:普通用户可以执行的命令都在这里,我们平时敲的ls、df、python这些命令,绝大多数都在这/usr/sbin:只有root管理员才能用的系统命令在这里,比如fdisk、reboot这些/usr/local:这个非常重要,我们自己手动编译安装的软件,默认都会装在/usr/local下面,比如你自己编译安装一个新版本的nginx或者php,一般都会放在/usr/local/nginx/、/usr/local/php/这里,分不清系统预装和自己装的软件,来这里找就对了/usr/src:存放内核源代码的地方,如果你要编译内核,就放在这里
/tmp:整个系统的“临时垃圾桶”
/tmp是temporary的缩写,就是临时目录,专门放各种程序生成的临时文件。这个目录有个特点:大多数Linux发行版,重启系统的时候会自动清空/tmp,所以千万不要把需要持久保存的文件放在这。
那什么时候用/tmp呢?比如你上传了一个临时压缩包,需要在服务器上解压出来处理,处理完就可以删了,放/tmp正好;或者程序运行的时候需要生成一些临时的锁文件、缓存文件,也会放在这。
我平时经常在/tmp放一些临时下载的安装包,装完就直接删了,省得占地方,反正重启也会清,非常方便。这里提醒一句,有些程序会把运行需要的socket文件放在/tmp,如果程序启动失败提示找不到socket,你可以看看/tmp是不是被清了,重启一下程序一般就好了。
/bin和sbin:系统核心命令的“大本营”
这两个目录现在其实已经慢慢整合到/usr/bin和/usr/sbin了,但是很多系统还是会保留,而且它们非常重要——这里放的是系统最核心的基础命令,就是系统单用户模式下,还能正常使用的命令。
比如ls、cat、cp、mv这些最基础的命令,都在/bin,/sbin放的是fsck、init这些核心的系统管理命令。
新人最容易踩的一个坑就是:手贱删了/bin或者/sbin下面的东西,删完你会发现,不仅很多命令用不了,系统直接都起不来了。我刚学的时候在虚拟机上试过,删了/bin下的几个文件,重启直接进不了系统,只能重装,这个教训一定要记住:没有弄清楚文件是干什么的之前,不要随便删/bin、/sbin、/lib这些目录下的东西。
/boot:系统启动的“敲门砖”
/boot里面放的是系统启动需要的核心文件,包括内核文件、启动引导程序GRUB的配置文件都在这里。一般这个目录会单独分一个很小的分区,几百M就够了。
如果这个目录被删了或者出问题了,你的系统根本就启动不了,开机直接卡引导界面。所以平时不要随便动这个目录,除非你在升级内核或者修复启动引导,否则碰都不要碰。
常见的排障场景就是系统启动失败,卡在GRUB那里,很多时候就是/boot空间满了,升级内核没放下,导致引导出问题,这个时候需要进救援模式清理/boot里没用的旧内核,就能解决问题。
/dev:硬件设备的“接口室”
Linux有一句设计哲学:“一切皆文件”,所有的硬件设备,在Linux里都会当成一个文件来访问,而这些代表硬件的文件,全都放在/dev下面。
比如你插了一块硬盘,硬盘的设备文件就是/dev/sda,分区就是/dev/sda1;你服务器上的光驱就是/dev/cdrom;你要操作串口就是/dev/tty;甚至你要扔东西,都有一个/dev/null空设备,相当于黑洞,什么东西往这一写就没了。
工作中经常用到的场景:你要挂载一块新硬盘,首先就得找到它的设备文件,就在/dev下面找;你要把一个错误输出屏蔽掉,就会写到/dev/null,这些都是天天用的操作。
说了这么多,我们来结合实际工作中的几个常见问题,看看正确的目录思路是怎么帮你快速排障的:
场景1:网站打不开,502错误
第一步应该去哪?先看nginx日志啊,日志在哪?/var/log/nginx/,去里面看error日志,看看是连接不上后端还是权限不对;配置是不是错了?去/etc/nginx/看配置文件,是不是路径写错了,端口写错了,是不是域名匹配错了。目录找对了,两分钟就能定位问题。
场景2:程序启动失败,没有报错输出
肯定先看日志啊,大部分程序都会把日志输出到/var/log下面自己的目录,找不到的话,systemd管理的服务,可以用journalctl -u 服务名看,要是程序自己打日志,去/var/log找对应的目录,十有八九能找到报错信息。
场景3:用户说自己文件找不到了
用户自己上传的文件,默认肯定在自己的/home/用户名/下面,要么就是在网站目录/var/www/下面,顺着找过去,要么就是删错了,要么就是放错地方了,很快就能找到。
场景4:系统启动失败,卡在启动界面
先检查是不是启动引导出问题了,去/boot看内核文件还在不在,GRUB配置对不对,再去/etc/fstab看是不是挂载配置写错了,这两个地方是系统启动失败的重灾区,绝大多数问题都在这。
场景5:磁盘满了,需要找大文件
首先用df -h看哪个分区满了,如果是/var满了,大概率是日志爆了,直接去/var/log找大文件;如果是/home满了,肯定是哪个用户存了大文件,du -sh /home/*找到那个用户,再往下挖;如果是/usr满了,可能是装了太多大软件,去/usr/local找;顺着目录结构一步步来,几分钟就能找到问题。
你看,整个排障过程,其实就是顺着目录结构找问题的过程。高手和新人的区别在哪?并不是高手会背一千个命令,而是高手看到一个问题,脑子里立刻就反应出来:应该去哪个目录找线索,不会瞎撞,不会乱试,几分钟就能定位问题,而新人可能翻半天都不知道去哪找,浪费了大量时间,还容易把小问题搞成大事故。
说了这么多,其实我想表达的核心观点就是:Linux目录结构真的不是拿来应付考试的死知识,它是Linux系统给你设计好的一张问题排查地图。你把这张地图摸熟了,出问题的时候就能顺着路快速找到根源,要是地图都看不懂,那排障只能靠瞎蒙。
很多新手学Linux,一开始就拼命背每个目录的作用,背了半天还是记不住,一到实际用的时候还是不知道去哪找,就是因为没有结合实际场景去理解。你背一百遍/var/log放日志,不如遇到一次日志爆盘的事故,遇到一次你这辈子都不会忘。
我现在给新人培训,从来不要求他们第一天就把所有目录背下来,我只会告诉他们几个核心目录的作用。