文件系统基础

文件系统是Linux系统的核心组成部分。理解Linux文件系统的层次结构、文件类型和权限机制,是掌握Linux系统管理的基础。本章将深入讲解Linux文件系统的组织方式和管理方法。


一、Linux文件系统结构

1.1 树形目录结构

1.1.1 根目录概念

Linux文件系统是树形结构,根目录为"/"

                    /
                    │
        ┌───────────┼───────────┬───────────┬───────────┐
        │           │           │           │           │
       bin         etc        home        usr         var
        │           │           │           │           │
      命令        配置        用户        程序        数据

东巴文观点:Linux文件系统就像一棵倒置的树,根目录"/"是树根,所有文件和目录都从根目录分支出来。

1.1.2 路径表示

绝对路径:从根目录开始的完整路径

/etc/passwd           # 绝对路径
/home/dbw/Documents   # 绝对路径

相对路径:从当前目录开始的路径

Documents/report.txt  # 相对路径
../Downloads          # 相对路径(上一级目录)
./test.txt            # 相对路径(当前目录)

特殊目录符号

符号 说明
/ 根目录
~ 用户主目录
. 当前目录
.. 上一级目录
- 上一次所在目录

1.2 标准目录结构

1.2.1 根目录下的主要目录

FHS(文件系统层次标准)定义的目录结构

/
├── bin/     # 基本命令(所有用户可用)
├── boot/    # 启动文件
├── dev/     # 设备文件
├── etc/     # 系统配置文件
├── home/    # 用户主目录
├── lib/     # 系统库文件
├── media/   # 可移动设备挂载点
├── mnt/     # 临时挂载点
├── opt/     # 可选软件包
├── proc/    # 进程信息(虚拟文件系统)
├── root/    # root用户主目录
├── run/     # 运行时数据
├── sbin/    # 系统管理命令
├── srv/     # 服务数据
├── sys/     # 系统信息(虚拟文件系统)
├── tmp/     # 临时文件
├── usr/     # 用户程序和数据
└── var/     # 可变数据

1.2.2 重要目录详解

/bin - 基本命令目录

# 存放系统启动和运行所需的基本命令
/bin/ls
/bin/cat
/bin/mkdir
/bin/rm

# 所有用户都可以使用这些命令

/etc - 配置文件目录

# 系统配置文件
/etc/passwd          # 用户信息
/etc/shadow          # 用户密码
/etc/group           # 组信息
/etc/hosts           # 主机名解析
/etc/fstab           # 文件系统挂载表
/etc/ssh/            # SSH配置
/etc/apt/            # APT配置(Ubuntu/Debian)
/etc/yum.repos.d/    # YUM配置(CentOS/RHEL)

东巴文提示:/etc目录是系统管理员最常访问的目录,几乎所有系统配置都在这里。

/home - 用户主目录

# 每个用户都有一个独立的主目录
/home/dbw/           # 用户dbw的主目录
/home/tom/           # 用户tom的主目录

# 用户主目录下的常见子目录
/home/dbw/Desktop/   # 桌面
/home/dbw/Documents/ # 文档
/home/dbw/Downloads/ # 下载
/home/dbw/.config/   # 应用配置(隐藏目录)

/var - 可变数据目录

# 系统运行时产生的可变数据
/var/log/            # 日志文件
/var/cache/          # 缓存数据
/var/spool/          # 队列数据
/var/lib/            # 应用数据
/var/tmp/            # 临时文件

# 常见日志文件
/var/log/syslog      # 系统日志(Ubuntu/Debian)
/var/log/messages    # 系统日志(CentOS/RHEL)
/var/log/auth.log    # 认证日志
/var/log/apache2/    # Apache日志

/usr - 用户程序目录

# 用户程序和数据
/usr/bin/            # 用户命令
/usr/sbin/           # 系统管理命令
/usr/lib/            # 用户库文件
/usr/share/          # 共享数据
/usr/local/          # 本地安装的软件
/usr/src/            # 源代码

# 示例
/usr/bin/vim         # Vim编辑器
/usr/bin/python3     # Python解释器

/dev - 设备文件目录

# 设备文件
/dev/null            # 空设备(丢弃所有输入)
/dev/zero            # 零设备(提供空字符)
/dev/random          # 随机数设备
/dev/tty             # 当前终端
/dev/sda             # 第一块SCSI硬盘
/dev/sda1            # 第一块硬盘的第一个分区

