组成部分

组成成分 描述
Bootloader 引导加载程序 一段用于引导启动过程以启动操作系统的代码。Parrot Linux 使用 GRUB 引导加载程序。
OS Kernel 操作系统内核 内核是操作系统的主要组件。它在硬件层面管理系统 I/O 设备的资源。
Daemons 守护进程 后台服务在 Linux 中被称为“守护进程”。其目的是确保调度、打印和多媒体等关键功能正常工作。这些小程序在我们启动或登录电脑后才加载。
OS Shell 操作系统壳 操作系统壳层或命令语言解释器(也称为命令行)是操作系统与用户之间的接口。该界面允许用户告诉操作系统该做什么。最常用的贝壳有 Bash、Tcsh/Csh、Ksh、Zsh 和 Fish。
Graphics server 图形服务器 这提供了一个称为“X”或“X-server”的图形子系统(服务器),允许图形程序在 X 窗口系统上本地或远程运行。
Window Manager 窗口管理器 也称为图形用户界面(GUI)。有很多选择,包括 GNOME、KDE、MATE、Unity 和 Cinnamon。桌面环境通常包含多个应用程序,包括文件浏览器和网页浏览器。这些功能允许用户访问和管理操作系统中重要且频繁访问的功能和服务。
Utilities 实用程序 应用程序或实用工具是为用户或另一个程序执行特定功能的程序。

文件系统

Path 路径 Description 描述
/ 顶层目录是根文件系统,包含在挂载其他文件系统之前启动操作系统所需的全部文件,以及启动其他文件系统所需的文件。启动后,所有其他文件系统都作为根的子目录挂载到标准挂载点。
/bin 包含必要的命令二进制文件。
/boot 由静态引导加载程序、内核可执行文件以及启动 Linux 操作系统所需的文件组成。
/dev 包含设备文件,以方便访问系统上连接的每个硬件设备。
/etc 本地系统配置文件。已安装应用程序的配置文件也可能保存在这里。
/home
系统中的每个用户都有一个用于存储的子目录。
/lib 系统启动所需的共享库文件。
/media USB 驱动器等外部可移动媒体设备挂载在这里。
/mnt 常规文件系统的临时挂载点。
/opt 可选文件,如第三方工具,可以保存在这里。
/root root 用户的家目录。
/sbin 此目录包含用于系统管理(二进制系统文件)的可执行文件。
/tmp 操作系统和许多程序使用此目录来存储临时文件。此目录通常在系统启动时被清除,并在其他时间可能未经警告就被删除。
/usr 包含可执行文件、库文件、man 文件等。
/var 此目录包含各种数据文件,如日志文件、电子邮件收件箱、Web 应用程序相关文件、cron 文件等。

SHELL简介

Linux 终端,也称为 shell 或命令行,为用户提供了一个基于文本的输入/输出(I/O)界面,用于与计算机系统的内核进行交互。该术语通常也指代“控制台”,但这里指的是文本模式下的屏幕,而不是窗口。在终端窗口中,可以执行命令来控制系统。

我们可以将 shell 视为一个基于文本的 GUI,在其中我们输入命令来执行导航到其他目录、处理文件以及从系统中获取信息等操作,但功能远不止这些。

终端模拟器

终端仿真软件是模拟终端功能的软件。它允许在图形用户界面( GUI )中使用基于文本的程序。还存在所谓的命令行界面( CLI ),它们作为附加终端在一个终端中运行。简而言之,终端是 shell 解释器的一个接口。

现在,假设你正在远程工作。终端仿真软件就像你电脑屏幕上的虚拟接待台(GUI),让你能够在不实际在办公室的情况下与服务器室进行交互。它仿真了实际接待台的功能,使你能够在图形环境中使用基于文本的程序和命令。

此外,在单个终端内运行的 command-line interfacesCLI )作为额外的终端,就像在屏幕上同时打开了多个虚拟接待台。每一个都允许你独立地向服务器室发送不同的指令,但通过同一个主界面。本质上,终端充当了你的网关,让你能够与由 shell 管理的核心操作进行通信和控制。


