

这期想单独讲 /etc,不是因为它名字神秘,也不是为了背目录规范。 真正的原因很简单:新手学 Linux,很多时候不是卡在命令不会敲,而是卡在“不知道配置到底该去哪里找”。服务启动失败、域名解析不对、环境变量不生效、磁盘重启后没挂上,最后查来查去,十有八九都会回到 /etc。把这个目录搞懂,后面学 Nginx、systemd、用户权限、网络配置,都会顺很多。
刚接触 Linux 的时候,很多人都会被根目录劝退。
/bin 像是放命令的,/home 像是放用户文件的,/boot 看名字也知道和启动有关。可偏偏有一个目录叫 /etc,名字短得离谱,里面却塞满了系统配置。
改 Nginx,要去 /etc/nginx。
改本地域名解析,要看 /etc/hosts。
查用户信息,会碰到 /etc/passwd。
配全局环境变量,很多教程又让你改 /etc/profile。
时间久了你会发现:只要是在 Linux 上改“系统行为”,大概率绕不开 /etc。
问题来了:etc 到底是什么意思?为什么这些配置不放在软件自己的目录里,非要集中到这里?
这篇先讲上半部分:名字来源、目录设计思路,以及几个最常见的基础配置文件。下篇再继续拆服务配置、开机挂载、.d 目录和备份习惯。
/etc 不是“Editable Text Configuration”很多文章会把 /etc 解释成:
Editable Text ConfigurationEverything To ConfigureExtended Tool Chest这些说法听起来都挺顺,但基本都是后人补出来的解释。
etc 更早的来源,是拉丁语 et cetera,意思接近“等等”“其他”。早期 Unix 系统的目录还没有今天这么细,很多不好分类的东西就被放进 etc 这个“其他”目录里。
换句话说,它一开始更像一个杂物间。
后来系统越来越大,目录职责慢慢分清楚了:命令放到 /bin、/usr/bin,库文件放到 /lib、/usr/lib,用户数据放到 /home,运行时数据放到 /run 或 /var。
/etc 也不再是随便堆东西的地方。
在今天的 Linux 语境里,更准确的说法是:
/etc主要放本机专属的系统配置文件。
注意这几个字:本机、系统、配置。
它不是所有配置的唯一入口。用户自己的配置通常在家目录,比如 ~/.bashrc、~/.ssh/config。程序运行时产生的数据也不该塞进 /etc,那些东西更常见于 /var、/run 或业务自己的数据目录。
所以别把 /etc 理解成“Linux 里所有配置都在这”。更稳的理解是:只要这个配置影响整台机器,而且属于系统级或服务级配置,它就很可能在 /etc。
先看一个很普通的场景。
你装了 Nginx,花了半天调好了反向代理、证书、日志格式。后来要升级 Nginx,如果配置和程序文件混在同一个目录里,升级时一覆盖,配置也可能跟着没了。
这事很烦。
Linux 的传统做法是把东西分开:
/usr/bin、/usr/sbin、/usr/lib 等位置。/etc。/var。这样软件升级时,包管理器主要替换程序文件;你改过的配置文件通常会被保留,或者以 .rpmnew、.dpkg-dist 这类方式提示你合并。
这就是“程序”和“配置”分离的价值。
程序像菜谱,配置像你家的口味。菜谱可以更新,少盐还是多辣,应该由你这台机器自己决定。
/etc 放的不是“数据”理解 /etc,最容易混的就是“配置”和“数据”。
举几个例子就清楚了:
/etc | /etc/hosts/etc/fstab | |
/usr | /usr/bin/ssh/usr/lib | |
/var | ||
/home | ~/.bashrc | |
/run |
所以,/etc/mysql/my.cnf 是 MySQL 的配置;MySQL 真正的数据文件通常不在这里。
/etc/docker/daemon.json 是 Docker daemon 的配置;镜像、容器、卷默认也不在这里,而是在 Docker 的数据目录里。
新手一开始只要记住这一点:/etc 负责“怎么运行”,不负责“运行过程中产生了什么”。
Linux 是多用户系统。
有些配置只影响你自己,比如你个人的 shell 别名。它放在 ~/.bashrc 里就够了。
有些配置影响整台机器,比如:
这类配置不能散落在每个用户目录里。它们需要一个系统管理员能快速找到、能统一备份、能明确管理权限的位置。
于是 /etc 就成了这个入口。
很多服务也遵循一个很直观的习惯:软件叫什么,配置目录就叫什么。
常见例子:
/etc/nginx/etc/docker/etc/ssh/etc/cron.d、/etc/crontab不过这里要留个心眼:不同发行版可能有差异。
比如 Apache 在 Debian/Ubuntu 上常见路径是 /etc/apache2,在 RHEL/CentOS/Fedora 系上常见路径是 /etc/httpd。网络配置、bash 全局配置也经常按发行版分家。
Linux 的很多东西是“约定”,不是铁律。
/etc,先别急着改你可以先看一眼目录里有什么:
ls /etc如果想看某个配置文件,建议先用只读方式打开:
less /etc/hosts或者看前几行:
head /etc/passwd不要一上来就 vim /etc/xxx 然后直接改。
/etc 里的文件很多都很敏感。改错一个字符,轻则服务启动失败,重则系统进不了正常模式。尤其是 /etc/fstab、/etc/sudoers、/etc/passwd 这类文件,更要谨慎。
一个简单习惯可以少救很多火:
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.20260602备份文件名里加日期,后面排查时会轻松很多。
/etc/passwd:用户信息从这里看起很多人第一次看到 /etc/passwd 会被名字吓到:密码是不是明文存在这里?
现在不是。
在现代 Linux 系统里,/etc/passwd 主要保存用户账号的基础信息。真正的密码哈希通常在 /etc/shadow,普通用户不能随便读取。
/etc/passwd 的一行大概长这样:
root:x:0:0:root:/root:/bin/bashnginx:x:101:101:Nginx web server:/var/lib/nginx:/sbin/nologintest:x:1000:1000:test:/home/test:/bin/bash每一行用冒号分成 7 段:
用户名:密码占位符:UID:GID:用户说明:家目录:登录 Shell比如这一行:
test:x:1000:1000:test:/home/test:/bin/bash意思是:
testx 表示密码哈希不在这里,而在 /etc/shadow10001000/home/test/bin/bash很多服务账号的最后一段会是 /sbin/nologin 或 /usr/sbin/nologin。这表示这个账号通常不允许交互登录,只用于运行服务进程。
实际工作里,不建议手动编辑 /etc/passwd 来创建用户。更常用的是:
sudo useradd testsudo usermod -s /sbin/nologin nginx如果确实要手动修复账号文件,优先用 vipw,它会做锁定和基本检查,风险比直接编辑低。
/etc/shadow:密码哈希和过期策略/etc/shadow 保存的是密码哈希、密码修改时间、过期策略等信息。
它通常只有 root 或具备相应权限的程序能读取:
sudo ls -l /etc/shadow你不需要记住每一列的细节,但要知道两件事:
第一,改密码不要手动改这个文件。
sudo passwd test第二,查密码过期策略可以用:
sudo chage -l test把 /etc/passwd 和 /etc/shadow 放在一起看,你就能明白 Linux 为什么会有“账号信息”和“密码信息”分离:前者很多程序需要读取,后者必须严格保护。
/etc/hosts:本地域名解析的小捷径/etc/hosts 很常用。
它的作用是把主机名直接映射到 IP 地址。比如:
127.0.0.1 localhost192.168.1.10 api.test.com当你访问 api.test.com 时,系统解析名称的流程会受 /etc/nsswitch.conf 等配置影响。在常见配置下,本机 hosts 文件会比 DNS 查询更早命中。
这就很适合临时调试。
比如线上域名还没切流量,但你想让自己的电脑先访问新服务器,就可以临时加一条 hosts 记录。
不过别把它当成长期配置中心。
/etc/hosts 适合少量、明确、本机专用的映射。规模一大,还是应该交给 DNS。否则机器多了以后,每台都手动改,迟早会有人漏掉。
/etc/resolv.conf:DNS 服务器从这里看如果服务器能 ping 通 IP,但访问域名失败,很多人第一反应就是看 /etc/resolv.conf。
里面常见内容类似这样:
nameserver 8.8.8.8nameserver 8.8.4.4这表示系统会使用这些 DNS 服务器解析域名。
但现在要注意一个变化:很多发行版已经不建议你直接手改 /etc/resolv.conf。
它可能是一个符号链接,背后由 systemd-resolved、NetworkManager、dhclient 或云厂商的网络初始化工具管理。你手动改完,网络服务一重启,它又被覆盖了。
所以排查 DNS 时可以先看:
ls -l /etc/resolv.confcat /etc/resolv.conf如果发现它指向别的文件,就要顺着管理工具去改,而不是只改表面这个文件。
这也是 /etc 的一个现实问题:它是入口,但不总是唯一的控制点。
/etc/profile 和全局 Shell 配置很多教程会说:“环境变量不生效?去改 /etc/profile。”
这话只对了一半。
/etc/profile 通常用于登录 shell 的全局初始化。比如你通过 SSH 登录服务器,bash 作为登录 shell 启动时,可能会读取它。
但如果你只是打开一个新的交互式 bash,它更可能读的是 bashrc 类文件。
不同发行版名字还不完全一样:
/etc/bashrc/etc/bash.bashrc~/.bashrc、~/.bash_profile、~/.profile所以环境变量不生效时,不要只盯着一个文件。
先问自己两个问题:
第一,这个配置是给所有用户用,还是只给当前用户用?
第二,它是登录时生效,还是每次打开交互式 shell 都要生效?
如果只给自己用,改家目录下的配置更合适。全局文件影响所有用户,改之前要更谨慎。
/etc 当成“本机配置入口”这一篇先把最基础的问题讲清楚:
/etc 的名字来自 et cetera,不是现代人编出来的那些反向缩写。/etc 主要保存本机专属的系统配置文件。/etc/passwd、/etc/shadow、/etc/hosts、/etc/resolv.conf、/etc/profile 都是理解 Linux 配置体系的好入口。/etc 之前先备份,别把教程命令当成万能答案。如果用一句话记住 /etc:
它不是 Linux 的杂物间了,而是这台机器“怎么运行”的说明书。
下篇我们继续逛 /etc,重点看更容易出事故的部分:systemd 服务、fstab 自动挂载、Nginx/MySQL/Docker 配置、.d 目录,以及为什么很多老运维备份服务器时会先惦记 /etc。
你第一次改 /etc 是为了配什么?是 hosts、环境变量,还是某个服务启动失败?可以先在评论区留个坑,下篇我们接着聊。

END