/proc - 进程信息目录

# 虚拟文件系统,提供内核和进程信息
/proc/cpuinfo        # CPU信息
/proc/meminfo        # 内存信息
/proc/version        # 内核版本
/proc/uptime         # 系统运行时间
/proc/[pid]/         # 进程信息(pid为进程ID)

# 查看CPU信息
cat /proc/cpuinfo

# 查看内存信息
cat /proc/meminfo

/tmp - 临时文件目录

# 临时文件,重启后可能清空
/tmp/

# 所有用户可读写
chmod 1777 /tmp      # 粘滞位,用户只能删除自己的文件

东巴文最佳实践:不要在/tmp目录存放重要文件,系统重启后可能丢失。

1.3 用户主目录

1.3.1 主目录结构

用户主目录/home/用户名/

常见子目录

目录 说明
~/Desktop 桌面
~/Documents 文档
~/Downloads 下载
~/Music 音乐
~/Pictures 图片
~/Videos 视频
~/.config 应用配置文件
~/.local 本地数据
~/.cache 缓存文件
~/.ssh SSH配置和密钥

1.3.2 隐藏文件

以点(.)开头的文件和目录是隐藏文件

# 查看隐藏文件
ls -a

# 输出示例:
# .              ..             .bashrc
# .profile       .cache         .config

# 常见隐藏文件
~/.bashrc            # Bash配置
~/.bash_profile      # Bash登录配置
~/.profile           # 用户配置
~/.vimrc             # Vim配置
~/.gitconfig         # Git配置

东巴文提示:隐藏文件通常是配置文件,不要随意删除。


二、文件类型

2.1 文件类型分类

2.1.1 Linux文件类型

Linux中一切皆文件

类型 标识符 说明
普通文件 - 文本文件、二进制文件等
目录 d 目录文件
符号链接 l 软链接
块设备 b 硬盘、U盘等
字符设备 c 终端、键盘等
管道 p 命名管道
套接字 s 网络套接字

2.1.2 查看文件类型

使用ls -l查看文件类型

ls -l

# 输出示例:
# -rw-r--r--  1 dbw dbw  1234 Jan 1 10:00 file.txt
# drwxr-xr-x  2 dbw dbw  4096 Jan 1 10:00 dir
# lrwxrwxrwx  1 dbw dbw     4 Jan 1 10:00 link -> file
# brw-rw----  1 root disk 8, 0 Jan 1 10:00 /dev/sda
# crw-rw-rw-  1 root tty  5, 0 Jan 1 10:00 /dev/tty

# 第一个字符表示文件类型:
# -  普通文件
# d  目录
# l  符号链接
# b  块设备
# c  字符设备

使用file命令查看文件类型

# 查看文件类型
file file.txt
# 输出:file.txt: ASCII text

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

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

file Pictures/
# 输出:Pictures/: directory

2.2 普通文件

2.2.1 文本文件

文本文件:以ASCII或UTF-8编码存储的文件。

# 创建文本文件
echo "Hello, World!" > hello.txt

# 查看文本文件
cat hello.txt
less hello.txt
head hello.txt
tail hello.txt

# 编辑文本文件
vim hello.txt
nano hello.txt

2.2.2 二进制文件

二进制文件:以二进制格式存储的文件。

# 可执行文件
/bin/ls
/usr/bin/vim

# 图片文件
image.jpg
image.png

# 压缩文件
archive.tar.gz
archive.zip

2.3 目录

2.3.1 目录操作

创建目录

# 创建单个目录
mkdir dir1

# 创建多级目录
mkdir -p dir1/dir2/dir3

# 创建目录并设置权限
mkdir -m 755 dir1

删除目录

# 删除空目录
rmdir dir1

# 删除非空目录
rm -r dir1

# 强制删除目录(不提示)
rm -rf dir1

东巴文警告rm -rf命令非常危险,删除后无法恢复!

2.4 符号链接

2.4.1 符号链接概念

符号链接(软链接):指向另一个文件的特殊文件。

特点

  • 类似Windows的快捷方式
  • 可以跨文件系统
  • 可以链接目录
  • 原文件删除后,链接失效