Linux 中最常用的 shell 是 Bourne-Again Shell ( BASH ),它是 GNU 项目的组成部分。通过图形用户界面(GUI)完成的一切操作,我们都可以通过 shell 来完成。shell 给我们提供了更多与程序和进程交互的可能性,从而更快地获取信息。此外,许多进程可以通过小型或大型脚本轻松实现自动化,从而大大简化了手动工作。

提示符

Bash 提示符很简单,默认情况下,它会显示用户名(你是谁)、计算机名称(主机名)以及当前正在工作的文件夹/目录等信息。它是一条显示在屏幕上的文本行,告诉你系统已准备好接收你的指令。提示符会出现在新的一行上,光标(闪烁的线或框)会紧随其后,等待你输入命令。

它可以被自定义以向用户提供有用的信息。格式可能看起来像这样:

1
<username>@<hostname><current working directory>$

家目录

用户的家目录用波浪号 ~ 标记,并且是登录时的默认文件夹。

1
<username>@<hostname>[~]$

管理员身份

在这种情况下,美元符号代表用户。一旦我们以 root 登录,字符会变为 hash # ,看起来像这样:

1
root@htb[/htb]#

Unprivileged - User Shell Prompt

无特权 - 用户 Shell 提示

1
$

Privileged - Root Shell Prompt

特权 - 根 Shell 提示

1
#

外观控制

Linux 系统中的 PS1 变量控制终端中命令提示的外观。它就像一个模板,定义了每次系统准备好让您输入命令时您看到的文本。通过自定义 PS1 变量,您可以更改提示以显示用户名、计算机名称、当前文件夹等信息,甚至可以添加颜色和特殊字符。这使您能够个性化命令行界面,使其更具信息量或视觉吸引力。

除了显示用户名和当前文件夹等基本信息外,您还可以自定义命令提示符以显示其他有用信息,例如 IP 地址、日期、时间和最后一个命令的成功或失败状态。这种自定义在渗透测试期间特别有帮助,因为它允许您更有效地跟踪您的操作。例如,您可以设置提示符显示当前工作目录的完整路径,而不仅仅是其名称,如果需要,还可以包含目标的 IP 地址。使用 script 等工具或查看 .bash_history 文件(位于用户的主目录中),您可以记录所有已使用的命令,并按日期和时间进行组织,这有助于文档记录和分析。

特殊符号 描述
\d 日期(Mon Feb 6)
\D{%Y-%m-%d} 日期 (YYYY-MM-DD)
\H 完整主机名
\j shell 管理的作业数量
\n 换行符
\r 回车符
\s shell 的名称
\t 当前时间 24 小时制(HH:MM:SS)
\T 当前时间 12 小时制(HH:MM:SS)
\@ 当前时间
\u 当前用户名
\w 当前工作目录的完整路径

自定义提示符是一个让您的终端体验更加个性化和高效的有用方法。它还可以是一个有助于故障排除和解决问题的工具,因为它可以在任何时候提供有关系统状态的重要信息。

除了自定义提示符外,我们还可以通过不同的配色方案、字体和其他设置来自定义他们的终端环境,使他们的工作环境更具视觉吸引力且更易于使用。

然而,我们在处理 Windows GUI 时看到了相同的情况。我们以用户身份登录到一台具有特定名称的计算机上,并且在浏览系统时我们知道自己所在的目录。Bash 提示符也可以根据我们的需要进行自定义和更改。调整 bash 提示符的范围不在此模块内。然而,我们可以查看 bash-prompt-generator 和 powerline,它们为我们提供了根据需求调整提示符的可能性。

文件描述和重定向

文件描述

文件描述符( FD )在 Unix/Linux 操作系统中是一个由内核维护的引用,它允许系统管理输入/输出( I/O )操作。它作为打开文件、套接字或任何其他 I/O 资源的唯一标识符。在基于 Windows 的操作系统中,这被称为文件句柄。本质上,文件描述符是系统跟踪活动 I/O 连接的方式,例如从文件中读取或向文件中写入。

