教程 linux tutorial

Linux 目录结构

Linux 文件系统采用单一的树状层次结构,从根目录 / 开始,所有其他目录都是根目录的子目录。理解 Linux 目录结构对于高效使用和管理 Linux 系统至关重要。

文件系统层次标准 (FHS)

FHS 简介

文件系统层次标准(Filesystem Hierarchy Standard,FHS)定义了 Linux/Unix 系统中目录结构和内容的标准布局。其目的是确保不同 Linux 发行版之间的兼容性和一致性。

最新版本

  • FHS 3.0 是当前最新的主要版本,发布于 2015 年
  • 许多现代 Linux 发行版都遵循这一标准或其变体

主要目录详解

根目录 /

根目录是整个文件系统的起点,所有其他目录都是它的子目录。在 FHS 中,根目录的大小应保持精简,只包含必要的目录。

/bin - 基本命令

包含基本的系统命令二进制文件,这些命令在单用户模式下也可用,所有用户都可以执行。

主要内容:

  • 基本的 shell 命令(如 bash, sh)
  • 文件操作命令(如 cp, mv, rm)
  • 文本处理命令(如 cat, echo)
  • 系统命令(如 kill, ps)
bash
# 查看 /bin 目录中的命令示例
ls -la /bin | head -10

/boot - 引导文件

包含启动 Linux 系统所需的文件,如内核映像、引导加载程序配置和初始化 RAM 磁盘。

主要内容:

  • 内核文件(如 vmlinuz-<version>)
  • 初始 RAM 磁盘(如 initrd.img-<version> 或 initramfs-<version>.img)
  • GRUB 引导加载程序配置和文件
bash
# 查看 /boot 目录内容
ls -la /boot

/dev - 设备文件

包含代表系统设备的特殊文件,Linux 通过这些文件与硬件设备进行通信。

主要内容:

  • 块设备(如硬盘分区 /dev/sda1)
  • 字符设备(如键盘 /dev/input/event0)
  • 伪终端(如 /dev/pts/0)
  • 系统设备(如随机数生成器 /dev/random)
bash
# 列出所有磁盘设备
ls -la /dev/sd*

/etc - 配置文件

包含系统和应用程序的配置文件。这是系统管理的核心目录之一。

主要内容:

  • 系统配置文件(如 fstab, hosts)
  • 服务配置(如 /etc/ssh/, /etc/apache2/)
  • 用户和组配置(passwd, group)
  • 网络配置(network/interfaces, resolv.conf)
  • 启动脚本和初始化配置
bash
# 查看重要的系统配置文件
ls -la /etc | grep -E 'fstab|hosts|passwd|group'

/home - 用户主目录

包含所有普通用户的主目录,每个用户在 /home 下有一个以其用户名命名的子目录。

主要内容:

  • 用户文件和目录
  • 用户配置文件(如 .bashrc, .profile)
  • 用户数据和文档
bash
# 查看用户主目录
ls -la /home

/lib 和 /lib64 - 库文件

包含系统和应用程序运行所需的共享库文件和内核模块。/lib64 专门用于 64 位库。

主要内容:

  • C 标准库(如 libc.so)
  • 内核模块(在 /lib/modules/<kernel-version>/ 目录)
  • 应用程序依赖库
bash
# 查看内核模块目录
ls -la /lib/modules/$(uname -r)/

/media - 可移动媒体

用于挂载可移动媒体设备(如 CD-ROM、USB 驱动器等)的挂载点。

主要内容:

  • 自动挂载的可移动设备目录

/mnt - 临时挂载

用于临时挂载文件系统的目录,通常由系统管理员手动使用。

/opt - 可选软件

用于安装第三方软件包或大型应用程序。这些软件通常不会被包管理器更新。

/proc - 进程信息

虚拟文件系统,提供关于系统和进程的实时信息,不占用实际磁盘空间。

主要内容:

  • 进程信息(如 /proc/<PID>/)
  • 系统信息(如 cpuinfo, meminfo)
  • 内核参数和统计信息
bash
# 查看 CPU 信息
cat /proc/cpuinfo
# 查看内存使用情况
cat /proc/meminfo

/root - 管理员主目录

root 用户的主目录,不同于普通用户的 /home 目录。

/run - 运行时数据

