学习目标
- 理解本节涉及的核心主题:Linux 文件系统、Linux 文件系统权限、文件的读、写、执行权限、设置文件权限和所有者。
- 掌握重点命令或工具:
mount、umount。 - 能够结合示例完成常见操作,并理解关键参数、使用场景与结果差异。
- 能够识别本节相关的常见风险、易错点或排查思路。
学习重点
- 主题范围:Linux 文件系统、Linux 文件系统权限、文件的读、写、执行权限、设置文件权限和所有者、管理特殊权限(SUID, SGID, Sticky Bit)、管理挂载点与文件系统类型
- 重点命令:
mount、umount - 学习重点:命令用途、关键参数、典型场景、与相近命令的区别
- 复习方式:先理解场景,再动手练习,最后对照结果检查
Linux 文件系统
Linux 文件系统权限
文件系统权限是 Linux 安全模型的核心部分,通过控制用户对文件和目录的访问权限,确保系统的安全性和稳定性。权限分为读、写、执行三种类型,并针对文件的所有者、所属组和其他用户进行设置。
文件的读、写、执行权限
权限分类:所有者(u)、所属组(g)、其他用户(o)
Linux 文件系统为每个文件和目录分配权限,这些权限决定了谁可以对其执行哪些操作。权限分为三类:
- 所有者(u,user):文件或目录的创建者,通常拥有最高权限。
- 所属组(g,group):文件或目录所属的用户组,组内成员共享相同的权限。
- 其他用户(o,others):系统中除所有者和所属组成员以外的所有用户。
权限的表示与解释(如 rwxr-xr--)
文件权限通常以十个字符的形式显示,其中:
- 第一个字符
:表示文件类型。-:普通文件。d:目录。l:符号链接。- 其他字符表示不同类型的文件。
- 接下来的九个字符
:分为三组,每组三个字符,分别表示所有者、所属组和其他用户的权限。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 具有读、执行权限,其他用户具有只读权限。
步骤:
- 设置所有者和所属组:
sudo chown -R alice:developers /home/alice/Projects/project_alpha - 设置权限:
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)权限位具有双重作用:
- 对于文件:当设置了 SGID 的可执行文件被执行时,进程的有效组 ID 将被设置为文件所属组的组 ID。
- 对于目录:新创建的文件或子目录将继承该目录的组,而不是创建者的主组。这有助于团队协作,确保所有文件属于统一的组。
表示方式: 在所属组执行权限位上添加 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 后,所有在该目录下创建的文件和子目录将自动继承该目录的所属组。这简化了团队合作,确保所有成员创建的文件都属于同一组。
示例操作:
- 设置 SGID 权限:
chmod g+s /home/alice/Projects/project_alpha - 创建新文件:
touch /home/alice/Projects/project_alpha/newfile.txt - 查看新文件的所属组:
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 后,用户只能删除或修改自己创建的临时文件,防止其他用户误删或恶意删除文件。
示例操作:
- 设置 Sticky Bit:
chmod +t /tmp - 查看
/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.
解决方法:
- 查找占用文件系统的进程:
lsof /mnt/usb - 终止相关进程或关闭文件:
假设发现进程1234正在使用/mnt/usb/file.txt,可以终止该进程:sudo kill 1234 - 重新尝试卸载:
sudo umount /mnt/usb
常见错误与解决方法(如「文件系统忙」)
- 错误提示:「文件系统忙」
原因: 有进程正在使用挂载点中的文件或目录。
解决方法:-
使用
lsof或fuser查找占用进程。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) 展开。
- 需要重点掌握的命令或工具包括:
mount、umount。 - 学习时应优先抓住「命令解决什么问题、在什么场景下使用、执行后会产生什么结果」。
- 对涉及权限、覆盖、网络、系统服务、删除或安全配置的操作,建议先在测试环境练习。
复习建议
- 先用自己的话复述本节每个主题或命令的作用,避免只记参数不懂用途。
- 按原文示例至少手敲一遍典型命令,并观察输出变化。
- 对高风险操作先确认路径、权限和目标对象,再执行实际命令。
- 可优先复习这些高频命令:
mount、umount。