默认情况下,Linux 中的前三个文件描述符是:

  1. 输入数据流
    • STDIN – 0
  2. 输出数据流
    • STDOUT – 1
  3. 与发生错误相关的输出数据流。
    • STDERR – 2

重定向

使用>来进行重定向

1
find /etc/ -name shadow 2> stderr.txt 1> stdout.txt

权限管理

在 Linux 中,权限就像钥匙,控制对文件和目录的访问。这些权限分配给用户和组,就像组织内特定个人和团队分发钥匙一样。每个用户可以属于多个组,成为组的一部分会获得额外的访问权限,允许用户对文件和目录执行特定操作。

每个文件和目录都有一个所有者(用户)并与一个组相关联。这些文件的权限为所有者和组定义,决定允许执行哪些操作——如读取、写入或执行

目录,用户必须首先拥有正确的钥匙——这个钥匙就是目录上的 execute 权限。没有它,即使目录的内容对用户可见,他们也无法进入或浏览其中。

换句话说,在目录上拥有 execute 权限就像拥有通过走廊进入房间内的权限。它不允许你查看或修改内部内容,但它确实授予你进入并探索目录结构的权限。没有这个权限,用户无法访问目录内容,而会看到一条“ Permission Denied ”错误消息。

需要注意的是,无论用户的访问级别如何,要遍历一个目录都需要 execute 权限。此外,目录上的 execute 权限不允许用户执行或修改任何文件或内容,只能遍历和访问目录内容。

要在目录中执行文件,用户需要在相应的文件上拥有 execute 权限。要修改目录内容(创建、删除或重命名文件和子目录),用户需要在目录上拥有 write 权限。

Linux 系统中的整个权限系统基于八进制数制,基本上,文件或目录可以被分配三种不同的权限:

  • ( r ) - 阅读
  • ( w ) - 写入
  • ( x ) - 执行

更改权限

我们可以使用 chmod 命令修改权限,权限组引用( u - 所有者, g - 组, o - 其他, a - 所有用户),以及使用 +- 来添加或移除指定的权限。在以下示例中,假设我们有一个名为 shell 的文件,我们希望修改它的权限,以便这个脚本属于该用户,不可执行,并为所有用户设置读写权限。

1
ls -l shell

然后我们可以应用 read 权限给所有用户,并查看结果。

1
chmod a+r shell && ls -l shell

我们也可以使用八进制值赋值,将所有其他用户的权限设置为 read

1
2
3
chmod 754 shell && ls -l shell

-rwxr-xr-- 1 cry0l1t3 htbteam 0 May 4 22:12 shell

权限分配赋值如下:
1
2
3
4
Binary Notation:                4 2 1  |  4 2 1  |  4 2 1
----------------------------------------------------------
Binary Representation: 1 1 1 | 1 0 1 | 1 0 0
----------------------------------------------------------

更改所有者

1
chown <user>:<group> <file/directory>

SUID 和 SGID

除了标准的用户和组权限外,Linux 允许我们通过 Set User ID( SUID )和 Set Group ID( SGID )位来配置文件的特殊权限。这些位就像临时访问通行证一样,使用户能够以另一个用户或组的权限运行某些程序。例如,管理员可以使用 SUIDSGID 来授予用户特定应用程序的提权,允许以必要的权限执行任务,即使该用户本身通常没有这些权限。

这些权限的存在通过文件权限集中的 s 代替通常的 x 来指示。当一个设置了 SUID 或 SGID 位的程序被执行时,它将以文件所有者或组的权限运行,而不是启动它的用户。这对于某些系统任务很有用,但如果使用不当,也会引入潜在的安全风险。

粘性位

Linux 中的粘性位就像共享空间中文件上的锁。当应用于目录时,粘性位会增加一层额外的安全性,确保只有特定人员可以修改或删除文件,即使其他人有权访问该目录。

此功能在共享环境中特别有用,例如公共目录,多个用户一起工作。通过设置粘滞位,您可以确保重要文件不会被有权力的用户意外或恶意更改,为协作工作空间添加了重要的安全保护。

