第一部分:Linux 命令行

第 1 章:初识 Linux 命令行

1.1 什么是 Linux

Linux 可以划分为四部分:Linux 内核(核心)、GNU 工具、图形化桌面环境、应用软件。

1.1.1 Linux 内核

Linux 系统的核心是内核,内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并更具需要执行软件。

内核主要负责四种功能:

  • 系统内存管理(可管理物理内存,以及虚拟内存)
  • 软件程序管理
  • 硬件设备管理
  • 文件系统管理

1.1.2 GNU 工具

Linux 系统需要工具来执行一些标准功能,GNU 就是通过模仿 Unix 操作系统开发出的一系列标准的计算机系统工具。

  1. 核心 GNU 工具
    供 Linux 系统使用的核心工具被称为 coreutils,其由三部分组成:用以处理文件的工具、用以操作文本的工具、用以管理进程的工具。通常将 Linux 内核和 GNU 工具的结合体称为 Linux。

  2. shell
    shell 是一种特殊的交互式工具,它为用户提供了启动程序、管理文件系统中的文件以及运行在 Linux 系统上的进程的途径。shell 核心是命令行提示符,也就是 shell 负责交互的部分。它允许你输入文本命令,然后解释命令,并在内核中执行。

1.1.3 Linux 桌面环境

Linux 桌面环境,就是类似 Windows 桌面那种可视化操作的,其中比较流行的有:X Window 系统、KDE 桌面、GNOME 桌面、Unity 桌面,等等。

1.2 Linux 发行版

我们将完整的 Linux 系统包称为发行版,有很多不同的 Linux 发行版来满足可能存在的各种运算需求。大多数发行版是为某个特定用户群指定的,每个定制的发行版都包含了支持特定功能所需的各种软件包。


第 2 章:走进 shell

2.1 进入命令行

在图形化桌面出现之前,与 Unix 系统进行交互的唯一方式就是借由 shell 所提供的文本命令行界面(CLI)。CLI 只能接受文本输入,也之恩那个显示出文本和基本的图形输出。

2.1.1 控制台终端

进入 CLI 的一种方法是让 Linux 系统退出图形化桌面模式,进入文本模式,这种模式被成为 Linux 控制台。Linux 系统启动后会自动创建出一些虚拟控制台(一般是 5~6 个),虚拟控制台是运行在 Linux 系统内存中的终端会话。

2.1.2 图形化终端

Linux 图形化桌面环境中有终端仿真包,终端仿真包会在一个桌面图形化窗口中模拟控制台终端的使用。当然图形化终端仿真只负责 Linux 图形化体验的一部分,完整的体验需要借助多个组件来实现。终端仿真器如下图:
在这里插入图片描述
要想在桌面中使用命令行,关键在于图形化终端仿真器。可以把图形化终端仿真器看作 GUI 中的 CLI 终端,将虚拟控制台看作 GUI 以外的 CLI 终端。

2.2 通过 Linux 控制台终端访问 CLI

之前提到过 Linux 启动时会创建多个虚拟控制台,但是很多 Linux 发行版在完成启动后会直接进入到图形化环境。通常可以通过 Ctrl + Alt 组合键,然后按功能键(F1~F6)进入要使用的虚拟控制台。F1 进入虚拟控制台 1,F2 进入虚拟控制台 2,以此类推。最后可以通过 F7 来返回到图形化桌面。
注意:不同的 Linux 发行版本使用的功能键可能有所不同。

文本模式的虚拟控制才采用全屏的显示方式显示文本登录界面,登入虚拟控制台之后,就进入了 Linux CLI。
在这里插入图片描述
一旦完成登录,你可以保持此次的活动状态,然后可以在不中断活动会话的同时切换到另一个虚拟控制台或图形化桌面,这样就可以拥有多个活动会话。
在这里插入图片描述
其中 tty 代表电传打字机(teletypewriter),这是一个值一台用于发消息的机器。其中 tty1 中的 1 表明这是虚拟控制台 1。

尽管虚拟控制台只是文本模式的控制台终端,但你可以修改文字和背景色。方法就是输入命令:

setterm -xxxx

下表展示了 setterm 命令的一些选项:

选项参数描述
-backgroundblack、red、green、yellow、blue、magenta、cyan 或 white将终端的背景色改为指定颜色
-foregroundblack、red、green、yellow、blue、magenta、cyan 或 white将终端的前景色改为指定颜色
-inversescreenon 或 off交换前景色和背景色
-reset将终端外观恢复成默认设置并清屏
-store将终端当前的前景色和背景色设置为 -rest 选项的值

2.3 通过图形化终端仿真访问 CLI

相较于虚拟化控制台终端,图形化桌面环境提供了更多访问 CLI 的方式。在图形化环境下,有大量可用的图形化终端仿真器。每个软件包都有各自独特的特性及选项。最常用到的有:GNOME Terminal、Konsole Termianl 和 xterm。

Tips:在一些 Linux 发行版的桌面环境中,例如 Ubuntu 的 Unity,可以使用快捷键 Ctrl+Alt+T 快速访问终端。对菜单栏的一些操作则可以使用快捷键 Ctrl+Shift+xxx 来使用。


第 3 章:基本的 bash shell 命令

大多数 Linux 发行版的默认 shell 都是 GNU bash shell。

3.1 启动 shell

GNU bash shell 能提供对 Linux 系统的交互式访问。他是作为普通程序运行的,通常是在用户登录终端时启动,登陆时系统启动的 shell 依赖于用户账户的配置。

3.2 shell 提示符

一旦启动了终端仿真软件包或者登录了 Linux 虚拟控制台,你就会看到 shell CLI 提示符。默认 bash shell 提示符是美元符号($),这个符号表明 shell 在等待用户输入,不同 Linux 发行版会采用不同格式的提示符。
在这里插入图片描述

3.3 bash 手册

大多数啊 Linux 发行版自带用以查找 shell 命令及其他 GNU 工具信息的在线手册。

man 命令用来访问存储在 Linux 系统上的手册页面,在想要查找的工具的名称前面输入 man 命令,就可以找到那个工具相应的手册条目。
在这里插入图片描述
也可以输入 man man 来查看与手册页相关的手册页。

Tips:如果不记得命令名,可以使用关键字搜索手册页。语法是:man -k 关键字。例如,要查找与终端相关的命令,可以输入 man -k terminal。

另外,大多数命令都可以接受 -help 或 --help 选项,来获取帮助信息。关于帮助的更多信息,可以输入 help help。

3.4 浏览文件系统

3.4.1 Linux 文件系统

首先,先来看一下 Linux 与 Windows 文件系统的不同。

Linux 在路径名中不使用驱动器盘符,Windows 会为每个物理磁盘驱动器分配一个盘符,每个驱动器都会有自己的目录结构。Linux 则是将文件存储在单个目录结构中,这个目录被称为虚拟目录。Linux 虚拟目录结构只包含一个称为根目录的基础目录。

Tips:Linux 使用正斜线(/)而不是反斜线(\)在文件路劲中划分目录,因为在 Linux 中反斜线是用来标识转义字符的。

Linux 会在跟驱动器上创建一些特别的目录,称为挂载点。挂载点是虚拟目录中用于分配额外存储是设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然而实际上它们却存储在另外一个驱动器中。通常系统文件会存储在根驱动器中,而用户文件则存储在另一个驱动器中。

在登录系统并获得一个 shell CLI 提示符后,会话将从主目录开始。主目录是分配给用户账户的一个特有目录。

3.4.2 遍历目录

在 Linux 文件系统时,可以使用切换目录命令 cd 将 shell 会话切换到另一个目录。cd 命令的格式如下:

cd destination

如果没有为 cd 命令指定目标路径,它将切换到用户主目录。destination 参数可以用两种方式表示:一种是使用绝对文件路径;另一种是使用相对路径。

  1. 绝对文件路径

绝对文件路劲总是以正斜线(/)开头,指明虚拟文件系统的根目录。绝对文件路径可以清晰表明用户想切换到的确切位置。要用绝对文件路径来,只需要在 cd 命令后指定全路径名。

Tips:如果 shell CLI 提示符中并没有显示 shell 会话的当前位置。可以使用 pwd 命令,来显示当前锁出位置。
在这里插入图片描述

  1. 相对文件路径

相对文件路径允许用户指定一个给予当前位置的目标文件路径。相对文件路径不以代表根目录的正斜(/)开头,而是以目录名或是一个特殊字符开始。

可以用在相对文件路径中的特殊字符有两个:

  • 单点符(.),表示当前目录;
  • 双点符(…),表示当前目录的父目录。

3.5 文件和目录列表

3.5.1 基本列表功能