包含系统运行时的进程数据,如进程 ID 文件和 socket 文件。在系统重启后重新创建。

/sbin - 系统命令

包含仅供系统管理员使用的系统管理命令。

主要内容:

  • 分区和格式化命令(如 fdisk, mkfs)
  • 文件系统维护命令(如 fsck)
  • 系统管理命令(如 ifconfig, route)
bash
# 查看 /sbin 目录中的命令示例
ls -la /sbin | head -10

/srv - 服务数据

包含系统提供的各种服务的数据文件,如 Web 服务器的文档根目录。

/sys - 系统信息

虚拟文件系统,提供关于设备、内核模块和系统功能的信息,与 udev 结合使用。

主要内容:

  • 设备信息(如 /sys/class/)
  • 内核参数(如 /sys/module/)
  • 电源管理信息
bash
# 查看块设备信息
ls -la /sys/block/

/tmp - 临时文件

用于存储临时文件的目录,系统重启后通常会清空。所有用户都可以在此创建文件。

/usr - 用户程序和数据

包含大多数用户工具和应用程序,是系统中最大的目录之一。

主要内容:

  • /usr/bin:非基本用户命令
  • /usr/sbin:非基本系统管理命令
  • /usr/lib:库文件
  • /usr/include:C/C++ 头文件
  • /usr/share:架构无关的数据文件
  • /usr/src:源代码(如内核源码)
bash
# 查看 /usr 目录结构
ls -la /usr

/var - 可变数据

包含系统运行时会改变的数据,如日志文件、缓存和数据库。

主要内容:

  • /var/log:日志文件
  • /var/spool:打印和邮件队列
  • /var/cache:应用程序缓存
  • /var/lib:状态信息和数据库
  • /var/run:运行时变量(部分发行版链接到 /run)
bash
# 查看系统日志目录
ls -la /var/log

目录结构的组织原则

静态与动态内容分离

  • 静态内容:不经常变化的数据,如可执行文件、库文件(在 /bin, /sbin, /lib, /usr 等)
  • 动态内容:经常变化的数据,如日志、缓存、临时文件(在 /var, /tmp, /run 等)

可共享与不可共享资源分离

  • 可共享资源:可以在网络上共享的数据,如 /usr, /srv
  • 不可共享资源:特定于单个系统的数据,如 /etc, /var/run

只读与读写目录分离

  • 只读目录:如 /usr(可以挂载为只读以提高安全性)
  • 读写目录:如 /var, /home, /tmp

目录管理最佳实践

命名约定

  • 避免在目录名中使用空格和特殊字符
  • 使用小写字母和短横线(-)分隔单词
  • 保持目录名简洁明了

权限管理

  • 正确设置目录权限,遵循最小权限原则
  • 对于系统目录,限制写入权限
  • 为用户数据目录设置适当的所有权
bash
# 设置目录权限示例
sudo chmod 755 /some/directory  # 所有者可读写执行,其他用户可读执行
sudo chown user:group /some/directory  # 设置目录所有权

磁盘空间管理

  • 监控重要目录的磁盘使用情况
  • 定期清理临时文件和旧日志
  • 考虑将大型数据目录挂载到单独的分区
bash
# 查看大目录
du -h --max-depth=1 / | sort -hr

自定义目录结构

在 /opt 中安装第三方软件

bash
# 示例:安装自定义应用到 /opt
sudo mkdir -p /opt/myapp
# 将应用文件复制到 /opt/myapp

在 /usr/local 中安装本地编译软件

bash
# 编译安装软件时指定安装路径
./configure --prefix=/usr/local
sudo make install

创建自定义挂载点

bash
# 创建数据目录
sudo mkdir -p /data
# 编辑 /etc/fstab 添加挂载配置
sudo nano /etc/fstab
# 添加类似行:/dev/sdb1 /data ext4 defaults 0 2

常见问题排查

目录权限问题

bash
# 检查目录权限
ls -la /path/to/directory
# 修复权限
chmod 755 /path/to/directory

磁盘空间不足

bash
# 查找占用大量空间的目录
du -h --max-depth=1 / | sort -hr | head -10
# 清理日志文件
find /var/log -name "*.log.*" -delete

通过理解 Linux 的目录结构,您可以更有效地导航文件系统、管理系统配置和排查问题。遵循 FHS 标准有助于保持系统的一致性和可维护性。