如果粘性位大写( T ),这意味着所有其他用户都没有 executex )权限,因此无法查看文件夹内容或从其中运行任何程序。小写的粘性位( t )是设置了 executex )权限的粘性位。

用户管理

有效的用户管理是 Linux 系统管理的基本方面。管理员经常需要创建新的用户帐户或将现有用户分配到特定组以执行适当的访问控制。此外,以不同用户身份执行命令对于需要不同权限的任务通常是必要的。

Command 命令 Description 描述
sudo 以不同用户执行命令。
su su 工具通过 PAM 请求适当的用户凭证,并切换到该用户 ID(默认用户是超级用户)。然后执行一个 shell。
useradd 创建新用户或更新默认新用户信息。
userdel 删除用户帐户和相关文件。
usermod 修改用户帐户。
addgroup 向系统添加组。
delgroup 从系统中删除组。
passwd 更改用户密码。

服务和进程管理

服务

服务,也称为守护进程,是 Linux 系统的基础组件,它们在后台静默运行“无需直接用户交互”。它们执行关键任务,以保持系统运行并提供附加功能。通常,服务可以分为两种类型:

系统服务

这些是在系统启动时所需的内部服务。它们执行与硬件相关的关键任务,并初始化操作系统正常运行所需的系统组件。这些就像引擎和变速箱系统。当你转动点火钥匙时它们启动,对于汽车运行至关重要。没有它们,汽车将无法移动。

用户服务

这些服务由用户添加,通常包括服务器应用程序和其他后台进程,以提供特定的功能或能力。

一般来说,当我们处理一个服务或流程时,我们只有几个目标:

  1. 启动/重启服务/流程
  2. 停止服务/流程
  3. 查看服务/流程的当前状态或历史状态
  4. 启用/禁用开机时服务/进程
  5. 查找服务/进程

大多数现代 Linux 发行版都采用了 systemd 作为其初始化系统(init 系统)。它在启动过程中是第一个启动的进程,并被分配了进程 ID( PID )。Linux 系统中的所有进程都被分配了一个 PID ,可以在 /proc/ 目录下查看,该目录包含了关于每个进程的信息。进程还可能有一个父进程 ID( PPID ),表明它们是由另一个进程(父进程)启动的,因此它们是子进程。

单元

简单说,单元就是 Systemd 的最小功能单位,是单个进程的描述。一个个小的单元互相调用和依赖,组成一个庞大的任务管理系统,这就是 Systemd 的基本思想。

由于 Systemd 要做的事情太多,导致单元有很多不同的种类,大概一共有12种。

每个单元都有一个单元描述文件,它们分散在三个目录。

  • /lib/systemd/system:系统默认的单元文件
  • /etc/systemd/system:用户安装的软件的单元文件
  • /usr/lib/systemd/system:用户自己定义的单元文件

    管理

    使用systemctl进行管理
    可以使用 systemctl 列出所有服务。
    1
    systemctl list-units --type=service

有可能服务因错误而无法启动。要查看问题,我们可以使用工具 journalctl 查看日志。

1
journalctl -u ssh.service --no-pager

进程

结束进程

一个进程可以处于以下状态:

  • Running 运行
  • Waiting (waiting for an event or system resource)
    等待(等待事件或系统资源)
  • Stopped 已停止
  • Zombie (stopped but still has an entry in the process table).
    僵尸(已停止但仍在进程表中有一个条目)。

可以使用 killpkillpgrepkillall 控制进程。要与进程交互,我们必须向它发送一个信号。可以使用以下命令查看所有信号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kill -l

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
2) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
3) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
4) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
5) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
6) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
7) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
8) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
9) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
10) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
11) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
12) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
13) SIGRTMAX-1 64) SIGRTMAX

常用的信号是:

