跳到主要内容

Linux 文件系统

文件系统是一种用于存储和组织计算机数据的机制,它使用文件和树形目录的抽象逻辑概念来代替硬盘和光盘等物理设备使用数据块的概念。文件系统的设计使得对数据的访问和查找变得容易,用户不必关心数据实际保存在硬盘或光盘的哪个地址,只需要记住文件所属的目录和文件名。文件系统自动完成硬盘上的存储空间管理(分配和释放),用户只需要记住数据被写入到哪个文件中。

常见的文件系统列表如下:

  • 文件配置表(File Allocation Table,FAT)系列:FAT12、FAT16、FAT32、exFAT
  • 新技术文件系统(New Technology File System,NTFS)
  • 分层文件系统(Hierarchical File System,HFS)和HFS Plus
  • 延伸文件系统(Extended File System,ext)系列:ext1、ext2、ext3、ext4
  • 旧式数据系统(Old Data System,ODS)
  • Btrfs(B-tree文件系统)
  • XFS(SGI的高性能日志文件系统)
  • UFS(Unix文件系统)
  • ZFS(Zettabyte文件系统)

在文件系统中,文件名是用于定位存储位置。大多数的文件系统对文件名的长度有限制。文件名可以是大小写不敏感的,也可以是大小写敏感的。现今的文件系统允许文件名包含非常多的 Unicode 字符集的字符,但某些特殊字符在文件名中受限。方便起见,一般不建议在文件名中包含特殊字符。

文件系统还维护元数据(Metadata),包括文件长度、最后修改时间、文件设备类型、文件所有者和访问权限等信息。有些文件系统还保存文件的创建时间、最后访问时间及属性修改时间。元数据还可以包括文件设备类型、字符集、套接口、子目录等信息。

文件系统可以通过访问控制列表或 capabilities 实现安全访问,但访问控制列表难以保证安全,因此研发中的文件系统倾向于使用 capabilities。然而目前多数商业性的文件系统仍然使用访问控制列表。

文件系统可以使用硬盘、光盘等物理设备存储数据,也可以通过网络协议提供数据,甚至可能根本没有对应的文件。严格来说,文件系统是一种实现数据的存储、分级组织、访问和获取等操作的抽象数据类型。

文件系统

在 Linux 系统中支持多种文件系统,如:Ext2、Ext3、Ext4、XFS、Btrfs、NTFS、FAT32、ISO 9660、NFS 等。

系统全拼功能优点用途
Ext2Second Extended File System提供基本的文件存储功能简单,速度较快,可靠性高适用于小型存储设备,如闪存卡
Ext3Third Extended File System在Ext2基础上增加了日志功能文件系统可靠性更高,具有较好的容错能力适用于大多数Linux发行版,以及需要可靠数据存储的服务器环境
Ext4Fourth Extended File System在Ext3基础上增加了更多的特性,如更大的文件系统和更高的性能支持大容量文件和高性能文件系统访问适用于大型服务器和高性能计算机
XFSXFS File System高性能文件系统,支持大容量文件和高吞吐量应用速度快,可靠性高,适合高性能计算和大型存储设备适用于需要大容量和高性能访问的服务器环境
BtrfsB-tree File System先进的文件系统,支持快照、数据压缩和多个设备的联合文件系统等功能可靠性高,能够在多个设备之间提供容错性适用于需要高效数据管理和可靠存储的服务器和桌面环境
NTFSNew Technology File SystemWindows操作系统上的文件系统,支持文件和目录的权限控制和加密等功能可以处理很大的文件系统,能够在Windows和Linux之间进行数据传输适用于需要与Windows系统交互的Linux系统
FAT32File Allocation Table 32-bit一种老旧的文件系统,支持大容量的存储设备可以在不同的操作系统之间进行数据传输,通常用于移动设备和便携式存储介质上适用于小型存储设备,如USB闪存盘和SD卡
ISO 9660International Standard Organization 9660用于光盘文件系统支持只读访问,可以在不同的操作系统之间进行数据传输适用于在CD和DVD上发布数据的场景
NFSNetwork File System一种网络文件系统,可以让不同的机器上的用户共享文件系统能够在不同的计算机之间共享文件和目录,提供高度的数据访问性能适用于需要在多个计算机之间共享文件的网络环

层次结构

在 Linux 系统中,文件系统采用了一种层次结构来组织文件和目录,这种层次结构称为文件系统层次结构(Filesystem Hierarchy Standard,FHS)。FHS 是一种标准化的文件系统层次结构,规定了在不同的 Linux 系统中应该如何组织文件和目录,以保证文件系统的一致性和兼容性。

目录名全拼功能用途
/Root根目录包含所有其他目录和文件的根目录
/binBinary存放系统二进制可执行文件包含最基本的系统命令
/bootBoot存放启动加载程序和内核包含启动Linux系统所必需的文件
/devDevice存放设备文件包含Linux系统中所有的设备文件,如硬盘、键盘、鼠标等
/etcEtcetera存放系统配置文件包含Linux系统中所有的系统配置文件,如网络配置文件、用户账号配置文件等
/homeHome存放用户家目录包含所有用户的家目录
/libLibrary存放系统共享库文件包含系统运行时所需要的一些库函数
/mediaMedia存放可移动介质挂载点包含可移动介质的挂载点,如U盘、光盘等
/mntMount存放挂载点包含文件系统挂载点,用于临时挂载其他文件系统
/optOptional存放第三方应用程序包含安装在系统中的第三方应用程序
/procProcess存放进程相关信息包含Linux系统中所有进程的相关信息
/rootRootroot用户家目录仅限root用户访问的家目录
/runRun存放运行时信息包含运行时所需要的各种信息,如进程号等
/sbinSystem Binary存放系统管理二进制可执行文件包含系统管理员使用的基本命令和系统管理工具
/srvService存放服务相关数据包含服务相关的数据,如Web服务的网站文件
/sysSystem存放系统设备文件包含系统中所有设备的相关信息
/tmpTemporary存放临时文件包含系统中各种临时文件
/usrUnix Shared Resources存放Unix共享资源包含系统中大多数应用程序、库文件和文档等
/varVariable存放经常变化的文件包含系统中经常变化的文件,如日志文件、数据库文件等

