Skip to content

文件系统

本章将介绍 Linux 文件系统的结构、文件类型、路径概念以及文件系统层次标准(FHS),帮助你理解 Linux 如何组织和管理文件。

文件系统概述

什么是文件系统?

文件系统是操作系统用于组织和存储文件的方法。Linux 采用树形目录结构,所有文件和目录都从根目录 / 开始。

mermaid
graph TD
    A["/ (根目录)"] --> B["/bin"]
    A --> C["/etc"]
    A --> D["/home"]
    A --> E["/var"]
    A --> F["/usr"]
    A --> G["/tmp"]
    A --> H["/root"]
    A --> I["/dev"]
    A --> J["/proc"]
    A --> K["/sys"]
    
    D --> D1["/home/user1"]
    D --> D2["/home/user2"]
    
    E --> E1["/var/log"]
    E --> E2["/var/www"]
    
    F --> F1["/usr/bin"]
    F --> F2["/usr/lib"]

文件系统层次标准(FHS)

FHS(Filesystem Hierarchy Standard)定义了 Linux 目录结构的标准。

目录结构详解

根目录 /

bash
# 根目录是整个文件系统的起点
# 查看根目录下的内容
ls /

# 常见输出:
# bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

主要目录说明

目录说明内容示例
/bin基本命令ls, cp, mv, cat
/sbin系统管理命令fdisk, fsck, reboot
/etc配置文件passwd, hosts, fstab
/home用户家目录/home/user1
/rootroot 用户家目录/root
/var可变数据日志、缓存、邮件
/usr用户程序应用程序、库文件
/tmp临时文件系统重启后清空
/dev设备文件硬盘、终端设备
/proc进程信息内核和进程信息
/sys系统信息内核参数
/boot启动文件内核、引导程序
/lib共享库系统库文件
/opt可选软件第三方软件
/mnt挂载点临时挂载
/media可移动设备U盘、光盘

/bin 和 /sbin

bash
# /bin - 所有用户可用的基本命令
ls /bin | head -10
# 输出:bash, cat, chmod, cp, date, dd, df, echo, ln, ls...

# /sbin - 系统管理命令(通常需要 root 权限)
ls /sbin | head -10
# 输出:fdisk, fsck, ifconfig, init, iptables, reboot...

# 注意:现代 Linux 发行版中,/bin 和 /sbin 可能是 /usr/bin 和 /usr/sbin 的软链接
ls -la /bin
# 输出:lrwxrwxrwx 1 root root 7 ... /bin -> usr/bin

/etc 配置文件

bash
# /etc 存放系统和应用程序的配置文件

# 常见配置文件:
/etc/passwd          # 用户账户信息
/etc/shadow          # 用户密码信息
/etc/group           # 组信息
/etc/hosts           # 主机名解析
/etc/fstab           # 文件系统挂载配置
/etc/hostname        # 主机名
/etc/resolv.conf     # DNS 配置
/etc/ssh/            # SSH 配置目录
/etc/apt/            # APT 配置目录(Debian/Ubuntu)
/etc/yum.repos.d/    # YUM 仓库配置(RHEL/CentOS)

# 查看用户配置
cat /etc/passwd | head -5
# 格式:用户名:密码占位符:UID:GID:描述:家目录:Shell
# 示例:root:x:0:0:root:/root:/bin/bash

/home 和 /root

bash
# /home - 普通用户的家目录
ls /home
# 输出:user1  user2  ...

# 用户家目录结构
ls -la /home/user1
# 常见内容:
# Desktop    - 桌面
# Documents  - 文档
# Downloads  - 下载
# Pictures   - 图片
# .bashrc    - Bash 配置
# .profile   - 登录配置

# /root - root 用户的家目录
sudo ls /root

/var 可变数据

bash
# /var 存放经常变化的数据

/var/log/            # 日志文件
/var/cache/          # 缓存数据
/var/spool/          # 队列数据(邮件、打印)
/var/lib/            # 应用程序数据
/var/www/            # Web 服务器内容

# 查看系统日志
ls /var/log/
# 常见日志:
# syslog      - 系统日志
# auth.log    - 认证日志
# kern.log    - 内核日志
# dmesg       - 启动日志

# 实时查看日志
tail -f /var/log/syslog

/usr 用户程序

bash
# /usr 存放用户安装的程序和数据

/usr/bin/            # 用户命令
/usr/sbin/           # 系统管理命令
/usr/lib/            # 库文件
/usr/include/        # 头文件
/usr/share/          # 共享数据
/usr/local/          # 本地安装的软件

# /usr/bin 中的命令数量
ls /usr/bin | wc -l

/dev 设备文件

bash
# /dev 存放设备文件

/dev/null            # 空设备(丢弃所有输入)
/dev/zero            # 零设备(产生零字节)
/dev/random          # 随机数设备
/dev/urandom         # 非阻塞随机数设备
/dev/tty             # 当前终端
/dev/console         # 系统控制台