Signal 信号 Description 描述
1 SIGHUP - This is sent to a process when the terminal that controls it is closed.
SIGHUP - 当控制它的终端关闭时,这会发送给进程。
2 SIGINT - Sent when a user presses [Ctrl] + C in the controlling terminal to interrupt a process.
SIGINT - 当用户在控制终端中按下 [Ctrl] + C 来中断进程时发送。
3 SIGQUIT - Sent when a user presses [Ctrl] + D to quit.
SIGQUIT - 当用户按下 [Ctrl] + D 退出时发送。
9 SIGKILL - Immediately kill a process with no clean-up operations.
SIGKILL - 立即杀死进程,不进行清理操作。
15 SIGTERM - Program termination.
SIGTERM - 程序终止。
19 SIGSTOP - Stop the program. It cannot be handled anymore.
SIGSTOP - 停止程序。无法再处理。
20 SIGTSTP - Sent when a user presses [Ctrl] + Z to request for a service to suspend. The user can handle it afterward.
SIGTSTP - 当用户按下 [Ctrl] + Z 请求服务暂停时发送。用户稍后可以处理。

后台进程

有时我们需要将刚刚启动的扫描或进程放到后台,以便继续使用当前会话与系统交互或启动其他进程。正如我们已经看到的,我们可以用快捷键 [Ctrl + Z] 来完成这个操作。如上所述,我们向内核发送 SIGTSTP 信号,内核会挂起进程。

所有后台进程都可以用以下命令显示。

1
jobs

[Ctrl] + Z 快捷键会挂起进程,并且它们将不会被进一步执行。为了在后台保持运行,我们必须输入 bg 命令将进程放到后台。

另一个选项是在命令末尾使用 AND 符号( & )来自动设置进程。

前台进程

之后,我们可以使用 jobs 命令来列出所有后台进程。后台进程不需要用户交互,我们可以使用同一个 shell 会话,而无需等待进程首先完成。一旦扫描或处理完成其工作,终端将通知我们进程已完成。

如果我们想把后台进程调到前台并再次与之交互,我们可以使用 fg <ID> 命令。

1
fg 1

任务调度

任务调度是 Linux 系统中的一个关键功能,它允许用户和管理员通过在特定时间或定期间隔运行任务来自动化任务,无需手动启动。在 Ubuntu、Red Hat Linux 和 Solaris 等发行版中提供此功能,该功能管理各种任务,如自动软件更新、脚本执行、数据库维护和备份自动化。通过调度定期和重复性任务,确保它们一致且可靠地执行。此外,可以配置警报在特定事件发生时通知管理员或用户。虽然这种自动化有众多应用,但这些示例代表了最常见的用例。

理解 Linux 系统中的任务调度对于我们作为网络安全专家和渗透测试人员来说至关重要,因为它既可以作为一种合法的管理工具,也可以成为恶意活动的载体。了解任务自动化方式使您能够识别潜在的安全风险,例如未经授权的 cron 作业执行有害脚本或在预定时间间隔上维护持久后门。通过理解任务调度的复杂性,您可以检测和分析这些隐藏威胁,增强系统审核,甚至可以利用计划任务在渗透测试期间模拟攻击场景。

Systemd

Systemd 是在 Ubuntu、Redhat Linux 和 Solaris 等 Linux 系统中用于在特定时间启动进程和脚本的服务。有了它,我们可以设置进程和脚本在特定时间或时间间隔运行,还可以指定特定的事件和触发器来触发特定任务。为此,在我们系统的脚本或进程自动执行之前,需要采取一些步骤和预防措施。

  1. Create a timer (schedules when your mytimer.service should run)
    创建定时器(安排你的 mytimer.service 应该运行的时间)
  2. Create a service (executes the commands or script)
    创建服务(执行命令或脚本)
  3. Activate the timer 启动定时器

创建定时器

为 systemd 创建定时器,我们需要创建一个目录来存储定时器脚本。

1
sudo mkdir /etc/systemd/system/mytimer.timer.d

写入文件
1
sudo vim /etc/systemd/system/mytimer.timer