文件元数据

在 Linux 系统中,每个文件都有其对应的元信息,也称为元数据(metadata)。元数据包含了文件的基本属性,如文件的创建时间、访问时间、修改时间,文件大小,文件所有者和所属组,文件的权限等等。

以下是一些常见的文件元数据:

  • 文件名:文件的名字,用于标识文件。
  • 文件类型:表示文件的类型,如普通文件、目录、链接文件、字符设备、块设备等等。
  • 文件大小:表示文件的大小,以字节为单位。
  • 时间戳:记录了文件的创建时间、访问时间、修改时间等信息。
  • 文件权限:文件所有者、所属组、其他用户对文件的读、写、执行权限。
  • 文件所有者和所属组:表示文件的所有者和所属组。
  • 文件状态:如 inode 号码、硬链接数等。

在 Unix 和类 Unix 操作系统中 文件系统中,每个文件或目录都有一个inode号码,它是唯一的,由文件系统分配,文件名只是 inode 的别名而已。当我们打开一个文件时,实际上是根据该文件名找到对应的 inode,然后通过 inode 读取文件的数据。

index node (inode) 是 Unix 和类 Unix 操作系统中的一个重要概念,它是文件系统中用来存储文件或目录的元数据信息的一种数据结构,每个文件或目录都对应一个唯一的 inode。下面是一个示例 inode 表格:

文件类型inode号大小拥有者权限访问时间修改时间创建时间
普通文件123451KBroot6442022/3/12022/3/22022/3/1

物理设备文件

在 Linux 系统中,一切都是文件,包括硬件设备也不例外。这是因为在 Linux 中,硬件设备被抽象成了一种特殊的文件类型,称为设备文件(Device file)。设备文件用于对硬件设备进行读写操作,类似于普通文件的读写操作。设备文件分为两种类型:

  • 块设备文件:对应的硬件设备是以块为单位进行读写的设备,例如硬盘、U盘等;
  • 字符设备文件:对应的硬件设备是以字符为单位进行读写的设备,例如键盘、鼠标、打印机等。

在 Linux 系统中,每个设备文件都有一个对应的设备文件名,该文件名通常位于 /dev 目录下,不同的硬件设备会有不同的设备文件名。通过访问设备文件,用户可以对硬件设备进行操作。例如,如果想要读取硬盘的数据,用户可以通过访问对应的设备文件(如 /dev/sda)来读取数据,而不需要关心具体的物理硬盘是什么型号、连接方式等等。这种抽象的方式让用户更方便地使用硬件设备,并且使得操作系统能够更好地管理硬件设备。

硬件设备命名规则
IDE 接口硬盘/dev/hd[a-d]
SCSI、SATA、U盘/dev/sd[a-z]
KVM/QEMU 虚拟设备/dev/vd[a-z]
软盘/dev/fd[0-1]
打印机/dev/lp[0-15]
CD/DVD 光盘驱动器/dev/cdrom
鼠标设备/dev/mouse
SCSI 接口磁带机或 IDE 接口/dev/st0 或 /dev/ht0

管理和维护

目录操作

操作命令描述示例
查看ls列出目录内容ls -l /home
pwd显示当前工作目录pwd
tree以树形结构显示目录和文件tree /home/user
创建mkdir创建新目录mkdir /home/new_directory
复制cp复制目录或文件cp -R /source /destination
移动cd更改当前工作目录cd /home/user
pushd将当前目录压入栈,并切换到新目录pushd /home/new_directory
popd从栈中弹出目录并切换回去popd
删除rmdir删除空目录rmdir /home/empty_directory

文件操作

操作命令描述示例
查看file确定文件类型file file.txt
cat显示文件内容cat file.txt
more分页显示文件内容more file.txt
less可以向前和向后翻页显示文件内容less file.txt
head显示文件的开头部分head -n 5 file.txt
tail显示文件的末尾部分tail -n 5 file.txt
查找whereis查找可执行文件、源码和手册页whereis python3
which显示可执行文件的位置which python3
find搜索文件和目录find /home -name "file.txt"
创建touch创建空文件或更新文件时间戳touch new_file.txt
ln创建硬链接和符号链接ln -s source_file.txt link.txt
复制cp复制文件cp source_file.txt destination.txt
移动mv移动文件或目录mv source_file.txt destination.txt
删除rm删除文件或目录rm file.txt

文件处理

基础

命令描述示例
grep在文件中搜索字符串或正则表达式grep "pattern" file.txt
sed流编辑器,用于对文本文件进行基于行的编辑sed 's/foo/bar/g' input.txt > output.txt
diff比较文件差异diff file1.txt file2.txt
diff3比较三个文件差异diff3 file1.txt file2.txt file3.txt
md5sum计算文件的 MD5 校验和md5sum file.txt
awk文本处理工具,用于对文本进行模式扫描和处理awk '{ print $1 }' file.txt
sort对文件中的行进行排序sort file.txt
uniq去除文件中的重复行uniq file.txt
tr翻译或删除字符tr 'a-z' 'A-Z' < input.txt > output.txt
wc计算字节数、字符数、行数wc file.txt
cut从文件中移除一部分cut -f 1,3 -d ',' file.txt
paste横向连接文件paste file1.txt file2.txt