ls 命令最基本的形式会展示当前目录下的文件和目录。注意,ls 命令输出的列表是按字母排序的(按列排序)。如果用户用的是支持彩色的终端仿真器,ls 命令还可以用不同的颜色来区分不同类型的文件(由 LS_COLORS 环境变量控制)。

下面是一些常用的命令:

  • ls -F 命令,可以区分文件和目录;
  • ls -a 命令,可以将隐藏文件和普通文件一起显示出来;
  • ls -R 命令,是递归选项,它会列出挡墙目录下包含的子目录中的文件。

在这里插入图片描述

3.5.2 显示长列表

基本的输出列表中,ls 命令并未输出太多每个文件的相关信息,如果要显示附加信息,另一个常用参数是 -l。-l 参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息。
在这里插入图片描述

3.5.3 过滤输出列表

ls 命令支持在命令行中定义过滤器,他会用过滤器来决定应该在输出中显示哪些文件或目录。这个过滤器就是一个进行简单文本匹配的字符串,可以在要用的命令行参数之后添加这个过滤器。

ls 命令也可以识别标准通配符,在过滤器中用它们进行模式匹配:

  • 问号(?)代表一个字符;
  • 星号(*)代表零个或多个字符;

除了这两个通配符外,还有很多其他的通配符,如中括号,感叹号等等。
在这里插入图片描述

3.6 处理文件

3.6.1 创建文件

可以通过 touch 命令创建空文件,也可以通过 touch 命令来修改时间:
在这里插入图片描述

3.6.2 复制文件

复制文件是通过 cp 命令执行的。在最基本的用法里,cp命令需要两个参数 —— 原对象和目标对象:

cp source destination

当 source 和 destination 参数都是文件名时,cp 命令将源文件复制成一个新文件,并以 destination 命名。如果后者已经存在,cp 命令并不会进行提示,会直接将其覆盖。可以通过加上 -i 选项,强制 shell 询问是否需要覆盖已有文件。
在这里插入图片描述
除了上述情况,cp 命令也可以结合绝路路径,相对路径,通配符等等。

Tips:更多关于 cp 命令的参数,可以通过 man cp 来查询。

3.6.3 制表键自动补全

制表键可以自动补全,当你在输入文件名或目录名时按下制表键(Tab),可以让 shell 帮你将内容补充完整。但是如果有其他同样前缀的文件名或目录名时,制表键就无法完成自动补全了。

3.6.4 链接文件

链接文件是 Linux 文件系统的一个优势。如需要在系统上维护同一文件的多份副本免除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接。链接时目录中指向文件真实位置的占位符。在 Linux 中有两种不同类型的文件链接:

  • 符号链接
  • 硬链接
符号链接

符号链接,就是一个实实在在的文件,它指向存放在虚拟目录结构中那个某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。为一个文件创建符号链接,原始文件必须存在,然后使用 ln 命令以及 -s 选项来创建符号链接。
在这里插入图片描述
在上面例子中,test_one_link 在 ln 命令中的第二个参数位置上。显示在长列表中符号文件名后的 -> 符号表明该文件是链接到问价 test_one 上的一个符号链接。可以注意到,符号链接的文件大小与数据文件的大小并不相同,所以它们是两个完全不同的文件。

硬链接

硬链接会船舰独立的虚拟文件,其中包含了原始文件信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用源文件。要创建硬链接,原始文件也必须实现存在,只不过这次使用 ln 命令时不再需要加入额外的参数。
在这里插入图片描述
在上述例子中,我们使用 ls -li 命令显示了 test_one 及 test_one_link 的 inode 编号以及长列表。可以发现,带有硬链接的文件共享 inode 编号且有相同的文件大小,这是因为它们是同一个文件。

文件或目录的 inode 编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的没有给对象。要查看文件或目录的 inode 编号,可以给 ls 命令加入 -i 参数。

需要注意的是,只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。

3.6.5 重命名文件

在 Linux 中,重命名文件称为移动(mv),mv 命令可以将文件和目录移动到另一个文职或重命名。需要注意的是,mv 命令可以将文件名进行更改,但是 inode 编号和时间戳保持不变。这是因为 mv 只影响文件名。
在这里插入图片描述

3.6.6 删除文件

在 Linux 中,删除叫做移除(rm),rm 命令的基本格式非常简单。同样的 rm 命令也可以添加 -i 参数,来提示你是否需要删除文件。
在这里插入图片描述
rm 的另一个特性是,如果要删除很多文件且不受提示符的打扰,可以使用 -f 参数强制删除。

3.7 处理目录

3.7.1 创建目录

在 Linux 中创建目录,可以使用 mkdir 命令。
在这里插入图片描述
可以注意到,查看刚刚创建的 New_Dir 的长列表是以 d 开头,这就表明了 New_Dir 是目录,而非文件。

如果需要同时创建多个目录和子目录,需要加入 -p 参数:

mkdir -p New_Dir/Sub_Dir/Under_Dir

3.7.2 删除目录

在 Linux 中删除目录的命令是 rmdir。

但是需要知道的是,rmdir 命令只能删除空目录,如果我们的目录中含有其他东西的话,rmdir 就会拒绝删除此目录,这是因为 rmdir 命令并没有 -i 选项来询问是否要删除目录。
在这里插入图片描述
当然也可以在整个目录上使用 rm 命令,使用 -r 选项使得命令可以向下进入目录,删除其中的文件,然后在删除目录本身。
在这里插入图片描述
需要注意的是,使用 rm 命令删除目录时,必须使用 -r 选项,否则 rm 会拒绝删除一个目录。

说明:对 rm 命令而言,-r 参数和 -R 参数的效果式样的。-R 参数同样可以递归地删除目录中的文件。shell 命令很少会就相同的功能采用不同大小写的参数。

3.8 查看文件内容

3.8.1 查看文件类型

Linux 中的 file 命令可以探测文件的内部,并决定该文件是什么类型的文件。
在这里插入图片描述

3.8.2 查看整个文件

Linux 有三个不同的命令可以查看文件内容。

  1. cat 命令

cat 命令是显示文本文件中所有数据的工具。它有几个常用参数:-n 参数会给所有的行加上行号;-b 参数给有文本的行加上行号;-T 参数可以不显示制表符(使用 ^I 字符组合代替)。

  1. more 命令

cat 命令的主要缺陷是:一旦运行,就无法控制后面的操作。more 命令会显示文本的内容,但是会在显示每页数据之后停下来。
在这里插入图片描述
more 命令只支持文本文件中基本移动。

  1. less 命令

less 命令实际上是 more 命令的升级版,它提供了一些极为实用的特性,能过够是现在文本文件中的前后反动,而且还有一些搜索功能。less 命令除了支持 more 命令相同的命令集,它还包括更多的选项。

3.8.3 查看部分文件

由于 cat 或 more 只能加载完整个文件后才能看到,如果要查看文件开头或末尾处的文本就会十分麻烦。所以查看部分文件,主要是针对文件的末尾处(tail)或者是开头处(head)。

  1. tail 命令

tail 命令会显示文件尾部的内容,默认情况下,它会显示文件末尾的 10 行。也可以通过加入 -n x(或 -x) 选项,使 tail 命令显示文件的最后 x 行。

-f 参数是 tail 命令的一个特殊性质,它允许你在其他进程使用该文件是查看文件的内容。tail 命令会保持活动状态,并不断显示添加到文件的内容。这是实时监测系统日志的绝妙方式。

  1. head 命令

head 命令,会显示文件开头的内容,默认情况下它会显示文件前 10 行的文本。类似 tail 命令,head 命令也支持 -n 参数,但是它并不支持 -f 参数,因为文件的开头通常不会改变。


第 4 章:更多的 bash shell 命令

4.1 检测程序

Linux 系统管理员面临的最复杂的任务就是跟踪运行在系统中的程序。这一节主要是介绍一些帮助在 Linux 上管理程序的基本工具。

4.1.1 探查进程(ps)

当程序运行在系统上时,我们称之为进程。想检测进程,就需要使用 ps 命令,ps 命令可以输出运行在系统上所有程序的信息。

默认情况下 ps 命令不会提供很多信息,只会显示运行在当前控制台下的属于当前用户的进程。
在这里插入图片描述
Linux 系统中,ps 命令支持 3 中不同类型的命令行参数:

  • Unix 风格参数,前面家单破折线;
  • BSD 风格参数,前面不加破折线;
  • GNU 风格的长参数,前面加双破折线。
  1. Unix 风格参数

