当前位置:首页>Linux>先搞懂 /etc:为什么 Linux 的配置都爱往这里放?(上)

先搞懂 /etc:为什么 Linux 的配置都爱往这里放?(上)

  • 2026-10-11 07:40:53
先搞懂 /etc:为什么 Linux 的配置都爱往这里放?(上)
点击上方
蓝字
关注我,设置星标不迷路哈

这期想单独讲 /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 Configuration
  • Everything To Configure
  • Extended 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
本次启动期间的运行时状态
PID 文件、socket

所以,/etc/mysql/my.cnf 是 MySQL 的配置;MySQL 真正的数据文件通常不在这里。

/etc/docker/daemon.json 是 Docker daemon 的配置;镜像、容器、卷默认也不在这里,而是在 Docker 的数据目录里。

新手一开始只要记住这一点:/etc 负责“怎么运行”,不负责“运行过程中产生了什么”。

为什么很多全局配置都集中在这里?

Linux 是多用户系统。

有些配置只影响你自己,比如你个人的 shell 别名。它放在 ~/.bashrc 里就够了。

有些配置影响整台机器,比如:

  • 本机主机名解析规则
  • 用户和用户组信息
  • 开机自动挂载哪些磁盘
  • 系统服务怎么启动
  • 全局 shell 环境

这类配置不能散落在每个用户目录里。它们需要一个系统管理员能快速找到、能统一备份、能明确管理权限的位置。

于是 /etc 就成了这个入口。

很多服务也遵循一个很直观的习惯:软件叫什么,配置目录就叫什么。

常见例子:

  • Nginx:/etc/nginx
  • Docker:/etc/docker
  • OpenSSH:/etc/ssh
  • cron:/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

意思是:

  • 用户名是 test
  • x 表示密码哈希不在这里,而在 /etc/shadow
  • UID 是 1000
  • GID 是 1000
  • 家目录是 /home/test
  • 登录 Shell 是 /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 类文件。

不同发行版名字还不完全一样:

  • RHEL/CentOS/Fedora 系常见 /etc/bashrc
  • Debian/Ubuntu 系常见 /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

Linux 新人为什么总绕不开 Vim?先会这些就够了(上)

Vim 入门别死背:这些真实场景,会让你越用越顺手(下)

第一次登录 Linux,路径、切目录和 PATH 一次讲清楚(下)

第一次登录 Linux,先别慌:看懂这 6 件事就入门了(上)

为什么 Linux 的目录这么奇怪?终于有人讲明白了

一文搞懂Linux磁盘结构与管理:物理磁盘、分区表、文件系统全梳理

最新文章

随机文章