我们需要创建一个配置定时器的脚本。该脚本必须包含以下选项:”Unit”、”Timer” 和 “Install”。 “Unit” 选项指定定时器的描述。”Timer” 选项指定定时器的启动时间和激活时间。最后,”Install” 选项指定定时器的安装位置。

  • [Unit]部分介绍本单元的基本信息(即元数据),Description字段给出这个单元的简单介绍(名字叫做MyTimer)。
  • [Service]部分用来定制行为,Systemd 提供许多字段。
    • ExecStartsystemctl start所要执行的命令
    • ExecStopsystemctl stop所要执行的命令
    • ExecReloadsystemctl reload所要执行的命令
    • ExecStartPreExecStart之前自动执行的命令
    • ExecStartPostExecStart之后自动执行的命令
    • ExecStopPostExecStop之后自动执行的命令
  • [Timer]部分定制定时器。Systemd 提供以下一些字段。
    • OnActiveSec:定时器生效后,多少时间开始执行任务
    • OnBootSec:系统启动后,多少时间开始执行任务
    • OnStartupSec:Systemd 进程启动后,多少时间开始执行任务
    • OnUnitActiveSec:该单元上次执行后,等多少时间再次执行
    • OnUnitInactiveSec: 定时器上次关闭后多少时间,再次执行
    • OnCalendar:基于绝对时间,而不是相对时间执行
    • AccuracySec:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒
    • Unit:真正要执行的任务,默认是同名的带有.service后缀的单元
    • Persistent:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元
    • WakeSystem:如果系统休眠,是否自动唤醒系统

      Cron

      Cron 是 Linux 系统中另一个可以用来调度和自动化进程的工具。它允许用户和管理员在特定时间或特定间隔内执行任务。对于上述示例,我们也可以使用 Cron 来自动化相同的任务。我们只需要创建一个脚本,然后告诉 cron 守护进程在特定时间调用它。

使用 Cron,我们可以自动化相同的任务,但设置 Cron 守护进程的过程与 Systemd 略有不同。要设置 cron 守护进程,我们需要将任务存储在一个名为 crontab 的文件中,然后告诉守护进程何时运行这些任务。然后我们可以通过相应地配置 cron 守护进程来安排和自动化任务。Cron 的结构由以下组件组成:

Time Frame 时间范围 Description 描述
Minutes (0-59) 分钟(0-59) This specifies in which minute the task should be executed.
这指定了任务应在哪一分钟执行。
Hours (0-23) 小时(0-23) This specifies in which hour the task should be executed.
这指定了任务应在哪一小时执行。
Days of month (1-31) 月份中的天数(1-31) This specifies on which day of the month the task should be executed.
这指定了任务应在月份的哪一天执行。
Months (1-12) 月份(1-12) This specifies in which month the task should be executed.
这指定了任务应在哪个月执行。
Days of the week (0-7)
星期几(0-7)
This specifies on which day of the week the task should be executed.
这指定了任务应在哪一天执行。

例如,这样的 crontab 可能看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
# System Update
0 */6 * * * /path/to/update_software.sh

# Execute Scripts
0 0 1 * * /path/to/scripts/run_scripts.sh

# Cleanup DB
0 0 * * 0 /path/to/scripts/clean_database.sh

# Backups
0 0 * * 7 /path/to/scripts/backup.sh

文件管理

管理 Linux 文件系统是一项关键任务,涉及在磁盘或其他存储设备上组织、存储和维护数据。Linux 是一个多功能的操作系统,支持多种不同的文件系统,包括 ext2、ext3、ext4、XFS、Btrfs 和 NTFS 等。每种文件系统都有其独特的特性,并适用于特定的使用场景。最佳文件系统的选择取决于应用程序或用户的特定需求,例如:

  • ext2 是一种较旧的文件系统,没有日志记录功能,这使得它不太适合现代系统,但在某些低开销场景中仍然有用(例如 USB 驱动器)。
  • ext3ext4 更高级,具有日志记录功能(有助于恢复崩溃),而 ext4 是大多数现代 Linux 系统的默认选择,因为它在性能、可靠性和大文件支持方面提供了平衡。
  • Btrfs 以快照和内置数据完整性检查等高级功能而闻名,使其成为复杂存储设置的理想选择。
  • XFS 在处理大文件和高性能方面表现出色。它最适合具有高 I/O 需求的环境。
  • NTFS ,最初为 Windows 开发,在处理双系统启动或需要在 Linux 和 Windows 系统上工作的外部驱动器时,具有兼容性优势。