Nano

Nano 是一款基于命令行的文本编辑器,它是 Linux 中最常用的编辑器之一。以下是 Nano 的常用命令:

命令功能
Ctrl + G显示帮助文档
Ctrl + O保存文件
Ctrl + X退出Nano
Ctrl + K剪切当前行
Ctrl + U粘贴剪切的行
Ctrl + W查找文本
Ctrl + \替换文本
Ctrl + ↑移动到文本的上一屏
Ctrl + ↓移动到文本的下一屏
Ctrl + →移动到文本的下一单词
Ctrl + ←移动到文本的上一单词

下面是一些 Nano 编辑器的使用示例:

  1. 打开文件:

    Copy code
    nano filename.txt

    这将打开一个名为 “filename.txt” 的文件,并将其用 Nano 编辑器打开。

  2. 查找文本:

    您可以使用 Ctrl + W 来查找文本。输入您想要查找的文本,然后按 Enter 键。Nano 将跳转到文本中找到的第一个匹配项。

  3. 替换文本:

    您可以使用 Ctrl + \ 来替换文本。输入您想要替换的文本和替换文本,然后按 Enter 键。Nano 将替换文本中找到的第一个匹配项。

  4. 剪切和粘贴行:

    使用 Ctrl + K 剪切当前行,使用 Ctrl + U 粘贴剪切的行。

  5. 移动光标:

    使用 Ctrl + ↑Ctrl + ↓ 移动到文本的上一屏或下一屏;使用 Ctrl + →Ctrl + ← 移动到文本的下一单词或上一单词。

  6. 保存和退出:

    使用 Ctrl + O 保存文件,使用 Ctrl + X 退出Nano编辑器。

Vim

Vim 是一款文本编辑器,也是Linux中最常用的编辑器之一。Vim 支持多种编辑模式,包括命令模式、插入模式和可视模式。以下是 Vim 的常用命令:

命令功能
:w保存文件
:q退出Vim
:wq保存文件并退出Vim
i进入插入模式
Esc退出插入模式并返回命令模式
v进入可视模式
V进入行选择模式
y复制选中文本
p粘贴文本
/查找文本
:进入命令模式

下面是一些 Vim 编辑器的使用示例:

  1. 打开文件:

    Copy code
    vim filename.txt

    这将打开一个名为 “filename.txt” 的文件,并将其用 Vim 编辑器打开。

  2. 保存文件:

    在命令模式下输入 :w,然后按 Enter 键即可保存文件。

  3. 退出 Vim:

    在命令模式下输入 :q,然后按 Enter 键即可退出 Vim。

  4. 保存文件并退出 Vim:

    在命令模式下输入 :wq,然后按 Enter 键即可保存文件并退出 Vim。

  5. 插入文本:

    在命令模式下按下 i 进入插入模式,然后开始编辑文本。

  6. 复制和粘贴文本:

    进入可视模式(按下 v),选择要复制的文本,然后按下 y 复制选中文本。返回命令模式后,将光标移动到要粘贴文本的位置,按下 p 粘贴文本。

  7. 查找文本:

    在命令模式下输入 /,然后输入要查找的文本并按下 Enter 键。Vim 将跳转到文本中找到的第一个匹配项。

文件解压缩

Tar

Tar(磁带归档器,Tape Archive)是一种用于文件打包(归档)的 UNIX 和 Linux 系统上的实用程序。它能将多个文件和目录合并成一个单独的归档文件,便于文件的传输、备份和存储。需要注意的是,Tar 本身并不具备压缩功能,但它可以与其他压缩工具(如Gzip、Bzip2等)结合使用,以实现文件归档与压缩的需求。

优点
  1. 跨平台兼容性:Tar 是 UNIX 和 Linux 系统的标准工具,但在其他操作系统(如 Windows、macOS 等)上也有实现,因此具有较强的跨平台兼容性。
  2. 保留文件属性:Tar 可以在归档过程中保留文件和目录的原始属性(如权限、时间戳等),便于在解包时恢复文件的状态。
  3. 可与压缩工具结合:尽管 Tar 本身不具备压缩功能,但可以与 Gzip、Bzip2 等压缩工具结合使用,提供压缩功能。
  4. 适用于大型文件集合:Tar 能有效地处理大量文件和目录,将它们打包成一个单独的归档文件,便于管理和传输。
缺点
  1. 不具备原生压缩功能:Tar 本身不具有压缩功能,需要与其他压缩工具结合使用。
  2. 压缩效率较低:与一体化的压缩工具相比,使用 Tar 结合其他压缩工具的方式在压缩效率上可能略有不足。
适用场景
  1. 文件备份:Tar 可以将多个文件和目录打包成一个归档文件,便于进行文件备份和存储。
  2. 文件传输:将多个文件和目录打包成一个归档文件,可以方便地进行文件传输,尤其是在网络传输中,减少传输次数和网络开销。
  3. 软件发布:开发者经常使用 Tar 打包源代码或二进制文件,方便用户下载和安装。
  4. 数据压缩:与压缩工具(如 Gzip、Bzip2 等)结合使用,可以实现文件的归档与压缩。

总的来说,Tar 是一种非常灵活的文件打包和压缩工具,具有多种压缩格式支持、易于传输和备份、支持文件和目录和支持存档格式等优点。但是,它的压缩比较低,不支持加密,因此在选择使用 Tar 时,需要根据具体的场景和需求来综合考虑其优缺点。