# 硬盘设备
/dev/sda             # 第一块 SCSI/SATA 硬盘
/dev/sda1            # 第一块硬盘的第一个分区
/dev/nvme0n1         # 第一块 NVMe 硬盘
/dev/nvme0n1p1       # 第一块 NVMe 硬盘的第一个分区

# 查看块设备
lsblk

/proc 和 /sys

bash
# /proc - 虚拟文件系统,提供进程和内核信息

/proc/cpuinfo        # CPU 信息
/proc/meminfo        # 内存信息
/proc/version        # 内核版本
/proc/uptime         # 系统运行时间
/proc/loadavg        # 系统负载
/proc/[pid]/         # 进程信息目录

# 查看 CPU 信息
cat /proc/cpuinfo | head -20

# 查看内存信息
cat /proc/meminfo | head -10

# /sys - 虚拟文件系统,提供内核参数
/sys/class/          # 设备类
/sys/devices/        # 设备信息
/sys/kernel/         # 内核参数

# 查看内核版本
cat /proc/version

文件类型

Linux 文件类型

bash
# Linux 中一切皆文件
# 文件类型通过 ls -l 命令的第一个字符标识

# 使用 ls -l 查看文件类型
ls -l /dev/sda /etc/passwd /tmp

# 文件类型标识:
# - 普通文件
# d 目录文件
# l 符号链接(软链接)
# b 块设备文件
# c 字符设备文件
# p 命名管道
# s 套接字文件

查看文件类型

bash
# 使用 file 命令查看文件类型
file /etc/passwd
# 输出:/etc/passwd: ASCII text

file /bin/ls
# 输出:/bin/ls: ELF 64-bit LSB executable

file /dev/sda
# 输出:/dev/sda: block special

file /usr/share/doc
# 输出:/usr/share/doc: directory

# 使用 stat 查看详细信息
stat /etc/passwd

普通文件

bash
# 普通文件是最常见的文件类型
# 包括:文本文件、二进制文件、数据文件等

# 文本文件
cat /etc/hosts

# 二进制可执行文件
file /bin/ls

# 压缩文件
file archive.tar.gz

# 数据文件
file /var/lib/dpkg/status

目录文件

bash
# 目录是存储文件名和 inode 号对应关系的特殊文件

# 创建目录
mkdir mydir

# 目录权限的含义:
# r - 可以列出目录内容
# w - 可以在目录中创建/删除文件
# x - 可以进入目录

# 查看目录的 inode
ls -ldi mydir

符号链接

bash
# 符号链接(软链接)是指向另一个文件的指针

# 创建软链接
ln -s /etc/passwd passwd_link

# 查看链接
ls -l passwd_link
# 输出:lrwxrwxrwx 1 user user 11 ... passwd_link -> /etc/passwd

# 读取链接指向的文件
readlink passwd_link

# 创建硬链接
ln /etc/passwd passwd_hard

# 软链接 vs 硬链接:
# 软链接可以跨文件系统,硬链接不能
# 软链接可以链接目录,硬链接不能
# 删除原文件后,软链接失效,硬链接仍可访问

设备文件

bash
# 块设备 - 以块为单位读写(如硬盘)
ls -l /dev/sda
# 输出:brw-rw---- 1 root disk 8, 0 ... /dev/sda

# 字符设备 - 以字符为单位读写(如终端)
ls -l /dev/tty
# 输出:crw-rw-rw- 1 root tty 5, 0 ... /dev/tty

# 设备文件的主设备号和次设备号
# 主设备号标识设备类型
# 次设备号标识具体设备

路径概念

绝对路径与相对路径

bash
# 绝对路径:从根目录开始的完整路径
/etc/passwd
/home/user/Documents/file.txt
/var/log/syslog

# 相对路径:从当前目录开始的路径
./file.txt           # 当前目录下的文件
../file.txt          # 上级目录下的文件
Documents/file.txt   # 当前目录下 Documents 目录中的文件

# 查看当前目录
pwd
# 输出:/home/user

# 使用相对路径
cd Documents         # 进入 /home/user/Documents
cd ..                # 返回 /home/user
cd ../..             # 返回 /home

特殊目录符号

bash
.                    # 当前目录
..                   # 上级目录
~                    # 当前用户的家目录
~-                   # 上一个工作目录

# 示例
cd ~                 # 回到家目录
cd ~/Documents       # 进入家目录下的 Documents
cd ~-                # 返回上一个目录
ls .                 # 列出当前目录
ls ..                # 列出上级目录

路径操作

bash
# 获取文件名部分
basename /etc/passwd
# 输出:passwd

# 获取目录部分
dirname /etc/passwd
# 输出:/etc

