一. 了解Ubuntu

1. Linux是什么

  • Linux 是一个开源的、类 Unix 的操作系统内核。

2. Linux发行版

  • Linux发行版是为了方便人们管理Linux系统(内核和应用程序)而产生的版本。

①Debian

  • Debian 是一个自由且开源的操作系统,其核心是 Linux 内核,但它也可以使用其他内核,如 kFreeBSD 和 Hurd。Debian 是由 Debian 项目开发的,这个项目由志愿者组成,致力于创建一个稳定、高质量且完全自由的软件生态系统。

②Ubuntu

  • Ubuntu 是基于 Debian 的一个开源操作系统,主要由 Canonical Ltd. 和社区开发者共同维护。它旨在为桌面、服务器和云环境提供一个用户友好的、稳定的操作系统。

③Arch Linux

  • Arch Linux 是一个以简单、灵活和滚动更新为核心理念的 Linux 发行版。它面向高级用户和开发者,提供了一个精简且高度可定制的操作系统环境。

④Fedora

  • Fedora 是一个由 Fedora 项目开发和维护的开源 Linux 发行版,该项目得到了 Red Hat 的赞助和支持。它旨在为桌面、服务器和云环境提供一个最新、前沿且稳定的操作系统。

⑤openSUSE

  • openSUSE 是一个由社区驱动的开源 Linux 发行版,由 SUSE 公司和 openSUSE 项目共同维护。它提供了一个稳定、安全且易于使用的操作系统环境,适合桌面、服务器和开发者使用。

⑥CentOS

  • CentOS(Community ENTerprise Operating System)是一个基于 Red Hat Enterprise Linux (RHEL) 的免费开源 Linux 发行版。它旨在为用户提供一个企业级的、稳定的操作系统,具有与 RHEL 相同的功能和兼容性,但不包含官方的商业支持。

⑦Red Hat Enterprise Linux

  • Red Hat Enterprise Linux (RHEL) 是由 Red Hat 公司开发和发布的企业级 Linux 发行版。它被广泛应用于商业和企业环境中,提供高稳定性、安全性和长期支持。

3. 了解Ubuntu

  • Ubuntu桌面版:Ubuntu Desktop 是 Ubuntu 的桌面版,专为个人用户和家庭用户设计,提供了一个用户友好的图形界面,适用于日常计算、办公、浏览网页和多媒体等用途。Ubuntu 22.04LTS默认安装GNOME42

  • Ubuntu服务器版:Ubuntu Server 是针对服务器环境设计的 Ubuntu 版本,旨在提供稳定、安全和高性能的操作系统,用于各种服务器场景,包括云服务器、虚拟机和物理服务器。

  • Ubuntu云版:Ubuntu Cloud 主要指的是用于云计算环境的 Ubuntu 版本,通常包括 Ubuntu Server 和一些特定的云计算工具和服务。

  • Ubuntu优麒麟版:Ubuntu Kylin 是 Ubuntu 的一个官方衍生版,专为中国用户设计。它以 Ubuntu 为基础,进行了本地化的改进和优化,提供了一些特别的功能和工具,以更好地满足中文用户的需求。

4. GNU GPL和POSIX介绍

  • GNU GPL:GNU General Public License (GPL) 是一种广泛使用的自由软件许可证,由自由软件基金会(Free Software Foundation, FSF)创建。GPL 旨在保护软件自由和开放性,确保用户可以自由使用、修改和分发软件。

  • POSIX:POSIX(Portable Operating System Interface)是一个为操作系统提供标准化接口的规范,旨在确保不同操作系统之间的兼容性和可移植性。POSIX 标准定义了操作系统 API、命令行接口、工具和实用程序的行为,以便程序可以在符合 POSIX 的操作系统上编译和运行,而无需修改源代码。

5. 桌面环境

①KDE

  • KDE 是一个流行的开源桌面环境,主要用于 Linux 和其他类 Unix 操作系统。它提供了一个高度可定制和用户友好的图形用户界面。其将常用的配置、插件等都打包到系统设置里。资源消耗大。

  • Ubuntu的分支Kubuntu采用KDE作为默认桌面。

②GNOME

  • 完全基于GPL协议的桌面环境。

  • 标准版Ubuntu的默认桌面环境。

③Xfce

  • 轻量级的桌面环境。