常见命令
命令描述
tar -cvf archive.tar file1 file2 directory1创建归档文件
tar -xvf archive.tar解压缩归档文件
tar -tvf archive.tar查看归档文件的内容
tar -zcvf archive.tar.gz file1 file2 directory1压缩归档文件为.gz格式
tar -zxvf archive.tar.gz解压缩.gz格式的归档文件
tar -jcvf archive.tar.bz2 file1 file2 directory1压缩归档文件为.bz2格式
tar -jxvf archive.tar.bz2解压缩.bz2格式的归档文件
tar -P保留绝对路径
tar --exclude='*.log' directory1排除指定文件或目录
常见选项
选项全拼功能
-c--create创建归档文件
-x--extract解压归档文件
-t--list查看归档文件中的文件列表
-f--file指定归档文件的名称
-z--gzip使用gzip压缩算法压缩归档文件
-j--bzip2使用bzip2压缩算法压缩归档文件
-v--verbose在执行操作时显示详细信息
-P--absolute-names保留文件和目录的绝对路径
--exclude--exclude=PATTERN排除匹配指定模式的文件或目录

Zip

ZIP(Zone Information Protocol)是一种广泛使用的文件压缩和归档格式工具,它可以将多个文件或目录打包成一个单独的文件,以便于传输、备份和存档。这种格式最初是由Phil Katz在1989年开发的,现在已成为一种通用的归档和压缩标准。

优点
  1. 跨平台兼容性:Zip 是一种通用的文件压缩和归档格式,几乎所有的操作系统(如Windows、macOS、Linux等)都支持Zip格式,具有很强的跨平台兼容性。
  2. 集成压缩和归档功能:Zip 同时具备文件压缩和归档功能,可以将多个文件和目录压缩成一个文件,便于传输和存储。
  3. 压缩率适中:Zip 格式的压缩率适中,能有效减少文件大小,从而节省存储空间和加快文件传输速度。
  4. 随机访问:Zip 支持随机访问,可以在不解压整个压缩包的情况下提取单个文件。
  5. 密码保护:Zip 格式支持为压缩文件设置密码,以提高文件的安全性。
缺点
  1. 压缩效率:与一些专门的压缩算法(如7z、Bzip2等)相比,Zip 的压缩效率较低,可能无法获得最佳的压缩效果。
  2. 加密安全性:Zip 的标准加密算法较弱,容易受到密码破解工具的攻击。虽然现代的 Zip 实现支持更强大的加密算法,但并非所有的压缩工具都支持这些算法。
适用场景
  1. 文件传输:Zip 可以将多个文件和目录压缩成一个文件,减小文件大小,方便在不同设备和平台之间进行传输。
  2. 文件存储:将文件和目录压缩成 Zip 格式,可以节省存储空间,便于备份和管理。
  3. 软件分发:开发者经常使用 Zip 格式打包软件和资源,便于用户下载和安装。
  4. 文档压缩:将文档、图片等资料压缩成 Zip 格式,方便存储和分享。

总的来说,Zip 是一种广泛使用的文件压缩和归档格式,具有很强的跨平台兼容性。它可以将多个文件和目录压缩成一个文件,便于传输和存储。Zip 的压缩率适中,支持随机访问和密码保护。然而,与一些专门的压缩算法(如7z、Bzip2等)相比,Zip 的压缩效率较低,可能无法获得最佳的压缩效果。

此外,虽然 Zip64 扩展已经解决了传统 Zip 格式中的 4GB 文件大小限制,但并非所有的压缩解压缩工具都支持 Zip64,因此在处理大文件时需要注意选择合适的工具。

常见命令
命令描述
zip archive.zip file1 file2 directory1创建Zip归档文件
unzip archive.zip解压缩Zip归档文件
zip -r archive.zip directory1压缩目录为Zip归档文件
unzip -l archive.zip列出Zip归档文件中的文件列表
zip -e archive.zip file1 file2使用加密算法压缩文件为Zip归档文件
常见选项
选项全拼功能
-r--recurse-paths递归压缩目录及其所有子目录
-e--encrypt使用加密算法压缩文件
-d--delete从Zip归档文件中删除文件
-u--update更新Zip归档文件中的文件
-l--list列出Zip归档文件中的文件列表
-v--verbose在执行操作时显示详细信息
-q--quiet在执行操作时禁止输出
-f--file指定归档文件的名称
-z--gzip使用gzip压缩算法压缩归档文件
-j--bzip2使用bzip2压缩算法压缩归档文件

Gzip

Gzip(GNU zip)是一种广泛使用的文件压缩和解压缩工具。它基于DEFLATE算法,该算法结合了LZ77(Lempel-Ziv 77)和Huffman编码技术,能够有效地压缩文件。Gzip 主要用于压缩单个文件,而不是整个目录结构。在Linux和Unix系统中,Gzip 常与 Tar(磁带归档器)结合使用,以实现文件归档和压缩的双重功能。

优点
  1. 高压缩率:Gzip 通常能提供较高的压缩率,从而降低文件大小,节省存储空间和带宽。
  2. 快速压缩和解压缩速度:Gzip 在保证较高压缩率的同时,压缩和解压缩速度相对较快。
  3. 跨平台兼容性:Gzip 在Linux、Unix、macOS 和 Windows 等操作系统上都有实现,具有良好的跨平台兼容性。
  4. 开源和免费:Gzip 是 GNU 项目的一部分,遵循开源协议,免费提供给用户使用。