选择文件系统时,分析应用程序或用户需求至关重要,性能、数据完整性、兼容性和存储需求等因素会影响决策。

Linux 的文件系统架构基于 Unix 模型,采用分层结构组织。这种结构由多个组件组成,其中最重要的是 inodesInodes 是数据结构,用于存储每个文件和目录的元数据,包括权限、所有权、大小和时间戳。Inodes 不存储文件的实际数据或名称,但它们包含指向磁盘上存储文件数据的块的指针。

文件类型

常见文件

普通文件是最常见的类型,通常由文本数据(如 ASCII)和/或二进制数据(如图像、音频或可执行文件)组成。它们存在于文件系统中的各个目录中,而不仅仅是在根目录中。根目录 (/) 仅仅是分层目录树的顶部,文件可以存在于该结构中的任何目录内。

目录

目录是特殊类型的文件,它们充当其他文件(包括普通文件和其他目录)的容器。当文件存储在目录中时,该目录被称为该文件的父目录。目录帮助组织 Linux 文件系统中的文件,允许以有效的方式管理文件集合。

符号链接

除了常规文件和目录外,Linux 还支持符号链接( symlinks ),它们充当指向其他文件或目录的快捷方式或引用。符号链接允许快速访问文件系统不同部分的文件,而无需复制文件本身。符号链接可用于通过指向不同位置的重要文件来简化访问或组织复杂的目录结构。

每个用户类别可以有不同的权限级别。例如,文件的所有者可能拥有读取、写入和执行该文件的权限,而其他人可能只有读取权限。这些权限是独立的,即对一个用户的权限的更改不一定会影响其他人。

磁盘与驱动器

分区管理

fdisk

Linux 下的磁盘管理涉及管理物理存储设备,包括硬盘、固态硬盘和可移动存储设备。Linux 下磁盘管理的主要工具是 fdisk ,它允许我们在驱动器上创建、删除和管理分区。它还可以显示分区表的信息,包括每个分区的大小和类型。在 Linux 上对驱动器进行分区涉及将物理存储空间划分为单独的逻辑部分。然后,每个分区都可以使用特定的文件系统(如 ext4、NTFS 或 FAT32)进行格式化,并可以作为一个单独的文件系统挂载。

1
sudo fdisk -l

挂载

每个逻辑分区或存储驱动器都必须分配到文件系统中的特定目录。这个过程称为 mounting 。挂载涉及将驱动器或分区链接到目录,使其内容在整体文件系统层次结构中可访问。一旦驱动器挂载到目录(也称为挂载点),它就可以像系统上的任何其他目录一样被访问和使用。

mount 命令通常用于在 Linux 上手动挂载文件系统。但是,如果您希望某些文件系统或分区在系统启动时自动挂载,您可以在 /etc/fstab 文件中定义它们。此文件列出了文件系统及其挂载点,以及读写权限和文件系统类型等选项,确保在启动时特定驱动器或分区可用,而无需手动干预。

SWAP

交换空间是 Linux 内存管理的重要组成部分,在确保系统平稳运行方面起着关键作用,尤其是在可用的物理内存(RAM)被完全利用时。当系统物理内存耗尽时,内核会将不活跃的内存页(未立即使用的数据)移动到交换空间,从而释放 RAM 供活跃进程使用。这个过程被称为交换。

创建交换空间

  • mkswap 用于准备设备或文件作为交换空间使用,通过创建 Linux 交换区域
  • swapon 激活交换空间,允许系统使用它

管理

swap space 的大小不是固定的,取决于您的系统物理内存和预期用途。例如,RAM 较少或运行内存密集型应用程序的系统可能需要更多的交换空间。然而,具有大量 RAM 的现代系统可能需要较少甚至不需要交换空间,具体取决于特定的使用案例。