# 获取真实路径(解析符号链接)
realpath /bin/ls
# 输出:/usr/bin/ls

readlink -f /bin/ls
# 输出:/usr/bin/ls

文件系统操作

查看磁盘使用

bash
# 查看文件系统磁盘使用情况
df -h
# 输出示例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   20G   28G  42% /
# tmpfs           3.9G     0  3.9G   0% /dev/shm

# 查看目录大小
du -sh /home
# 输出:1.5G    /home

# 查看当前目录下各子目录大小
du -h --max-depth=1

# 按大小排序
du -h --max-depth=1 | sort -h

挂载文件系统

bash
# 查看已挂载的文件系统
mount
df -h

# 挂载设备
sudo mount /dev/sdb1 /mnt/usb

# 卸载设备
sudo umount /mnt/usb
# 或
sudo umount /dev/sdb1

# 查看挂载配置
cat /etc/fstab

文件系统检查

bash
# 查看文件系统类型
df -T

# 使用 blkid 查看设备信息
sudo blkid

# 检查文件系统(需要卸载)
sudo umount /dev/sda1
sudo fsck /dev/sda1

# 查看超级块信息
sudo dumpe2fs /dev/sda1 | head -20

文件权限基础

权限表示

bash
# 权限格式:rwx rwx rwx
# 第一组:文件所有者权限
# 第二组:文件所属组权限
# 第三组:其他用户权限

# r - 读权限(值:4)
# w - 写权限(值:2)
# x - 执行权限(值:1)

# 查看权限
ls -l /etc/passwd
# 输出:-rw-r--r-- 1 root root ... /etc/passwd
# 解析:- (普通文件) rw- (所有者读写) r-- (组只读) r-- (其他只读)

# 数字表示法
# rwx = 4+2+1 = 7
# rw- = 4+2 = 6
# r-x = 4+1 = 5
# r-- = 4

修改权限

bash
# chmod - 修改权限

# 符号模式
chmod u+x script.sh      # 给所有者添加执行权限
chmod g-w file.txt       # 移除组的写权限
chmod o+r file.txt       # 给其他用户添加读权限
chmod a+x script.sh      # 给所有用户添加执行权限
chmod u=rw,go=r file.txt # 设置具体权限

# 数字模式
chmod 755 script.sh      # rwxr-xr-x
chmod 644 file.txt       # rw-r--r--
chmod 700 private/       # rwx------
chmod 777 public/        # rwxrwxrwx(不推荐)

修改所有者

bash
# chown - 修改所有者
sudo chown user file.txt
sudo chown user:group file.txt
sudo chown :group file.txt    # 只修改组

# chgrp - 修改所属组
sudo chgrp group file.txt

# 递归修改
sudo chown -R user:group /home/user

文件系统特性

inode 概念

bash
# inode(索引节点)存储文件的元数据
# 包括:文件大小、权限、所有者、时间戳、数据块位置等
# 不包括:文件名

# 查看 inode 信息
stat /etc/passwd

# 查看 inode 号
ls -i /etc/passwd

# 查看文件系统的 inode 使用情况
df -i

硬链接计数

bash
# 硬链接计数表示有多少个文件名指向同一个 inode

# 创建文件
touch file.txt
ls -l file.txt
# 硬链接计数为 1

# 创建硬链接
ln file.txt hardlink.txt
ls -l file.txt
# 硬链接计数为 2

# 删除原文件
rm file.txt
ls -l hardlink.txt
# 硬链接计数为 1,文件内容仍可访问

# 目录的硬链接计数
ls -ld /home
# 计数至少为 2(. 和 ..)

文件时间戳

bash
# 文件有三个时间戳:
# atime - 访问时间(Access Time)
# mtime - 修改时间(Modification Time,内容变化)
# ctime - 状态改变时间(Change Time,元数据变化)

# 查看时间戳
stat /etc/passwd

# 只查看 mtime
ls -l /etc/passwd

# 查看 atime
ls -lu /etc/passwd

# 查看 ctime
ls -lc /etc/passwd

# 修改时间戳
touch -t 202301011200 file.txt    # 设置具体时间
touch -d "2023-01-01 12:00" file.txt
touch -r ref.txt file.txt         # 使用参考文件的时间

小结

本章介绍了 Linux 文件系统的核心概念:

内容要点
目录结构FHS 标准、主要目录用途
文件类型普通文件、目录、链接、设备文件
路径绝对路径、相对路径、特殊符号
权限rwx 权限、chmod、chown
inode元数据存储、硬链接

关键要点

  • Linux 采用树形目录结构,根目录是 /
  • 一切皆文件,包括设备、进程信息等
  • 理解目录结构有助于快速找到配置文件和日志
  • inode 是文件系统的重要概念

下一步

下一章我们将学习 Linux 基础命令,包括文件操作、目录操作和文件查看等常用命令。