学习目标

  • 理解本节涉及的核心主题:Linux 文件系统、Linux 文件系统权限、文件的读、写、执行权限、设置文件权限和所有者。
  • 掌握重点命令或工具:mountumount
  • 能够结合示例完成常见操作,并理解关键参数、使用场景与结果差异。
  • 能够识别本节相关的常见风险、易错点或排查思路。

学习重点

  • 主题范围:Linux 文件系统、Linux 文件系统权限、文件的读、写、执行权限、设置文件权限和所有者、管理特殊权限(SUID, SGID, Sticky Bit)、管理挂载点与文件系统类型
  • 重点命令:mountumount
  • 学习重点:命令用途、关键参数、典型场景、与相近命令的区别
  • 复习方式:先理解场景,再动手练习,最后对照结果检查

Linux 文件系统

Linux 文件系统权限

文件系统权限是 Linux 安全模型的核心部分,通过控制用户对文件和目录的访问权限,确保系统的安全性和稳定性。权限分为读、写、执行三种类型,并针对文件的所有者、所属组和其他用户进行设置。

文件的读、写、执行权限

权限分类:所有者(u)、所属组(g)、其他用户(o)

Linux 文件系统为每个文件和目录分配权限,这些权限决定了谁可以对其执行哪些操作。权限分为三类:

  • 所有者(u,user):文件或目录的创建者,通常拥有最高权限。
  • 所属组(g,group):文件或目录所属的用户组,组内成员共享相同的权限。
  • 其他用户(o,others):系统中除所有者和所属组成员以外的所有用户。