6. 无引号、单引号、双引号

  • 单引号 ('):用于定义字面量字符串,所有内容(包括特殊字符和变量)都被视为字面量,特殊字符不会被解释或替换。

  • 双引号 ("):用于定义可以包含变量替换和特殊字符处理的字符串。变量会被替换,转义字符会被处理。

  • 不加引号:在 Linux 命令行中,如果不使用引号(单引号或双引号),字符串会被 Shell 处理,这通常涉及到变量替换、通配符扩展和空格的处理。

二. 文件系统

1. 文件系统的层次结构

  • Linux系统中,最小的数据存储单位为文件,一切皆文件。

①树形层次结构

  • 在windows系统中,存储空间先分为不同硬盘,在各个硬盘上再划分分区,在每个分区上创建文件系统,在文件系统上创建不同的目录,在目录下创建一个或多个子目录。所以,windows的文件组织也是树形层次结构,但是这个树形结构的根不是唯一的,基本上每个分区都是一个相对独立的树形结构,且树与树之间并没有什么必然联系。如下:

  • 在Linux文件系统中,逻辑上只有一个根文件系统(‘/’),它作为整个文件系统树的根节点。所有的文件和目录都从这个根文件系统开始,构成一个统一的树形结构。所有的存储空间和设备共享一个根目录,不同的磁盘块、不同的分区再挂载上称为某个子目录的子目录,甚至设备也挂载成某个子目录下的一个文件。目录时逻辑上的区分,分区存储设备是物理上的区分。

  • 然而,物理上,整个文件系统可以分布在多个存储设备或分区上。每个存储设备或分区可以被格式化成独立的文件系统,并挂载到根文件系统的某个目录下。这样,用户可以在根文件系统下创建和挂载其他文件系统。

  • 根目录是所有文件和目录所在的地方,需要挂载上一个磁盘分区。

  • 如下:

  • tree 命令,可以查看这种树形的层次结构。tree /home 查看某个文件的结构。

  • 创建不同分区(装不同文件系统)的目的是可以把不同资料放到不同分区中管理,降低风险。此外,大硬盘搜索范围大,效率低,创建分区(文件系统)可以提高效率。

②路径名

  • 绝对路径:文件系统中用来唯一标识文件或目录位置的完整路径。它从文件系统的根目录开始,提供了一个完整的、唯一的路径描述。绝对路径以根目录 / 开始,这表示路径的起点是文件系统的根。绝对路径提供了从根目录到目标文件或目录的完整路径,包括所有中间目录。绝对路径在整个文件系统中是唯一的,可以确保精确地找到文件或目录。可通过pwd 命令查看当前绝对路径。/home/user/documents/file.txt 是一个绝对路径,它从根目录 / 开始,经过 home、user 和 documents 目录,最终指向 file.txt 文件。

  • 相对路径:相对路径是相对于当前工作目录的路径。它不以根目录 / 开始,而是从当前目录开始描述。例如,如果当前目录是 /home/user,那么相对路径 documents/file.txt 指向 /home/user/documents/file.txt 文件。

  • Linux中,相对路径有4种表示方法,‘.’、'..'、‘~user’、‘~’。.表示当前目录,./lin:当前目录下的lib目录。..表示父目录,../lib表示上级目录下的lin目录。~user表示某个用户的主目录,user是用户账号。~表示当前用户的主目录。

③Linux目录结构

  • Linux目录组织参考UNIX,其命名有规律可循。

目录

说明

/bin

包含基本的命令二进制文件(可执行命令),如 ls、cp、mv、cat 等

/boot

存放启动引导文件,如内核映像(vmlinuz)和引导加载程序配置文件(如 grub)

/cdrom

官潘挂载点,在光盘被挂载到 /cdrom 后,用户可以通过访问 /cdrom 目录来浏览和操作光盘中的文件。现代 Linux 系统中,/cdrom 目录可能不会被默认创建或使用,尤其是对于大多数新安装的系统。代替它,系统可能使用 /media 或 /mnt 目录来挂载可移动设备,包括光盘、USB 驱动器等。

/dev

包含设备文件,代表系统中的所有设备(如硬盘、终端、打印机等)

/etc

存放系统配置文件和脚本,如网络配置(network)、用户账户(passwd)、服务配置等。大多数系统服务的配置文件都在这里。

/home

存储普通用户的个人文件和目录。每个用户在 /home 下有一个以其用户名命名的子目录,例如 /home/user。

/lib和lib64

/lib 目录通常包含32位系统和应用程序所需的共享库文件,而 /lib64 目录则专门存放64位系统和应用程序所需的共享库文件。对于64位系统,/lib 还可能包含32位库以支持兼容性,而32位系统则只使用 /lib 目录。

/lost+found

用于存储在文件系统检查和修复过程中恢复的丢失文件。这个目录通常位于每个文件系统的根目录下,fsck 工具会将文件系统损坏或丢失的文件恢复到这里,以便用户检查和处理。恢复的文件可能会被重命名为 inode 编号,并需要用户手动处理。

/media

用于挂载可移动媒体设备(如 CD-ROM、USB 驱动器)的挂载点。

/mnt

用于临时挂载文件系统的挂载点。管理员可以在这里手动挂载文件系统。

/opt

用于安装额外的应用程序软件包。非系统自带的软件通常安装在这里。

/proc

各进程文件存放位置。一个虚拟文件系统,提供内核和系统状态的信息。例如,进程信息(/proc/[pid])、系统信息(/proc/cpuinfo、/proc/meminfo)等。

/root

超级用户(root)的主目录,类似于 /home 下的用户目录,但专用于 root 用户。

/sbin

包含系统管理员使用的二进制文件(如 fsck、shutdown、ifconfig),这些文件通常用于系统维护和管理。

/sys

一个虚拟文件系统,用于提供系统硬件和内核信息的接口。它通过内核与用户空间之间的交互,动态展示系统硬件的状态和配置,例如设备信息、驱动程序参数等。/sys 目录的内容通常是实时生成的,不占用实际磁盘空间,主要用于系统管理和调试。

/tmp

存放临时文件的目录,供系统和应用程序使用。这个目录在系统重启后通常会被清空。

/usr

存放系统的用户程序和数据。/usr 目录下包含 /usr/bin(用户命令)、/usr/lib(共享库)、/usr/share(共享数据)等子目录。

/var

存放可变数据文件,如日志文件(/var/log)、邮件(/var/mail)、缓存(/var/cache)等。

2. 文件类型

①普通文件

  • 在 Linux 文件系统中,普通文件是最常见的一种文件类型,用于存储数据、文本文档、程序、图像等各种内容。

  • 普通文件用于存储实际的数据,可以是文本、二进制数据、图像、音频或其他任何类型的信息。

  • 它的内容是连续的字节流,没有固定的结构,具体内容由文件的类型和用途决定。

  • ls -l 等价于 ll:ls列出目录内容, -l表示详细展示。file 可以查看文件具体类型。

ll
-rw-r--r-- 1 user group 1234 Aug  2 12:34 example.txt
第一个字符 - 表示这是一个普通文件,其后跟着的是文件的权限、链接数、所有者、组、文件大小、修改时间和文件名等信息。

②目录文件

  • 目录文件是用于组织和管理其他文件和子目录的特殊文件。目录文件包含了一个文件列表,指向其包含的文件和子目录的名称及其对应的 inode 号码。通过目录文件,用户和系统可以快速查找和访问存储在该目录中的文件和其他目录。在 ls -l 命令的输出中,目录文件的类型标识为 d,例如 drwxr-xr-x 表示一个目录。

③字符设备文件

  • 字符设备文件代表可以进行字符流数据传输的设备,如终端、串口和某些类型的硬件设备。只能按顺序一字节一字节的读取。这些文件通过逐字符的方式与设备进行数据交换,适用于不需要块操作的设备。字符设备文件的类型在 ls -l 命令的输出中以 c 开头,后跟设备的主设备号和从设备号,例如 crw-rw-r-- 1 root dialout 4, 64 Aug 2 12:34 ttyS0

④块设备文件

  • 在 Linux 文件系统中,块设备文件代表可以进行块级数据传输的设备,如硬盘、SSD 和光盘驱动器。这些设备通过以固定大小的数据块进行数据交换,适用于需要块级操作的设备。块设备文件允许系统高效地读取和写入大块数据。块设备文件的类型在 ls -l 命令的输出中以 b 开头,后跟设备的主设备号和从设备号,例如 brw-rw---- 1 root disk 8, 0 Aug 2 12:34 /dev/sda

  • 支持随机读取,通常配备高速缓存。

  • 字符设备和块设备的定义数据OS的设备访问层,与实际物理设备关系无关系。设备访问层下面是驱动程序,所以只要是驱动提供的方式,都可以使用。

⑤管道

  • 管道文件是一种特殊文件,用于在进程之间传递数据。它允许一个进程的输出直接作为另一个进程的输入,实现数据流的传递和处理。管道文件在 ls -l 命令的输出中以 p 开头,表示管道。管道分为无名管道(用于同一进程组的进程间通信)和命名管道(FIFO,用于不同进程间的通信),后者可以在文件系统中创建并具有明确的路径。管道文件在 ls -l 输出中以 p 开头。

  • 匿名管道:用于临时地连接同一进程组中的进程。创建和使用时,管道的存在仅在进程间有效,例如通过 | 操作符实现的管道。ps -ef | grep mysql 通过|将ps和grep两个命令连接起来,ps -ef 的执行结果会作为grep mysql 命令的输入,经过grep筛选后,才会输出到屏幕上。ls -l /etc | more 。由于没有文件名,匿名管道只能用于具有亲缘关系的进程间通信。

  • 命名管道(FIFO):命名管道克服了以上的限制,其以FIFO的形式存储在文件系统中。命名管道是一个设备文件,只要进程可以访问该路径,就可以通过FIFO相互通信。数据按照先进先出原则,且管道中不保存数据。

  • 管道的创建:Linux提供两种方式创建命名管道,一种是在shell下通过命令交互创建管道,另一种是在程序中调用系统函数创建命名管道。

  • Shell下创建管道:通过mknodmkfifo 两个命令。

VMware-Virtual-Platform:~/demo$ mknod fname p # fname为文件名, p代表文件类型为管道文件
VMware-Virtual-Platform:~/demo$ ls
fname


VMware-Virtual-Platform:~/demo$ mkfifo pname2 # pname2是文件名
VMware-Virtual-Platform:~/demo$ ls
fname  pname2
  • 系统函数创建管道int mkfifo(const char* pathname, mode_t mode); pathname是文件名,mode是文件的访问权限,成功返回0,失败返回-1。该函数在 <sys/types.h><sys/stat.h> 头文件中声明。

  • 命名管道的读写方法

⑤套接字

  • 套接字是进程间通信的特殊文件,与管道不同的是,套接字能通过网络连接不同计算机的进程之间进行通信。在ls命令中,套接字以字母s标识。

  • 套接字不与任何数据块关联。

⑥文件链接

  • 文件链接(file linking)在计算机系统中指的是创建指向一个文件的引用,而不是直接复制文件内容。

  • Inode(索引节点、i节点):文件系统中用于存储文件元数据的数据结构。每个文件或目录在文件系统中都有一个唯一的inode号码,通过该号码,系统可以找到文件的元数据。文件名和inode号码是分开的,文件名映射到文件的inode号码,inode号码则存储实际的文件信息。当文件被创建时,文件系统分配一个inode来存储文件的元数据。

  • 符号链接(软链接)

  • 符号链接是一个特殊的文件,它包含一个指向另一个文件或目录的路径。

  • 符号链接与原始文件是不同的文件,具有自己的 inode 号码。

  • 符号链接可以跨文件系统,并且可以链接目录。

  • 如果原始文件被删除,符号链接会变成一个悬挂链接(dangling link),指向一个不存在的路径。

  • ls命令中以字母l开头。

  • 硬链接

  • 硬链接是文件系统中的一种链接类型,它允许多个目录项指向同一个文件数据块。在文件系统中,硬链接具有相同的 inode 号码,这意味着它们实际指向同一数据块。

  • 硬链接不能跨文件系统,也不能链接目录。

  • 删除硬链接中的一个(文件名)不会删除实际文件数据,只有当所有硬链接都删除时,文件数据才会被删除。

创建硬链接
ln /path/to/original /path/to/hardlink # original原始文件,hardlink硬链接文件

创建软链接
ln -s /path/to/original /path/to/symlink # original原始文件,符号链接文件

ls -il # -i参数是显式i节点

3. 创建文件

①使用touch命令创建文件

  • touch主要功能是为了改变时间戳(访问时间和修改时间),但指定的目标文件不存在时,touch会创建一个空白文件。若touch后的文件已经存在,则会修改目标文件的时间戳为当前系统时间。

  • touch filename

②使用重定向创建文件

  • Linux系统中每个命令的输出都有默认的目标设备(ls, cat, more默认输出设为屏幕,lp等命令默认输出为打印机)。

  • 但提供了一条特殊操作可以改变默认输出的目标文件,即IO重定向。

  • 重定向分为输入重定向和输出重定向,其中输出重定向可以创建文件。

  • 输出重定向两种操作符:>和>> 其区别在于,在文件已经存在情况下,>会覆盖已有文件,>>会追加内容到文件后面,不会清楚原来内容。

  • ll >> filename 将当前文件ll展示的内容存入filename中。

③使用vi命令创建文件

  • vi是UNIX命令,是全屏幕纯文本编辑器。

  • 在Linux中,vi编辑器叫vim, 是vi的增强版,与vi完全兼容,且实现了很多增强的功能。

  • vi编辑器支持两种模式,分别为编辑模式和命令模式,在编辑模式下可以完成文本编辑的功能,在命令模式下可以完成对文件的操作命令。

  • 默认打开vi编辑器后进入命令模式,从命令模式切换到编辑模式使用A、a、O、o、I、i键,从编辑模式切换到命令模式用Esc键。

命令

说明

Ctrl+u

向文件首翻半屏

Ctrl+d

向文件尾翻半屏

Ctrl+f

向文件尾翻一屏

Ctrl+b

向文件首翻一屏

Esc

重编辑模式切换到命令模式

:行号

光标切换到指定行的行首

:$

光标跳转到最后一行的行首

x或X

删除一个字符,x删除光标后的,X删除光标前的。

D

删除从当前光标所在位置到改行行尾的全部字符

dd

删除光标所在行

ndd

删除当前行以及后面的n-1行

p

将剪贴板中的内容粘贴到当前光标所在位置的下方

P

将剪贴板中的内容粘贴到当前光标所在位置的上方

/字符串

从当前光标所在位置开始向文件尾部查找指定字符串的内容,查找的字符串会被加亮显式

?字符串

从当前光标所在位置开始向文件首部查找指定字符串的内容,查找的字符串会被加亮显式

a

在当前字符后添加文本

A

在行末添加文本

i

在当前字符前插入文本

I

在行首插入文本

o

在当前行后面插入一空行

O

在当前行前面插入一空行

:wq

保存并退出

:w

保存

:w!

强制保存

:q

退出

:q!

强制退出

:e 文件名

打开并编辑指定名称的文件

:set number 或 :set nu

显示行号

:set nonumber 或 :set nonu

隐藏行号

:set relativenumber 或 :set rnu

显示相对行号(相对于当前行)

:set number relativenumber

同时显示绝对行号和相对行号

4. 显示文件列表

  • ls option file ,option为选项,file是文件

常用选项

-a

显示所有文件,包括以.开头的隐藏文件(隐藏文件是以.开头的文件)

-A

显示除本目录.和父目录..之外的所有文件,包括隐藏文件

--color

启用彩色输出

-C

多列显示,该选项为默认选项

-F

在每个输出项后追加文件的类型标示符,*表示具有可执行权限的普通文件,/表示目录,@表示符号链接,|表示命令管道FIFO,=表示套接字。当文件为普通文件时,不输出任何标示符。

-i

显示文件的i节点信息

-m

使用逗号分隔每个文件和目录的名称

-R

递归显示目录以及子目录的内容

-l

列出当前目录中文件及子目录的详细信息

-k(-lk)

以KB为单位显示文件大小

-h(-lh)

以易读方式显示文件和目录的大小KB.MB,GB

  • ls 显示非隐藏文件和目录

  • ls -l ll 列出文件及子目录的详细信息

  • ls -lh 以易读方式显示文件和目录的大小KB.MB,GB

5. 显示文件内容

①拼接文件内容:cat命令

  • cat命令基本功能是拼接文本文件内容并输出到屏幕上。但通常用来显示某个文件内容。

  • cat option file option是选项,-n和-b(忽略空行)添加行号,-s用来压缩空白行。file为要显示的文件。

  • cat file | more 通过管道实现分屏,cat file的结果作为more的输入,然后通过空格键切换页面。

  • cat file1 file2 > file3 通过cat合并文件,当cat后有多个文件,会将这些文件的内容拼接起来。>重定向到file3创建了文件。

②分屏显示:more命令

  • more命令以全屏幕方式分页显示文件的内容,一次显示一屏,满屏后暂停,在底部有一个已显示的百分比。

  • more option file option选项:-数字用来指定每屏要显示的行数,-c表示不滚动屏幕直接刷新,-s压缩空白行,-d 选项会在尝试滚动到文件末尾时显示一条提示信息,告知用户无法再继续查看 。

  • more -dc -20 file 每屏显示20行,不滚动直接刷新,末尾告知。

more后操作

说明

按空格键

显示文本下一屏内容

按Enter键

显示文本下一行内容

按/

接着输入一个字符串,在文本中寻找下一个相匹配的字符串

按h键

显示帮助屏,该屏上有相关的帮助信息

按b键

显示上一屏

按q键

退出more命令

③前后翻页分屏显示:less命令

  • less实现了more的功能,但比more更先进。对于大文件,less性能更优,不用刚开始就把整个文件读入内存。

  • less命令语法与more相似。less可通过up和page down前后翻页, q退出less命令。

④查看前几行内容:head命令

  • head命令用来查看文件开头部分。

  • head option file option是选项:-n表示要输出的行数,-c表示要显示的字符数,file是文件。

  • head -n 15 file 显示file的前15行。

  • head -c 30 file 显示file前30个字符。

⑤查看最后几行内容:tail命令

  • tail option file option是选项:-f使得tail随时检查目标文件是否发生变化,若检查到文件的内容有所增长,则会把增长的部分实时输出到屏幕上。-n指定要输出的行数。

  • 在使用含有-f选项的命令时,可按Ctrl+C组合键退出命令。

  • tail -n 3 -f file 实时显示后3行。

6. 文件的常用操作

①复制文件

  • 复制文件是为现有的文件创建一个副本。

  • cp option source dest option为选项,source为源文件或目录,dest问目标文件或目录。原始文件和目标文件都可以通过绝对路径或相对路径来表示。source若是多个文件,文件名用空格隔开。

  • cp ./*.txt backup/cp支持文件通配符,将当前目录中所有txt文件,复制到backup目录中。

  • 可通过cp实现文件重命名。

cp option常用选项

-d

当复制符号链接时,把目标文件或目录也建立为符号链接,并指向与源文件或目录连接的原始文件或目录

-f

强行复制文件或目录,不管目标文件或目录是否已存在

-i

覆盖已有文件之前先询问用户

-l

对源文件建立硬链接,而非复制文件

-p

保留源文件或目录的属性

-R/-r(cp复制目录时,必加)

递归复制文件或目录

-s

对源文件建立符号链接,而非复制文件

-u

使用这项参数后,只会在源文件的更改时间较目标文件更新时,或名称相互对应的目标文件不存在时,才会复制文件

-S

在备份文件时,用指定的后缀SUFFIX代替文件默认的后缀

-b

覆盖已存在的文件目标前将目标文件备份

②移动文件

  • 移动文件只改变源文件在整个目录的位置,不会创建副本。

  • mv option source dest option是命令选项,source是源文件,dest是目标文件或目录。source若是多个文件,文件名用空格隔开

  • mv也支持通配符,实现批量转移。

mv option常用选项

--backup=备份模式

  • 若需覆盖文件,则覆盖前先行备份。备份模式:none不创建备份(默认行为)

  • numbered备份文件会编号,例如 file~1~ 表示第一个备份,file~2~ 表示第二个备份,以此类推

  • t备份文件会带有时间戳,例如 file~20240805~,这有助于按时间排序备份文件

  • existing备份文件使用现有文件名。如果目标位置已有备份文件,则新的备份将会覆盖旧的备份文件。这种方式会保留最新的备份,但可能会丢失旧的备份

  • simple备份文件使用简单的命名方式(通常是 文件名~)。这种方式不会覆盖现有的备份文件,每次备份都会创建一个新的文件,备份文件会按照简单的命名规则来区分。

-b

当文件存在时,覆盖前会为其创建备份。与--backup类似,但不接受参数。

-f

若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录

-i

覆盖前询问用户,若源文件与目标文件或目标目录中的文件重名,则询问用户是否覆盖目标文件。y同意,n拒绝,避免将文件覆盖。

-S 后缀

为备份文件指定后缀,默认为~。mv -b -S .bak aw ./detail

③删除文件

  • 适用通配符进行批量操作。

  • rm option file option为选项,file为要删除的文件或目录。file若是多个文件,文件名用空格隔开。

rm option常用命令

-f

强制删除文件,不给任何提示

-i

交互式删除,删除前提示

-r

递归删除

④比较文件

  • diff option file1 file2 option是命令选项,file是文件或目录。

diff option常用选项

-b

不检查空格字符的不同

-B

不检查空行的不同

-c

使用上下文输出格式

-i

不检查大小写的不同

-r

在对比目录时,递归比较其所包含的子目录中的文件的不同

-x

不比较该选项中指定的文件或目录的不同

-y

以并列的方式显示文件不同

# diff file1.txt file2.txt
2c2,2
< This is a test
---
> This is an experiment
  • <:表示 文件1 中的行。>:表示 文件2 中的行。---***:用于分隔不同的文件或版本。

  • 2c2,2 是一种差异的表示语法,由3部分组成。第1部分的数字1表示第一个文件中的行号,2c2,2中的第一个2表示第一个文件的第二行。中间字母表示是由什么原因造成不同,c表示修改,a表示增加,d表示删除。最后一组数字表示第2个文件中相应行号,2,2表示2-2行。

⑤重命名文件

  • 通过mv完成。

7. 搜索文件

①快速搜索文件:locate命令

  • 该命令是Linux中搜索最快的命令,因为其不是实时在文件系统中搜索目标文件,而是通过一个数据库索引来搜索的。

  • 与locate命令有关的文件有updatedb、/etc/updatedb.cof、/var/lib/mlocate/mlocate.db。/var/lib/mlocate/mlocate.db是一个文件索引数据库文件,里面包含locate搜索所需要的信息。updatedb是一个命令,用来更新/var/lib/mlocate/mlocate.db的内容,通常updatedb由crontab定期自动执行,也可以手动执行。/etc/updatedb.cof用来配置要查询哪些目录或文件。

  • locate option pattern option是命令选项,pattern是匹配模式,可以是文件名一部分,也可以使用通配符,默认模糊匹配只要包含pattern即可。

locate option常用选项

-c

控制locate命令输出搜索结果的数量

-i

忽略字母大小写

-b

精确匹配

②按类型搜索文件:whereis命令

  • whereis主要用来定位可执行文件、源代码文件、帮助文件在文件系统中的位置。与其他搜索命令不同的是,默认下,whereis命令仅搜索特定的位置,这些位置包含PATH和MANPATH系统变量指定的路径等。用户可通过选项来指定其他的路径。

  • whereis [option] [-BMS dir -f] name option主要有3个选项,-b指定搜索二进制文件,-m指定搜索命令手册,-s指定搜索源代码文件。-B, -M, -S这三个选项用来指定whereis命令搜索的路径,分别针对二进制、命令手册、源代码文件,搜索路径跟在这三个选项后面,多个路径用空格分开,最后以-f结尾。name为搜索的文件名,可通配符。

  • whereis -bms -B . -f a 三种文件类型,指定当前目录,文件名含a。

③搜索二进制文件:which

  • which命令依赖于PATH系统变量,只在文件名中搜索,不支持通配符。

  • which filename filename为文件名

④全功能搜索文件:find

  • 全磁盘实时搜索。

  • find [start-point] [expression] start-point指搜索起始位置,没指定则默认当前工作目录。expression指搜索表达式,主要表达搜索什么样的文件以及如何处理搜索到的文件。

  • 支持通配符。

  • 搜索表达式包含以下几个部分

  • [1] 匹配条件:匹配条件返回真或假,通常基于文件的某些属性,例如文件名、修改时间等。

  • [2] 动作:表示对搜索结果的处理方法,例如打印、删除等。

  • [3] 全局选项:该选项会影响所有的匹配条件和动作。

  • [4] 局部选项:该类选项只会影响跟在他们后面的匹配条件或动作。

  • [5] 运算符:主要用来连接搜索表达式中的各个部分。

find命令常用参数

全局选项

-name

  • 按文件名查找

  • find /路径 -name "文件名"

-iname

  • 按文件名查找,不区分大小写。

  • find /路径 -iname "文件名"

-type

  • 按文件类型查找。

  • f普通文件,d目录,l符号链接。

  • find /路径 -type f

-size

  • 按文件大小查找。

  • +:大于指定大小

  • -:小于指定大小

  • c:字节,k:千字节,M:兆字节

  • find /路径 -size +100M

-mtime

  • 按修改时间查找。

  • +n:n天前

  • -n:n天内

  • n:正好n天

  • find /路径 -mtime -7

-atime

  • 按访问时间查找。

  • find /路径 -atime +30

-ctime

  • 按状态变化时间查找。

  • find /路径 -ctime -1

-perm

  • 按权限查找

  • mode:权限模式,如 644

  • +mode:匹配所有具有指定权限的文件

  • -mode:匹配所有具有指定权限的文件(缺失的权限被忽略)

  • find /路径 -perm 755

执行动作

-print

  • 打印匹配的文件(默认动作)。

  • find /路径 -name "*.txt" -print

-exec

  • 对匹配的文件执行命令。

  • find /路径 -name "*.log" -exec ls -l {} \;

  • {} 是匹配的文件名的占位符。

  • \; 用于结束 -exec 命令。\是转义字符。

-delete

  • 删除匹配的文件(小心使用)。

  • find /路径 -name "*.tmp" -delete

-print0 和 -0

  • 处理包含空格或特殊字符的文件名。

  • find /路径 -print0 | xargs -0 rm 组合使用 findxargs 来查找并删除文件,处理文件名中包含空格或特殊字符的情况。

  • -print0:将匹配的文件路径用 null 字符 (\0) 作为分隔符输出,而不是换行符。这样可以正确处理文件名中包含空格或特殊字符的情况。

  • 管道符|将 find 命令的输出传递给 xargs 命令作为输入。

  • xargs:构造并执行命令,用于处理从标准输入接收到的文件列表。

  • -0:指定 xargs 以 null 字符 (\0) 为分隔符来读取输入。这与 find-print0 选项配合使用,以确保正确处理包含空格和特殊字符的文件名。

  • rm:删除文件的命令。

  • -

  • 假设我们有一个目录 /example,其中包含以下文件:

    • file with spaces.txt

    • file\nwith\nnewlines.txt

  • find /example -print0

  • 输出:/example/file with spaces.txt\0/example/file\nwith\nnewlines.txt\0

运算符

-and 或 -a

  • 与逻辑运算(默认行为)。

  • find /路径 -type f -name "*.txt" -and -size +1M

-or 或 -o

  • 或逻辑运算。

  • find /路径 -type f -name "*.txt" -or -name "*.md"

-not 或 !

  • 逻辑非运算。

  • find /路径 -not -name "*.bak"

()

  • 用于组合多个条件,需要用 \ 转义。

  • find /路径 \( -name "*.txt" -or -name "*.md" \) -and -size +1M

8. 文本内容筛选

①使用grep命令检索文本内容

  • grep [option] pattern [file] option是命令选项,pattern是要匹配的字符串或正则表达式,file是要搜索的文件。

grep option常用选项

-c

不输出具体内容,只输出含有匹配文本的行数。

-e

指定要匹配的字符串,当pattern含空格等特殊字符,用"pattern"表示一个整体,其余情况pattern和"pattern"一样。

-E

表示pattern为扩展正则表达式

-F

按照字符串字面意思处理,不作为正则表达式处理

-i

忽略大小写

-r

递归搜索指定的目录

-n

显示匹配的行号

  • grep "main" file.c hello.c 从后两个字符串搜索字符串"main"

  • grep -e "main" -e "print" . -r 递归搜索当前目录下文件含"main"或"print"字符串的文件。

  • grep "main" . -r | more 将找到符合条件的文件给more输出。

②筛选其他命令输出的结果

  • ps -ef | grep -i mysql 判断mysql服务进程是否存在

③在grep命令中使用正则表达式

常用正则表达式

^

匹配行首

$

匹配行尾

[ ]or[n-n]

匹配方括号内任意字符

.

匹配任意单字符

*

跟在某个字符后面,表示0个或多个前面的字符

\

转义字符

\?

匹配前面的字符0次或1次

\+

匹配前面的字符1次或多次

X\{m\}

匹配字符X m次

X\{m,\}

匹配字符X最少m次

X\{m,n\}

匹配字符X,m~n次

\|

或关系

  • grep "loved\?" demo.txt

9. 文本排序

  • sort [option] file option表示命令选项,file是要排序的文件。

sort option常用选项

-b

忽略每行开头的空格字符

-c

检查目标文本文件是否已经排序,已经排序无提示,否则提示无序

-d

排序时只考虑空格、英文字母和数字

-f

排序时将小写字母视为大写字母

-n

依照数值的大小排序

-r

以相反的顺序排序

-o filename

将排序后的结果存入filename文件

-m

合并有序文件,合并后的文件仍是有序的

  • sort demo.txt -o sorted.txt

  • sort -m sorted1.txt sorted2.txt

10. 文件的压缩、解压和打包

  • 注意:除zip外,gzip、compress、bzip2命令都不会将多个文件压缩为单个文件。

①压缩文件

  • zip命令(.zip)

  • zip [option] zipfile file option为常用命令选项,zipfile为压缩后的文件名,file为要压缩的文件,多个文件名用空格隔开(多个压缩在一起),可使用通配符。

zip常用option

-d

从压缩文件中删除指定的文件

-m

把文件压缩并加入压缩文件后,删除原始文件。

-r

递归处理

  • zip -d src.zip file.c 从压缩文件src.zip中删除file.c


  • gzip命令(.gz)

  • gzip [option] [name..] option是命令选项,name...可是多个名字或通配符。

gzip常用option

-d

解压缩文件

-l

列出压缩文件中每个文件的信息

-r

递归处理

-k

压缩时,保留原始文件

  • gzip *.log 默认gzip将文件逐个压缩(没有压缩在一起),压缩文件以源文件名+.gz,操作完成后源文件被删除。

  • gzip不可将多个文件压缩为一个,但是可结合tar命令实现这个操作。


  • compress命令(.Z):语法同gzip


  • bzip2(.bz2)

  • bzip2 [option] [name...] option是命令选项,name...可是多个名字或通配符(单独压缩)。

  • 压缩名字为原来名字+.bz2,操作完成后源文件被删除。

bzip2常用option

-d

解压缩文件

-f

压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件,若要覆盖使用此选项

-r

递归处理

-k

压缩时,保留原始文件

②解压文件

  • zip、gzip、cpmpress、bzip2对应解压缩命令为:unzip、gunzip、uncompress、bunzip2。

③打包文件

  • tar [option]... file... option为命令选项,file...为多个文件或目录,支持通配符。

  • tar主要用于将多个文件和目录打包成一个归档文件(.tar),而压缩命令(如 gzip、bzip2、xz)用于将文件或归档文件压缩以减少其大小。tar 不进行压缩,只打包,而压缩命令则专注于压缩。通常,它们结合使用,如 tar 与 gzip 结合创建 .tar.gz 文件,以同时打包和压缩数据。

tar常用option

-c

创建新的归档文件(打包)

-x

从归档文件中提取文件(解包)

-f <文件名>

指定文件名

-v

显示操作的详细信息

-z

通过gzip压缩归档文件

-j

通过bzip2压缩归档文件

--exclude=<模式>

排除匹配模式的文件

--list

列出归档文件的内容

--preserve-permissions

保留原始文件的权限和所有权信息

  • tar -cf documents.tar /home/user/documents 将/home/user/documents目录打包成documents.tar

  • tar -xf documents.tar 解包documents.tar

  • tar -czf documents.tar.gz /home/user/documents 压缩打包

  • tar -xzf documents.tar.gz 解包解压缩

  • tar --list -f documents.tar 显示包内容

  • tar -cf documents.tar --exclude='*.txt' /home/user/documents 将/home/user/documents目录打包成documents.tar, 排除.txt文件

  • tar --preserve-permissions -cf documents.tar /home/user/documents 保留权限和所有权的归档文件

11. 目录管理

①显示当前工作目录

  • pwd

②改变目录

  • cd [option] path option为命令选项,path为路径。

  • option:-P若切换到的目标目录是一个符号链接,直接切换到符号链接指向的目标目录;-L若若切换到的目标目录是一个符号链接,直接切换到字符链接代表的目录,而非符号链接指向的目录。

③创建目录

  • mkdir [option]... directory... option为命令选项,directory...以空格分开的多个目录。

  • option只有-p:若父目录不存在,先创建父目录。

④移动目录

  • mv source dest source是要移动的源目录,dest是目的地目录。

⑤复制目录

  • cp -r source dest 将source目录复制到dest目录中

⑥删除目录

  • rm -r name 删除名为name的目录

三. 用户和权限管理

1. 用户和用户组

①用户和用户标识号(UID)

  • 用户登录的时候用的是账号和密码,但Linux并不认识用户账号,在Linux系统中唯一标识用户的是一个整数值,即用户标识号。

  • 其中0为超级用户root。1-499是系统用户,用来保证系统服务正常运行,一般不会登陆Linux系统。500-60000为普通用户,这些用户可以登录系统,并且拥有一定的权限。

  • 当管理员添加用户时,通常Linux系统会为其分配这个范围内的用户标识号。

  • 登录名和用户标识号并不一定一一对应,实际上,Linux允许几个登录名对应同一个用户标识号。

  • 用户账号和UID对应关系在:/etc/passwd 文件中。

②用户组和组标识号(GID)

  • 所谓用户组,是指一组权限和功能类似的用户的集合。

  • Linux系统本身预定义了许多与系统功能有关的用户组,例如root、daemon、bin以及sys等。用户也可以根据自己的需求添加用户组。

  • 用户组拥有组名、组标识号及组成员等属性。通过组标识号来标识用户组,组标识号也是一个整数值。

  • 用户组的信息保存在/etc/group文件中。

③/etc/passwd文件

  • 该文件存储了当前系统的用户账户信息,文件所有者为root,所属组为root。对于该文件,只有root用户才有写入权限,其他的用户和组只有读取权限。

  • 该文件中,每一行代表一个用户,7个字段,用冒号 : 分隔。

  • 用户名:密码:用户ID:组ID:注释:家目录:Shell程序 jdoe:x:1001:1001:John Doe:/home/jdoe:/bin/bash

  • 用户名:区分不同用户,用户名唯一。

  • 密码:可选项,为空表示无密码;若该字段为小写x,则表示密码存在/etc/shadow文件中;若为其他的字符串,则视为加密后的密码。

  • 用户ID(标识号):唯一用户标识,区分不同用户,可存在多个用户拥有同一个用户ID,其实都是一个用户。

  • 组ID(标识号):用户的主用户组标识。每个用户可属于多个组。除了passwd文件中指定其归属的基本组外,还可在/etc/group文件中指明一个组所包含的用户。

  • 注释:包含用户的一些信息

  • 家目录:root是/root, 其他是/home/用户名

  • Shell程序:用户登录后默认启动的Shell程序,需要指定绝对路径。

④/etc/shadow文件

  • 该文件包含当前系统中的用户密码以及密码过期时间等信息。

  • 该文件只对root及同组成员可读(不同于/etc/passwd对于所有用户都可读),只有root可写。

  • 每一行描述一项密码信息,由冒号隔开的9个字段。

  • 用户名:加密密码:最后一次修改日期:最小时间间隔:最大时间间隔:警告时间:密码禁用期:账户失效时间:保留字段

  • jdoe:$6$abcd1234$...:18567:0:99999:7:14:0:

  • 用户名:同上。

  • 加密密码:为空表示无需密码;含*或!等特殊字符,表示用户无法通过密码认证登录,但可通过其他方式认证登录。*表示账户被锁定,!表示密码被锁定,!后为原有密码。以$数字$开头表示使用了对应加密算法。

  • 最后一次修改日期:以天为单位,从1970年1月1日算起。0表示下次登录需要修改密码,空串表示禁用该功能。

  • 最小时间间隔:表示用户修改密码后,至少多长时间后才允许再次修改。空串或0表示没有限制。

  • 最大时间间隔:表示当前密码有效的最长时间。空字段则表示没有限制。最大时间间隔<最小时间间隔则无法修改。

  • 警告时间:密码过期之前,在登录时发出警告的天数。0或空串表示无警告时间。

  • 密码禁用期:表示密码过期后,仍然接受该密码的最长天数,超过则用户无法登录。空串表示无限制。

  • 账户失效时间:表示账户有效期,从1970年1月1日算起。空串表示永不过期。

  • 保留字段:保留将来使用。

⑤/etc/group文件

  • 保存当前系统用户组信息。

  • 每行描述一个用户组,由4个字段组成,冒号隔开。

  • 该文件所有者为root用户,对于所有用户都可读,只有root可写。

  • 若/etc/passwd中指定的用户组在/etc/group中不存在,则用户无法登录。

  • 组名:密码:组ID:成员列表 admin:x:1001:jdoe,smith

  • 组名:用户组名称。

  • 密码:一般Linux系统用户组无密码,该字段一般为空或小写x。

  • 组ID(GID):整数值。

  • 成员列表:由逗号隔开的组内用户。

2. 用户管理

①添加用户:useradd命令

  • useradd [option] login option是命令选项,login是登录用户名(系统中唯一)。

useradd常用option

-b

指定基目录。若无-d指定主目录,则采用基目录加上用户登录名作为主目录。若无-m选项,则指定的基目录必须存在。若没指定基目录,则使用/etc/default/useradd中的HOME变量的值或取默认的/home。

-c

指定用户的注释信息

-d

指定用户主目录。目录不一定存在,必要时创建

-e

指定用户失效信息,格式为YYYY-MM-DD。若没指定,则使用/etc/default/useradd中的EXPIRE变量的值;若为空字符串,则表示永不过期。

-f

选项用于设置用户密码过期后的宽限期(即在密码过期后,用户账户仍然可以使用的天数)。0表示立即禁用,-1表示不禁用用户。若无指定,取/etc/default/useradd中的INACTIVE或者为-1。

-g

指定用户的主组,可使用组名或组ID,组必须存在。若没指定,则依赖于/etc/login.defs中的USERFROUPS_ENAB变量的值。若值为yes,useradd会为新用户自动创建一个组,组名与登录名相同;若为no,则该命令会把新用户的主组设为/etc/default/useradd中的GROUP的值,或取默认值100.

-G

指定新用户的附加组,多个组名间用逗号隔开,中间无空格。

-m

若主目录不存在自动创建。没指定-m,则通常不会自动创建主目录。

-M

不创建用户主目录

-r

创建一个系统用户。UID取值范围为100-999, 且不会自动为新用户创建主目录

-s

指定默认Shell程序,需要绝对路径

-u

手动指定UID,必须在当前系统唯一

②添加用户:adduser命令

  • adduser [option] user option是命令选项,user是用户名。

adduser常用option

--disabled-login

不为新用户设置密码。意味着用户无法登录系统,除非为他设置了密码。

--disabled-password

创建用户时禁用密码,使用户无法通过密码登录,但可用别的方式认证。

--gid

若创建一个用户组,则用来指定GID

--group

创建一个用户组

--home

指定用户主目录,不存在则创建。

--shell

指定用户默认的shell程序

--ingroup

指定用户的主组。如果指定的组不存在,会自动创建。

--system

创建一个系统用户

--no-create-home

不创建用户主目录

--uid

指定UID

--add_extra_groups

指定用户的附加用户组

③修改用户:usermod命令

  • usermod [option] login option为命令选项,login为用户名。

usermod常用option

-a

将用户添加到指定的附加组,该选项只能和-G一起使用。

-c

修改注释。

-d

指定用户主目录,若指定了-m,则当前用户主目录中的内容会被移动到新的主目录当中。

-e

指定用户失效日期。这意味着用户账户将在指定日期后被禁用,用户将无法再登录系统。指定为""表示解禁。年-月-日usermod --expiredate YYYY-MM-DD 用户名

-f

指定密码过期后,账户被禁用前的天数。0表示立即禁用,-1表示不禁用。

-g

修改主组,指定的组必须存在。在用户主目录中,属于原来的主组的文件将转交给新组所有。主目录之外的文件所属组必须手动修改。

-G

指定附加组,多个逗号隔开

-l

修改用户登录名

-L

锁定用户账户密码认证,该操作会在用户加密的密码前加一个!

-m

将用户主目录中的文件移动到新位置,需配合-d

-s

修改用户默认Shell

-u

指定新UID

-U

解除用户密码认证锁定,将移除用户加密密码前的!

④删除用户:userdel命令

  • userdel [option] login option是命令选项,login是用户名。

userdel常用option

-f

强制删除,即使其处于登录状态

-r

用户主目录中的文件将随用户主目录和邮箱一起删除,在其他文件系统中的文件必须手动搜索并删除。

⑤修改用户密码:passwd命令

  • 系统管理员可修改指定用户密码,普通用户只能修改自己的密码。

  • passwd [option] login option是命令选项,login是用户名。

  • 修改自己密码,可不写login。

passwd常用option

-a

显示所有用户状态,需要和-S一起用。

-d

删除用户密码,用户无需密码就可登录。

-e

设置用户密码立即过期。

-i

设置用户密码过期后指定的天数禁用该账户

-l

锁定用户密码,在用户加密密码前加!(并没有禁用账户,只是禁用通过密码认证登录)

-S

显示账户状态信息,7个字段。1是登录名;2是用户账户已经锁定密码(L), 没有密码(NP),密码可用(P);3是最后一次更改密码日期;4是密码最小时间间隔;5是最大时间间隔;6是警告期;7是禁用期限。都以天为单位。

-u

解锁用户密码

⑥显示用户信息:id命令

  • id [option] [user] option是常用命令选项,user可为多个用户名。

  • id会显示当前已登录的用户的信息。

id常用option

-g

仅显示有效的组id

-G

显示所有的组id

-n

显示名称,而不是数字

-u

显示有效用户Id

⑦用户间切换:su命令

  • su [option] login option是常用命令选项,login为用户名。若没提供login,表示切换到root用户。

su常用option

-c

指定切换后执行的shell命令

-或-l

提供一个类似于用户直接登录的环境

-s

指定切换后使用的Shell程序

⑧受限的特权:sudo命令

  • sudo("superuser do" 的缩写)是一个允许用户以另一个用户身份(通常是超级用户 root)执行命令的工具。它在 Unix 和 Linux 系统中非常常见,提供了一种安全、审计的方式来执行需要管理员权限的操作,而不需要直接切换到超级用户。

  • sudo [option] command option是常用命令选项,command是要执行的命令。

  • sudo命令最重要的一个配置文件是/etc/sudoers,其保存了哪些用户可以执行sudo命令,以及该用户可执行哪些特权命令。

  • sudo su -或sudo su 切换到root用户。

sudo常用option

-b

在后台执行指定命令

-g

以指定的用户组作为主组运行指定的命令

-l

列出指定用户可以执行的命令

-U

与-l配合使用,列出指定用户可以执行的命令

-u

以指定用户的身份执行命令

3. 用户组管理

①添加用户组:groupadd命令

  • groupadd [options] group options是常用命令选项,group是组名。

groupadd常用option

-g

指定新的用户组的GID

-r

创建系统用户组

②添加用户组:addgroup命令

  • addgroup实际上是adduser命令的符号链接。

  • addgroup group group是组名

③修改用户组:groupmod命令

  • groupmod [option] group option是命令选项,group是要修改的组名。

groupmod常用option

-n

指定新组名,新组名不能与/etc/group中的重复

-g

指定新GID,不能重复。

④删除用户组:groupdel命令

  • 在删除用户组时,若该组为某用户的主组,则不能删除,需要先将把该组作为主组的用户从该组移除。附加组不影响。

  • groupdel group group为组名

4. 权限管理

①介绍

  • Linux系统的权限可分为权限组、基本权限类型、特殊权限类型、控制访问列表。

  • 权限组:文件的权限组分为所有者(u)、所属组(g)、其他组(o)3种。

  • 基本权限类型:读、写、执行。

  • 特殊权限类型:setuid、setgid、粘滞位。

  • 访问控制列表:可单独控制具体用户,减小了上面粒度较大的问题。

  • 基本权限

  • 基本权限分为3个权限组,分别为文件所有者、文件所属组、其他用户。d rwx rwx r-x 三个位置代表一个权限组的权限。

  • 文件所有者(u表示):一般指文件的创建者,谁创建文件,默认称为该文件所有者。通常,文件所有者对该文件拥有全部权限。

  • 文件所属组(g):指某个用户组对该文件的访问权限。

  • 其他用户(o):指除文件所有者和所属组之外的系统中的其他用户对该文件的访问权限。

  • 所有用户用a表示。

  • 对于每个文件或目录,都有3种基本权限类型,分别为读、写、执行。读指读取文件内容,写指写入或修改文件内容,执行指用户能执行该文件或进入某个目录。三个权限类型分别用r、w、x表示。若无这种权限,用连字符-表示。

  • 除了这种字母表示外,还支持另一种二进制数字表示法,即分别用二进制100、010、001表示读、写、执行权限,转换成十进制就是4、2、1。7代表拥有所有权限。777表示三个权限组每个都有读写执行的权限。

  • -

  • 特殊权限

  • 3种特殊权限,setuid、setgid、粘滞位。前两者是为了使某个程序在执行时能够得到权限提升而设置的,而后者则是为了保护文件或者目录不被他人删除而设置的。前两者通常设置在可执行文件上,后一个通常设置在目录或非可执行文件上

  • setuid和setgid分别允许用户以文件所有者和文件所属组的身份执行某个文件。这两种权限适合于某个任务所需的权限高于运行者所拥有的权限,而为了运行这个任务,允许用户暂时提高权限。

  • setuid:在程序执行时设置其为文件所有者的id,即:只要有执行该程序的权限,那么该程序执行时,就相当于该程序的所有者在执行。

  • setgid:程序在执行时,执行者拥有文件所属组所拥有的权限。

  • setuid和setgid用字符s表示,setuid占用所有者权限的第三个字符x所在的位置,setgid占用文件所属组权限的第三个字符x所在的位置。若只有setuid或setgid,而无x权限,则用S表示,都有是小写s。

  • 二进制表示法中,setuid在权限的最高位上用十进制数字4表示,而setgid在权限最高位上用十进制数字2表示。

  • 粘滞位:为/tmp目录设置粘滞位后,只有文件的所有者才可以修改或删除/tmp目录中的文件。

  • 其在文件权限中用字符t表示,占用其他用户权限的第三个字符x所在的位置。若只有粘滞位而无执行权限,用T表示,都有是t。

  • 二进制表示:最高位上用十进制数字1表示。

②显示文件权限

③修改文件权限

  • chmod option... permission file...

  • file...多个文件用空格隔开,支持通配符。

  • option表示命令选项,常用的是-R或-recursive,该选项表示递归修改文件权限。

  • permission参数表示文件的权限,可用字符也可用数字表示。

  • 所有者、所属组、其他用户,用u、g、o表示。

  • +表示增加权限,-表示删除权限。

  • file是目录或文件名。

chmod g+w dir1 # 将dir1的访问权限设置为所在组可写。
chmod g-w dir1 # 将dir1的访问权限设置为所在组不可写。
chmod g+w,o-w dir1 # 设置多个权限组
chmod g+w-r,o-w dir1 # 多个权限组合
chmod a+rwx dir1 #为所有用户都增加rwx
chmod g=rw dir1 #为所属组增加rw
chmod u=rwx,g=rw,o=r hello.sh
chmod 764 hello.sh
  • 通过数值修改:若无特殊权限,文件权限可用3位十进制数字表示,第1位表示所有者,第2位表示所属组,第3位表示其他用户。

  • 每位十进制数字都是3种权限数值的和。例如,7表示可读可写可执行,7=4+2+1;5=4+1,表示可读可执行。

  • 751:所有者可读可写可执行,所属组可读可执行,其他用户可执行。

chmod 751 dir1

④更改文件所有权

  • 默认文件所有者是文件的创建者。

  • chown [option] [owner][:[group]] file...

  • option表示命令选项,常用的是-R或-recursive,该选项表示递归修改文件权限。--from表示只更改当前的所有者匹配指定的用户的文件。

  • owner是文件的新的所有者,必须是有效账号。

  • group是所属组,通过该命令可修改所属组,若group为空,表示只修改文件所有者,否则都修改

  • file表示文件, 多个可空格隔开,支持通配符。

sudo chown root: dir1 # dir1所有者更为root,不更改所属组,sudo命令用来以root用户的身份执行某个命令(系统配置方面的任务)

sudo chown :root dir1 # 所属组修改
  • chgrp group file...来更改文件或目录的所属组,语法与chown基本相同。group为新组名,file为多个文件空格隔开,支持通配符。

⑤文件的特殊权限

chmod u+s data #为data文件设置setuid权限
chmod g+s data #由于setgid权限也用s表示, 只是位置不同,u改为g即可
chmod o+t data #设置其他用户,粘滞位

# 数值表示, 特殊权限的数值放在最高位即可
chmod 4751 dir1 #为dir1目录设置setuid权限,4是setuid权限,751是普通权限。 

⑥访问控制列表(ACL)

[d[efault]] u[ser]:uid:[perms]
[d[efault]] g[roup]:gid:[perms]
[d[efault]] m[ask]:[perms]
[d[efault]] o[ther]:[perms]
最前面的default表示设置默认ACL规则,可选的。默认ACL规则主要针对目录,当某个目录被设置了默认ACL规则后,在该目录中创建的文件都会继承该ACL规则

第1条针对特定用户:u:joe:rwx、user:joe:rwx。用户joe有读写执行权限。uid没指定默认为文件所有者

第2条针对用户组:g:staff:rw-, 组staff有rw权限。gid没指定,默认所属组

第3条设置了有效掩码。有效掩码指定了用户和组对该文件的最大访问权限,除所有者外,有效掩码控制了组和其他用户的权限,确保即使在 ACL 中为某个用户或组设置了更高的权限,实际有效的权限也不会超过掩码设置的限制。例如,如果有效掩码设置为 r-x,那么即使 ACL 中为某个用户或组设置了 rw- 权限,该用户或组实际拥有的权限也只能是 r-x。

第4条针对其他用户:o:r--
  • getfacl查询文件ACL

  • getfacl file... file...多个文件空格隔开,支持通配符。

  • 使用ls -l显示文件权限时,若文件被设置了ACL规则,且已经设置了权限掩码,则中间的那组权限代表的不是所属组的权限,而是访问掩码。

# file: hello.sh
# owner: liu
# group: liu
user::rwx # 文件所有者权限
user:joe:rwx #用户joe权限,实际为r-x
group::r-x # 所属组权限
mask::r-x # 有效掩码
other::r-x # 其他用户权限
  • setfacl设置ACL

  • setfacl [option] file... option是常用命令选项,file...多个文件空格隔开,支持通配符。

setfacl常用option

-b

删除所有的扩展ACL规则。所有者、所属组、其他用户等基本ACL规则将被保留。

-k

删除默认的ACL规则

-m

修改文件的ACL规则

-n

不重新计算有效权限掩码。默认会重新计算

--mask

重新计算有效权限掩码

-d

指定默认的ACK规则

-R

递归处理

-L

跟踪符号链接,包括符号链接目录。默认会跳过符号链接目录,只跟踪符号链接文件

-P

跳过符号链接,包括符号链接文件

-x

删除文件的ACL规则

  • ---srw----+ +表示文件是ACL文件。

  • setfacl -m u:bob:rw- myfile.txt 添加或修改用户 bob 对 myfile.txt 的权限

  • setfacl -d -m u:charlie:rw- mydir 为目录mydir设置默认ACL,以便新创建的文件也具有读写权限

⑦设置权限掩码:umask命令

  • 当用户创建一个新的文件夹或目录时,新文件的访问通常被设置为rw-r--r--(644),新目录的访问权限通常设置为rwxr-xr-x(755)。

  • 这个默认访问权限是由umask命令设置的权限掩码决定的。权限掩码规定了要在原有权限的基础上删除的权限,通常使用十进制数字设置。对于文件,每个数字最大值是6,对于目录,每个数字最大是7。

  • 例如,某个用户的权限掩码为022,当用户创建新文件时,用666依次减去掩码中相对应的权限上的数字,其默认访问权限为644。创建目录时,用777减去,其默认访问权限为755。

  • umask命令可以设置默认的权限掩码,实际上,在用户登录后,会自动调用umask来设置权限掩码。

  • umask [-S] 直接调用是显示当前的权限掩码,-S是以字符形式显示。umask 244 设置权限掩码为244。

四. 系统启动和关闭

1. Ubuntu的启动

①BIOS阶段

  • BIOS(Basic Input/Output System)是计算机系统中的一种固件,负责在计算机启动时进行基本的硬件初始化和操作系统加载。它是计算机硬件和操作系统之间的接口。主要完成下面几个任务:

  • [1] 开机自检(POST):当计算机开机时,BIOS 执行开机自检(Power-On Self-Test),检查计算机的基本硬件组件(如内存、处理器和存储设备)是否正常工作。如果发现问题,通常会发出警报或显示错误信息。

  • [2] 初始化:初始化计算机的硬件组件,包括处理器、内存、硬盘、键盘、显示器等。确保所有硬件在操作系统加载之前能够正常工作。从 CMOS(Complementary Metal-Oxide-Semiconductor)电池中读取存储的系统配置设置,如启动顺序、硬件设置和时钟设置。这些设置用于定义计算机的启动和操作模式。

  • [3] 加载引导程序:BIOS 根据启动顺序设置,查找并加载引导加载程序(如 GRUB)。引导加载程序负责加载操作系统内核并将控制权交给它。

②引导程序阶段

  • BIOS 将控制权交给引导程序GRUB,引导程序负责从硬盘加载操作系统内核。

  • GRUB会显示启动菜单(如果配置了多个操作系统或内核版本)。用户可以选择要启动的操作系统或内核版本。

  • 然后内核将创建init进程,其ID为1。由init进程根据用户指定的运行级别,继续进行初始化。

③内核阶段

  • 通过GRUB加载内核,并将控制权给内核。内核创建内存中的数据结构,完成硬件诊断,加载各种硬件设备驱动程序。

④进入系统

2. Ubuntu的关闭

①shutdown命令

  • shutdown [option] [time] [warning-message] option是常用命令选项,time是时间,warning-message是警告信息。

  • time指定关闭操作的执行时间。24小时制hh:mm, hh是小时,mm是分钟。也可相对时间+m,+表示以当前时间为基准,延迟指定的时间, m为分钟。now表示当前时刻。

shutdown常用option

-H或--halt

在具有高级电源管理接口的计算机上,-H只会关闭OS,电源仍在工作。用户需手工关闭电源。

-P或--poweroff

默认选项,在具有高级电源管理接口的计算机上,-P关闭OS和电源

-r或--reboot

重启OS

-c

取消即将进行的关闭操作,但不可取消指定了关闭时间为now或者+0的系统关闭操作

  • sudo shutdown +1 一分钟后关闭

  • sudo shutdown now 立即关闭

  • sudo shutdown -r +0 立即重启

②其他命令

  • sudo init 0 快速关闭操作系统。

  • halt、poweroff、reboot:前两者关闭系统,后者重启系统。

五. 服务和进程管理

1. 初始化程序概述

①初始化程序

  • Linux内核由GRUB加载,而内核接下来会加载Linux的初始化程序(init),由初始化程序完成后面的过程。初始化程序是Linux启动时的第一个进程,该进程的进程ID为1,是所有其他进程的祖先。

  • 在 Linux 启动过程中,init 程序是第一个用户空间的进程,它负责初始化系统和启动其他必要的服务和进程。init 的主要任务是设置系统环境、启动系统服务,并为用户提供交互界面。不同的 Linux 发行版和系统可能使用不同的初始化系统,但 init 概念是核心的。Linux启动完成后,初始化程序便以守护进程的方式存在,一直到系统关闭。

  • 运行级别:描述系统各种可能的状态。(0-关闭电源,1-单用户模式等等)

②systemd

  • systemd是现代Linux系统中使用的初始化系统和服务管理器,提供了一种更高效和灵活的方式来管理系统服务和启动过程。

  • systemd管理着其他所有的守护进程,包括systemd本身,在系统引导过程中, systemd是第一个启动的进程,其进程ID为1(有时为保持兼容,进程ID为1的进程仍名为init);而在系统关闭过程中,systemd是最后停止的进程。

  • 由其架构看出,systemd不仅是初始化程序,还是一套软件包。

③systemd的基本配置文件

  • systemd的配置文件都位于/etc/systemd目录以及子目录中。如果配置系统级别服务,可修改system.conf文件,如果配置用户级别的服务,可修改user.conf文件。

  • 在Linux初始化过程中,对于系统级别的服务,systemd会读取system.conf以及解释并执行/etc/systemd/system目录中的文件;对于用户级别的服务,则会读取user.conf,解释并执行/etc/system/user目录中的文件。

2. 单元

  • systemd可以管理所有系统资源,不同的系统资源称为单元。systemd通过单元来管理任务,每个单元都有相应的配置文件和类型。

  • systemd的单元并不是孤立的,他们之间可以相互依赖。systemd的依赖通过以.wants为扩展名的目录来表示。例如poweroff.target目标依赖于plymouth-poweroff服务,那么poweroff.target。wants目录中就会包含一个指向plymouth-poweroff服务的符号链接。

  • 这些以.wants为扩展名的目录位于两个地方,分别为/etc/systemd/system和/lib/systemd/system(前一个优先级更高)。/lib/systemd/system目录中的.wants由系统维护,用户不可修改。/etc/systemd/system目录中的.wants目录可由用户管理,可把自己依配置放在该目录中。

  • /etc/systemd/system中的符号链接无需自己创建。在启动某项服务时systemd会自动在特定的.wants目录中创建符号链接,在禁用服务时会删除。这些操作使用systemctl完成。

常见的单元类型及其帮助手册

单元类型

帮助手册

描述

service

systemd.service

服务类单元,这些服务可被启动和停止

socket

systemd.socket

服务的套接字

devices

systemd.device

设备类单元

mount

systemd.mount

文件系统挂载点

automount

systemd.automount

文件系统自动挂载点,与mount一起使用

target

systemd.target

用来组织单元

path

systemd.path

管理目录

snapshot

systemd.snapshot

systemd运行状态快照

swap

systemd.swap

systemd为交换分区文件系统创建的交换单元文件

timer

systemd.timer

systemd提供的定时器

scope

systemd.scope

不是由systemd启动的外部进程

slice

systemd.slice

进程组

unit

systemd.unit

systemd所有单元的配置选项手册

exec

systemd.exec

systemd的service、socket、mount、swap等单元执行环境帮助手册

special

systemd.special

systemd的multi-user.target以及print.target等特殊目标的帮助手册

time

systemd.time

systemd的时间、日期格式版帮助手册

directives

systemd.directives

列出所有的systemd选项及其帮助手册

3. 目标

  • 启动计算机时需要启动大量单元,若每次启动都一一写明启动需要哪些单元,显然是非常麻烦的。目标就是为了解决这个问题的一个方案。

  • 目标是一种特殊的单元,同时包含很多单元,启动目标时,会启动目标中所有的单元。

  • systemd与传统的init初始化程序区别:

  • [1] 默认的运行级别被默认的目标取代。默认的运行级别在/etc/inittab文件中设置,而默认的目标在/lib/systemd/system/default.target中设置,通常符号链接到graphical.target(图形界面)或者multi-user.target(多用户命令行)。

  • [2] 启动脚本位置。以前是/etc/init.d目录,符号链接到不同的运行级别目录,例如/etc/rc3.d、/etc/rc5.d等,现在则存放在/lib/systemd/system和/etc/systemd/system目录中。

  • [3] 配置文件的位置。以前init进程的配置文件是/etc/inittab,各种服务的配置文件存放在/etc/sysconfig目录。现在的配置文件主要存放在/lib/systemd目录。在/etc/systemd目录中的修改可覆盖原始配置。

  • -

  • 对于目标来说,其所包含的单元就是其对于其他单元的依赖。

  • 目标与传统运行级别不同,他们可以同时并存。利用isolate子命令,可实现与传统级别切换相似的功能。

  • 传统初始化程序有默认级别选项,即系统启动时会自动进入运行级别。systemd也提供了默认目标与之对应。可通过get-default获取当前默认的目标,set-default修改当前默认目标。

4. 常用systemd命令

①systemctl

  • systemctl [option] command [name...] 该命令检查和控制systemd状态,管理各种systemd服务。option是命令选项,command是子命令,name...是多个单元名称空格隔开。

systemctl常用option

-t或者--type

指定要列出的单元类型,多个类型间用逗号隔开

--state

  • 指定要列出单元的LOAD、SUB、ACTIVE状态,多个状态间用逗号隔开。

  • active:列出当前活跃的单元

  • inactive:列出当前不活跃的单元

  • failed:列出失败的单元

  • running:列出正在运行的单元。

  • exited:列出已退出的单元。

-a或者--all

列出所有的单元

systemctl常用command

没有指定单元扩展名,默认.service

list-units

  • 默认子命令,不提供任何子命令,就会列出当前系统中的单元。

  • 显示系统中所有活动的 systemd 单元。它会列出单元名称(UNIT)、加载状态(LOAD该单元配置文件是否正确处理)、活动状态(ACTIVE该单元是否激活)和子状态(SUB更加详细的状态描述信息),单元信息描述(DESCRIPTION)。

  • systemctl list-units -a 列出所有单元

  • systemctl list-units --type=service 列出类型为serviec的单元

  • systemctl list-units --state=inactive 列出不活跃的单元

status

查看systemd系统及其单元的状态,可接受单元名称或者进程ID,多个单元名称、通配符,若无参数则显示systemd的运行状态。systemctl status [unit.扩展名]

is-active

is-failed

is-enabled

  • 是否正在运行:systemctl is-active <unit.扩展名>

  • 是否启动失败:systemctl is-failed <unit.扩展名>

  • 是否被启用(被启用指,是否在对应的.wants目录中建立符号链接):systemctl is-enabled <unit.扩展名>

list-dependencies

显示不同单元间的依赖关系,可接受参数单元名称,绿色正常运行,黑色不在运行。默认不展开所有分支,加上--all可展示所有分支。systemctl list-dependencies [unit.扩展名]

list-unit-files

  • 在systemd中每个单元都有一个配置文件,告诉systemd怎么启动这个单元。默认情况下会从/etc/systemd/system和/lib/systemd/system目录中读取单元配置文件,前者优先级高于后者。

  • 用户自定义的单元配置文件需要在/etc/systemd/system目录中建立符号链接,而不能直接添加到/lib/systemd/system中。实际上,/etc/systemd/system绝大部分是指向/lib/systemd/system目录中对应的符号链接,而真实的单元配置文件位于/lib/systemd/system目录中。

  • systemd单元配置文件名称以单元类型为扩展名,service类型的单元配置文件的扩展名为.service。默认情况下,systemd会把单元理解为service类型,若没加扩展名,会自动在后面加上.service。

  • systemctl list-unit-files输出结果有两列UNIT FILE和STATE,前者为单元配置文件名称,后者为其状态。

  • 常见的systemd单元配置文件状态有以下几种:

  • enabled:已经建立启动符号链接,即已启用

  • disabled:没有建立启动符号链接,即未启用

  • static:该配置文件没有[Install]部分,即无法自己执行,只能作为其他配置文件的依赖

  • masked: 该配置文件被禁止建立启动符号链接,即完全被禁用

  • generated: 该单元文件由其他的API动态创建

  • bad:无效的单元文件

  • indirect:该单元文件本身没有启用,但是他的[Install]部分配置了Also选项。

  • systemctl list-unit-files --type=service类型筛选

  • systemctl list-unit-files m*.service通配符

cat

  • 查看单元文件内容

  • systemctl cat <unit.扩展名>unit为单元名称

start

  • 可接受一个或多个单元名称作参数,或通配符,实现服务启动

  • systemctl start <unit.扩展名>

stop

  • 可接受一个或多个单元名称作参数,或通配符,实现服务关闭

  • systemctl stop <unit.扩展名>

restart

  • 可接受一个或多个单元名称作参数,或通配符,实现服务重启

  • systemctl restart <unit.扩展名>

reload

  • 可接受一个或多个单元名称作参数,或通配符,实现服务配置文件重加载(my.cnf)(不是单元配置文件)

  • systemctl reload <unit.扩展名>

enable

  • 服务自启动

  • 可接受一个或多个单元名称作参数,或通配符,实现服务自启动

  • systemctl enable <unit.扩展名>

disable

  • 禁止服务自启动

  • 可接受一个或多个单元名称作参数,或通配符,禁止服务启动

  • systemctl disable <unit.扩展名>

daemon-reload

  • 重新加载所有单元文件以及重新创建整个依赖树

  • systemctl daemon-reload

  • daemon-reload:用来重新加载 systemd 管理器的所有配置文件。适用于系统级别的更改,如新增或修改单元文件。

  • reload:用来重新加载某个服务的配置。适用于服务级别的更改,如应用配置文件的修改。

  • 在修改系统服务配置文件后,通常需要先执行 daemon-reload,然后用 reload 重新加载具体的服务配置(如果支持的话)。

show

  • 显示单元属性

  • systemctl show [unit.扩展名] 无单元名,显示systemd本身的属性

  • --property筛选

  • systemctl show nginx.service --property=ActiveState,ExecStart 多个属性逗号隔开

  • ActiveState:显示单元的活动状态(例如,activeinactivefailed)。

  • LoadState:显示单元的加载状态(例如,loadednot-found)。

  • SubState:显示单元的子状态(例如,runningexited)。

  • ExecStart:显示服务的启动命令。

  • Description:显示单元的描述。

  • MemoryMax:内存限制

set-property

  • 设置服务属性

  • sudo systemctl set-property nginx.service MemoryMax=500M

isolate

  • 执行该命令后指定的单元以及依赖单元会被启动,而其他的单元会被停止。

  • 使用该命令时,单元文件中必须有AllowIsolate选项。

  • systemctl isolate <unit.扩展名>

get-default

  • 获取当前默认目标

  • systemctl get-default

set-default

  • 修改默认目标

  • systemctl set-default 新目标

②systemd-analyze命令分析系统启动时的性能

  • systemd-analyze [option] [command] option是常用选项,command是常用命令

systemd-analyze常用option

--user

在用户级别查询systemd实例

--system

在系统级别查询systemd实例

systemd-analyze常用command

time

输出系统启动时间,为默认命令

blame

按照占用时间长短的顺序输出所有正在运行的单元。

critical-chain

以树状形式输出服务在什么时间启动以及用了多长时间

plot

以SVG图像的格式输出服务在什么时间启动以及用了多少时间

dot

输出单元依赖图

输出详细的可读的服务状态

③hostnamectl命令

  • hostnamectl [command] 用来查看或修改主机名。command是常用子命令。

  • 单命令是显式当前的。

hostnamectl常用command

set-hostname

hostnamectl set-hostname new_name修改主机名

④localectl命令

  • localectl命令可以查看或修改当前系统的区域和键盘布局。单命令是显式当前系统的区域信息。

  • 区域一般至少包括语言和地区,此外数据格式、小数点符号等也属于区域。

  • localectl [command] command是子命令

localectl常用command

set-loacl

localectl set-loacl xxx=xxx设置系统当前区域

⑤timedatectl命令

  • 用来查看或修改当前系统的时区设置。

  • timedatectl [command] command是子命令。单命令是显示当前的信息。

timedatectl常用command

set-timezone

timedatectl set-timezone 新时区设置系统当前时区

⑥loginctl命令

  • 单命令是查看当前登录的用户。仅显示已登录的用户。

  • loginctl [command] command是子命令

loginctl常用command

show-user

loginctl show-user 用户名查看某个用户详细信息

list-users

列出当前系统中的用户以及id,loginctl list-users

5. 日志管理

  • systemd提供了自己的日志系统,称为journal,使用systemd日志时,无需额外安装日志服务。

  • journalctl [option] [matches...] option为命令选项,matches为匹配的筛选。

  • 若没有给其提供任何选项(journalctl),则会显示所有日志。

journalctl常用option

-a

以完整格式显示日志

-f

实时动态显示最新日志

-n

显示指定行数的日志

-r

按时间,逆序显示日志

-o

  • 指定输出格式。

  • short:默认格式,包含时间戳、服务名等基本信息。

  • short-full :比short更详细的信息。

  • verbose:详细格式,包含更多字段信息。

  • json:JSON 格式,适合程序处理。

  • json-pretty:格式化的 JSON,更易读。

  • cat:仅输出消息内容,不包括其他字段。

  • export:将日志以二进制形式导出

  • journalctl -o json > logs.json

-b

查看系统本次启动的日志

-k

仅仅查看内核的日志

-u

限制显示某个单元的日志

journalctl -u <unit.扩展名>

-S(--since)和-U(--util)

  • 通过时间限制日志范围,-S是起始时间,-U是结束时间

  • 时间格式:

  • 日期和时间(年月日 时:分:秒):journalctl -S "2024-08-01 12:00:00" -U "2024-08-01 14:00:00"

  • ISO 8601 格式(包括时区):journalctl --since "2024-08-01T12:00:00+00:00" --until "2024-08-01T14:00:00+00:00"

  • 只用日期:journalctl --since "2024-08-01" --until "2024-08-02"

  • 过去的时间(从当前时间往回):journalctl --since "1 hour ago"

    journalctl --until "1 hour ago"

  • 过去的天数或分钟:journalctl --since "1 day ago"

    journalctl --until "30 minutes ago"

  • 自系统启动以来的时间(例如,5分钟):journalctl --since "5 minutes ago"

--disk-usage

  • 显示日志文件大小

  • 日志配置文件/etc/systemd/journal.conf,配置日志大小限制,存储位置

--flush

  • 日志可位于/run/log/journal和/var/log/journal。

  • 该选项,可将/run/log/journal同步到/var/log/journal

--vacuum-size

  • 删除超过指定大小的日志。

  • sudo journalctl --vacuum-size=1G保留最近 1 GB 的日志,其余删除

--vacuum-time

  • 删除超过指定时间的日志。例如,保留最近 2 周的日志,其余删除

  • sudo journalctl --vacuum-time=2weeks

--vacuum-files

  • 通过删除最旧的日志文件来清理日志,以便保持指定数量的日志文件

  • 保留最新的 5 个日志文件sudo journalctl --vacuum-files=5

6. 进程管理

①ps

  • ps执行结果是当前系统中的进程的一个快照,代表进程在某个时刻的状态,是静态的。

  • ps [options] options是命令选项。

ps常用option

-a

显示系统中所有活动进程的当前状态,与终端无关联的进程除外

-e或-A

显式系统中所有进程的状态

-f

显示每个进程的完整信息

-l

显示每个进程的详细信息,起始时间除外

-g

显示与指定的用户组ID或组名关联的进程

-p

显示与指定进程ID的进程的信息

-u

显示与指定的用户ID或用户名关联的进程

ps命令输出的字段

字段

说明

UID

进程所有者的有效用户ID

PID

进程ID

PPID

父进程的进程ID

C

进程生命周期的CPU利用率(百分比),即进程实际利用CPU的时间除以进程整个声明周期的时长

STIME

进程的起始运行的时间。若起始时间位于24小时内,则以HH:MM的形式表示;若超过24小时,则以MmmDD的形式表示,Mmm表示月,DD表示天。

tty

控制终端。表示进程在哪个终端上运行,若为?,表示该进程与任何终端无关

TIME

进程迄今累计占用CPU时间的总和。以DD-]HH:MM:SS表示

CMD

进程对应的程序或者命令的名称

PRI

进程优先级,数值越大,表示进程的优先级越低。

NI

进程优先级的nice调整值,其范围为-20~19,用于调整进程优先级

ADDR

进程内存地址

%CPU

进程迄今占用的CPU时间相对于全部CPU时间的百分比

%MEM

进程当前占用的实际物理内存数量相对于系统全部物理内存数量的百分比

RSS

进程当前占用物理内存的数量,单位为KB

WCHAN

进程所等待事件的内存地址

SZ

虚拟内存用量

F

标识。1为已创建,但是尚未执行的进程,4为用到超级用户特权的进程

S

进程状态码。S表示因等待一段时间而处于休眠状态,进程可以终端;D表示进程处于休眠状态,但不可中断;R表示进程正在运行;X表示进程已经终止;Z表示僵尸进程。

②pstree

  • 以树状形式显示进程间的调用关系。

  • pstree [options] [PID]。option是常用选项,PID是进程ID。若没有指定进程ID,则从systemd进程开始显示。

pstree常用option

-p

把进程ID显示出来

③top

  • top命令可以动态的监控进程以及其他系统资源,直接输入top即可。

  • 上半部分为系统运行状态概况。

  • 第一行:当前系统时间、系统自启动以来的累计运行时间、登录系统的当前用户数、系统3个平均负载值(1分钟、5分钟、15分钟的负载情况)

  • 第二行(进程概况):进程总数、运行态进程数量、休眠态进程数量、暂停运行的进程数量、僵尸进程数量

  • 第三行(CPU工作状态):从左至右依次为CPU处于用户模式、系统模式、空闲状态、等待IO状态、处理硬件中断、处理软件中断所占的百分比。

  • 第四行(内存使用情况):系统配置物理内存数量、空闲内存数量、已用内存数量、用作缓冲区的内存数量

  • 第五行(交换分区使用情况):交换分区大小、空间交换分区大小、已有交换分区大小、用作缓冲区的交换分区大小

  • -

  • 下半部分为各个进程详细信息。

top输出字段含义

字段

含义

PID

进程ID

USER

进程所有者

PR

进程优先级

NI

进程优先级的nice调整值,其范围为-20~19,用于调整进程优先级

VIRT

进程使用的虚拟内存数量

RES

进程占用的基本物理内存数量

SHR

进程占用的共享内存的数量

S

  • 进程当前的状态。S表示因等待一段时间而处于休眠状态,进程可以终端;D表示进程处于休眠状态,但不可中断;R表示进程正在运行,或处于运行队列,一调度就可运行;X表示进程已经终止;Z表示僵尸进程;T表示进程因跟踪调试或者因收到某个信号而暂停运行。

%CPU

进程占用CPU百分比。默认降序,3秒刷新。

%MEM

进程占用物理内存百分比

TIME+

进程累计占用CPU时间

COMMAND

进程所执行的命令

top按键控制

按键

含义

f

切换到字段管理视图:字段名称左侧有*的表示该字段显示在top主界面,上下箭头移动,空格显示或者取消。也可按s使得top主界面进程列表以该字段排序,按esc返回主界面。

d

改变主界面刷新时间间隔。在光标处输入一个数字,按Enter生效。

q

退出top界面。

1

若有多个CPU,则显示多个CPU数据。

Shift >或Shift <

向右向左改变当前的排序字段

b

可把当前状态为R的进程反相显示

x

反相显示排序字段

④kill

  • kill [option] <pid> 终止某个进程。option为常用选项。

  • 实际上kill命令功能是向某个进程发送一个信号。

  • 没有指明option(信号), 默认为15:SIGTERM(默认终止信号)

  • kill -9 1234SIGKILL(强制终止)

kill常用option

-l:显示kill支持的所有信号

⑤nice和renic

  • nice用于以指定的优先级启动程序,renice用于调整已经存在的进程的优先级。

  • nice [option] [command] option是选项,command是要启动的程序。选项只有一个:-n,指定进程的优先级,为整数值。

  • 通过增加nice值可以降低一个进程的优先级,反之可增加进程优先级。

  • 普通用户只能降低进程优先级,而超级用户可以提高进程优先级。对于超级用户,nice值的取值范围为-20~19,对于普通用户,nice值的取值范围为0~19。如果没有指定nice值,默认为10。

  • nice -12 tar -cvf doc.tar 降低优先级。

  • -

  • renice [-n] priority [-g|-p|-u] identifier... -n指定新的优先级,priority为新nice值,-n可以省略。-g指定进程组ID,-p指定进程ID,-u指定进程的拥有者,identifier...为组ID、进程ID或用户名。

  • sudo renice +1 -p 22856 增加该进程的nice值1,优先级降低。

六. 软件包管理

1. 软件包管理概述

①基本概念

  • 软件包:Linux系统中所有软件和文档都是以软件包的形式提供的,主要有两种形式,分别是二进制软件包和源代码软件包。前者用于封装可执行程序、相关的文档以及配置文件等,后者则是包含软件包的源代码以及生成二进制软件包的方法。

  • DEB是Debian及其派生出来的Linux发行版主要支持的标准软件包格式,其扩展名为.deb。

  • 软件仓储:通常,软件仓储是一组网站,提供按一定组织形式存储的软件包以及索引文件,供软件包管理工具访问。

  • 软件包之间的相互依赖:尽管软件包是一个相对独立的功能组合,但软件包中的软件却不可避免的依赖于其他软件包的支持,这其中主要是对底层库文件的依赖。

  • 有了软件包管理工具,无需人工处理这些依赖关系。在安装软件包时,软件包管理工具会自动判断要安装的软件包与其他软件包的依赖关系,并且会自动安装或者更新所需的软件包。

②软件包管理工具

  • apt-get:是较早的工具,提供了更稳定和一致的行为,特别适合于自动化任务和脚本,因为其命令和输出格式长期保持不变,确保了脚本的兼容性和可靠性。

  • apt:是较新的工具,设计用于提供更简洁和统一的用户体验,整合了apt-get和apt-cache的功能,适合日常使用和交互操作。它提供了更友好的输出格式和命令简化。

2. apt-get

①搜索软件包

  • 在正式安装某个软件包前,可先搜索,以便确认软件仓储中是否包含该软件包。

  • apt-cache [command] command为子命令

apt-cache常用command

showpkg

查看软件包的信息。apt-cache showpkg package_name

search

搜索某个软件包。apt-cache search package_name

depends

显示软件包的依赖关系。apt-cache depends package_name

②apt-get基本语法

  • apt-get [options] [command] options是常用命令选项,command是子命令。

apt-get常用option

-c

指定apt-get使用的,除默认配置文件之外的配置文件。

-y

对于需要用户确认的,等于yes请求

--no-download

禁止下载软件包

--download-only

仅仅下载软件包,不解压和安装

--purge

清除软件包,与remove子命令配合使用,功能等同于purge子命令

--reinstall

重新安装已经安装过的软件包

--allow-unauthenticated

允许安装未认证的软件包

--no-remove

禁止删除软件包

--no-upgrade

禁止升级软件包

apt-get常用command

install

安装一个或多个软件包。apt-get install package_name...

update

同步软件仓储的软件包索引。apt-get update

upgrade

升级软件包。apt-get upgrade package_name

remove

删除一个或多个软件包。apt-get remove package_name...

autoremove

删除一个或多个软件包,并自动处理依赖关系。apt-get autoremove package_name...

purge

彻底清除某个软件包,包含其配置文件。apt-get purge package_name

check

检查apt缓冲区,确定依赖包是否存在。apt-get check package_name

clean

清除apt本地缓存。apt-get clean

3. apt

  • apt [command] [options] options是常用命令选项,command是子命令。

apt常用command

update

从软件仓储更新软件包索引。apt update

upgrade

升级所有已安装的软件包软件包,但不会删除软件包。apt upgrade

full-upgrade

升级所有已安装的软件包软件包, 同时会安装或删除其他软件包以解决依赖关系。apt full-upgrade

install

安装软件包,重复安装则是升级特定软件包。apt install package_name...

remove

删除软件包。sudo apt remove package_name

purge

彻底删除软件包(包括配置文件)。sudo apt purge package_name

autoremove

自动删除不依赖的软件包。sudo apt autoremove

search

搜索软件包。apt search package_name

show

显示软件包信息。apt show package_name

list

列出所有可用的软件包apt list,通过--installed列出所有已安装的软件包apt list --installed,通过--upgradeable列出所有可升级的软件包apt list --upgradeable

七. 磁盘和文件系统管理

  • 磁盘是数据存储的物理再提吧,而文件系统是数据存储的逻辑方式。

1. 磁盘管理基础

①磁头

  • 磁头是硬盘驱动器和磁带驱动器中的关键组件,负责读取和写入数据。它由一个非常小的电磁装置组成,通过改变磁场来读取或记录数据到磁性介质上。硬盘的磁头在磁盘的旋转过程中在磁盘表面上移动,而磁带驱动器的磁头则在磁带上进行操作。磁头的精确度直接影响数据的读写速度和准确性。

②磁道

  • 磁道是硬盘或磁带上用来存储数据的连续磁性轨迹。硬盘上的磁道是圆形的,沿着盘片的同心圆分布,每个磁道上可以存储一定量的数据。在磁带驱动器中,磁道是沿着磁带长度方向的条形区域。数据在这些磁道上以磁信号的形式被记录和读取。磁道的排列和密度直接影响存储设备的容量和性能。

③柱面

  • 柱面是硬盘驱动器中的一个概念,指的是由多个磁盘面上的相同磁道组成的一个虚拟“柱体”。具体来说,硬盘上每个磁盘面都被划分成若干个磁道,柱面则包括所有这些磁盘面上相同位置的磁道。例如,硬盘的第一个磁盘面上的第一个磁道与第二个磁盘面上的第一个磁道组成一个柱面。这样,数据可以在不同磁盘面上的相同磁道位置进行读写,提高了数据存取的效率。

④扇区

  • 扇区是硬盘及其他存储设备中最小的数据存储单位,通常大小为512字节或4096字节。它将磁盘上的数据组织成固定大小的数据块,使得数据读写操作更加高效和一致。每个扇区在磁盘上对应于磁道上的一个特定区域,通过这种结构,存储设备可以有效地管理和访问数据。

  • 磁盘存储容量=存储容量=盘片数量×每盘片的磁道数×每磁道的扇区数×每扇区的字节数

2. 文件系统相关基础知识

①文件系统基础知识

  • FAT:FAT(File Allocation Table)是一种文件系统,用于管理磁盘上的文件和目录。它通过一个文件分配表来记录文件的存储位置和空间分配情况。FAT有多个版本,包括FAT12、FAT16、FAT32和exFAT,其中FAT32支持较大的磁盘容量和文件大小,exFAT则用于更大容量的闪存驱动器。FAT系统简单且兼容性强,但在处理大容量存储和大量文件时,效率较低。

  • exFAT:exFAT(Extended File Allocation Table)是一种文件系统,专为闪存驱动器和大容量存储设备设计。它克服了FAT32的一些限制,如文件和分区大小。exFAT支持最大16EB的分区和最大256TB的单个文件,适合用于现代大容量存储设备,如SD卡、USB闪存驱动器和外部硬盘。它还提供了更高效的文件分配表和更强的兼容性,尤其是在各种操作系统和设备之间。exFAT的设计使得它成为大容量存储和移动设备的理想选择。

  • NTFS:NTFS(New Technology File System)是微软开发的文件系统,用于Windows操作系统。它提供了对大容量存储设备和大文件的支持,具有文件权限管理、数据加密、压缩和磁盘配额等先进功能。此外,NTFS具备日志记录功能,能够在系统故障时帮助恢复数据,是现代Windows系统和许多内部存储设备的默认文件系统。

  • Ext2/Ext3/Ext4:Ext2、Ext3和Ext4是Linux操作系统中常用的文件系统。Ext2是早期的文件系统,提供基本功能但不具备日志功能。Ext3在Ext2的基础上引入了日志记录,增强了数据完整性和恢复能力。Ext4是最新版本,提供了显著的性能改进和扩展功能,包括支持更大的文件和分区、更高的效率和数据完整性保障。Ext4在处理大容量存储和文件时表现优越,同时兼容之前的Ext2和Ext3文件系统。

  • Btrfs:Btrfs(B-Tree File System)是一个现代的Linux文件系统,旨在提供高级数据管理功能和高效的存储性能。它支持快照、子卷、压缩、数据校验和动态卷管理等功能,能够自动修复数据错误,增强数据可靠性。Btrfs设计用于满足高容量存储需求,并具备灵活的管理和扩展能力,使其在数据保护和系统恢复方面表现出色。

  • ZFS:ZFS(Zettabyte File System)是一个先进的文件系统和逻辑卷管理器,最初由Sun Microsystems开发。它提供了数据完整性保护、内置快照、克隆、自动修复和高效的压缩功能。ZFS支持大容量存储,具有极强的扩展性,并通过强大的数据保护机制,确保数据的一致性和恢复能力。其设计旨在处理大规模存储系统的需求,并在数据管理和可靠性方面提供卓越的性能。

  • UFS:UFS(Unix File System)是一种用于Unix及类Unix操作系统的文件系统。最初设计用于早期的Unix系统,UFS提供了基本的文件管理功能,包括文件、目录、权限和符号链接等。它支持大文件和大容量存储,但相较于现代文件系统,其功能和性能可能较为有限。UFS的多个版本,如UFS1和UFS2,提供了不同的扩展功能,如更大的文件系统支持和改进的元数据管理。

  • ReiserFS:ReiserFS是一种Linux文件系统,由Hans Reiser开发,旨在提供高性能和高效的存储管理。它特别擅长处理小文件和目录结构,采用了基于B树的数据结构来提高文件访问速度。ReiserFS支持动态文件系统结构、日志功能、以及灵活的空间分配,但在维护和开发方面相对较少更新。尽管曾在早期Linux系统中广泛使用,现代系统中较少采用它,因为许多新文件系统提供了更先进的功能和更好的支持。

②块

  • 在Linux文件系统中,最小的读写单位成为块。在创建文件系统时,需要指定块大小。多个块被组织成块组。

  • 块组0有引导块,其余没有。

③引导块

  • 引导块(Boot Block)是计算机存储设备的关键区域,用于启动系统的引导过程。它位于磁盘的最前面,包含启动加载程序的代码,负责初始化硬件并加载操作系统核心部分。引导块的内容和功能根据不同的系统和设备有所不同,如PC上的主引导记录(MBR)和现代系统中的GUID分区表(GPT)与UEFI。引导块的设计确保了操作系统能够正确地从存储设备启动。

④超级快

  • 在Linux中,超级块(Superblock)是文件系统的重要数据结构,位于磁盘或存储设备的开始部分。它包含了文件系统的元数据,如文件系统的总大小、空闲空间、文件系统类型、创建时间和文件系统状态等信息。超级块对于文件系统的管理和维护至关重要,因为它提供了操作文件系统所需的基本信息和结构。损坏或丢失超级块可能会导致文件系统无法正确识别和访问存储的数据。

⑤索引节点

  • 索引节点(inode)是文件系统中的核心数据结构,存储了文件或目录的元数据,如大小、权限、时间戳和数据块位置。文件系统通常将索引节点组织在块组(block group)中,每个块组包含一定数量的索引节点和数据块。索引节点和数据块的关系通过块组来管理,从而优化数据的存储和访问效率。每个块组都有自己的超级块和索引节点表,这些索引节点表记录了文件和目录的元数据。通过这种结构,文件系统能够高效地访问和管理大量的文件和目录。

  • 索引节点与文件一一对应。

3. 创建文件系统

  • 注意创建分区会清除磁盘,创建文件系统会清除指定分区中的数据。

①创建分区

  • 创建分区是将一个大的磁盘划分为多个逻辑区域的过程。各个磁盘分区可以相对独立的管理,创建不同的文件系统。

  • fdisk [option] device option是常用选项,device是要划分分区的设备,通常是/dev/sda、/dev/sdb

fdisk常用option

-b

指定磁盘分区的大小

-l

列出指定设备的分区表,没有指定目标设备,则会列出/etc/fstab文件配置以及系统检测到的每个存储设备的分区信息。

-t

指定分区方案类型


  • 对未分区loop1,进行分区

  • (1) 进入fdisk

  • sudo fdisk /dev/loop1

  • (2) 显示帮助

  • 输入m,然后Enter

  • (3) 输出当前磁盘分区表:p

  • 磁盘分区会导致磁盘上面的数据全部丢失,因此在进行分区前,可输入p,输出当前的磁盘分区,以确定是否指认了正确的磁盘

  • (4) 创建分区,指定分区类型:n

  • 输入n后,会要求用户指定分区类型,还会显示主分区和扩展分区的数量。

  • (5) 指定分区号(1~4)。若没指定,默认用最小值。

  • 输入1,或者直接Enter默认

  • (6) 指定起始扇区

  • fdisk会给出当前可用扇区范围,若没指定(Enter)会自动选择当前可用最小值

  • (7) 指定结束扇区

  • 可用两种方式来指定结束扇区:一是"+扇区数",二是"+字节数"。指定字节数时,需要指定单位,可为K、M、G、T、P。若没指定,则默认当前可用的最大扇区。

  • 若用户只想把当前磁盘划分为一个分区,则可直接Enter。若想创建多个分区,则可输入指定数值。例如,创建一个80M的分区,则输入"+80M"。

  • p进行查看

  • (8) 创建其他分区

  • 重复(4)~(7), p查看

  • (9) 写入磁盘

  • 以上操作都是在内存中进行的,并没有真正写入磁盘,若此时退出fdisk,则磁盘数据不会发生任何变化。

  • 为了将用户分区信息写入磁盘,输入w,然后按Enter。

②创建文件系统

  • 重新创建文件系统,首先必须把它卸载掉,否则会出现设备忙而无法更新分区表。

  • 创建完磁盘分区后,可以在分区中创建文件系统,使用mkfs命令来创建Linux文件系统。

  • mkfs [option] device [size] option是命令选项,device为要创建文件系统的目标分区。size参数则可以为当前文件系统指定块的数量。

  • 除了基本的mkfs命令之外,Linux还提供了其他的一些相关命令来创建文件系统。


  • mke2fs

  • 该命令用来创建一个ext2、ext3或者ext4文件系统。

  • mke2fs [option] device [fs-size] option是命令选项,device表示要创建文件系统的设备,通常是一个磁盘分区。fs-size参数为要创建的文件系统的大小,若省略该参数,则表示文件系统的大小为磁盘分区的大小。

mke2fs常用option

-b

指定块的大小,可取1024、2048、4096,单位为字节

-c

在创建文件系统前,检查坏的块

-E

指定文件系统的扩展选项

-f

指定磁盘碎片的大小

-g

指定每个块组包含的块的数量,通常无需指定该选项

-i

指定字节和索引节点的比例

-I(i)

指定索引节点的大小

-L

指定新的文件系统卷标,最长16字节

-m

该值为百分比,指定保留给超级用户的磁盘块的比例,默认为5%

-M

记录最后一次挂载的目录

-n

不实际创建文件系统,而是显示设备上即将被使用的超级块和组描述符的备份位置。这在需要恢复文件系统时特别有用,因为可以提供关键的元数据信息,而不需要改变任何现有数据。

-N

指定要创建的索引节点的数量

-t

  • 指定要创建的文件系统的类型,例如ext2、ext3、ext4

  • sudo mke2fs -t ext2 /dev/sdc1; 创建Ext2类型的文件系统,目前分区为/dev/sdc1

  • mkfs.ext2、mkfs.ext3、mkfs.ext4符号链接分别用来创建对应的文件系统。

  • mke2fs还有一个配置文件,其名称为mke2fs.conf,位于/etc目录中。


  • mkfs.fat

  • 该命令来创建一个MS-DOS类型的文件系统,即FAT类型的文件系统。

  • mkfs.fat [option] device [block-count]

  • mkfs.fat命令的选项option与mke2fs基本相同。device参数为要创建的文件系统的目标分区,block-count参数为要创建的文件系统的块数。若没指定block-count参数,则mkfs.fat命令会自己判断块数。


  • mkfs.reiser4

  • 该命令用来创建一个reiser4文件系统。

  • mkfs.reiser4 [option] device [size[k|m|g]]

  • mkfs.reiser4的选项与前面介绍的mke2fs大致相同,不再详细介绍。device参数为要创建文件系统的目标分区,最后的size参数为文件系统的大小。


  • mkntfs

  • 该命令用来创建一个NFTS文件系统。

  • mkntfs [option] device [number-of-sectors]

  • option参照前面,device为目标分区,number-of-sectors为文件系统的扇区数。


  • 符号链接

  • 除了上面介绍的几个命令,Linux还专门创建了几个符号链接,以便用户使用。其中mkfs.ext2、mkfs.ext3、mkfs.ext4都指向mke2fs,mkfs.ntfs指向mkntfs,mkfs.msdos和mkfs.vfat都指向mkfs.fat。

  • 用户在使用这些符号链接时,意味着用户会创建特定类型的文件系统。例如,调用mkfs.ext4意味着用户会创建ext4文件系统。


  • NTFS

  • NTFS是Windows操作系统的标准文件系统,Linux已经支持这类文件系统的读写操作。

  • Linux创建NTFS文件系统需要使用mkfs.ntfs或者mkntfs。sudo mkfs.ntfs /dev/sdc2


  • 创建FAT文件系统

  • 本小节介绍,如何在一个U盘上创建FAT文件系统。当把U盘接入计算机后,Linux会识别到该设备,并且自动挂载。为了能在上面重新创建文件系统,首先必须把它卸载掉,否则会出现设备忙而无法更新分区表。

  • Ubuntu系统中,U盘一般挂载到/media/{userid}目录下面,userid为用户名。可使用mount命令来查看,没有参数的mount命令会把当前系统挂载的文件系统都显示出来。/media/wcc/5156-62B7

  • 若不能判断该设备是否是U盘,可通过dmesg命令查看Linux系统内核日志来确认。

  • 若U盘已经自动挂载,可以使用umount命令卸载。umount /media/wcc/5156-62B7

③调整文件系统

  • 当一个文件系统被创建后,大部分参数是固定不变的。Ext文件系统保留了部分可调参数,并且提供了tune2fs命令来进行相关的调整。

  • tune2fs [option] device option为常用选项,device参数为要调整的文件系统。

tune2fs常用option

-c

指定文件系统被强制检查前可以挂载的次数。若指定为0或者-1,则该文件系统不会被强制检查。

-C

设置文件系统已经被挂载的次数。若该选项指定了一个大于-c选项指定的值,则该文件系统会在下次重启时被e2fsck命令检查

-E

设置文件系统的扩展选项

-g

指定可以使用文件系统保留块的用户组

-i

指定执行文件系统检查的时间间隔

-I(i)

修改文件系统的索引节点的大小

-j

为当前文件系统增加日志功能

-J

覆盖现有的Ext3参数

-l(L)

显示文件系统超级块的内容

-L

  • 设置文件系统的卷标。

  • 卷标(或称为标签、标签名)通常指的是对存储设备(如硬盘、U盘、分区等)进行标识的名称。它可以帮助用户快速识别和区分不同的存储设备。

-m

设置文件系统保留块所占的比例

-o

设置文件系统默认的挂载选项

-u

指定可以使用文件系统保留块的用户

4. 挂载与卸载文件系统

  • 新的文件系统必须被挂载到Linux的目录树中,才可以被其他的应用系统使用。

①挂载点

  • 挂载点实际上是一个普通目录然而当一个目录充当了挂载点的功能角色之后,他就成为了访问被挂载文件系统的入口。

  • 传统UNIX和Linux都有一个/mnt目录, 通常作为临时挂载点使用。

  • 现代Linux通常使用/media作为临时挂载点。

  • 除了这些系统提供的挂载点外,可以自己创建一个目录,充当挂载点的角色。

  • 当一个目录充当挂载点时,该目录中的内容就是被挂载的文件系统的内容,而非该目录自身的内容。

②mount和findmnt命令

  • mount将某个文件系统挂载到某个挂载点上。

  • mount [option] device dir option是常用选项,device为要挂载的文件系统,dir为挂载点。

  • 没有任何参数,mount会读取/etc/mtab列出当前挂载的文件系统,目前这种方式不推荐。

  • 手动挂载文件系统:使用上面的命令

  • 自动挂载文件系统:Linux启动时(实际执行了mount -a)以及用户执行mount -a,可在/etc/fstab中配置,实现自动挂载

mount常用option

-a

  • 挂载/etc/fstab文件中配置的所有文件系统

  • linux启动时,自动执行mount -a

-l

在列出挂载的文件系统时显示卷标

-L

挂载指定卷标的文件系统

-n

挂载文件系统,但不写入/etc/mtab文件

-o

指定挂载选项

-r

将文件系统以只读的方式挂载

-T

指定用户自定义的fstab文件

-t

指定要挂载的文件系统的类型

-U

挂载UUID为指定值的分区

-w

以读写方式挂载文件系统

mount与文件系统无关的option

async

  • 所有读写写操作都异步执行,数据可能会在内存中缓存一段时间(默认)

  • 异步模式挂载文件系统(默认行为):mount -o async /dev/sda1 /mnt/mydisk

atime

访问文件时更新索引节点中的文件的最后访问时间属性

noatime

不更新索引节点中的文件的最后访问时间属性,即使该文件被访问过

auto

系统启动时自动挂载文件系统(默认)

noauto

系统启动时不自动挂载,需要手动挂载。

defaults

挂载文件系统时使用默认选项,即rw、suid、dev、exec、auto、nouser、and async

dev

允许解析文件系统上面的字符或块等特殊设备

nodev

不解析文件系统上面的字符或块等特殊设备

diratime

启用目录访问时间更新。在访问目录时,目录的最后访问时间会被更新

nodiratime

禁用目录访问时间更新。在访问目录时,不会更新目录的最后访问时间。这可以提高性能,特别是当目录被频繁访问时。

dirsync

启用目录同步。所有对目录的写操作都将同步到磁盘。这对于确保目录的元数据在系统崩溃或断电后不会丢失很有用,但可能会导致性能下降,因为每次目录更新都需要写入磁盘。

exec

允许执行该文件系统中的二进制文件

noexec

不允许执行该文件系统中的二进制文件

group

允许指定用户组中的普通用户挂载该文件系统

suid

允许suid或sgid标志位生效

nosuid

禁止suid或sgid标志位生效

owner

允许设备所有者挂载该文件系统

remount

允许重新挂载该文件系统,即使该文件系统已经被挂载

ro

以只读的方式挂载该文件系统

rw

以可读写的方式挂载该文件系统

sync

对文件系统的读写必须以同步方式进行

user

允许指定的普通用户挂载该文件系统

nouser

禁止普通用户挂载该文件系统

users

允许任何普通用户挂载或者卸载该文件系统

  • findmnt命令会读取/etc/fstab和/proc/self/mountinfo文件,列出当前系统挂载的文件系统以及类型。

  • 若没指定设备名称或挂载点,findmnt命令会以树形列出所有的文件系统

  • findmnt [option] device|mountpoint option是常用命令选项,device是设备(分区),moutpoint是挂载点

findmnt常用option

-J

以JSON格式输出结果

-l

以列格式输出结果

-p

以轮询模式输出结果

-r

以原始格式输出

-t

只显示指定类型的文件系统

③/etc/fstab文件

  • 该文件为当前Linux系统的静态配置文件,该文件定义了存储设备和分区整合到整个系统的方式。mount命令会读取这个文件,确定设备和分区的挂载选项。这个文件列出了系统在启动时需要自动挂载的文件系统以及它们的相关选项。每一行代表一个文件系统,包括以下字段:

  • 文件系统 - 设备名或 UUID或卷标(例如 /dev/sda1 或 UUID=xxxx)。

    挂载点 - 文件系统在根目录下的挂载位置(例如 /、/home)。

    文件系统类型 - 文件系统的类型(例如 ext4、swap)。

    挂载选项 - 挂载时使用的选项(例如 defaults、ro、noatime)。

    转储选项 - 是否在系统备份时转储文件系统,通常是 0 或 1。

    文件系统检查顺序 - 系统启动时检查文件系统的顺序,根文件系统通常为 1,其他为 2 或 0(不检查)。

Linux系统常见设备名

设备名

说明

/dev/hd[a-t]

IDE设备

/dev/sd[a-z]

SCSI磁盘

/dev/fd[0-7]

标准软驱

/dev/md[0-31]

软RAID设备

/dev/loop[0-7]

本地回环设备

/dev/ram[0-15]

内存

/dev/null

空设备,它丢弃一切写入其中的数据,但若报告写入操作成功,读取他则会立即得到一个EOF

/dev/zero

零设备,读它的时候,他会提供无线空字符

/dev/tty[0-63]

虚拟中端设备

/dev/ttyS[0-3]

串口

/dev/lp[0-3]

并口

/dev/console

控制台

/dev/fb[0-31]

帧缓存设备

/dev/cdrom

指向/dev/sr0的符号链接

/dev/random

随机数设备

④卸载文件系统

  • 卸载文件系统是将某个文件系统从Linux目录树中移除,移除后进程无法对齐读写。

  • 卸载文件系统通常发生在要对文件系统进行完整备份或者修复检测时,可有效防止其他的进程对文件系统读写而产生干扰。

  • 卸载文件系统前,必须停止对文件系统的读写,当前工作目录也不可以在要卸载的文件系统中。

  • umount [option] {mountpoint|device} option是常用选项,device是设备名(分区),moutpoint是挂载点.

umount常用option

-a

/proc/self/mountinfo中列出的文件系统都将被卸载

-f

强制卸载文件系统

-l

延迟卸载文件系统。占用文件系统的进程仍可继续使用,但其他进程无法使用。当进程结束后,文件系统不被占用,会自动卸载

-r

当文件系统卸载失败时,尝试以只读的方式重新挂载该文件系统

-t

指定要卸载的文件系统的类型

5. 检查与修复文件系统

①修复文件系统

  • 电源故障、硬盘故障、强行关机会导致文件系统受损。

  • fsck和e2fsck都可对文件系统进行检查和修复,前者针对多种文件系统,后者主要针对ext2、ext3、ext4等文件系统。

  • fsck [option] [filesystem] option是常用选项,filesystem是文件系统(设备名、挂载点、UUID、卷标)。

  • fsck也提供了许多针对不同文件系统的命令,fsck.ext2、fsck.ext3、fsck.ext4等等。

fsck常用option

-A

根据/etc/fstab配置文件中的内容,检查文件内列出的所有文件系统

-N

不执行命令,仅列出会执行的操作

-p

自动修复文件系统中不需要用户介入的简单问题。如果遇到复杂问题或无法自动修复的问题,fsck 会停止并提示用户进行手动修复。

-P

与-A配合使用,同时检查所有的文件系统

-R

与-A配合使用,跳过根文件系统

-s

依次检查各个文件系统

-t

指定要检查的文件系统的类型

  • e2fsck [option] device option是常用选项,device可以为设备名、卷标、UUID。

e2fsck常用option

-b

使用指定的超级块修复文件系统

-B

指定包含超级块的磁盘块的大小

-c

通过执行badblocks程序扫描并标注损坏的块

-E

指定文件系统的扩展选项

-f

强制执行文件系统的检查

-F

执行检查前,先清空设备的缓冲区

-p

不询问用户意见,自动修复错误

-y

对于检查和修复过程中的问题,均以yes回答

②修复超级块

  • 超级块保存了整个文件系统的重要数据,当超级块损坏时,文件系统将无法使用,为保证其正常,文件系统对超级块保留多个副本,当主超级块损坏时可以使用超级块来还原。

  • 先卸载sdc, 再执行sudo mkfs -t ext4 -n /dev/sdc

  • 还原超级块:sudo fsck -t ext4 -b 32768 /dev/sdc

6. 磁盘阵列

①介绍

  • 磁盘阵列(RAID),是由多个独立的磁盘构成一个容量巨大的磁盘组。

  • 磁盘阵列分为不同级别,RAID0~RAID6。

  • 磁盘阵列使得容量极大提升、数据安全增加、性能得到提升,但是由于需要数据冗余会损失一定比例磁盘容量。

②创建磁盘阵列

  • 根据阵列的实现方式,可以分为软件阵列和硬件阵列。软件阵列是指由软件模式阵列控制器来管理整个阵列,其缺点是需要耗费大量CPU来处理数据。硬件阵列则是由阵列控制器来管理整个阵列,阵列控制器上有独立CPU来处理数据,性能较好。

  • mdadm是Linux创建和管理(软件)阵列的工具。

  • 由于实际生产硬件阵列最为常用,故此处略。

7. 逻辑卷管理

①介绍

  • 在Linux系统运行过程中,经常遇到磁盘分区不够用了。而逻辑卷就是为了应对这种情况出现的技术。

  • 磁盘->分区->物理卷->卷组->逻辑卷->文件系统。

  • 逻辑卷管理通过在磁盘和分区上建立一个抽象的逻辑层来屏蔽物理分区的大小。用户可以将多个磁盘分区组合成一个存储池(卷组),管理员可以在存储池(卷组)上根据需求来创建逻辑卷,然后创建文件系统,挂载到系统中使用。

  • 物理介质:指物理磁盘,在OS中是/dev目录下的一个个设备文件,如/dev/sda。

  • 物理卷(PV):指物理硬盘上的分区或逻辑上与磁盘分区具有相同功能的设备。物理卷是逻辑卷管理的基本存储单元。

  • 物理块(PE):一个卷组中最小的连续区域(默认为4 MiB),多个物理块将被分配给一个逻辑卷。你可以把它看成物理卷的一部分,这部分可以被分配给一个逻辑卷。

  • 卷组(VG):卷组由一个或多个物理卷组成。对操作系统来说,卷组类似物理磁盘,卷组上面可以创建虚拟分区,即逻辑卷。

  • 逻辑卷(LV):指卷组上面创建的虚拟分区。对于操作系统来说,逻辑卷类似磁盘分区,在逻辑卷上可以建立文件系统,然后挂载到挂载点上。

LVM.png

②创建物理卷(PV)

  • 假定三块磁盘:/dev/sdf、/dev/sdg、/dev/sdh

  • (1)创建类型为Linux LVM的分区。创建LVM分区的步骤与前面介绍的创建磁盘分区的步骤相同。但是创建完成后,需要使用t命令将分区类型修改为8e, 即Linux LVM。在w保存前,用t命令。

  • 分1.png

  • (2)相同命令在其余两块磁盘创建。最终有三个分区:/dev/sdf1、/dev/sdg1、/dev/sdh1

  • (3)创建物理卷sudo pvcreate /dev/sdf1 sudo pvcreate /dev/sdg1 sudo pvcreate /dev/sdh1 创建完成后可用pvs、pvscan或pvdisplay查看。


  • pvcreate [option] PhysicalVolume option常用的为-u,指定设备的UUID, PhysicalVolume为物理分区,多个空格隔开。

  • pvs 显示系统中所有物理卷的简要信息。它提供了一个表格视图,显示每个物理卷的名称、卷组、大小、已用空间、剩余空间等信息。

  • pvscan 来扫描所有的物理卷,-u显示设备的UUID。扫描系统中的所有物理卷,并更新 LVM 的元数据缓存。它通常用于检测新添加的物理卷或更新现有物理卷的状态。

  • pvdisplay 显示物理卷详细信息,没指定设备名,则显示所有物理卷信息。

③创建卷组(VG)

  • 创建卷组过程是把多个物理卷组合起来,形成一个大的存储池。

  • vgcreate [option] VolumeGroupName PhysicalDevicePath... option为命令选项,VolumeGroupName为卷组名,PhysicalDevicePath...为要加入卷组的物理卷列表,使用设备名表示,多个空格隔开。

  • 例如:sudo vgcreate vgpool /dev/sdf1 /dev/sdg1 /dev/sdh1

  • vgs vgscan vgdisplay 去查看,功能类似上面。

④创建逻辑卷(LV)

  • lvcreate [option] Volumegroup option是命令选项,Volumegroup是在哪个卷组上创建LV。

lvcreate常用option

-a

创建完成后立即激活该逻辑卷

-n

指定新创建的逻辑卷的名称

-p

指定逻辑卷的访问权限,可以是r(只读)或者rw(读写)

-L

指定逻辑卷大小,可以是字节、扇区、KB、MB等单位。

-i

  • 指定要创建的条带数

  • 条带(Striping)是一种将数据分布在多个存储设备(如磁盘或物理卷)上的技术,以提高数据访问速度。它常用于 RAID(独立磁盘冗余阵列)和 LVM(逻辑卷管理)中。条带化通过将数据分割成小块,并将这些块分布在不同的存储设备上,使得多个设备可以并行处理读写操作,从而提升性能。

  • 数据分割:数据被分割成固定大小的块,这些块称为条带(Stripes)。

  • 分布:每个条带按顺序分布在多个存储设备上。例如,在一个有两个磁盘的条带化设置中,第一块数据写入磁盘1,第二块数据写入磁盘2,第三块数据又写入磁盘1,如此循环往复。

  • 并行操作:由于数据分布在多个设备上,这些设备可以同时处理读写请求,从而显著提高数据访问速度。

-I

指定条带大小

  • 创建一个200MB的逻辑卷sudo lvcreate -L 200MB vgpool 使用fdisk可以查看这个逻辑卷。

  • lvs、lvscan、lvdisplay查看

  • 逻辑卷设备文件位于/dev目录下面以卷组命名的目录中。

  • 创建文件系统并挂载到挂载点:同之前讲的。

⑤扩展逻辑卷

  • lvextend [option] LV option是命令选项,LV是逻辑卷的设备名。

lvextend常用option

-L

该选项有两种语法,若直接指定一个数字,则表示将逻辑卷的大小设置为指定值;

若在指定的数字前面加上一个'+',表示在原来的大小上再增加指定值。

-i

指定条带数量

-I(i)

指定条带大小

-r

  • 同时扩展文件系统的大小。否则fdisk查看磁盘发现LV扩展了,但是df -h查看文件系统,发现大小没变。不使用该选项,后面可再用resize2fs LV去扩展文件系统大小

  • 逻辑卷大小是指在 LVM 中分配的存储空间,而文件系统大小是指实际可用来存储数据的容量。虽然逻辑卷可以动态调整大小,但文件系统也必须相应调整才能使用新增的空间。因此,逻辑卷大小与文件系统大小需要一致,以确保存储空间的有效利用。

⑥压缩逻辑卷

  • 首先压缩文件系统大小resize2fs LV 数值

  • 压缩逻辑卷大小lvreduce [option] LV 用法同扩展,数字前有-表示减小多少,否则为减少到指定数量。

八. 网络管理

1. 网络接口

  • 在Linux中,所有网络通信都是通过网络接口完成的。Linux 网络接口是系统中用于连接和管理网络连接的虚拟或物理设备。每个接口都有一个唯一的名称(如 eth0、wlan0),并通过配置 IP 地址、子网掩码和网关等参数与网络进行通信。接口可以是有线的(如以太网接口)或无线的(如 Wi-Fi 接口)。

①查看网络接口

  • ifconfig [option] [name] option是命令选项, -a表示列出所有的(包括没上线的),name为要显示的网络接口名字,不填表示显示所有的。

  • 非活动状态的网络接口不可以进行网络通信。


  • lshw -class network lshw列出当前系统的硬件系统,包含网络接口,-class network表示只列出网络接口硬件。

②网络接口命名

  • Linux为每个网络接口指定了一个逻辑名称,其遵循一定规则。

  • 最常见的就是ethn,eth表示网络接口为以太网,n表示网络 接口顺序。fc表示光纤网络,ge表示千兆以太网,xe表示万兆以太网。

  • 从16.04版本开始变成了enp0s8,en表示以太网,p表示网卡位置,s表示网卡所处槽位,数字表示序号。

③配置网络接口IP地址

  • Linux支持临时IP地址配置和静态IP地址配置,前者通过ifconfig命令完成,后者通过修改配置文件完成。

  • 临时IP地址配置ifconfig interface ip netmask netmask interface表示网络接口逻辑名称;ip表示要为该接口配置的ip地址;netmask表示子网掩码。sudo ifcnfig eth1 10.0.0.16 netmask 255.255.255.0

  • 为了使其能够通信,还需为该接口指定默认网关。sudo route add default gw 10.0.3.1 eth1

  • 大部分网站都是通过域名标识和访问的,所以还需配置DNS服务器地址:/etc/resolv.conf

  • nameserver为关键字,后面位DNS服务器地址。

  • 通过ifconfig配置的临时IP会立即生效,无需重启该接口。


  • 静态地址配置

  • 用户需修改/etc/netplan/01-network-manager-all.yaml配置文件

  • 然后使用netplan apply重启生效。


  • 动态分配IP地址(DHCP):

  • 若用户网络中有DHCP服务器,且Linux主机的IP地址允许动态获取,则用户可以为Linux主机的网络接口配置DHCP客户端。同静态地址文件中配置然后删除静态地址然后重启生效。

④域名解析

  • 域名解析是将域名转换为IP地址的过程。Linux主机通过域名访问某项网络服务,需要指定域名服务器为其解析域名。

  • 配置文件同上面静态动态地址配置的文件。

2. 常用的网络配置命令

①ifconfig

  • ifconfig interface [aftype] option | address interface表示要配置的网络接口,aftype表示地址类型,option为命令选项,address为指派给网络接口的IP地址。

ifconfig常用option

-a

列出所有网络接口,包括禁用的

up

启用指定的网络接口

down

禁用指定的网络接口

netmask

指定当前IP网络的子网掩码

add

为指定网络接口增加一个IPv6地址

del

从指定网络接口删除一个IPv6地址

-broadcast

指定网络接口的广播地址

②ip

  • ip [option] object {command} option为命令选项,object为命令操作对象,command为命令。

ip常用option

-h

输出可读的信息

-f

指定协议族。可取inet、inet6、bridge、ipx、dnet。若没指定协议族,iP命令会从其他参数判断,若无法判断,则默认为inet

-4

指定协议族为inet,即为IPv4

-6

指定协议族为inet6,即为IPv6

-B

指定协议族为bridge,即为桥接

-D

指定协议族为decnet

-I(i)

指定协议族为ipx,即为IPX协议

-s

显示详细信息

ip常用object

address、a、add、addr

ipv4或6地址

l2tp

L2TP隧道协议

link

网络设备

maddress

多播地址

route

路由表

rule

路由策略

tunnel

隧道

ip常用command

add

增加

delete

删除

show

展示

set

设置down禁用,up启用

ip link set dev eth0 updev是指定网络接口

list

陈列

③route

  • 显式和管理路由表:route [option] option为命令选项

ip常用option

-A

指定协议族,可取inet、inet6

-n

显示数字形式的IP地址

-e

使用netstat格式显示路由表

del

删除路由记录

add

添加路由记录

gw

设置默认网关

dev

路由记录对应的网络接口

-net

指定目标是一个网络

-host

指定目标是一台主机

netmask

指定目标网络的子网掩码

④netstat

  • 该命令用来查看各种网络信息

  • netstat [option]

netstat常用option

-a

显示所有处于活动状态的套接字

-A

显示指定协议族的网络连接信息

-c

持续列出网络状态信息,刷新频率为1s

-e

显示更加详细的信息

-i

列出所有网络接口

-l

列出所有处于监听状态的套接字

-n

直接显示IP地址,不转化为域名

-p

显示使用套接字的进程ID和程序名称

-r

显示路由表信息

-s

显示每个协议的统计信息

-t

显示TCP/IP协议的连接信息

-u

显示UDP协议的连接信息

⑤nslookup

  • 该命令主要用来查询域名信息

  • nslookup [name | -] [server] name表示要查询的域名,server指定域名服务器。

  • 单nslookup会进入交互模式,出现>, nslookup提供了3个主要命令,分别为set(改变查询记录的类型)、server、lserver(后两个用来指定域名服务器)。

⑥ping

  • 该命令会向某主机发送ICMP数据包,并接受响应。

  • ping [option] destination option为命令选项,destination为目标主机。

ping常用option

-4

仅使用ipv4

-6

仅使用ipv6

-c

指定发送数据包的数量

-i

指定发送数据包的时间间隔,默认为秒

-I(i)

指定使用的网络接口

3. 防火墙

①ufw简介

  • Linux内核的2.4版本开始,引入了一个名为Netfilter的子系统。通过改系统,可以实现数据包的过滤、网络地址转换等网络功能。

  • 在Netfilter基础上,出现了一些防火墙管理工具,默认Ubuntu采用ufw作为防火墙管理工具。

②ufw配置

  • ufw [option] command option为命令选项,command为子命令。

ufw常用command

enable

启用uwf防火墙

disable

禁用防火墙

reload

重新加载防火墙

default

修改默认策略。该子命令可指定allow、deny、reject,并且可以指定数据包的方向为incoming、outgoing、routed

logging

  • 日志管理,包括禁用日志,以及指定日志级别

  • sudo ufw logging on 启用日志

  • sudo ufw logging off禁用日志

  • ufw日志出现在/var/log/messages、/var/log/syslog、/var/log/kern.log等文件。

reset

将防火墙配置恢复到初始状态

status

显示防火墙状态以及应用规则

show

显示防火墙信息

allow

  • 添加允许通信的规则(在防火墙规则链最后追加一条规则)

  • sudo ufw allow 80开方80端口

deny

添加禁止通信的规则

reject

添加拒绝通信的规则

limit

添加限制规则

delete

  • 删除指定规则,delete+规则即可

  • sudo ufw delete allow 8080

insert

  • 在指定位置插入规则

  • sudo ufw insert 1allow 8080在第一条规则前插入一条规则

  • 在ufw中每个需要开放端口的应用系统都会有一个配置文件。该配置文件记录了该应用系统需要的端口。默认该配置文件位于/etc/ufw/applications.d目录下。用户可以直接修改这些配置文件,或者使用命令。

  • 允许某些应用程序通过防火墙,需要首先为该应用程序在/etc/ufw/applications.d目录下创建配置文件,然后allow去允许。ufw命令会从配置文件中读取所需要开放的端口信息。

  • sudo ufw allow mysql 允许mysql通过防火墙。

app list

列出使用防火墙的应用系统

app info

列出使用防火墙的应用信息,可指定显示哪个

app update

更新应用防火墙,可指定更新哪个

app default

执行应用的默认防护墙规则,可指定用于哪个

③ufw扩展规则

  • 指定源 IP 和目标端口sudo ufw allow from 192.168.1.100 to any port 22 允许特定 IP 地址访问特定端口:这个命令允许 IP 地址 192.168.1.100 访问本机的 SSH 端口 22。

  • 指定源 IP 地址范围sudo ufw allow from 192.168.1.0/24 to any port 80 允许特定 IP 地址范围访问特定端口:允许子网 192.168.1.0/24 中的所有 IP 地址访问本机的 HTTP 端口 80。

  • 指定目标 IP 地址和端口sudo ufw allow from 192.168.1.0/24 to 192.168.1.10 port 443 如果你的服务器有多个网络接口,可以针对特定接口设置规则:这个命令允许来自 192.168.1.0/24 子网的流量访问服务器 192.168.1.10 的 HTTPS 端口 443。

  • 指定协议sudo ufw allow proto tcp from any to any port 25 你可以指定规则只应用于特定协议,如 TCP 或 UDP:这个命令允许所有 IP 地址通过 TCP 协议访问 SMTP 端口 25。

  • 指定源和目标端口sudo ufw allow from any to any port 80 proto tcp 允许来自特定端口的连接流量:这个命令允许所有 IP 地址通过 TCP 访问 HTTP 端口 80。

  • 配置出站规则sudo ufw deny out 25 默认情况下,UFW 允许所有出站流量,但你可以配置特定的出站规则:禁止所有出站流量通过端口 25。

  • 限制规则sudo ufw limit ssh/tcp 使用限制规则可以防止暴力破解攻击,例如限制 SSH 登录尝试:这个命令在某个 IP 地址过于频繁地尝试连接 SSH 时,会自动对该 IP 地址进行速率限制。

  • 配置双向规则sudo ufw allow in on eth0 to any port 443 proto tcp sudo ufw allow out on eth0 to any port 443 proto tcp 如果你希望同时控制入站和出站流量,可以配置双向规则:这两条规则允许 eth0 接口上通过 TCP 协议的入站和出站 HTTPS 流量。

  • 管理多个端口sudo ufw allow 80,443/tcp 使用逗号分隔可以在同一条规则中指定多个端口:这条规则允许所有 IP 地址通过 TCP 访问端口 80 和 443。

  • 配置 IPv6 规则sudo ufw allow from fe80::/64 to any port 22 proto tcp 默认情况下,UFW 支持 IPv6。配置 IPv6 规则的方式与 IPv4 类似:这条规则允许来自 fe80::/64 的 IPv6 流量访问 SSH 端口 22。

九. 网络服务管理

1. SSH服务

①SSH协议

  • SSH(安全外壳协议)是一种用于通过不安全的网络安全连接远程计算机的协议。它可以在两台计算机之间建立加密通信,通常用于管理任务、文件传输和安全隧道。

  • SSH协议包括两部分,分别为服务端和客户端,服务端以服务的形式运行在Linux上,监听22端口,等待客户端链接。SSH客户端有多种(Xshell......),shell本身也提供了一个命令行的SSH客户端,即ssh命令。

  • SSH提供了账号/密码以及密匙两种用户认证方式,两者都是通过密文传输数据的。前者传输账号和密码,即用户在Linux系统中的账号及其密码。后者要求用户必须为自己创建一对密钥,并且把公钥放在需要登录的服务器上。当需要连接SSH服务端的时候,客户端就会向服务器发送请求,服务器收到请求后,先在该用户的主目录下寻找公钥,再把它和发生过来的公钥进行比较。若两个密钥一直,服务端就利用公钥把反馈信息加密后发送给客户端,客户端再利用私钥解密后响应服务端的质询,从而完成密钥认证过程。

  • 密钥认证是一种非常安全的认证方式。如果没有私钥任何人无法登录该账户。

②配置SSH服务

  • SSH服务的配置文件在/etc/ssh目录中,名称为sshd_config。

  • 修改完配置后,执行sudo systemctl restart sshd 使得配置生效。

③使用账号密码登录(Xshell软件)

④使用密匙对登录SSH服务

  • 密钥登录方式同最开始介绍的。若将公钥复制到其他账户甚至主机,利用私钥也可以登录。

  • 密钥产生的既可以通过Xshell这种软件,也可以通过ssh命令行客户端产生。


  • 利用Xshell客户端生成密钥


  • 使用ssh-keygen -t rsa 生成密钥对

  • - t 是指定密匙算法,默认生成密钥长度为2048位,可以通过- b指定不同的位数(如4096位)

十. shell脚本