Unix 风格参数是从贝尔实验室开发的 AT&T Unix 系统上原有的 ps 命令继承下来的。很多 Linux 系统管理员常常会使用 -ef 参数组合来提取自己想要的信息。
在这里插入图片描述
-e 参数指定显示所有运行在系统上的进程;-f 参数则扩展了输出,这些扩展的列包含的字段如下:

  • UID:启动这些进程的用户。
  • PID:进程的进程ID。
  • PPID:父进程的进程号(如果该进程是由另一个进程启动的)。
  • C:进程生命周期中的 CPU 利用率。
  • STIME:进程启动时的系统时间。
  • TTY:进程启动时的终端设备。
  • TIME:运行进程需要的累计 CPU 时间。
  • CMD:启动的程序名称。

如果想要获得更多的信息,可以采用 -l 参数,它会产生一个长格式输出。
在这里插入图片描述
使用 -l 参数之后多出了如下的字段:

  • F:内核分配给进程的系统标记。
  • S:进程的状态(O 代表正在运行;S 代表在休眠;R 代表可运行,正在等待运行;Z 代表僵化,进程完成但父进程没有响应;T 代表停止)。
  • PRI:进程的优先级(越大的数组代表越低的优先级)。
  • NI:谦让度值用来参与决定优先级。
  • ADDR:进程的内存地址。
  • SZ:加入进程被换出,所需交换空间的大致大小。
  • WCHAN:进程休眠的内核函数的地址。
  1. BSD 风格参数

伯克利软件发行版(BSD)时加州大学伯克利分校开发的一个 Unix 版本,它和 AT&T Unix 系统有许多细小的不同。

在使用 BSD 参数时,ps 命令会自动改变输出以模仿 BSD 格式。
在这里插入图片描述
其中大部分输出都跟 Unix 风格参数一致,只有一小部分不同:

  • VSZ:进程在内存中的大小,以千字节(KB)为单位。
  • RSS:进程在为未换出时占用的物理内存。
  • STAT:代表当前进程状态的双字符状态码。

相比较于 Unix 风格参数,BSD 风格的 l 参数能输出更详细的进程状态码(STAT 列)。第一个字符采用了和 Unix 风格 S 列相同的值,第二个参数进一步说明进程的状态:

  • <:该进程运行在高优先级上。
  • N:该进程运行在低优先级上。
  • L:该进程有页面锁定在内存中。
  • s:该进程是控制进程。
  • l:该进程是多线程进程。
  • +:该进程运行在前台。
  1. GNU 长参数
    GNU 开发人员在 ps 命令中加入了另外一些参数,其中一些 GNU 长参数复制了现有的 Unix 或 BSD 类型的参数,而另一些则提供了新功能。

可以将 GNU 长参数和 Unix 或 BSD 风格的参数混用来定制输出。GNU 长参数中最受喜爱的是 --forest 参数,它会显示进程的层级,并用 ASCII 字符绘制出图表。
在这里插入图片描述
这种格式让追踪子进程和父进程变得更加容易。

4.1.2 实时监测进程(top)

ps 命令只能显示某个特定时间点的信息,如果想观察频繁换进换出的内存的进程趋势就需要使用 top 命令(因为 top 命令是实时显示的)。
在这里插入图片描述
第一行显示的是系统概况:显示了当前时间、系统的运行时间、登录的用户数以及系统的平均负载(最近 1 分钟、最近 5 分钟和最近 15 分钟)。如果近 15 分钟内的平均负载都很高,就说明系统可能有问题。

第二行显示了进程概要信息:显示有多少进程在运行、休眠、停止或是僵化状态。

第三行显示了 CPU 的概要信息:top 根据进度属主(用户还是系统)和进程的状态,将 CPU 利用率分成几类输出。

第四行和第五行说明名系统内存的状态:第一行说的是系统的物理内存,总共有多少内存,当前用了多少,还有多少空闲;最后一行说的是同样的信息,不过是针对系统交换空间的状态而言。

最后显示的是当前运行中的进程的详细列表:

  • PID:进程的进程ID。
  • USER:进程属主的名字。
  • PR:进程的优先级
  • NI:进程的谦让度值。
  • VIRT:进程占用的虚拟内存总量。
  • RES:进程占用的物理内存总量。
  • SHR:进程和其他进程共享的内存总量。
  • S:进程的状态(D 代表可中断的休眠状态;R 代表在运行状态;S 代表在休眠;Z 代表僵化状态;T 代表停止状态或跟踪状态)。
  • %CPU:进程使用的 CPU 时间比例。
  • %MEM:进程使用的内存站可用内存的比例。
  • TIME+:子进程启动到目前为止的 CPU 时间总量。
  • COMMAND:进程所对应的命令行名称,也就是启动的程序名。

4.1.3 结束进程

有时进程挂起了,需要你让进程重新运行或结束;有时,有的进程会耗尽 CPU 且不释放资源。这时候就需要控制进程,在 Linux 中,进程之间通过信号来通信。信号就是预定义好的一个消息,进程能识别它并决定忽略还是做出反应。

在 Linux 中 有两个命令可以想运行中的进程发出进程信号。

  1. kill 命令
    kill 命令可通过进程 IP(PID)给进程发信号。默认情况下,kill 命令会向命令行中列出的全部 PID 发送一个 TERM 信号(尽可能终止)。要发送进程信号,你必须是进程的属主或登录为 root 用户。

  2. killall 命令
    killall 命令支持通过进程名而不是 PID 来结束进程。killall 命令也支持通配符,这在系统因负载过大而变慢时很有效。

警告:以 root 用户身份登陆系统时,使用 killall 命令要特别小心,因为很容易就会误用通配符而结束了重要的系统进程。

4.2 检测磁盘空间

系统管理员的另一个重要任务就是检测系统磁盘的的使用情况,你需要知道还有多少空间可以留给你的应用程序。

4.2.1 挂载存储媒体

Linux 文件系统将所有的磁盘都并入一个虚拟目录下,在使用新的存储媒体之前,需要把它放到虚拟目录下,这项工作称为挂载

大多数 Linux 发行版都能自动挂载特定类型的可移动存储媒体(如 U 盘),如果不支持自动挂载和卸载可移动存储媒体的话,就必须手动完成。

  1. mount 命令

Linux 上用来挂载媒体的命令叫作 mount。默认情况下,mount 命令会输出当前系统上挂载的设备列表。
在这里插入图片描述
mount 命令提供如下四部分信息:

  • 媒体的设备文件名
  • 媒体挂载到虚拟目录的挂载点
  • 文件系统类型
  • 已挂载媒体的访问状态

要手动在虚拟目录中挂载设备,需要以 root 用户身份登录,或是以 root 用户身份运行 sudo 命令。下面是手动挂载媒体设备的基本命令:

mount -t type decice directory

比如,手动将 U 盘(大多数 U 盘会被格式化成 vfat 文件系统) /dev/sdb1 挂载到 /media/disk,可以用如下命令:

mount -t vfat /dev/sdb1 /media/disk
  1. umount 命令

从 Linux 系统上移除一个可移动设备时,不能直接从系统上移除,而应该先卸载。卸载设备的命令时 umount,其格式非常简单:

umount [directory | device]

umount 命令支持通过设备文件或者挂载点来指定要卸载的设备。如果有任何程序正在使用设备上的文件,系统就不允许你卸载它。

4.2.2 使用 df 命令

df 命令可以查看所有已挂载磁盘的使用情况。
在这里插入图片描述

说明:Linux 系统后台一直有进程来处理文件或使用文件。df 命令的输出值显示的时 Linux 系统认为的当前值。有可能系统上有运行的进程已经创建或删除了某个文件,但尚未释放文件。这个值是不会算进闲置空间的。

4.2.3 使用 du 命令

du 命令可以显示某个特定目录(默认情况时当前目录)的磁盘使用情况。这一方法可用来快速判断系统上某个目录下是不是有超大文件。
在这里插入图片描述
每行输出左边的数值时每个文件或目录占用的磁盘块数。

4.3 处理数据文件

4.3.1 排序数据

处理大量数据时一个常用命令是 sort 命令。默认情况下 sort 命令按照会话指定的默认语言的排序规则对文本文件中的数据排序。
在这里插入图片描述
sort 常用的参数选项有,-n 将数字识别成数字而不是字符,并按值排序;-M 按月排序(三字符的月份名);-k(排序从 POS1 位置开始,如果指定了 POS2,到 POS2 位置结束) 和 -t(指定一个用来区分键位的字符) 参数在对按字段分隔的数据进行排序十分有用;-r 将结果逆序输出。

4.3.2 搜索数据

如果需要在大文件中找一行数据,可以使用 grep 命令,其格式如下:

grep [options] pattern [file]

grep 命令会在输入或指定的文件中查找包含匹配指定模式的字符的行。grep 的输出就是包含了匹配模式的行。在这里插入图片描述
-v 进行反向搜索;-n 查看行号;-c 查看有多少行含匹配模式;-e 指定多个匹配模式(每个匹配模式之间的关系是 或);也可以使用正则表达式。
在这里插入图片描述