缺点
  1. 仅支持单文件压缩:Gzip 本身只能压缩单个文件,无法直接压缩目录。通常需要与 Tar 等归档工具结合使用。
  2. 压缩效率高:虽然 Gzip 的压缩效率较高,但与一些专门的压缩算法(如7z、Bzip2等)相比,可能无法获得最佳的压缩效果。
适用场景
  • 文件传输:Gzip 可以将文件压缩成更小的体积,有助于减少传输时间和网络开销。
  • 网页优化:服务器可以使用 Gzip 压缩网页内容,提高传输速度,降低带宽消耗,提高用户体验。
  • 数据存储:Gzip 可以用于压缩文档、日志文件等,节省存储空间。
  • 软件分发:开发者可以将源代码或二进制文件压缩为 Gzip 格式,便于用户下载和安装。

总之,Gzip 是一种广泛使用的文件压缩工具,基于 DEFLATE 算法,提供较高的压缩率和较快的压缩速度。尽管 Gzip 仅支持单文件压缩,但可以与 Tar 等归档工具结合使用,实现目录的压缩。具有良好的跨平台兼容性和开源性质,适用于文件传输、网页优化、数据存储和软件分发等场景。在压缩效率方面,虽然 Gzip 表现出色,但可能无法与一些专门的压缩算法(如7z、Bzip2等)相媲美。

常见命令
命令描述
gzip file.txt压缩文件“file.txt”
gzip -r directory1递归压缩目录“directory1”及其所有子目录和文件
gzip -d file.txt.gz解压缩Gzip压缩的文件“file.txt.gz”
gzip -l file.txt.gz查看Gzip压缩文件“file.txt.gz”的详细信息
gzip -v file.txt压缩文件“file.txt”并显示压缩进度
常见选项
选项选项全称功能
-d--decompress解压缩文件
-r--recursive递归压缩目录及其所有子目录
-l--list列出Gzip压缩文件的详细信息
-v--verbose显示操作的详细信息
-q--quiet禁止输出操作信息
-f--force强制执行操作,即使会覆盖文件
-t--test测试Gzip压缩文件的完整性
-k--keep保留原始文件,不删除压缩文件

Bzip2

Bzip2 是一款开源的文件压缩工具,使用 Burrows-Wheeler 算法(BWT)以及哈夫曼编码进行文件压缩。Bzip2 专注于提供高压缩率,通常能够比 Gzip 提供更高的压缩效果,但相应的压缩和解压缩速度较慢。与 Gzip 类似,Bzip2 主要用于压缩单个文件,而不是整个目录结构。在 Linux 和 Unix 系统中,Bzip2 也常与 Tar 归档工具结合使用。

优点
  1. 高压缩率:Bzip2 通常能提供比 Gzip 更高的压缩率,从而进一步减小文件大小,节省存储空间和带宽。
  2. 开源和免费:Bzip2 是一个开源项目,可以免费使用。
  3. 跨平台兼容性:Bzip2 在 Linux、Unix、macOS 和 Windows 等操作系统上都有实现,具有良好的跨平台兼容性。
缺点
  1. 速度较慢:由于 Bzip2 的高压缩率,压缩和解压缩速度相对较慢,特别是与 Gzip 相比。
  2. 仅支持单文件压缩:Bzip2 本身只能压缩单个文件,无法直接压缩目录。通常需要与 Tar 等归档工具结合使用。
适用场景
  1. 文件存储:当存储空间有限且需要高压缩率时,Bzip2 可用于压缩文档、日志文件等。
  2. 文件传输:Bzip2 可以将文件压缩成更小的体积,有助于减少传输时间和网络开销,尤其在对压缩率要求较高的场景中。
  3. 软件分发:开发者可以将源代码或二进制文件压缩为 Bzip2 格式,以获得更小的文件体积,便于用户下载和安装。

简单总结:Bzip2 是一款开源的文件压缩工具,使用 Burrows-Wheeler 算法和哈夫曼编码,提供较高的压缩率,但压缩和解压缩速度较慢。Bzip2 主要用于压缩单个文件,可以与 Tar 等归档工具结合使用,具有良好的跨平台兼容性。适用于文件存储、传输和软件分发等场景,特别是在对压缩率要求较高的情况下。

常见命令
命令描述
bzip2 file.txt压缩文件“file.txt”
bzip2 -k file.txt压缩文件“file.txt”并保留原始文件
bzip2 -d file.txt.bz2解压缩Bzip2压缩的文件“file.txt.bz2”
bzip2 -l file.txt.bz2查看Bzip2压缩文件“file.txt.bz2”的详细信息
bzip2 -v file.txt压缩文件“file.txt”并显示压缩进度
常见选项
选项选项全称功能
-c--stdout将输出写入标准输出,而不是写入压缩文件。
-d--decompress解压缩Bzip2压缩文件,生成原始文件。
-f--force强制覆盖现有的压缩文件,而不提示。
-k--keep保留原始文件,不删除生成的压缩文件。
-q--quiet不显示任何压缩和解压缩过程的信息。
-t--test测试Bzip2压缩文件的完整性。
-v--verbose显示详细的压缩和解压缩过程的信息。
-z--compress使用Bzip2进行压缩,生成Bzip2压缩文件(默认选项)。
-1--fast使用1级别的压缩,生成速度快,压缩比低的压缩文件。
-2--best使用2级别的压缩,生成速度慢,压缩比高的压缩文件(默认级别)。
-3--small使用3级别的压缩,生成速度较慢,压缩比更高的压缩文件。
-4使用4级别的压缩,生成速度更慢,压缩比更高的压缩文件。
-5使用5级别的压缩,生成速度更慢,压缩比更高的压缩文件。
-6使用6级别的压缩,生成速度更慢,压缩比更高的压缩文件。
-7使用7级别的压缩,生成速度更慢,压缩比更高的压缩文件。
-8使用8级别的压缩,生成速度更慢,压缩比更高的压缩文件。
-9--best-quality使用9级别的压缩,生成速度最慢,压缩比最高的压缩文件。