2.4.2 创建符号链接

ln命令

# 创建符号链接
ln -s 源文件 链接文件

# 示例
ln -s /usr/bin/python3 /usr/bin/python

# 创建目录的符号链接
ln -s /var/log logs

# 查看链接
ls -l logs
# 输出:lrwxrwxrwx 1 dbw dbw 8 Jan 1 10:00 logs -> /var/log

2.4.3 硬链接

硬链接:指向相同inode的多个文件名。

特点

  • 不能跨文件系统
  • 不能链接目录
  • 原文件删除后,硬链接仍然有效
  • 修改一个文件,另一个也改变
# 创建硬链接
ln 源文件 硬链接文件

# 示例
ln file.txt hardlink.txt

# 查看inode号
ls -i file.txt hardlink.txt
# 输出:
# 123456 file.txt
# 123456 hardlink.txt  # inode号相同

东巴文对比

特性 符号链接 硬链接
跨文件系统 可以 不可以
链接目录 可以 不可以
原文件删除 链接失效 链接有效
inode 不同 相同

2.5 设备文件

2.5.1 块设备

块设备:以块为单位读写数据的设备。

# 硬盘设备
/dev/sda        # 第一块SCSI硬盘
/dev/sda1       # 第一块硬盘的第一个分区
/dev/sdb        # 第二块SCSI硬盘

# 查看块设备
lsblk

# 输出示例:
# NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
# sda      8:0    0   100G  0 disk
# ├─sda1   8:1    0    50G  0 part /
# └─sda2   8:2    0    50G  0 part /home

2.5.2 字符设备

字符设备:以字符为单位读写数据的设备。

# 终端设备
/dev/tty        # 当前终端
/dev/tty1       # 虚拟终端1
/dev/pts/0      # 伪终端

# 查看字符设备
ls -l /dev/tty
# 输出:crw-rw-rw- 1 root tty 5, 0 Jan 1 10:00 /dev/tty

三、文件权限

3.1 权限基础

3.1.1 权限分类

Linux文件权限分为三类

权限 文件 目录
读(r) 查看文件内容 列出目录内容
写(w) 修改文件内容 创建/删除文件
执行(x) 执行文件 进入目录

3.1.2 权限表示

符号表示法

-rwxr-xr--
│└┬┘└┬┘└┬┘
│ │  │  └─ 其他用户权限(r--)
│ │  └──── 组权限(r-x)
│ └─────── 所有者权限(rwx)
└───────── 文件类型(-)

数字表示法

权限 数字 二进制
--- 0 000
--x 1 001
-w- 2 010
-wx 3 011
r-- 4 100
r-x 5 101
rw- 6 110
rwx 7 111

示例

-rwxr-xr--  =  754
-rw-r--r--  =  644
drwxr-xr-x  =  755

3.2 权限管理

3.2.1 chmod命令

符号模式

# 语法
chmod [ugoa][+-=][rwx] 文件

# 参数说明
u  # 所有者(user)
g  # 组(group)
o  # 其他用户(other)
a  # 所有人(all)

+  # 添加权限
-  # 移除权限
=  # 设置权限

# 示例
chmod u+x script.sh        # 给所有者添加执行权限
chmod g-w file.txt         # 移除组的写权限
chmod o=r file.txt         # 设置其他用户只读权限
chmod a+x script.sh        # 给所有人添加执行权限
chmod u=rwx,g=rx,o=r file  # 设置完整权限

数字模式

# 语法
chmod 数字 文件

# 示例
chmod 755 script.sh    # rwxr-xr-x
chmod 644 file.txt     # rw-r--r--
chmod 700 dir/         # rwx------
chmod 777 public/      # rwxrwxrwx(不推荐)

递归修改

# 递归修改目录及其子目录
chmod -R 755 /var/www/html/

东巴文最佳实践

  • 目录权限:755(rwxr-xr-x)
  • 文件权限:644(rw-r--r--)
  • 脚本权限:755(rwxr-xr-x)
  • 私密文件:600(rw-------)

3.2.2 chown命令

修改文件所有者

# 语法
chown 用户:组 文件

# 示例
chown dbw file.txt          # 修改所有者
chown dbw:dbw file.txt      # 修改所有者和组
chown :dbw file.txt         # 只修改组