在设置交换空间时,重要的是将其分配在一个独立的分区或文件上,与文件系统的其余部分分开。这可以防止碎片化,并确保在需要时能够高效地使用交换区域。此外,由于敏感数据可能会暂时存储在交换空间中,因此建议对交换空间进行加密,以防止潜在的数据泄露。

用于休眠的交换空间

除了扩展物理内存外,交换空间还用于 hibernation 。休眠是一种节能功能,它将系统的状态(包括打开的应用程序和进程)保存到交换空间,然后关闭系统。当系统重新启动时,它会从交换空间恢复其先前状态,从而继续之前未完成的工作。

容器

容器化是将应用程序打包并在隔离环境中运行的过程,通常称为容器。这些容器为应用程序提供轻量级、一致的环境,确保它们无论部署在哪里都能以相同的方式运行。Docker、Docker Compose 和 Linux 容器(LXC)等技术在 Linux 基于的系统上使容器化成为可能。容器与虚拟机不同,因为它们共享主机系统的内核,因此更加轻量级和高效。借助这些技术,用户可以快速创建、部署和管理应用程序,同时提高安全性、可移植性和可扩展性。

容器高度可配置,允许用户根据其特定需求进行定制,其轻量级特性使得在同一主机系统上同时运行多个容器变得容易。此功能对于扩展应用程序和管理复杂的微服务架构尤其有利。

同样地,容器将应用程序及其所有必需的工具和设置打包在一起,使其能够在不同的系统上一致地运行而不会发生冲突,同时共享同一个“主舞台”(底层系统的资源)。

Docker

Docker 是一个开源平台,用于自动化部署应用程序为自包含的单元,称为容器。它使用分层文件系统和资源隔离功能来提供灵活性和可移植性。此外,它提供了一套强大的工具来创建、部署和管理应用程序,这有助于简化容器化过程。

LXC

Linux 容器( LXC )是一种轻量级的虚拟化技术,允许多个隔离的 Linux 系统(称为容器)在单个主机上运行。LXC 使用关键资源隔离功能,如控制组( cgroups )和 namespaces ,以确保每个容器独立运行。与传统虚拟机不同,后者每个实例都需要完整的操作系统,容器共享主机的内核,这使得 LXC 在资源使用方面更加高效。

LXC 提供了一套全面的工具和 API 用于管理和配置容器,使其成为 Linux 系统上容器化的流行选择。然而,虽然 LXC 和 Docker 都是容器化技术,但它们服务于不同的目的并具有独特的功能。

Category 分类 Description 描述
Approach LXC 通常被视为一种更传统、系统级的容器化工具,专注于创建类似轻量级虚拟机的隔离 Linux 环境。而 Docker 则侧重于应用,意味着它针对打包和部署单个应用或微服务进行了优化。
Image building Docker 使用标准化的镜像格式(Docker 镜像),其中包含运行应用所需的一切(代码、库、配置)。LXC 虽然能够实现类似的功能,但在构建和管理环境方面通常需要更多的手动设置。
Portability Docker 在可移植性方面表现出色。其容器镜像可以通过 Docker Hub 或其他注册中心轻松地在不同系统之间共享。相比之下,LXC 环境在这方面可移植性较差,因为它们与主机系统的配置更紧密地集成。
Easy of use Docker 以简洁为设计理念,提供用户友好的 CLI 和广泛的社会支持。LXC 虽然功能强大,但可能需要更深入了解 Linux 系统管理,对初学者来说不太直接。
Security Docker 容器通常开箱即用更安全,这得益于额外的隔离层,如 AppArmor 和 SELinux,以及其只读文件系统功能。LXC 容器虽然安全,但可能需要额外的配置才能达到 Docker 默认提供的隔离级别。有趣的是,当配置错误时,Docker 和 LXC 都可能成为本地提权的途径(这些技术在我们 Linux 本地提权模块中有详细说明)。