7z

7z(7-Zip)是一款开源的文件压缩和解压缩工具,主要使用 LZMA(Lempel-Ziv-Markov链算法)和 LZMA2 算法进行压缩。7z 格式以高压缩率和高压缩速度而著称,通常能够提供比 Gzip 和 Bzip2 更高的压缩效果。除了 7z 格式,7-Zip 还支持其他压缩格式,如 ZIP、Gzip、Bzip2、Tar 等。

优点
  1. 高压缩率:7z 格式通常能提供非常高的压缩率,从而进一步减小文件大小,节省存储空间和带宽。
  2. 压缩速度:7z 在保证高压缩率的同时,压缩速度相对较快。
  3. 多文件支持:7z 支持压缩多个文件和目录结构,无需额外的归档工具。
  4. 密码保护:7z 支持使用 AES-256 加密算法对压缩文件进行密码保护。
  5. 开源和免费:7-Zip 是一个开源项目,可以免费使用。
  6. 跨平台兼容性:7-Zip 在 Windows、Linux 和 macOS 等操作系统上都有实现,具有良好的跨平台兼容性。
缺点
  1. 广泛支持度:尽管 7z 格式具有许多优点,但与 ZIP 和 Gzip 相比,它的支持和普及程度相对较低。
  2. 可能需要额外软件:在某些操作系统(如 macOS 和 Linux)上,可能需要额外安装 7-Zip 或类似工具,以支持 7z 格式。
适用场景
  1. 文件存储:当存储空间有限或需要高压缩率时,7z 可用于压缩文档、日志文件等。
  2. 文件传输:7z 可以将文件压缩成更小的体积,有助于减少传输时间和网络开销。
  3. 软件分发:开发者可以将源代码或二进制文件压缩为 7z 格式,以获得更小的文件体积,便于用户下载和安装。
  4. 数据备份:7z 支持压缩大量文件和目录结构,适用于对数据进行备份和归档。

简单总结:7z 是一款开源的文件压缩工具,使用 LZMA 和 LZMA2 算法,提供高压缩率和较快的压缩速度。7z 支持压缩多个文件和目录结构,支持密码保护,具有良好的跨平台

常见命令
命令描述
7z a archive.7z file1 file2将 file1 和 file2 添加到名为 archive.7z 的压缩文件中
7z a -r archive.7z folder将 folder 目录及其子目录递归添加到名为 archive.7z 的压缩文件中
7z e archive.7z从 archive.7z 提取文件,不保留目录结构
7z x archive.7z从 archive.7z 提取文件,保留目录结构
7z l archive.7z显示名为 archive.7z 的压缩文件中的文件列表
7z t archive.7z测试名为 archive.7z 的压缩文件的完整性
7z a -pPASSWORD archive.7z file将 file 添加到名为 archive.7z 的压缩文件中,并使用密码 PASSWORD 保护
7z a -sfx archive.exe file创建名为 archive.exe 的自解压缩可执行文件,其中包含 file
7z a -tzip archive.zip file将 file 添加到名为 archive.zip 的 ZIP 格式压缩文件中
7z a archive.7z -v100m file将 file 添加到名为 archive.7z 的压缩文件中,并创建 100MB 的分卷文件
常见选项
选项全拼功能
aAdd添加文件到压缩文件
eExtract提取压缩文件,不保留目录结构
lList显示压缩文件中的文件列表
tTest测试压缩文件的完整性
xeXtract with full paths提取压缩文件,保留目录结构
-pPassword设置压缩文件的密码
-rRecurse递归处理子文件夹
-sfxCreate SFX archive创建自解压缩可执行文件
-tType指定压缩文件的类型(如 7z、zip、gzip 等)
-vCreate volumes创建多卷压缩文件

权限和安全

Linux 文件系统的权限和安全主要可以分为四个部分:常用权限控制、特殊权限控制、隐藏权限控制和 SELinux 权限控制。

常用权限

Linux 系统中有三种基本的权限:读(r,read)、写(w,write)和执行(x,execute)。也可以使用数字来表示文件或目录的权限。每个权限用一个数字表示,分别为 4、2 和 1,分别代表读、写和执行权限。通过将这些数字相加,可以得到一个三位数的数字,用于表示用户、组和其他用户的权限。这些权限分别适用于文件和目录。权限可以分为三组,分别为:用户(u,user),组(g,group)和其他(o,others)

  • 文件权限设置为 -rw-r--r--:chmod 644 file.txtchmod u=rw,g=r,o=r file.txt
  • 文件所有者设置执行权限:chmod u+x file.txt
  • 文件所有组去除写入和执行权限:chmod g-wx file.txt
  • 文件其他用户设置只读权限:chmod o=r file.txt

注意:chmod + 表示添加权限,- 表示删除权限,= 表示设置权限。

drwxr-xr-x 1 root root 4096 Dec 10 03:15 boot

这是一个目录(d开头),权限为rwxr-xr-x,所有者为root,所属组也为root,大小为4096字节,创建时间为12月10日 03:15。