4.3.3 压缩数据

类似 Windows 的 zip 文件,Linux 也有自己的压缩文件和压缩工具,如下表所示:

工具文件扩展名描述
bzip2.bz2采用 Burrows-Wheeler 块排序文本压缩算法和霍夫曼编码
compress.Z最初的 Unix 文件压缩工具,很少使用了
gzip.gzGNU 压缩工具,用 Lempel-Ziv 编码
zip.zipWindows 上 PKZIP 工具的 Unix 实现

gzip 是 Linux 上最流行的压缩工具,它是 GNU 项目的产物,这个软件包含有下面的工具:

  • gzip:用来压缩文件。
  • gzcat(我的是 zcat):用来查看压缩过的文本文件的内容。
  • gunzip:用来解压文件。

在这里插入图片描述


第 5 章:理解 shell

shell 不单单是一种 CLI,它是一个时刻都在运行的复杂交互式程序。

5.1 shell 的类型

系统启动什么类型的 shell 程序取决于你个人的用户 ID 配置,在 /etc/passwd 文件中(可以使用 cat 命令查看),在用户 ID 记录的第 7 个字段中列出了默认的 shell 程序。

默认交互的 shell 会在用户登录某个虚拟控制台终端或 GUI 运行终端仿真器时启动。不过还有另外一个默认 shell 是 /bin/sh。它作为默认的系统 shell,用于那些需要在启动时使用的系统 shell 脚本。

在有些 Linux 发行版中,默认的系统 shell 和默认的交互 shell 并不相同:
在这里插入图片描述
用户 ubuntu 默认的交互 shell 是 zsh(z shell),但是默认系统 shell 被设置成 dash shell。

5.2 shell 的父子关系

默认的交互 shell,是一个父 shell。在 CLI 提示符后输入 /bin/bash 命令或其他等效的 bash 命令是,会创建一个新的 shell 程序,这个 shell 程序被称为子 shell
在这里插入图片描述
第一次使用 ps -f 时,显示出两个进程,ps -f 是在父 shell 中执行的。在输入 bash 命令之后,多出了一个子 shell,第二个 ps -f 是在子 shell 中执行的。父 shell 进程 ID 是 1827,子 shell 的进程 ID 是 1842,其父进程 ID(PPID)是 1827,这就指明了它们之间的关系。

说明:进程就是正在运行的程序。bash shell 是一个程序,当它运行的时候,就成为了一个进程。一个运行着的 shell 就是某种进程而已。

子 shell 可以从父 shell 中创建,也可以从另一个子 shell 中创建,可以通过 ps --forest 命令展示它们之间的关系。
在这里插入图片描述
如果想结束子 shell,可以利用 exit 命令,来退出子 shell。
在这里插入图片描述
exit 命令不仅能退出子 shell,还能用来登出当前的虚拟控制台终端或终端仿真器,只需要在父 shell 中输入 exit,就可以退出 CLI 了。

5.2.1 进程列表

在一行中指定要一次执行的一系列命令,可以通过命令列表来实现,只需要在命令之间加入分号(;)即可。
在这里插入图片描述
上面的例子中,所有命令依次执行,但是这并不是进程列表。命令列表要想成为进程列表,这些命令必须包含在括号里。
在这里插入图片描述
括号的加入使命令列表变成了进程列表,生成了一个子 shell 来执行对应的命令。

说明:进程列表是一种命令分组。另一种命令分组是将命令放入花括号中,并在命令列表的尾部加上分号。语法为 { command; }。使用花括号进行命令分组并不会像进程列表那样创建出子 shell。

可以通过一个环境变量的命令 echo $BASH_SUBSHELL 来判断是否生成了子 shell,如果该命令返回 0,就表明没有子 shell,如果返回 1 或者其他更大的数字,就表明存在子 shell。
在这里插入图片描述

5.2.2 别出心裁的子 shell 用法

在交互式 shell 中,一个高效的子 shell 用法就是使用后台模式。

  1. 探索后台模式

在后台模式中运行命令可以在处理命令的同时让出 CLI,以供他用。将命令置入后台模式,可以在命令末尾加上字符 &,这里我们使用 sleep 函数来进行测试。
在这里插入图片描述
在 shell CLI 提示符返回之前,会出现两条信息。第一条信息是显示在方括号中的后台作业号([1]),第二条是后台作业的进程 ID(2087)。我们也可以使用 jobs 命令来显示后台作业信息,jobs 命令可以显示出当前运行在后台模式中的所有用户的进程。
在这里插入图片描述
2. 将进程列表置入后台

参考下面的例子:
在这里插入图片描述
第一次直接是使用进程列表,其结果和期望是一致的,停滞两秒,显示变量 BASH_SUBSHELL,再停滞两秒,然后返回提示符。但是如果将这个进程列表放入后台模式,其表现就有所不同。

在 CLI 中运用子 shell 的创造性方法之一就是将进程列表置入后台模式。既可以在子 shell 中进行反中的处理工作,同时也不会让子 shell 的 I/O 受制于终端。

  1. 协程

协程可以同时做两件事,它在后台生成一个 shell,并在这个子 shell 中执行命令。要进行协程处理,得使用 coproc 命令,还有要在子 shell 中执行的命令。
在这里插入图片描述
除了创建子 shell 之外,协程基本上就是将命令置入后台模式。在这里插入图片描述
上例中,CORPOC 是 coproc 给进程起的名字,当然也可以使用命令的扩展语法自己设置这个名字。
在这里插入图片描述

说明:协程可以发送或接受来自子 shell 中进程的信息。只有在拥有多个协程的时候才需要对协程进行命名,因为你得和它们进行通信。否则的话,让 coproc 命令将其设置成默认的名字 COPROC 即可。

5.3 理解 shell 的内置命令

5.3.1 外部命令

外部命令,有时候也被称为文件系统命令,是存在于 bash shell 之外的程序,他们并不是 shell 程序的一部分。外部命令程序通常位于 /bin、/usr/bin、/sbin 或 /usr/sbin 中。ps 就是一个外部命令,可以使用 which 或 type 命令找到它。
在这里插入图片描述
当外部命令执行时,会创建出一个子进程。这种操作被称为衍生。外部命令 ps 很方便显示出它的父进程以及机子所对应的衍生子进程。
在这里插入图片描述

5.2.3 内置进程

内指命令和外部命令的区别在于前者不需要使用子进程来执行。它们已经和 shell 编译成了一体,作为 shell 工具的组成部分存在。不需要借助外部程序文件来运行。cd 和 exit 命令都是 bash shell 的内置命令,可以利用 type 命令来了解某个命令是否是内置命令。
在这里插入图片描述
因为既不需要通过衍生子进程来执行,也不需要打开程序文件,内置命令的执行速度更快、效率更高。有些命令有多种实现,如 echo 和 pwd 既有内置命令也有外部命令,两种实现略有不同。
在这里插入图片描述

  1. history 命令

内置命令 history,可以追踪你使用过的命令,你可以换回这些命令并重新使用。
在这里插入图片描述
如果想唤回并重用历史列表中最近的命令,可以输入两个感叹号(!!),当输入 !! 时,bash 首先会显示出从 shell 的历史记录中唤回的命令,然后执行该命令。如果要唤回历史列表中任意命令,只需输入感叹号和命令在历史列表中的编号即可。
在这里插入图片描述
命令历史记录会保存在隐藏文件 .bash_history 中,它位于用户的主目录中。需要注意的时,bash 命令的历史记录实现存放在内存中,当 shell 退出时才被写入到历史文件中

  1. 命名别名(alias)

命令别名允许你为常用的命令(及其参数)创建另一个名称,从而将输入量减少到最低。可以通过 alias -p 来查看已经设置好的命名别名。
在这里插入图片描述
也可以使用 alias 命令创建自己的别名。在定义好别名之后,随时可以在 shell 中使用它,就算在 shell 脚本中也没有问题。因为命名别名属于内部命令,一个别名尽在它所被定义的 shell 进程中才有效。
在这里插入图片描述


第 6 章:使用 Linux 环境变量

6.1 什么是环境变量

bash shell 使用环境变量来存储有关 shell 会话和工作环境的信息(这也是它们被称为环境变量的原因)。这项特性允许你在内存中存储数据,一边程序或 shell 中运行的脚本能够轻松访问到他们。这也是存储持久数据的一种简便方法。这也是存储持久数据的方法。

6.1.1 全局环境变量

全局环境变量对于 shell 会话和所有生成的子 shell 都是可见的。局部变量则只对创建它们的 shell 可见。这让全局环境变量对那些所创建的子 shell 需要获取父 shell 信息的程序来说十分有用。