# 递归修改
chown -R dbw:dbw /var/www/html/

3.2.3 chgrp命令

修改文件所属组

# 语法
chgrp 组 文件

# 示例
chgrp dbw file.txt

# 递归修改
chgrp -R dbw /var/www/html/

3.3 特殊权限

3.3.1 SUID

SUID(Set User ID):执行时以文件所有者身份运行。

# 设置SUID
chmod u+s /usr/bin/passwd

# 查看SUID
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root ... /usr/bin/passwd
#       ↑ s表示SUID

# 示例:普通用户修改密码
# passwd命令以root身份运行,可以修改/etc/shadow

东巴文提示:SUID权限有安全风险,谨慎使用。

3.3.2 SGID

SGID(Set Group ID)

  • 文件:执行时以文件所属组身份运行
  • 目录:新建文件继承目录的组
# 设置SGID
chmod g+s /shared/

# 查看SGID
ls -ld /shared/
# 输出:drwxrwsr-x 2 root dbw ... /shared/
#                   ↑ s表示SGID

# 在SGID目录下创建的文件自动继承目录的组
cd /shared/
touch file.txt
ls -l file.txt
# 输出:-rw-r--r-- 1 dbw dbw ... file.txt
#                   ↑ 组为dbw,继承自目录

3.3.3 粘滞位

粘滞位(Sticky Bit):目录中的文件只能由所有者删除。

# 设置粘滞位
chmod +t /tmp/

# 查看粘滞位
ls -ld /tmp/
# 输出:drwxrwxrwt 15 root root ... /tmp/
#                   ↑ t表示粘滞位

# 示例:/tmp目录
# 所有用户可写,但只能删除自己的文件

东巴文提示:粘滞位常用于公共目录,如/tmp。


四、文件系统挂载

4.1 挂载概念

4.1.1 什么是挂载

挂载:将文件系统连接到目录树的过程。

挂载前:
/ (根文件系统)
├── bin/
├── etc/
└── home/

挂载后(将/dev/sdb1挂载到/mnt/usb):
/ (根文件系统)
├── bin/
├── etc/
├── home/
└── mnt/
    └── usb/  ← /dev/sdb1的内容

东巴文比喻:挂载就像给硬盘分区分配一个"门牌号"(挂载点),通过这个门牌号才能访问分区内容。

4.1.2 挂载点

挂载点:目录树中用于挂载文件系统的目录。

# 常见挂载点
/              # 根文件系统
/home          # 用户主目录
/var           # 可变数据
/tmp           # 临时文件
/boot          # 启动文件
/mnt           # 临时挂载点
/media         # 可移动设备挂载点

4.2 mount命令

4.2.1 挂载文件系统

基本语法

mount 设备 挂载点

挂载U盘

# 查看设备
lsblk

# 创建挂载点
sudo mkdir -p /mnt/usb

# 挂载U盘
sudo mount /dev/sdb1 /mnt/usb

# 访问U盘
cd /mnt/usb
ls

挂载ISO文件

# 挂载ISO文件
sudo mount -o loop ubuntu-20.04.iso /mnt/iso

挂载网络共享

# 挂载NFS共享
sudo mount -t nfs 192.168.1.100:/share /mnt/nfs

# 挂载Windows共享
sudo mount -t cifs //192.168.1.100/share /mnt/smb -o username=user,password=pass

4.2.2 查看挂载信息

# 查看所有挂载
mount

# 查看特定设备
mount | grep sdb1

# 查看挂载点
df -h

# 输出示例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   20G   30G  40% /
# /dev/sda2        50G   10G   40G  20% /home

4.2.3 卸载文件系统

# 基本语法
umount 挂载点
# 或
umount 设备

# 示例
sudo umount /mnt/usb
sudo umount /dev/sdb1

# 强制卸载(设备忙时)
sudo umount -l /mnt/usb

东巴文提示:卸载前确保没有进程在使用挂载点,否则会失败。

4.3 自动挂载(/etc/fstab)

4.3.1 fstab文件格式

/etc/fstab文件:定义开机自动挂载的文件系统。

设备    挂载点    文件系统类型    挂载选项    dump    fsck

示例

# /etc/fstab
# <file system>  <mount point>  <type>  <options>  <dump>  <pass>

# 根文件系统
/dev/sda1        /              ext4    errors=remount-ro  0       1