权限的表示与解释(如 rwxr-xr--

文件权限通常以十个字符的形式显示,其中:

  1. 第一个字符
    :表示文件类型。
    • -:普通文件。
    • d:目录。
    • l:符号链接。
    • 其他字符表示不同类型的文件。
  2. 接下来的九个字符
    :分为三组,每组三个字符,分别表示所有者、所属组和其他用户的权限。
    • r:读权限。
    • w:写权限。
    • x:执行权限。
    • -:无权限。

示例:-rwxr-xr--

  • -:普通文件。
  • rwx:所有者具有读、写、执行权限。
  • r-x:所属组具有读、执行权限。
  • r--:其他用户具有读权限。
权限修改的基本原则
  • 最小权限原则:仅授予用户执行其任务所需的最小权限,减少潜在的安全风险。
  • 继承权限:新创建的文件和目录通常继承其父目录的权限。
  • 合理分组:将用户合理分组,并为组分配适当的权限,以简化权限管理。

设置文件权限和所有者

通过命令行工具,可以修改文件和目录的权限、所有者和所属组,以满足不同的访问需求。

使用 chmod 修改权限

chmod(change mode 的缩写)命令用于修改文件或目录的权限。

基本语法:

chmod [选项] 权限 文件/目录

示例:为文件 main.py 设置所有者具有读、写、执行权限,所属组和其他用户具有读、执行权限。

chmod 755 main.py

解释:

  • 7:所有者权限,rwx(4+2+1)。
  • 5:所属组权限,r-x(4+0+1)。
  • 5:其他用户权限,r-x(4+0+1)。

数字模式与符号模式:

  • 数字模式
    :使用三位八进制数表示权限。
    • 读(r)= 4,写(w)= 2,执行(x)= 1。
    • 权限值通过相加得到,例如 rwx = 4+2+1 = 7。
  • 符号模式
    :使用字符来添加、移除或设置权限。
    • u:所有者,g:所属组,o:其他用户,a:所有用户。
    • 操作符:+(添加),-(移除),=(设置)。

符号模式示例:

  • 为所有者添加执行权限:
    chmod u+x main.py
    
  • 移除所属组和其他用户的写权限:
    chmod go-w main.py
    
  • 设置所有用户仅有读权限:
    chmod a=r main.py
    
使用 chown 修改所有者

chown(change owner 的缩写)命令用于更改文件或目录的所有者和所属组。

基本语法:

chown [选项] 新所有者 文件/目录

示例:将文件 app.js 的所有者更改为 bob

chown bob app.js

同时更改所有者和所属组:

chown alice:developers app.js

解释:

  • alice:新所有者。
  • developers:新所属组。
使用 chgrp 修改所属组

chgrp(change group 的缩写)命令专门用于更改文件或目录的所属组。

基本语法:

chgrp [选项] 新组 文件/目录

示例:将文件 utils.py 的所属组更改为 staff

chgrp staff utils.py
组合使用命令实例

示例:为项目目录设置合适的权限和所有者

假设有一个项目目录 /home/alice/Projects/project_alpha,希望所有者 alice 具有完全权限,所属组 developers 具有读、执行权限,其他用户具有只读权限。

步骤:

  1. 设置所有者和所属组:
    sudo chown -R alice:developers /home/alice/Projects/project_alpha
    
  2. 设置权限:
    chmod -R 755 /home/alice/Projects/project_alpha
    

解释:

  • -R:递归修改目录及其子目录和文件。
  • 755:所有者 rwx,所属组 r-x,其他用户 r-x

管理特殊权限(SUID, SGID, Sticky Bit)

特殊权限在文件权限中添加了额外的功能,用于特定场景,增强系统安全性和功能性。

SUID(Set User ID)
定义与作用

SUID(Set User ID)权限位用于当设置了 SUID 的可执行文件被执行时,进程的有效用户 ID 将被设置为文件所有者的用户 ID,而不是执行者的用户 ID。这通常用于需要临时提升权限的程序。

表示方式: 在所有者执行权限位上添加 s,如 rwsr-xr-x

设置与撤销(chmod u+s

设置 SUID 权限:

chmod u+s /usr/bin/passwd

撤销 SUID 权限:

chmod u-s /usr/bin/passwd
应用场景与安全性

应用场景:

  • passwd:修改用户密码需要写入 /etc/shadow 文件,普通用户没有直接写权限。设置 SUID 后,passwd 程序以 root 权限运行,允许用户修改密码。

安全性注意事项:

  • 不当使用 SUID 可能导致安全漏洞,攻击者可能利用具有 SUID 的程序获取高权限。
  • 仅对信任的可执行文件设置 SUID。

示例操作:

查看文件是否具有 SUID 权限:

ls -l /usr/bin/passwd

输出示例:

-rwsr-xr-x 1 root root 54256 Apr 27 09:00 /usr/bin/passwd
SGID(Set Group ID)
定义与作用

SGID(Set Group ID)权限位具有双重作用:

  1. 对于文件:当设置了 SGID 的可执行文件被执行时,进程的有效组 ID 将被设置为文件所属组的组 ID。
  2. 对于目录:新创建的文件或子目录将继承该目录的组,而不是创建者的主组。这有助于团队协作,确保所有文件属于统一的组。

表示方式: 在所属组执行权限位上添加 s,如 rwxr-sr-x

设置与撤销(chmod g+s

设置 SGID 权限:

chmod g+s /home/alice/Projects/project_alpha

撤销 SGID 权限:

chmod g-s /home/alice/Projects/project_alpha
目录的 SGID 行为

设置 SGID 后,所有在该目录下创建的文件和子目录将自动继承该目录的所属组。这简化了团队合作,确保所有成员创建的文件都属于同一组。

示例操作:

  1. 设置 SGID 权限:
    chmod g+s /home/alice/Projects/project_alpha
    
  2. 创建新文件:
    touch /home/alice/Projects/project_alpha/newfile.txt
    
  3. 查看新文件的所属组:
    ls -l /home/alice/Projects/project_alpha/newfile.txt
    

输出示例:

-rw-r--r-- 1 alice developers 0 Apr 27 10:30 /home/alice/Projects/project_alpha/newfile.txt

解释:

新文件 newfile.txt 的所属组为 developers,继承自父目录的所属组。

Sticky Bit
定义与作用

Sticky Bit 是一种特殊权限,主要用于目录,防止用户删除或重命名目录中其他用户的文件。即使用户拥有写权限,也只能删除或重命名自己创建的文件。常见于公共目录,如 /tmp

表示方式: 在其他用户执行权限位上添加 t,如 rwxr-xr-t

设置与撤销(chmod +t

设置 Sticky Bit:

chmod +t /tmp

撤销 Sticky Bit:

chmod -t /tmp
常见应用场景(如 /tmp 目录)

/tmp 目录是系统和用户存放临时文件的地方,通常对所有用户开放写权限。设置 Sticky Bit 后,用户只能删除或修改自己创建的临时文件,防止其他用户误删或恶意删除文件。

示例操作:

  1. 设置 Sticky Bit:
    chmod +t /tmp
    
  2. 查看 /tmp 目录权限:
    ls -ld /tmp
    

输出示例:

drwxrwxrwt 10 root root 4096 Apr 27 10:40 /tmp

解释:

  • drwxrwxrwt:目录(d),所有者、所属组和其他用户具有读、写、执行权限,且 Sticky Bit 设置(t)。

注意事项:

  • 仅适用于需要共享访问的目录,避免在不必要的目录设置 Sticky Bit。
  • 保证目录中的文件权限合理,防止权限泄露。

管理挂载点与文件系统类型

挂载点是文件系统被集成到 Linux 文件系统层次结构中的位置。不同类型的文件系统适用于不同的存储需求和使用场景。了解常见的文件系统类型及其挂载选项,有助于优化系统性能和存储管理。

常见文件系统类型

  • ext4:目前 Linux 系统中最常用的文件系统,具有良好的性能和稳定性。
  • xfs:高性能的日志文件系统,适用于大文件和高并发的应用场景。
  • btrfs:现代化的文件系统,支持快照、压缩和高级数据管理功能。
  • ntfs:Windows 操作系统的主要文件系统,Linux 可以通过 ntfs-3g 驱动支持读写。
  • vfat:FAT32 文件系统的变种,常用于可移动媒体设备,如 USB 驱动器。
挂载选项与性能优化

挂载文件系统时,可以使用多种选项来优化性能和行为。例如:

  • 只读挂载(ro:将文件系统以只读方式挂载,防止写入操作。
  • 读写挂载(rw:将文件系统以读写方式挂载,允许写入操作。
  • 自动挂载(auto:在系统启动时自动挂载文件系统。
  • 延迟写入(async:提高写入性能,但可能导致数据丢失风险。
  • 同步写入(sync:提高数据安全性,但可能降低性能。

示例:以只读方式挂载 data.iso/mnt/iso

sudo mount -o ro,data.iso /mnt/iso
查看已挂载文件系统(df -T, mount 命令)

使用 df -T 查看文件系统类型和使用情况:

df -T

输出示例:

Filesystem     Type     1K-blocks    Used Available Use% Mounted on
/dev/sda1      ext4      20480000 1024000  18496000   5% /
/dev/sda2      ext4      10240000 512000   9728000   5% /home
tmpfs          tmpfs        409600       0    409600   0% /run

使用 mount 查看所有已挂载文件系统:

mount

输出示例:

/dev/sda1 on / type ext4 (rw,relatime,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=16384256k,nr_inodes=4096064,mode=755)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=409600k,mode=755)
/dev/sda2 on /home type ext4 (rw,relatime,data=ordered)

挂载与卸载文件系统

挂载(Mount)和卸载(Unmount)文件系统是 Linux 系统管理中的基本操作,涉及将存储设备集成到文件系统层次结构中,或将其从系统中移除。

mount - 挂载文件系统

基本用法

mount 命令用于将文件系统挂载到指定的挂载点,使其内容可以在文件系统树中访问。

命令语法:

mount [选项] 设备 挂载点

示例:将 USB 驱动器 /dev/sdb1 挂载到 /mnt/usb

sudo mount /dev/sdb1 /mnt/usb

解释:

  • /dev/sdb1:设备文件,表示 USB 驱动器的第一个分区。
  • /mnt/usb:挂载点,目录必须存在且为空。

输出:

挂载成功后,设备内容可以在 /mnt/usb 访问,无输出表示成功。

指定挂载点与文件系统类型(-t 选项)

有时需要明确指定文件系统类型,以确保正确挂载。

示例:以 vfat 文件系统类型挂载 USB 驱动器

sudo mount -t vfat /dev/sdb1 /mnt/usb

解释:

  • -t vfat:指定文件系统类型为 vfat
挂载选项(-o 选项,如只读 ro

通过 -o 选项,可以指定各种挂载选项以调整文件系统的行为。

常见挂载选项:

  • ro:只读挂载。
  • rw:读写挂载(默认)。
  • noexec:禁止执行文件。
  • nosuid:忽略 SUID 和 SGID 位。
  • user:允许普通用户挂载设备。

示例:以只读方式挂载 data.iso/mnt/iso

sudo mount -o ro,data.iso /mnt/iso
自动挂载与临时挂载的区别
  • 自动挂载:通过 /etc/fstab 文件配置,系统启动时自动挂载。
  • 临时挂载:手动使用 mount 命令挂载,仅在当前会话有效。

示例:临时挂载 NFS 共享

sudo mount -t nfs server:/export/data /mnt/data

umount - 卸载文件系统

基本用法

umount 命令用于卸载之前挂载的文件系统,使其不再可访问。

命令语法:

umount [选项] 挂载点/设备

示例:卸载 USB 驱动器

sudo umount /mnt/usb

解释:

  • /mnt/usb:挂载点,表示要卸载的文件系统。
卸载前的准备工作(关闭相关文件与进程)

在卸载文件系统之前,必须确保没有任何进程正在使用该文件系统中的文件或目录。否则,系统会提示「文件系统忙」。

示例:尝试卸载被占用的文件系统

sudo umount /mnt/usb

输出示例:

umount: /mnt/usb: target is busy.

解决方法:

  1. 查找占用文件系统的进程:
    lsof /mnt/usb
    
  2. 终止相关进程或关闭文件:
    假设发现进程 1234 正在使用 /mnt/usb/file.txt,可以终止该进程:
    sudo kill 1234
    
  3. 重新尝试卸载:
    sudo umount /mnt/usb
    
常见错误与解决方法(如「文件系统忙」)
  • 错误提示:「文件系统忙」
    原因: 有进程正在使用挂载点中的文件或目录。
    解决方法:
    • 使用 lsoffuser 查找占用进程。

      lsof /mnt/usb
      

      sudo fuser -m /mnt/usb
      
    • 终止占用进程:

      sudo kill <PID>
      
    • 强制卸载(不推荐,可能导致数据丢失):

      sudo umount -f /mnt/usb
      

管理挂载点与文件系统类型

常见文件系统类型(如 ext4, xfs, btrfs, ntfs, vfat)

不同的文件系统类型具有不同的特点和适用场景。选择合适的文件系统类型可以优化性能和可靠性。

常见文件系统类型简介:

  • ext4:默认文件系统,性能稳定,适用于大多数场景。
  • xfs:高性能文件系统,适用于需要高并发和大文件的应用。
  • btrfs:支持快照、压缩和自我修复功能,适用于需要高级数据管理的场景。
  • ntfs:Windows 系统的主要文件系统,Linux 通过 ntfs-3g 支持读写。
  • vfat:适用于可移动媒体设备,兼容性好。
挂载选项与性能优化

通过挂载选项,可以根据需求优化文件系统的性能和行为。

常用挂载选项:

  • noatime:不更新文件访问时间,减少磁盘写入。
  • async:异步写入,提高写入性能。
  • sync:同步写入,提高数据安全性。
  • compress(针对 btrfs):启用文件压缩。
  • defaults:使用默认挂载选项。

示例:以 ext4 文件系统挂载时启用 noatime 选项

sudo mount -o noatime /dev/sda1 /mnt/data
查看已挂载文件系统(df -T, mount 命令)

使用 df -T 查看文件系统类型和使用情况:

df -T

输出示例:

Filesystem     Type     1K-blocks    Used Available Use% Mounted on
/dev/sda1      ext4      20480000 1024000  18496000   5% /
/dev/sda2      ext4      10240000 512000   9728000   5% /home
tmpfs          tmpfs        409600       0    409600   0% /run

使用 mount 查看所有已挂载文件系统:

mount

输出示例:

/dev/sda1 on / type ext4 (rw,relatime,noatime,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=16384256k,nr_inodes=4096064,mode=755)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=409600k,mode=755)
示例操作

示例 1:挂载 data.iso 为只读

sudo mount -o ro -t iso9660 /dev/cdrom /mnt/iso

解释:

  • -o ro:以只读方式挂载。
  • -t iso9660:指定文件系统类型为 ISO 9660。
  • /dev/cdrom:设备文件。
  • /mnt/iso:挂载点。

示例 2:挂载 NFS 共享

sudo mount -t nfs server:/export/data /mnt/data

解释:

  • -t nfs:指定文件系统类型为 NFS。
  • server:/export/data:NFS 服务器上的共享路径。
  • /mnt/data:挂载点。

示例 3:挂载 Windows 分区(NTFS)

sudo mount -t ntfs-3g /dev/sdb1 /mnt/windows

解释:

  • -t ntfs-3g:指定文件系统类型为 NTFS,并使用 ntfs-3g 驱动支持读写。
  • /dev/sdb1:设备文件。
  • /mnt/windows:挂载点。

本节总结

  • 本节主要围绕 Linux 文件系统、Linux 文件系统权限、文件的读、写、执行权限、设置文件权限和所有者、管理特殊权限(SUID, SGID, Sticky Bit) 展开。
  • 需要重点掌握的命令或工具包括:mountumount
  • 学习时应优先抓住「命令解决什么问题、在什么场景下使用、执行后会产生什么结果」。
  • 对涉及权限、覆盖、网络、系统服务、删除或安全配置的操作,建议先在测试环境练习。

复习建议

  • 先用自己的话复述本节每个主题或命令的作用,避免只记参数不懂用途。
  • 按原文示例至少手敲一遍典型命令,并观察输出变化。
  • 对高风险操作先确认路径、权限和目标对象,再执行实际命令。
  • 可优先复习这些高频命令:mountumount