系统环境变量基本都是以全大写字母,以区别普通用户的环境变量。查看全局变量,可以使用 env 或 printenv 命令。
在这里插入图片描述
要显示个别环境变量的值,可以使用 printenv 命令,而不能使用 env 命令,也可以使用 echo 显示变量的值,但是需要在变量前加上美元符($)。在 echo命令中,在变量名前加上 $ 不仅仅可以显示变量当前的值,还可以让变量作为命令行参数。
在这里插入图片描述

6.1.2 局部环境变量

局部环境变量只能在定义它们的进程中可见,在 Linux 中没有专门查看局部环境变量的命令,但是可以通过 set 命令显示某个特定进程中的所有环境变量。

说明:set 命令会显示出部变量、全局变量以及用户定义变量,它还会按照字母顺序对结果进行排序。env 和 printenv 命令同 set 命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。

6.2 设置用户定义变量

6.2.1 设置局部用户变量

可以通过等号给环境变量复制(变量名、等号和值之间没有空格),值可以是数值或字符串。如果要给变量赋一个含有空格的字符串值,必须单引号来界定字符串的首和尾,如果没有引号的花,bash shell 会以为下一个此时另一个要执行的命令。
在这里插入图片描述

Tips:所有系统环境变量均使用大写字符,如果时自己创建的局部环境变量或 shell 脚本,请使用小写字母(区分大小写),这能够避免重新定义系统环境变量可能带来的灾难。

如果生成了另外一个 shell,它在子 shell 中就不可使用了(同理,回到父 shell 时,子 shell 的局部变量也不存在)。
在这里插入图片描述

6.2.2 设置全局环境变量

在设定全局环境变量的进程所创建的子进程中,该变量都是可见的(但是全局环境变量在其父进程并不可见)。创建全局环境变量的方法就是先创建一个局部环境变量,然后再把它导出到全局环境中。这个过程通过 export 命令完成,变量名前面不需要再加 $。
在这里插入图片描述
需要知道的是,子 shell 中修改的全局环境变量并不会反应到父 shell 中,甚至子 shell 无法使用 export 命令改变父 shell 中全局环境变量的值。
在这里插入图片描述

6.3 删除环境变量

删除环境变量可以通过 unset 命令(不要使用 $)。
在这里插入图片描述

Tips:在设计环境变量时,可以记住如果要用到变量,使用 $;如果要操作变量,不使用 $。这条规则的一个例外就是使用 printenv 显示某个变量的值。

不过在删除环境变量时,子进程的操作也无法反应到父进程中,也就是如果你在子进程中删除了一个全局变量这只对子进程有效,而该全局环境变量在父进程依然可用。

6.4 设置 PATH 环境变量

当输入一个外部命令时,shell 必须搜索系统来找到对应的程序。PATH 环境变量定义了用户进行命令和程序查找的目录。
在这里插入图片描述
输出中显示了有 8 个可供 shell 用来查找命令和程序的目录,PATH 中的目录使用冒号分隔。如果命令或程序的位置没有包括在 PATH 变量中,那么如果不适用绝对路径,shell 是无法找到的,此时它会产生也给错误信息。
在这里插入图片描述
输出中显示了有 8 个可供 shell 用来查找命令和程序的目录,PATH 中的目录使用冒号分隔。如果命令或程序的位置没有包括在 PATH 变量中,那么如果不适用绝对路径,shell 是无法找到的,此时它会产生也给错误信息。

此时我们可以添加新的搜索目录到现有的 PATH 环境变量中,只需要引用原来的 PATH 值,然后再给这个字符传添加新目录即可。
在这里插入图片描述
这样对 PATH 变量的修改只能吃需要退出或重启系统,并不能持续。

6.5 定位系统环境变量

在启动一个 bash shell 时,默认情况下 bash 会在几个文件中查找命令。这些文件叫做启动文件环境文件。bash 检查的启动文件取决于启动 bash shell 的方式。启动 bash shell 的方式有三种:

  • 登陆时作为默认的 shell
  • 作为非登录 shell 的交互式 shell
  • 作为运行脚本的非交互 shell

6.5.1 登录 shell

当登录 Linux 系统是,bash shell 会作为登录 shell 启动。登录 sehll 会从 5 个不同的启动文件里读取命令:

  • /etc/profile(默认的主启动文件)
  • $HOME/.bash_profile
  • $HOME/.bashrc
  • $HOME/.bash_login
  • $HOME/.profile
  1. /etc/profile

/etc/profile 文件是 bash shell 的住启动文件。只要你登陆了 Linux 系统,bash 就会执行 /etc/profile 启动文件中的命令。不同的 Linux 发行版在这个文件里放了不同的设置和命令。

  1. $HOME 目录下的启动文件

剩下的启动文件都起着一个作用:提供要给用户专属的启动文件来定义该用户所用到的环境变量。这四个启动文件并不需要全部使用,有时候只是用一到两个。

需要注意的是这四个文件都是以点号开头,这说明它们是隐藏文件(不会再通常的 ls 命令输出列表中出现)。它们位于用户的 HOME 目录下,所以每个用户可以编辑这些文件并添加自己的环境变量,这些环境变量会在每次启动 bash shell 会话时生效。

Tips:$HOME 表示的时某个用户的主目录,它和破浪号(~)的作用一样。

6.5.2 交互式 shell 进程

如果 bash shell 不是登陆系统时启动的(比如在命令行提示符下输入 bash 时启动),那么这个 shell 叫做交互式 shell。交互式 shell 不会像登录 shell 一样运行,但它依然提供了命令行提示符来输入命令。

如果 bash 是作为交互式 shell 启动,它就不会访问 /etc/profile 文件,只会检查用户 HOME 目录中的 .bashrc 文件。

.bashrc 文件有两个作用:一是查看 /etc 目录下通用的 bashrc 文件,二是为用户提供一个定制自己的命名别名和私有脚本函数的地方。

6.5.3 非交互式 shell

系统执行 shell 脚本时用的就是这种 shell。不同的地方在于它没有命令行提示符。

Tips:脚本能以不同的方式执行,只有其中的某一些方式能够启动子 shell。

但是当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令,为了处理这种情况,bash shell 提供了 BASH_ENV 环境变量。当 shell 启动一个非交互式 shell 进程时,它会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell 会执行该文件里的命令,这通常包括 shell 脚本变量设置。

有些 shell 脚本是通过启动一个子 shell 来执行的,即使 BASH_ENV 变量没有设置,子 shell 可以继承父 shell 导出过的变量。不过要知道,由父 shell 设置但并未导出的变量都是局部变量,子 shell 无法继承局部变量。

6.5.4 环境变量持久化

可以通过将变量设置在 /etc/profile 文件中,来创建自己的永久性全局变量或局部变量,但是如果升级了你所用的发行版,这个文件也会更新,之前创建的都会失效。最好是在 /etc/profile.d 目录中创建一个以 .sh 结尾的文件,把所有新的或修改过的全局环境变量设置在这个文件中。

大多数发行版本,存储个人用户变量的地方是 $HOME/.bashrc 文件。

6.6 数组变量

环境变量可以作为数组使用,要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。
在这里插入图片描述
需要注意的是,数组并不可以向普通的环境变量一样直接输出(有的发行版本可以)。
在这里插入图片描述
可以使用 unset 命令删除数组中的某个值,但是这样可能会比较复杂。
在这里插入图片描述
此例使用 unset 删除了索引值为 2 的元素,显示整个数组时是正确的,但是当输出索引值为 2 的元素是,就可以看到这个位置的元素是空的。


第 7 章:理解 Linux 文件权限

Linux 沿用了 Unix 文件权限的办法,即允许用户和组根据每个文件和目录的安全性设置来访问文件。

7.1 Linux 的安全性

Linux 安全系统的核心是用户账户。每个能进入 Linux 系统的用户都会被分配唯一的用户账户,用户对系统中各个对象的访问权限取决于他们登陆系统时用的账户。用户权限是通过创建用户时分配的用户 ID(UID)来跟踪的,每个用户都有唯一的 UID。

7.1.1 /etc/passwd 文件

/etc/passwd 文件,是用来将用户的登录名匹配到对应 UID 的文件,它包含了一些与用户有关的信息。
在这里插入图片描述
root 用户是 Linux 系统的管理员,固定分配给它们的 UID 是 0。像上图所展示的,Linux 系统会为各种功能创建不同的账号,这些账户被称为系统账户,是系统上运行的各种服务进程访问资源用的特殊账户。

Linux 为系统账户预留了 500 以下的 UID 值,为普通用户创建账户时,大多数系统从 500 开始,将第一个可用 UID 分配给这个账户。

/etc/passwd 文件的字段主要包含了如下信息:

  • 登陆用户名
  • 用户密码
  • 用户账户的 UID
  • 用户账户的 GID
  • 用户账户的文本描述(称为备注字段)
  • 用户 HOME 目录的位置
  • 用户默认的 shell

