共计 2900 个字符,预计需要花费 8 分钟才能阅读完成。
文章目录 [显示]
用 Linux 的人,迟早会在终端里敲下 ls /,然后看到一堆目录名——bin、etc、home、usr、var……第一反应大概是:这些都是什么东西?为什么不像 Windows 那样分个 C 盘 D 盘了事?
这篇文章就来把 Linux 的目录树从根到叶捋一遍。读完你会知道每个核心目录装的是什么、为什么这么设计,以及那句经典的 " 一切皆文件 " 到底意味着什么。
先说设计哲学:一切皆文件
在 Linux 的世界观里,硬盘是文件,键盘是文件,网络接口是文件,甚至正在跑的进程信息也是文件。
这不是比喻,是字面意思。你可以用 cat 读取 /proc/cpuinfo 获取 CPU 信息,可以往 /dev/null 里写数据把它丢弃,可以通过 /dev/sda 直接操作整块硬盘。
这套设计带来一个巨大的好处: 你只需要掌握一套读写文件的接口(open/read/write/close),就能跟系统里几乎所有资源打交道。 不需要为硬件、进程、网络分别学一套 API。
理解了这一点,再看目录结构就不会觉得奇怪了——那些目录不只是 " 放文件的文件夹 ",它们是整个操作系统的骨架。
FHS:大家商量好的规矩
早期各家 Linux 发行版各搞各的目录布局,软件开发者苦不堪言——你的配置文件到底放 /etc 还是 /usr/etc?
于是社区搞出了 FHS(Filesystem Hierarchy Standard,文件系统层次标准),本质上是一份约定:什么类型的文件该放在哪里。目前主流发行版(Debian、Ubuntu、Fedora、Arch 等)基本都遵守这套标准,虽然细节上各有微调。
FHS 把目录按两个维度划分:
| 静态数据(不常变) | 动态数据(经常变) | |
|---|---|---|
| 可共享 (多台主机共用) | /usr、/opt |
/var/mail、/var/spool |
| 不可共享 (仅本机使用) | /etc、/boot |
/var/run、/var/lock |
这个分类方式不用死记,但它能帮你理解 " 为什么这个文件放在这里而不是那里 "。
根目录下的核心成员
打开终端,执行 ls /,你大概会看到这些:
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
一个一个说。
/bin 和 /sbin:基础命令
/bin 放的是所有用户都能用的基础命令,比如 ls、cp、mv、cat。这些命令在系统启动早期(其他分区还没挂载时)就得能用。
/sbin 放的是系统管理命令,比如 fdisk、iptables、reboot。普通用户一般没权限执行。
坦白说,现在很多发行版已经把 /bin 做成了指向 /usr/bin 的软链接,/sbin 同理。但理解它们的原始设计意图还是有价值的。
/etc:系统配置大本营
这可能是你最常打交道的目录之一。 几乎所有系统级的配置文件都住在这里:
/etc/fstab——磁盘挂载配置/etc/hosts——本地域名解析/etc/passwd和/etc/shadow——用户账户信息/etc/nginx/、/etc/ssh/——各种服务的配置目录
有个好习惯:改配置之前先备份原文件。一句 cp nginx.conf nginx.conf.bak 能在关键时刻救命。
/home:用户的地盘
每个普通用户在 /home 下都有一个以用户名命名的目录。你的文档、下载、桌面配置、.bashrc 都在这里。
服务器上做权限管理时,/home 的重要性更明显——不同用户的数据物理隔离,互不干扰。
/root:超级用户的家
root 用户的家目录不在 /home/root,而是单独放在 /root。原因很实际:/home 可能挂载在单独的分区上,万一那个分区挂了,root 用户照样需要能登录系统修问题。
/usr:软件主阵地
这是整个系统里体积最大的目录之一。名字来源是 "Unix System Resources"(不是 "user",很多人搞混)。
/usr/bin——大部分用户命令/usr/lib——库文件/usr/share——架构无关的共享数据(文档、图标、字体等)/usr/local——你手动编译安装的软件的默认去处
怎么理解 /usr 和根目录下 /bin 的关系?简单说:根目录下的是 " 急救包 "(系统启动必需),/usr 下的是 " 完整工具箱 "(系统完全启动后才需要)。
/var:变化的数据
var 是 variable 的缩写,存放运行时会持续变化的数据:
/var/log——系统日志,排查问题的第一站/var/cache——应用缓存/var/lib——程序运行时的状态数据(比如数据库文件)/var/tmp——需要跨重启保留的临时文件
服务器运维中,/var/log 吃满磁盘是常见事故。设置日志轮转(logrotate)是基本功。
/dev:设备文件
这里体现了 " 一切皆文件 " 的设计。每个硬件设备在 /dev 下都有对应的文件:
/dev/sda——第一块硬盘/dev/tty——终端设备/dev/null——黑洞,写进去的数据全部消失/dev/zero——无限产出零字节,常用于创建空文件
# 创建一个 1GB 的空文件
dd if=/dev/zero of=testfile bs=1M count=1024
/proc 和 /sys:虚拟文件系统
这两个目录里的内容不存在于硬盘上——它们是内核在内存中动态生成的。
/proc 暴露进程和内核信息。比如 /proc/1/ 是 PID 为 1 的进程的所有信息,/proc/meminfo 是内存使用状况。
/sys 暴露设备和驱动信息,结构比 /proc 更规整,是较新的接口。
这两个目录是系统监控和调优的利器。top、free、lscpu 这些命令背后,读的都是这里的文件。
/tmp:临时文件
谁都能往里写,重启后通常会被清空。程序运行时的临时数据扔这里。
需要注意的是,正因为权限开放,/tmp 也是安全审计的重点区域。
/boot:启动文件
内核文件(vmlinuz)、初始化内存盘(initramfs)和 GRUB 引导器的配置都在这里。普通使用中几乎不需要动它,但升级内核时会自动更新这个目录。
/opt、/srv、/media、/mnt
这几个用得相对少,简单提一下:
/opt——第三方大型软件的安装位置(比如 Google Chrome、JetBrains IDE)/srv——服务相关数据(Web 服务器的站点文件等),实际中很多人用/var/www代替/media——自动挂载的移动设备(U 盘、光盘)/mnt——手动临时挂载点
怎么把这些知识用起来
知道目录结构不是为了考试,而是让你在实际操作中少走弯路:
找配置文件 ——直接去 /etc 翻,不用满系统 find。
排查问题 ——先看 /var/log 下的日志,大部分故障线索都在那儿。
清理磁盘空间 ——du -sh /var/log/* 看看日志占了多少,/tmp 和 /var/cache 也是常见的空间杀手。
安装软件 ——包管理器装的在 /usr,手动编译的约定放 /usr/local,第三方商业软件放 /opt。别往 /bin 里随便塞东西。
说到底,Linux 的目录结构是几十年实践经验的沉淀。它不是某个人拍脑袋想出来的,而是无数运维事故和开发者争论后达成的共识。刚开始觉得复杂很正常,用着用着你会发现——它确实比 " 什么都往 C 盘扔 " 合理得多。