Appearance
文件系统
本章将介绍 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 |
/root | root 用户家目录 | /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 基础命令,包括文件操作、目录操作和文件查看等常用命令。