所有者(root)具有读、写和执行权限(rwx)
所属组(root)和其他用户具有读和执行权限(r-x)
总的来说,这个目录的权限是755(rwxr-xr-x),所有者有最高的权限,可以对目录进行任何操作,而组和其他用户只有读和执行权限。
权限数字文件权限目录权限
读(r)4允许用户读取文件内容允许用户查看目录内容
写(w)2允许用户修改文件内容允许用户在目录中创建、删除和重命名文件
执行 (x)1允许用户执行文件(如程序或脚本)允许用户进入目录

特殊权限

Linux 系统中,特殊权限是指那些不同于常规文件和目录权限(读、写、执行)的权限。这些特殊权限有助于控制用户或进程在访问或操作文件时所拥有的权限。

  • 文件设置粘滞位:chmod o+t
  • 文件取消粘滞位:chmod o-t
特殊权限示例描述
Setuid (suid)chmod u+s当文件具有 setuid 权限时,任何用户在执行该文件时都将获得文件所有者的权限。
Setgid (sgid)chmod g+s当文件具有 setgid 权限时,用户可以以文件所属组的权限执行文件。对于目录,具有 setgid 权限的目录下创建的文件和子目录自动继承该目录的组。
粘滞位 (Sticky Bit)chmod o+t当为目录设置粘滞位时,只有文件所有者和 root 用户可以删除或重命名该目录中的文件。

隐藏权限

Linux 系统中,隐藏权限通常指那些不容易被用户发现的权限。这些权限可以通过 chattr 命令设置,并使用 lsattr 命令查看。隐藏权限有助于保护文件免受意外删除或修改,从而增强 Linux 系统的安全性。

  • 文件设置不可修改(i)权限:chattr +i example.txt
  • 文件取消不可修改(i)权限:chattr -i example.txt
  • 查看文件的隐藏权限:lsattr example.txt
隐藏权限chattr 参数作用
Immutablei无法修改文件,目录中子文件内容可修改,不能新建或删除文件
Append onlya仅允许追加内容,无法覆盖/删除内容
SyncS文件内容变更后立即同步到硬盘
Secure deletions彻底删除,不可恢复(用 0 填充原文件所在硬盘区域)
No update of atimeA不再修改文件或目录的最后访问时间
No update of btimeb不再修改文件或目录的存取时间
Error checkingD检查压缩文件中的错误
No dumpd使用 dump 命令备份时忽略本文件/目录
Compressionc默认将文件或目录进行压缩
Undeletionu删除后保留在硬盘中的数据,方便恢复
Tail-mergingt让文件系统支持尾部合并
Direct accessx可以直接访问压缩文件中的内容

SELinux

SELinux(Security-Enhanced Linux)是一个强大的 Linux 内核安全模块,用于实现访问控制安全策略。它通过强制访问控制(MAC)限制用户和进程对系统资源的访问,从而提高系统安全性。

SELinux 的起源可以追溯到 1998 年,当时美国国家安全局(NSA)与安全系统研究小组(SFR)共同开发了一个名为 Flask 的安全架构。该架构的目标是为操作系统提供一种强大且灵活的访问控制机制。在 2000 年,NSA 将 Flask 架构集成到 Linux 内核中,从而诞生了 SELinux。

SELinux 的开发过程受到了开源社区的广泛支持。Red Hat 在 2003 年发布的 Red Hat Enterprise Linux 4(RHEL 4)中首次将 SELinux 作为默认安全模块。此后,许多其他 Linux 发行版,如 CentOS、Fedora 和 Gentoo,也开始支持 SELinux。

SELinux 的发展方向主要集中在以下几个方面:

  1. 提高安全性:SELinux 将继续优化安全策略,提高系统安全性。例如,通过引入更多安全策略类型,如基于属性的访问控制(ABAC),以满足不断变化的安全需求。
  2. 简化配置和管理:尽管 SELinux 的学习曲线较陡,但它将继续努力简化安全策略的配置和管理,以便降低使用门槛。
  3. 性能优化:SELinux 将持续改进性能,以减轻其对系统性能的影响,同时确保高度安全性。
  4. 社区合作与支持:SELinux 将继续与开源社区合作,共同推动 Linux 安全模块的发展和完善。此外,它将继续提供支持和培训,帮助用户更好地理解和应用 SELinux。

优点

  1. 提供详细的安全策略和访问控制,支持多种安全策略,如基于角色的访问控制(RBAC)和类型强制访问控制(TE)等。
  2. 通过强制访问控制(MAC)限制用户和进程对系统资源的访问,从而提高系统安全性。
  3. 被广泛应用于许多 Linux 发行版,如 Red Hat Enterprise Linux (RHEL)、CentOS 和 Fedora 等。
  4. 完全集成在内核中,提供强大的安全保护。

缺点

SELinux 的缺点包括配置和学习复杂,性能开销较大。因此,它更适用于高度安全要求的环境,如政府、金融和敏感数据处理等场景。在这些场合,SELinux 能够提供强大且灵活的安全策略,以满足不同的安全需求。

实现

  1. 通过 Linux 内核安全模块(LSM)框架实现,使内核支持额外的安全策略。
  2. 使用安全策略和安全上下文标签,对进程和对象进行访问控制。
  3. 通过安全策略规则集,定义允许的操作、角色和类型。