为了减少安全隐患,用户密码字段都被设置为 x,将其专门存放在 /etc/shadow 文件中,只有特定的程序(如登录程序)才能访问这个文件。

7.1.2 /etc/shadow 文件

/etc/shadow 文件对 Linux 系统密码管理提供了更多的控制,而且只有 root 用户可以访问 /etc/shadow 文件。
在这里插入图片描述
/etc/shadow 文件的每条记录都有 9 个字段:

  • 与 /etc/passwd 文件中的登录名字段对应的登录名
  • 加密后的密码
  • 自上次修改密码后过去的天数
  • 多少天后才可以更改密码
  • 多少天后必须更改密码
  • 密码过期前提前多少天提醒用户更改密码
  • 密码过期后多少填禁用用户账户
  • 用户账户被禁用的日期
  • 预留字段给将来使用

7.2 使用 Linux 组

为了解决共享资源的一组用户的安全性,Linux 系统采用了这个安全概念。组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。每个组都有唯一的 GID(类似 UID)以及唯一的组名。

7.2.1 /etc/group 文件

/etc/group 文件包含了系统上用到的每个组的信息。
在这里插入图片描述
系统账户用的组通常会分配低于 500 的 GID 值,而用户组的 GIP 则会从 500 开始分配。/etc/group 文件有四个字段:

  • 组名
  • 组密码
  • GID
  • 数组改组的用户列表

组密码允许非组内成员通过它成为该值的临时成员,不能通过直接修改 /etc/group 文件来添加用户到一个组,要用 usermod 命令。

说明:在列表中,有些组并没有列出用户,这并不是说这些组没有成员。当一个用户在 /etc/passwd 文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现再 /etc/group 文件中。

7.2.2 创建新组(groupadd)

groupadd 命令可以在系统上创建新组。
在这里插入图片描述
在创建新组时,默认没有用户被分配到该组,groupadd 命令没有提供将用户添加到组中的选项,但可以用 usermod 命令来弥补。
在这里插入图片描述
shared 组里现在又一个成员 ubuntu,usermod 命令的 -G 选项会把这个新组添加到该用户账户的组列表中。

警告:如果加了 -g 选项,指定的组名会替换掉该账户的默认组,-G 选项则将该组添加到用户的属组列表中,不会影响默认组。

说明:如果更改了已登录系统账户所属的用户组,该用户必须退出登陆后再登陆,族惯习的更改才能生效。

7.3 理解文件权限

7.3.1 使用文件权限符

ls 命令可以用来查看 Linux 系统上的文件、目录和设备的权限。
在这里插入图片描述
其输入结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象的类型:

  • - 代表文件
  • d 代表目录
  • l 代表链接
  • c 代表字符型设备
  • b 代表块设备
  • n 代表网络设备

之后时 3 组三字符的编码。每一组定义了三种访问权限:

  • r 代表对象是可读的
  • w 代表对象是可写的
  • x 代表对象是可执行的

若没有某种权限,在该权限位会出现单破折线。这 3 组权限分别对应对象的 3 个安全级别:

  • 对象的属主
  • 对象的属组
  • 系统其他用户

参考下面的例子:

-rw-r--r-- 1 ubuntu ubuntu   63  520 16:22 test_two.gz

文件 test_two.gz 有下面 3 组权限:

  • rw-:文件的属主(登录名 ubuntu) 可以读取、该文件。
  • r–:文件的属组(组名 ubuntu)只能读取该文件。
  • r–:系统上其他人也只能读取该文件。

7.3.2 默认文件权限

umask 命令用来设置所创建文件和目录的默认权限。
在这里插入图片描述
umask 的第一位代表了一项特别的安全特性 —— 粘着位。后面 3 位标识文件或目录对应的 umask 八进制值。

八进制模式的安全性设置先获取这 3 个 rwx 权限的值,然后将其转换成 3 位二进制值,用一个八进制值来表示。假如,权限值是 r–,其二进制值就是 100,代表的八进制值就是 4。

权限二进制值八进制值描述
0000没有任何权限
–x0011只有执行权限
-w-0102只有写入权限
-wx0113有写入和执行权限
r–1004只有读取权限
r-x1015有读取和执行权限
rw-1106有读取和写入权限
rwx1117有全部权限

八进制模式先取得权限的八进制,然后再把这三组安全级别(属主、属组和其他用户)的八进制值顺序取出。

Linux 系统上默认的八进制 umask 值是 0022,但是创建的文件八进制权限却并不是 022,这是因为 umask 值只是掩码,它会屏蔽掉不想授予该安全级别的权限。

要把 umask 值从对象的全权限值中减掉,对于文件来说,全权限值是 666(所有用户都可读写);而对目录来说,则是 777(所有用户都有读、写、执行权限)。所以文件一开始的权限是 666,减去 mask 值 002 之后,剩下的文件权限就成了 644。
在这里插入图片描述
在大多数 Linux 发行版中,umask 值通常会设置在 /etc/profile 启动文件中,不过有一些是设置在 /etc/login.defs 文件中(如 Ubuntu)。也可以用 umask 命令为默认 umask 设置指定一个新值。

在这里插入图片描述
此时默认的文件权限也会有所改变。

7.4 改变安全性设置

如果你已经创建了一个目录或文件,需要改变它的安全性设置,在 Linux 系统上有一些工具可以来完成这件事。

7.4.1 改变权限(chmod)

chmod 命令用来改变文件和目录的安全性设置。该命令格式如下:

chmod options mode file

mode 参数可以使用八进制模式或符号模式进行安全设置,八进制模式设置非常直观,直接用期望赋予文件的标准 3 位八进制权限码即可。
在这里插入图片描述
八进制文件权限会自动应用到指定文件上。下面是符号模式指定权限的格式:

[ugoa...][[+-=][rwxXstugo...]]

第一组字符定义了权限作用的对象:

  • u 代表用户
  • g 代表组
  • o 代表其他
  • a 代表所有

第二组符号表示你是想在现有权限基础上增加权限(+),还是在现有权限基础上移除权限(-),或是将权限设置成后面的值(=)。

第三组符号代表作用到设置上的权限,除了 rwx 额外的设置有:

  • X:如果对象是目录或其它已有执行权限,赋予执行权限。
  • s:运行时重新设置 UID 或 GID。
  • t:保留文件或目录。
  • u:设置属主权限。
  • g:设置数组权限。
  • o:设置其他用户权限。在这里插入图片描述

7.4.2 改变所属关系(chown / chgrp)

有时需要改变文件的属主,比如有人离职或开发人员创建了一个在产品环境中需要归属在系统账户下的应用。Linux 提供了两个命令来实现这个功能:chown 命令用来改变文件的属主,chgrp 命令来改变文件的默认属组。

chown 命令格式如下:

chown options owner[.group] file

可以用登录名或 UID 来指定文件的新属主,chown 命令也支持同时待变文件的属主和属组。在这里插入图片描述

说明:只有 root 用户可以改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。

而 chgrp 命令只可以改变文件或目录的默认属组。在更改完属组之后,新属组的人一个成员都可以写这个文件了(这是 Linux 系统共享文件的一个途径)。

7.5 共享文件

创建新文件时,Linux 会用默认的 UID 和 GID 给文件分配权限,想让其他人也能访问文件,要么改变其他用户所在安全组的权限,要么就给文件分配一个包含其他用户的新默认属组。

Linux 为每个文件和目录存储了 3 个额外的信息位:

  • 设置用户 ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
  • 设置组 ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
  • 粘着位:进程结束后文件还驻留(粘着)在内存中。

启用 SGID 位之后,你可以强制在一个共享目录下创建的新文件都属于该目录的属组,这个组也就成为了每个用户的属组。SGI 可以通过 chmod 命令设置,它会加到标准 3 位八进制值之前(组成 4 位八进制值),或者在符号模式下用符号 s。

二进制值八进制值描述
0000所有位都清零
0011粘着位置位
0102SGID 位置位
0113SGID 位和粘着位都置位
1004SUID 位置位
1015SUID 位和粘着位置位
1106SUID 位和 SGID 位置位
1117全部位都置位

因此,要创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将目录的 SGID 位置位。
在这里插入图片描述
为了让这个环境可以正常工作,所有组成员都需要把它们的 umask 值设置成文件对属组成员可写。将 umask 改成 002,就可以使文件对属组可写。
在这里插入图片描述
现在组成员就能到共享目录下创建新文件了,新文件会沿用目录的属组,而不是用户的默认属组,shared 组的所有用户都可以访问这个文件。


第 8 章:管理文件系统