# 用户主目录
/dev/sda2        /home          ext4    defaults          0       2

# 交换分区
/dev/sda3        none           swap    sw                0       0

# 光驱
/dev/cdrom       /media/cdrom   udf,iso9660 user,noauto  0       0

# 网络共享
//192.168.1.100/share  /mnt/smb  cifs  credentials=/etc/smbpasswd  0  0

4.3.2 挂载选项

常用挂载选项

选项 说明
defaults 默认选项(rw, suid, dev, exec, auto, nouser, async)
ro 只读挂载
rw 读写挂载
noexec 不允许执行程序
nosuid 不允许SUID
noauto 不自动挂载
user 允许普通用户挂载
users 允许所有用户挂载和卸载

4.3.3 编辑fstab

# 编辑fstab文件
sudo vim /etc/fstab

# 添加新挂载
/dev/sdb1    /mnt/data    ext4    defaults    0    2

# 测试挂载
sudo mount -a

# 验证
df -h

东巴文警告:fstab配置错误可能导致系统无法启动,修改前务必备份!


五、磁盘空间管理

5.1 查看磁盘空间

5.1.1 df命令

查看文件系统磁盘空间使用情况

# 基本用法
df

# 人类可读格式
df -h

# 输出示例:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   20G   30G  40% /
# tmpfs           2.0G     0  2.0G   0% /dev/shm
# /dev/sda2        50G   10G   40G  20% /home

# 查看inode使用情况
df -i

# 查看特定文件系统类型
df -t ext4

5.1.2 du命令

查看目录或文件磁盘使用情况

# 查看当前目录大小
du

# 人类可读格式
du -h

# 查看目录总大小
du -sh

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

# 输出示例:
# 4.0K    ./dir1
# 8.0K    ./dir2
# 12K     .

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

# 查看指定目录
du -sh /var/log

5.2 磁盘配额

5.2.1 启用配额

安装配额工具

# Ubuntu/Debian
sudo apt install quota

# CentOS/RHEL
sudo yum install quota

编辑fstab启用配额

# 编辑fstab
sudo vim /etc/fstab

# 添加配额选项
/dev/sda2    /home    ext4    defaults,usrquota,grpquota    0    2

# 重新挂载
sudo mount -o remount /home

5.2.2 设置配额

# 创建配额文件
sudo quotacheck -cug /home

# 启用配额
sudo quotaon /home

# 设置用户配额
sudo edquota -u dbw

# 设置组配额
sudo edquota -g dbw

# 查看配额
quota -u dbw
repquota /home

5.3 磁盘清理

5.3.1 清理软件包缓存

# Ubuntu/Debian
sudo apt clean          # 清理软件包缓存
sudo apt autoclean      # 清理过期的软件包缓存
sudo apt autoremove     # 删除不需要的依赖包

# CentOS/RHEL
sudo yum clean all      # 清理所有缓存

5.3.2 清理日志文件

# 查看日志大小
du -sh /var/log/*

# 清空日志文件(保留文件)
sudo truncate -s 0 /var/log/syslog

# 删除旧日志
sudo find /var/log -type f -name "*.log.*" -mtime +30 -delete

# 使用logrotate自动管理日志
sudo logrotate -f /etc/logrotate.conf

5.3.3 查找大文件

# 查找大于100MB的文件
find / -type f -size +100M

# 查找最大的10个文件
find / -type f -exec du -h {} + | sort -rh | head -10

# 查找特定目录下的大文件
find /var -type f -size +50M

东巴文最佳实践:定期清理磁盘空间,避免磁盘满导致系统异常。


六、本章小结

6.1 核心要点

✅ Linux文件系统是树形结构,根目录为/ ✅ 理解重要目录的作用:/etc、/home、/var、/usr ✅ 掌握文件类型和权限管理 ✅ 学会挂载和卸载文件系统 ✅ 定期检查磁盘空间使用情况

6.2 验证清单

完成本章学习后,请确认您能够:

  • 理解Linux文件系统的层次结构
  • 区分绝对路径和相对路径
  • 识别不同类型的文件
  • 使用chmod、chown管理权限
  • 挂载和卸载文件系统
  • 查看磁盘空间使用情况

东巴文(db-w.cn) - 让Linux学习更简单