常用的命令和示例

  1. Enforcing:在此模式下,SELinux 会执行所有安全策略并强制访问控制。如果发现违反了安全策略,SELinux 将阻止访问并在审计日志中记录相关信息。这是 SELinux 的默认模式,旨在提供最高级别的系统安全保护。
  2. Permissive:在此模式下,SELinux 不会阻止任何违反安全策略的操作,但仍会在审计日志中记录违规行为。这种模式通常用于调试和排错,因为它允许管理员了解哪些操作可能被阻止,同时不会对系统造成实际影响。
  3. Disabled:在此模式下,SELinux 完全禁用,不会执行任何安全策略。所有操作都将按照传统的 Linux 访问控制(如文件权限和所有者)进行,而不受 SELinux 的影响。这种模式可能会降低系统安全性,因此不推荐在生产环境中使用。
命令描述示例
sestatus显示当前 SELinux 状态和概述sudo sestatus
getenforce显示当前 SELinux 模式(enforcing, permissive, disabled)sudo getenforce
setenforce设置 SELinux 模式(0 = permissive, 1 = enforcing)sudo setenforce 1
chcon更改文件或目录的 SELinux 上下文sudo chcon -t httpd_sys_content_t /var/www/html
restorecon恢复文件或目录的默认 SELinux 上下文sudo restorecon -Rv /var/www/html
semanage管理 SELinux 的配置、布尔值、上下文等sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
ausearch搜索和分析 SELinux 的审计日志sudo ausearch -m AVC
audit2allow从审计日志生成 SELinux 策略模块sudo audit2allow -a -M my_new_module
semodule管理 SELinux 策略模块sudo semodule -i my_new_module.pp

AppArmor

AppArmor(Application Armor)是一种 Linux 安全模块,旨在保护应用程序免受潜在威胁。它通过强制访问控制(MAC)限制应用程序对系统资源的访问,从而增强系统安全性。AppArmor 的策略配置相对简单,基于路径的访问控制易于理解和配置。

AppArmor 诞生于 1998 年,最初由 Immunix 公司开发,其目的是为 Linux 系统提供一个易于管理且高效的安全解决方案。2005 年,Novell 收购了 Immunix 公司,并在同年将 AppArmor 开源。自此,AppArmor 成为了一个独立的开源项目,吸引了许多开发者和维护者的加入。

2007 年,AppArmor 成为了 Ubuntu 7.10(Gutsy Gibbon)的默认安全模块。随后,其他 Linux 发行版,如 openSUSE 和 Debian,也开始支持 AppArmor。作为一种与 SELinux 并行的 Linux 安全模块,AppArmor 在易用性和性能方面具有明显优势,使其在个人电脑和服务器领域得到广泛应用。

AppArmor 的发展方向主要集中在以下几个方面:

  1. 简化策略配置和管理:AppArmor 将继续简化安全策略的配置和管理,使其更易于使用和部署。
  2. 提升性能:AppArmor 会继续优化其性能表现,以满足不断增长的系统安全需求,同时减少性能开销。
  3. 扩展功能和支持:AppArmor 将持续扩展其功能,以支持更多的 Linux 发行版和应用场景。此外,AppArmor 也可能引入新的安全机制,以增强其安全性能。
  4. 社区合作:AppArmor 将继续与开源社区合作,共同推动 Linux 安全模块的发展和完善。

优点

  1. 策略配置相对简单,基于路径的访问控制,易于理解和配置。
  2. 通过限制应用程序对文件系统和其他资源的访问,增强系统安全性。
  3. 应用于诸如 Ubuntu、openSUSE 和 Debian 等 Linux 发行版。
  4. 针对单个应用程序的策略配置,使得策略隔离更好。
  5. 较低的性能开销。

缺点

AppArmor 的缺点在于其安全策略相对简单,可能不适用于某些高度安全要求的场景,同时不支持基于角色的访问控制。因此,它更适用于一般安全要求的环境,如个人电脑和服务器等场景。在这些场合,AppArmor 能够提供简单且实用的安全策略,帮助用户保护系统资源和数据。

实现

  1. 通过 Linux 内核安全模块(LSM)框架实现,使内核支持额外的安全策略。
  2. 使用基于路径的访问控制策略,对应用程序进行访问控制。
  3. 通过简单的文本策略文件,定义允许的操作、文件访问权限等。

常用的命令和示例

命令描述示例
apparmor_status显示当前 AppArmor 状态和概述sudo apparmor_status
aa-enforce设置指定配置文件为强制模式(enforce)sudo aa-enforce /etc/apparmor.d/usr.bin.firefox
aa-complain设置指定配置文件为投诉模式(complain)sudo aa-complain /etc/apparmor.d/usr.bin.firefox
aa-disable禁用指定配置文件sudo aa-disable /etc/apparmor.d/usr.bin.firefox
aa-genprof生成指定程序的 AppArmor 配置文件sudo aa-genprof /usr/bin/firefox
aa-logprof分析日志,根据需求更新 AppArmor 配置文件sudo aa-logprof
aa-autodep自动生成 AppArmor 配置文件的依赖项sudo aa-autodep /usr/bin/firefox
aa-cleanprof清理无用的配置文件sudo aa-cleanprof
aa-unconfined列出未受 AppArmor 限制的进程sudo aa-unconfined

SELinux 与 AppArmor 对比

SELinux 和 AppArmor 都是 Linux 内核安全模块,分别用于实现访问控制安全策略。它们各自具有不同的优缺点,适用于不同的场景。

特性 / 安全模块SELinuxAppArmor
优点详细的安全策略和访问控制;支持多种安全策略;广泛应用策略配置简单;基于路径的访问控制;较低的性能开销
缺点配置和学习复杂;性能开销较大安全策略相对简单;不支持基于角色的访问控制
适用场景高度安全要求的环境一般安全要求的环境
发行版本RHEL、CentOS、Fedora 等Ubuntu、openSUSE、Debian 等