使用 Linux 系统时,需要做出的决策之一就是位存储设备选用什么文件系统。大多数 Linux 发行版在安装时会提供默认的文件系统。

8.1 探索 Linux 文件系统

Linux 的文件系统为我们在硬盘中存储的 0 和 1 和应用中使用的文件与目录之间搭建起了一座桥梁。

Linux 支持多种类型的文件和文件系统管理文件和目录。每种文件系统都在存储设备上实现了虚拟目录结构,仅特性略有不同。

8.1.1 基本的 Linux 文件系统

Linux 最初采用的是一种简单的文件系统,它模仿了 Unix 文件系统的功能。

  1. ext 文件系统

Linux 中最早的文件系统叫作扩展文件系统(ext),它为 Linux 提供了一个基本的类 Unix 文件系统:使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据。

  1. ext2 文件系统

最早的 ext 文件系统又很多限制,比如文件大小不得超过 2GB,在 Linux 出现后不久,ext 文件系统就升级到了第二代扩展文件系统。但是 ext2 文件系统容器在系统奔溃或断电时损坏。

8.1.2 日志文件系统

日志文件系统为 Linux 系统增加了一层安全性。它不再使用之前先将数据直接写入存储设备再更新索引节点表的做法,而是先将文件的更改写入到临时文件(即,日志)中。再数据成功写到存储设备和索引节点表之后,再删除对应的日志条目。

如果系统再数据被写入存储设备之前崩溃或断电了,日志文件系统下次回读取日志文件并处理上次留下的未写入的数据。

Linux 中有 3 种广泛使用的日志方法,每种的保护等级都不相同,如下表:

方法描述
数据模式索引节点和文件都会被写入日志;丢失数据风险低,但性能差
有序模式只有索引节点数据会被写入日志,但只有数据成功写入后才删除;在性能和安全性之间取得了良好的折中
回写模式只有索引节点数据被写入日志,但不控制文件数据何时写入;丢失数据风险高,但扔比不用日志好

所有写到存储设备上的数据都必须写两次:第一次写入日志,第二次才写入真正的存储设备。

日志文件系统有:ext3、ext4、Reiser 文件系统、JFS 文件系统、XFS 文件系统。

8.1.3 写时复制

就文件系统而言,日志式的另一种选择是叫作写时复制(COW) 的技术。COW 利用快照兼顾了安全性和性能。如果要修改数据,会使用克隆或可写快照。修改过的数据并不会直接覆盖当前数据,而是被放入文件系统种的另一个位置上,即便是数据修改已经完成,之前的旧数据也不会被重写。

COW 文件系统中,最流行的两种是 Btrf文件系统 和 ZFS文件系统。

8.2 操作文件系统

8.2.1 创建分区(fdisk)

fdisk 工具用来帮助管理安装在系统上的任何存储设备上的分区,它是个交互式程序,允许你输入命令来逐步完成硬盘分区操作。

要启动 fdisk 命令,必须指定要分区的存储设备的设备名,另外还得有超级用户权限。

说明:Linux 采用一种标准格式来为硬盘分配设备名称。对于老式的 IDE 驱动器,Linux 使用 /dev/hdx;对于较新的 SATA 驱动器和 SCSI 驱动器,Linux 使用 /dev/sdx。其中 x 表示一个字母,具体是什么要根据驱动器的检测顺序(第一个驱动器是 a,第二个驱动器是 b,依次类推)。在格式化分区之前,最好再检查一下是否正确指定了驱动器。

如果你拥有超级用户权限,并指定了正确的驱动器,那就可以进入 fdisk 工具的操作界面了。如果这是第一次给该存储设备分区,fdisk 会警告你设备上没有分区表。
在这里插入图片描述
常用命令有 p(查看设备)、n(创建分区)、l(查看类型)、w(保存到设备上)。

使用 p 命令可以将一个存储设备的详细信息显示出来。
在这里插入图片描述
输出显示这个存储设备有 40GB 的空间。存储设备明细后的列表说明这个设备上是否已有分区。

下一步,可以使用 n 命令再该存储设备上创建新的分区。
在这里插入图片描述
分区可以按主分区(primary)和扩展分区(extended)创建。主分区可以被文件系统直接格式化,而扩展分区则只能容纳逻辑分区(logical)。扩展分区出现的原因是每个存储设备上只能有 4 个分区,可以通过创建多个扩展分区,然后再扩展分区内创建逻辑分区进行扩展。

在上例中,在存储设备上给它分配了分区号 1,然后给它分配了 1MB 的存储设备空间。
在这里插入图片描述
fdisk 允许创建多种分区类型,使用 l 命令列出可用的不同类型。默认类型是 83,表示定义了一个 Linux 文件系统。如果想为其他文件系统创建一个分区,只要选择一个不同的分区类型即可。
在这里插入图片描述
创建了想要的分区之后,用 w 命令将更改保存到设备上。存储设备的分区信息被写入分区表中,Linux 系统通过 ioct1() 调用来货至新分区的出现,设置到分区之后,可以通过 Linux 文件系统对齐进行格式化。

8.2.2 创建文件系统

在将数据存储到分区之前,必须使用某种文件系统对其进行格式化,这样 Linux 才能使用它。每种文件系统类型都用自己的命令程序来格式化分区。

工具用途
mkefs创建一个 ext 文件系统
mke2fs创建一个 ext2 文件系统
mkfs.ext3创建一个 ext3 文件系统
mkfs.ext4创建一个 ext4 文件系统
mkreiserfs创建一个 ReiserFS 文件系统
jfs_mkfs创建一个 JFS 文件系统
mkfs.xfs创建一个 XFS 文件系统
mkfs.zfs创建一个 ZFS 文件系统
mkfs.btrfs创建一个 Brefs 文件系统

并非所有文件系统都默认安装了,可以通过 type 命令查看,是否安装了某个文件系统工具。
在这里插入图片描述
每个文件系统命令都有很多命令行选项,允许你定制如何在分区上创建文件系统。所有的文件系统命令都允许通过不带选项的简单命令来创建一个默认的文件系统。
在这里插入图片描述
然后我们需要将文件系统挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了,可以将新文件系统挂载到虚拟目录中需要额外空间的任何位置。

mkdir 命令在虚拟目录中创建了挂载点,mount 命令将新的硬盘分区添加到挂载点,-t 选项指明了要挂载的文件系统类型。之后就可以在新分区中保存新文件和目录了。
在这里插入图片描述

说明:这种方法只能临时挂载文件系统,当重启 Linux 系统时,文件系统并不会自动挂载。要强制 Linux 在启动时自动挂载新的文件系统,可以将其添加到 /etc/fstab 文件。

8.2.3 文件系统的检查与修复(fsck)

每个文件系统都有各自可以和文件系统交互的恢复命令,fsck 命令能够检查和修复大部分类型的 Linux 文件系统,该命令的格式是:

fsck options filesystem

可以在命令行上列出多个要检查的文件系统,文件系统可以通过设备名、在虚拟目录中的挂载点以及分配给文件系统的唯一 UUID 值来引用。fsck 命令使用 /etc/fstab 文件来自动决定正常挂载到系统上的存储设备的文件系统。如果存储设备尚未挂载(比如刚刚在新的存储设备上创建了文件系统),需要用 -t 命令行选项来指定文件系统类型。

Tips:只能在未挂载的文件系统上运行 fsck 命令。对大多数文件系统来说,只需要卸载文件系统来进行检查,检查完成后重新挂载即可。

8.3 逻辑卷管理

如果用标准分区在硬盘上创建文件系统,只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有空间了,你就必须农业给更大的硬盘,然后手动将已有的文件系统移动到新的硬盘上。

这时候可以通过将另一个硬盘上的分区加入已有的文件系统,动态地添加存储空间。Linux 逻辑卷管理器(LVM)软件包就是用来做这个的。

8.3.1 逻辑卷管理布局

逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理中,硬盘分区成为物理卷(PV)。每个物理卷都会映射到硬盘上特定的物理分区。

多个物理卷集中在一起,形成一个卷组(VG)。逻辑卷管理器将卷组视为一个物理硬盘,但事实上卷组可能由分布在多个物理硬盘上的多个物理分区组成。卷组提供了一个创建逻辑分区的平台,而这些逻辑分区则包含了文件系统。

整个结构中的最后一层是逻辑卷(LV)。逻辑卷为 Linux 提供了创建文件系统的分区环境,作用类似于物理硬盘分区,Linux 系统将逻辑卷视为物理分区。

可以用任一标准 Linux 文件系统来格式化逻辑卷,然后再将它加入 Linux 虚拟目录中的某个挂载点。

8.3.2 LVM

LVM 允许你在 Linux 上使用简单的命令行命令管理一个完整的逻辑卷管理环境。Linux LVM 有两个可用版本:LVM1 和 LVM2。LVM2 在标准的 LVM1 功能外提供了额外的功能。

  1. 快照

LVM 允许你在逻辑卷在线的状态下将其复制到另一个设备,这个功能叫作快照。传统的备份方法在将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键的 Web 服务器或数据库服务器继续工作

  1. 条带化

有了条带化,可以跨多个物理硬盘创建逻辑卷。条带化有助于提高硬盘的性能,因为 Linux 可以将一个文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘等待读写磁头到多个不同位置。

  1. 镜像

镜像是一个实时更新的逻辑卷的完整副本,当你创建镜像逻辑卷时,LVM 会将原始逻辑卷同步到镜像副本中。


第 9 章:安装软件程序

9.1 包管理基础

各种主流 Linux 发行版都采用了某种形式的包管理系统(PMS) 来控制软件和库的安装。PMS 利用一个数据库来记录各种相关内容:

  • Linux 系统上一安装了什么软件包;
  • 每个包安装了什么文件;
  • 每个已安装软件包的版本。

软件包存储在服务器上,可以利用本地 Linux 系统上的 PMS 工具通过互联网访问,这些服务器被称为仓库。可以利用 PMS 工具来搜索新的软件包,或者是更新系统上已安装软件包

需要知道的是,PMS 工具及相关命令在不同的 Linux 发行版上有很大的不同,Linux 中广泛使用的两种主要的 PMS 基础工具是 dpkg 和 rpm。

基于 Debian 的发行版(如 Ubuntu 和 Linux Mint)使用的是 dpkg 命令,这些发行版的 PMS 工具也是以该命令为基础的。dpkg 会直接和 Linux 上的 PMS 交互,用来安装、管理和删除软件包。

基于 Red Hat 的发行版(如 Fedora、openSUSE 及 Mandriva)使用的是 rpm 命令,该命令是其 PMS 的底层基础。类似 dpkg 命令,rpm 能够列出已安装包、安装新报和删除已有软件。

9.2 基于 Debian 的系统

dpkg 命令是基于 Debian 系 PMS 工具的核心,aptitude 则是 apt 工具和 dpkg 的前端。dpkg 是软件包管理系统工具,aptitude 则是完整的软件包管理系统。

9.2.1 使用 aptitude 管理软件包

如果使用的 Linux 发行版中已经安装了 aptitude,只需要在 shell 提示符输入 aptitude(有的是输入 apt)。aptitude 的常用命令及其用法如下图所示。
在这里插入图片描述

9.2.2 aptitude 仓库

aptitude 默认的软件仓库位置是在安装 Linux 发行版时设置的,具体位置存储在文件 /etc/apt/sources.list 中。

很多情况下,跟不需要添加或删除软件仓库,所以也没有必要接触这个 文件。但 aptitude 只会从这些仓库中下载文件。另外,在搜索软件进行安装或更新时,aptitude 通用指挥检查这些库。如果需要为你的 PMS 添加一些额外的软件仓库,就可以在这个文件中设置。
在这里插入图片描述


第 10 章:使用编辑器

常见的 Linux 文本编辑器有 vim 编辑器、nano 编辑器、emacs 编辑器、KWrite 编辑器、Kate 编辑器和 GNOME 编辑器。

10.1 vim 编辑器

vi 编辑器是 Unix 系统最初的编辑器,它使用控制台图形模式来模拟文本编辑窗口,允许查看文件中的行、在文件中移动、插入、编辑和替换文本。

10.1.1 检查 vim 软件包

在使用 vim 编辑器之前,首先需要了解自己所使用的 vim 是不是完整版的。
在这里插入图片描述
可以注意到,vim 程序被设置了链接(有可能没有),此时它就有可能会被链接到一个功能较弱的编辑器,所以最好检查一下链接文件(可以一步一步检查,也可以通过 readlink -f 命令直接找到链接文件的最后一环)。
在这里插入图片描述
vim.tiny 只提供少量的 vim 编辑器功能,所以如果需要 vim 编辑器,而且你最后链接的 vim 是 vim.tiny,可以通过下面的命令来安装 vim.basic:

sudo apt-get install vim

10.1.2 vim 基础

vim 编辑器在内存缓冲区中处理数据,只要输入 vim 命令和要编辑的文件名字就可以启动 vim 编辑器了:

vim myprog.c

如果在启动 vim 时未指定文件名,或这个文件不存在,vim 会开辟一段新的缓冲区来编辑。如果是已存在的文件,vim 会将文件的整个内容都读到一块缓冲区域来准备编辑。

在这里插入图片描述
最初的 vim 编辑窗口显示了文件的内容(如果有的话),并在窗口底部显示一条消息行。如果文件内容并未占据整个屏幕,vim 会在非文件内容行设置一个波浪线。

vim 编辑器有两种操作模式:

  • 普通模式
  • 插入模式

当刚打开要编辑的文件时,vim 会进入普通模式,在普通模式中,vim 编辑器会将案件解释成命令。

在插入模式下,vim 会将你在当前光标位置输入的每个键都插入到缓冲区中。按下 i 键进入插入模式,按下 ESC 键退回到普通模式。

在普通模式种,可以用方向键在文本区域移动光标(只要 vim 能正确识别你的终端类型),如果在一个没有定义方向键的终端连接上,vim 中也有用来移动的光标命令:

  • h:左移一个字符。
  • j:下移一行。
  • k:上移一行。
  • l:右移一个字符
  • PageDownCtrl+F:下翻一屏。
  • PageUpCtrl+B:上翻一屏。
  • G:移动到缓冲区最后一行。
  • num G:移动到黄忠去中的第 num 行。
  • gg:移动到缓冲区第一行。

vim 编辑器在普通模式下有个特别的功能叫命令行模式。命令行模式提供了一个交互式命令行,可以输入额外的命令来控制 vim 的行为。要进入命令航模是,在普通模式下按下冒号键,光标会移动到消息行,然后出现冒号,等待输入命令。
在这里插入图片描述
在命令行模式下有几个命令可以将缓冲区的数据保存到文件中:

  • q:如果未修改缓冲区数据,退出。
  • q!:取消所有对缓冲区数据的修改并退出。
  • w filename:将文件保存到另一个文件中。
  • wq:将缓冲区数据保存到文件中并退出。

10.1.3 编辑数据

在普通模式下,vim 编辑器提供了一些命令来编辑缓冲区中的数据,如下表所示:

命令描述
x删除当前光标所在位置的字符
dd删除当前光标所在行
dw删除当前光标所在位置的单词
d$删除当前光标所在位置至行尾的内容
J删除当前光标所在行行尾的换行符(拼接行)
u撤销前一编辑命令
a在当前光标后追加数据
A在当前光标所在行行未追加数据
r char用 char 替代当前光标所在位置的单个字符
R test用 test 覆盖当前光标所在位置的数据,直到按下 ESC 键

有些编辑器命令允许数字修饰符来指定重复该命令多少次。比如,2x 会删除从光标当前开始的两个字符。

10.1.4 复制粘贴

剪切粘贴:在 vim 中删除数据时,实际上会将数据保存在单独的一个寄存器中,可以用 p 命令取回数据。

复制粘贴:vim 中复制命令是 y(yank),可以在 y 后面使用和 d 命令相同的第二个字符(yw 表示复制一个单词,y$ 表示复制到行尾),在复制文本后,可以使用 p 命令粘贴。

10.1.5 查找和替换

查找

要输入一个查找字符串,就按下斜线(/)键,输入想要查找的文本后,按下回车即可、如果要继续查找同一个单词,可以按下斜线键再按回车,或者直接按下 n 键,表示下一个。

替换

替换命令允许你快速用另一个单词来替换文本中的某个单词。但是必须进入命令行模式才能使用替换命令,其格式为:

:s/old/new/

vim 编辑器会跳到从光标开始 old 第一次出现的地方,并用 new 替换。可以对替换命令做一些修改来替换多出文本:

  • : s/old/new/g:一行命令替换所有 old。
  • :n, ms/old/new/g:替换行号 n 和 m 之间所有 old。
  • :%s/old/new/g:替换整个文件中所有 old。
  • :%s/old/new/gc:替换整个文件中所有 old,但在每次出现时提示。

10.2 nano 编辑器

nano 文本编辑器时 Unix 系统的 Pico 编辑器的克隆版。大多数 Linux 发行版都默认安装了 nano 文本编辑器,打开格式如下:

nano myprog.c

注意,在 nano 编辑器窗口的底部显示了各种命令及简要描述,这些命令时 nano 的控制命令。字符 ^ 表示 Ctrl 键,即 ^x 表示组合键 Ctrl+X。

Tips:尽管 nano 控制命令在列出组合时用的是大写字母,但在使用时,大小写字母都可以。

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值