标签 LFCS 下的文章

由于 2016 年 2 月 2 号开始启用了新的 LFCS 考试要求,我们在已经发表的 LFCS 系列 基础上增加了一些必要的主题。为了准备考试,同时也建议你看看 LFCE 系列 文章。

第十四讲: 监控 Linux 进程并为每个用户设置进程限制

每个 Linux 系统管理员都应该知道如何验证硬件、资源和主要进程的完整性和可用性。另外,基于每个用户设置资源限制也是其中一项必备技能。

在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方法,这些方法能够避免潜在的会导致生产环境下线或钱财损失的问题发生。

报告 Linux 进程统计信息

你可以使用 mpstat 单独查看每个处理器或者系统整体的活动,可以是每次一个快照或者动态更新。

为了使用这个工具,你首先需要安装 sysstat

# yum update && yum install sysstat              [基于 CentOS 的系统]
# aptitutde update && aptitude install sysstat   [基于 Ubuntu 的系统]
# zypper update && zypper install sysstat        [基于 openSUSE 的系统]

你可以在 在 Linux 中学习 Sysstat 和其中的工具 mpstat、pidstat、iostat 和 sar 了解更多和 sysstat 和其中的工具相关的信息。

安装完 mpstat 之后,就可以使用它生成处理器统计信息的报告。

你可以使用下面的命令每隔 2 秒显示所有 CPU(用 -P ALL 表示)的 CPU 利用率(-u),共显示 3 次。

# mpstat -P ALL -u 2 3

示例输出:

Linux 3.19.0-32-generic (tecmint.com)   Wednesday 30 March 2016     _x86_64_    (4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

要查看指定的 CPU(在下面的例子中是 CPU 0),可以使用:

# mpstat -P 0 -u 2 3

示例输出:

Linux 3.19.0-32-generic (tecmint.com)   Wednesday 30 March 2016     _x86_64_    (4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

上面命令的输出包括这些列:

  • CPU: 整数表示的处理器号或者 all 表示所有处理器的平均值。
  • %usr: 运行在用户级别的应用的 CPU 利用率百分数。
  • %nice: 和 %usr 相同,但有 nice 优先级。
  • %sys: 执行内核应用的 CPU 利用率百分比。这不包括用于处理中断或者硬件请求的时间。
  • %iowait: 指定(或所有)CPU 的空闲时间百分比,这表示当前 CPU 处于 I/O 操作密集的状态。更详细的解释(附带示例)可以查看这里
  • %irq: 用于处理硬件中断的时间所占百分比。
  • %soft: 和 %irq 相同,但是是软中断。
  • %steal: 虚拟机非自主等待(时间片窃取)所占时间的百分比,即当虚拟机在竞争 CPU 时所从虚拟机管理程序那里“赢得”的时间。应该保持这个值尽可能小。如果这个值很大,意味着虚拟机正在或者将要停止运转。
  • %guest: 运行虚拟处理器所用的时间百分比。
  • %idle: CPU 没有运行任何任务所占时间的百分比。如果你观察到这个值很小,意味着系统负载很重。在这种情况下,你需要查看详细的进程列表、以及下面将要讨论的内容来确定这是什么原因导致的。

运行下面的命令使处理器处于极高负载,然后在另一个终端执行 mpstat 命令:

# dd if=/dev/zero of=test.iso bs=1G count=1
# mpstat -u -P 0 2 3
# ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
# mpstat -u -P 0 2 3

最后,和 “正常” 情况下 mpstat 的输出作比较:

Linux 处理器相关统计信息报告

正如你在上面图示中看到的,在前面两个例子中,根据 %idle 的值可以判断 CPU 0 负载很高。

在下一部分,我们会讨论如何识别资源饥饿型进程,如何获取更多和它们相关的信息,以及如何采取恰当的措施。

Linux 进程报告

我们可以使用有名的 ps 命令,用 -eo 选项(根据用户定义格式选中所有进程) 和 --sort 选项(指定自定义排序顺序)按照 CPU 使用率排序列出进程,例如:

# ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

上面的命令只会显示 PIDPPID、和进程相关的命令、 CPU 使用率以及 RAM 使用率,并按照 CPU 使用率降序排序。创建 .iso 文件的时候运行上面的命令,下面是输出的前面几行:

根据 CPU 使用率查找进程

一旦我们找到了感兴趣的进程(例如 PID=2822 的进程),我们就可以进入 /proc/PID(本例中是 /proc/2822) 列出目录内容。

这个目录就是进程运行的时候保存多个关于该进程详细信息的文件和子目录的目录。

例如:

  • /proc/2822/io 包括该进程的 IO 统计信息(IO 操作时的读写字符数)。
  • /proc/2822/attr/current 显示了进程当前的 SELinux 安全属性。
  • /proc/2822/cgroup 如果启用了 CONFIGCGROUPS 内核设置选项,这会显示该进程所属的控制组(简称 cgroups),你可以使用下面命令验证是否启用了 CONFIGCGROUPS:
# cat /boot/config-$(uname -r) | grep -i cgroups

如果启用了该选项,你应该看到:

CONFIG_CGROUPS=y

根据 红帽企业版 Linux 7 资源管理指南 第一到四章的内容、openSUSE 系统分析和调优指南 第九章、Ubuntu 14.04 服务器文档 Control Groups 章节,你可以使用 cgroups 管理每个进程允许使用的资源数目。

/proc/2822/fd 这个目录包含每个打开的描述进程的文件的符号链接。下面的截图显示了 tty1(第一个终端) 中创建 .iso 镜像进程的相关信息:

查找 Linux 进程信息

上面的截图显示 stdin(文件描述符 0)、stdout(文件描述符 1)、stderr(文件描述符 2) 相应地被映射到 /dev/zero/root/test.iso/dev/tty1

更多关于 /proc 信息的可以查看 Kernel.org 维护的 “/proc 文件系统” 和 Linux 开发者手册。

在 Linux 中为每个用户设置资源限制

如果你不够小心、让任意用户使用不受限制的进程数,最终你可能会遇到意外的系统关机或者由于系统进入不可用的状态而被锁住。为了防止这种情况发生,你应该为用户可以启动的进程数目设置上限。

你可以在 /etc/security/limits.conf 文件末尾添加下面一行来设置限制:

*       hard    nproc   10

第一个字段可以用来表示一个用户、组或者所有人(*), 第二个字段强制限制可以使用的进程数目(nproc) 为 10。退出并重新登录就可以使设置生效。

然后,让我们来看看非 root 用户(合法用户或非法用户) 试图引起 shell fork 炸弹 (参见 WiKi) 时会发生什么。如果我们没有设置限制, shell fork 炸弹会无限制地启动函数的两个实例,然后无限循环地复制任意一个实例。最终导致你的系统卡死。

但是,如果使用了上面的限制,fort 炸弹就不会成功,但用户仍然会被锁在外面直到系统管理员杀死相关的进程。

运行 Shell Fork 炸弹

提示limits.conf 文件中可以查看其它 ulimit 可以更改的限制。

其它 Linux 进程管理工具

除了上面讨论的工具, 一个系统管理员还可能需要:

a) 通过使用 renice 调整执行优先级(系统资源的使用)。这意味着内核会根据分配的优先级(众所周知的 “niceness”,它是一个范围从 -2019 的整数)给进程分配更多或更少的系统资源。

这个值越小,执行优先级越高。普通用户(而非 root)只能调高他们所有的进程的 niceness 值(意味着更低的优先级),而 root 用户可以调高或调低任何进程的 niceness 值。

renice 命令的基本语法如下:

# renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

如果 new priority 后面的参数没有(为空),默认就是 PID。在这种情况下,PID=identifier 的进程的 niceness 值会被设置为 <new priority>

b) 需要的时候中断一个进程的正常执行。这也就是通常所说的“杀死”进程。实质上,这意味着给进程发送一个信号使它恰当地结束运行并以有序的方式释放任何占用的资源。

按照下面的方式使用 kill 命令杀死进程

# kill PID

另外,你也可以使用 pkill 结束指定用户(-u)、指定组(-G) 甚至有共同的父进程 ID (-P) 的所有进程。这些选项后面可以使用数字或者名称表示的标识符。

# pkill [options] identifier

例如:

# pkill -G 1000

会杀死组 GID=1000 的所有进程。而

# pkill -P 4993 

会杀死 PPID 是 4993 的所有进程。

在运行 pkill 之前,先用 pgrep 测试结果、或者使用 -l 选项列出进程名称是一个很好的办法。它需要和 pkill 相同的参数、但是只会返回进程的 PID(而不会有其它操作),而 pkill 会杀死进程。

# pgrep -l -u gacanepa

用下面的图片说明:

在 Linux 中查找用户运行的进程

总结

在这篇文章中我们探讨了一些监控资源使用的方法,以便验证 Linux 系统中重要硬件和软件组件的完整性和可用性。

我们也学习了如何在特殊情况下采取恰当的措施(通过调整给定进程的执行优先级或者结束进程)。

我们希望本篇中介绍的概念能对你有所帮助。如果你有任何疑问或者评论,可以使用下面的联系方式联系我们。


via: http://www.tecmint.com/monitor-linux-processes-and-set-process-limits-per-user/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

由于 LFCS 考试需求的变动已于 2016 年 2 月 2 日生效,因此我们向 LFCS 系列 添加了一些必要的话题。为了准备认证考试,我们也强烈推荐你去看看 LFCE 系列

LFCS 系列第十三讲:配置并排除 Grub 引导加载程序故障。

本文将会向你介绍 GRUB 的知识,并会说明你为什么需要一个引导加载程序,以及它是如何给系统增加功能的。

Linux 引导过程 是从你按下你的电脑电源键开始,直到你拥有一个全功能的系统为止,整个过程遵循着这样的主要步骤:

    1. 一个叫做 POST上电自检)的过程会对你的电脑硬件组件做全面的检查。
    1. POST 完成后,它会把控制权转交给引导加载程序,接下来引导加载程序会将 Linux 内核(以及 initramfs)加载到内存中并执行。
    1. 内核首先检查并访问硬件,然后运行初始化进程(主要以它的通用名 init 而为人熟知),接下来初始化进程会启动一些服务,最后完成系统启动过程。

在该系列的第七讲(“SysVinit、Upstart 和 Systemd”)中,我们介绍了现代 Linux 发行版使用的一些服务管理系统和工具。在继续学习之前,你可能想要回顾一下那一讲的知识。

GRUB 引导装载程序介绍

在现代系统中,你会发现有两种主要的 GRUB 版本(一种是有时被称为 GRUB Legacyv1 版本,另一种则是 v2 版本),虽说多数最新版本的发行版系统都默认使用了 v2 版本。如今,只有 红帽企业版 Linux 6 及其衍生系统仍在使用 v1 版本。

因此,在本指南中,我们将着重关注 v2 版本的功能。

不管 GRUB 的版本是什么,一个引导加载程序都允许用户:

  1. 通过指定使用不同的内核来修改系统的行为;
  2. 从多个操作系统中选择一个启动;
  3. 添加或编辑配置区块来改变启动选项等。

如今,GNU 项目负责维护 GRUB,并在它们的网站上提供了丰富的文档。当你在阅读这篇指南时,我们强烈建议你看下 GNU 官方文档

当系统引导时,你会在主控制台看到如下的 GRUB 画面。最开始,你可以根据提示在多个内核版本中选择一个内核(默认情况下,系统将会使用最新的内核启动),并且可以进入 GRUB 命令行模式(使用 c 键),或者编辑启动项(按下 e 键)。

GRUB 启动画面

你会考虑使用一个旧版内核启动的原因之一是之前工作正常的某个硬件设备在一次升级后出现了“怪毛病(acting up)”(例如,你可以参考 AskUbuntu 论坛中的这条链接)。

在启动时会从 /boot/grub/grub.cfg/boot/grub2/grub.cfg 文件中读取GRUB v2 的配置文件,而 GRUB v1 使用的配置文件则来自 /boot/grub/grub.conf/boot/grub/menu.lst。这些文件不应该直接手动编辑,而应通过 /etc/default/grub 的内容和 /etc/grub.d 目录中的文件来更新。

CentOS 7 上,当系统最初完成安装后,会生成如下的配置文件:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

除了在线文档外,你也可以使用下面的命令查阅 GNU GRUB 手册:

# info grub

如果你对 /etc/default/grub 文件中的可用选项特别感兴趣的话,你可以直接查阅配置一节的帮助文档:

# info -f grub -n 'Simple configuration'

使用上述命令,你会发现 GRUB_TIMEOUT 用于设置启动画面出现和系统自动开始启动(除非被用户中断)之间的时间。当该变量值为 -1 时,除非用户主动做出选择,否则不会开始启动。

当同一台机器上安装了多个操作系统或内核后,GRUB_DEFAULT 就需要用一个整数来指定 GRUB 启动画面默认选择启动的操作系统或内核条目。我们既可以通过上述启动画面查看启动条目列表,也可以使用下面的命令:

在 CentOS 和 openSUSE 系统上

# awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg

在 Ubuntu 系统上

# awk -F\' '$1=="menuentry " {print $2}' /boot/grub/grub.cfg

如下图所示的例子中,如果我们想要使用版本为 3.10.0-123.el7.x86_64 的内核(第四个条目),我们需要将 GRUB_DEFAULT 设置为 3(条目从零开始编号),如下所示:

GRUB_DEFAULT=3

使用旧版内核启动系统

最后一个需要特别关注的 GRUB 配置变量是 GRUB_CMDLINE_LINUX,它是用来给内核传递选项的。我们可以在 内核变量文件man 7 bootparam 中找到能够通过 GRUB 传递给内核的选项的详细文档。

我的 CentOS 7 服务器上当前的选项是:

GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"

为什么你希望修改默认的内核参数或者传递额外的选项呢?简单来说,在很多情况下,你需要告诉内核某些由内核自身无法判断的硬件参数,或者是覆盖一些内核检测的值。

不久之前,就在我身上发生过这样的事情,当时我在自己已用了 10 年的老笔记本上尝试了衍生自 SlackwareVector Linux。完成安装后,内核并没有检测出我的显卡的正确配置,所以我不得不通过 GRUB 传递修改过的内核选项来让它工作。

另外一个例子是当你需要将系统切换到单用户模式以执行维护工作时。为此,你可以直接在 GRUB_CMDLINE_LINUX 变量中直接追加 single 并重启即可:

GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet single"

编辑完 /etc/default/grub 之后,你需要运行 update-grub (在 Ubuntu 上)或者 grub2-mkconfig -o /boot/grub2/grub.cfg (在 CentOSopenSUSE 上)命令来更新 grub.cfg 文件(否则,改动会在系统启动时丢失)。

这条命令会处理早先提到的那些启动配置文件来更新 grub.cfg 文件。这种方法可以确保改动持久化,而在启动时刻通过 GRUB 传递的选项仅在当前会话期间有效。

修复 Linux GRUB 问题

如果你安装了第二个操作系统,或者由于人为失误而导致你的 GRUB 配置文件损坏了,依然有一些方法可以让你恢复并能够再次启动系统。

在启动画面中按下 c 键进入 GRUB 命令行模式(记住,你也可以按下 e 键编辑默认启动选项),并可以在 GRUB 提示中输入 help 命令获得可用命令:

修复 Linux 的 Grub 配置问题

我们将会着重关注 ls 命令,它会列出已安装的设备和文件系统,并且我们将会看看它查找到的东西。在下面的图片中,我们可以看到有 4 块硬盘(hd0hd3)。

貌似只有 hd0 已经分区了(msdos1 和 msdos2 可以证明,这里的 1 和 2 是分区号,msdos 则是分区方案)。

现在我们来看看能否在第一个分区 hd0msdos1)上找到 GRUB。这种方法允许我们启动 Linux,并且使用高级工具修复配置文件,或者如果有必要的话,干脆重新安装 GRUB:

# ls (hd0,msdos1)/

从高亮区域可以发现,grub2 目录就在这个分区:

查找 Grub 配置

一旦我们确信了 GRUB 位于 (hd0, msdos1),那就让我们告诉 GRUB 该去哪儿查找它的配置文件并指示它去尝试启动它的菜单:

set prefix=(hd0,msdos1)/grub2
set root=(hd0,msdos1)
insmod normal
normal

查找并启动 Grub 菜单

然后,在 GRUB 菜单中,选择一个条目并按下回车键以使用它启动。一旦系统成功启动后,你就可以运行 grub2-install /dev/sdX 命令修复问题了(将 sdX 改成你想要安装 GRUB 的设备)。然后启动信息将会更新,并且所有相关文件都会得到恢复。

# grub2-install /dev/sdX

其它更加复杂的情景及其修复建议都记录在 Ubuntu GRUB2 故障排除指南 中。该指南中阐述的概念对于其它发行版也是有效的。

总结

本文向你介绍了 GRUB,并指导你可以在何处找到线上和线下的文档,同时说明了如何面对由于引导加载相关的问题而导致系统无法正常启动的情况。

幸运的是,GRUB 是文档支持非常丰富的工具之一,你可以使用我们在文中分享的资源非常轻松地获取已安装的文档或在线文档。

你有什么问题或建议吗?请不要犹豫,使用下面的评论框告诉我们吧。我们期待着来自你的回复!


via: http://www.tecmint.com/configure-and-troubleshoot-grub-boot-loader-linux/

作者:Gabriel Cánepa 译者:ChrisLeeGit 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

由于 2016 年 2 月 2 号开始启用了新的 LFCS 考试要求, 我们在 LFCS 系列系列添加了一些必要的内容。为了考试的需要,我们强烈建议你看一下LFCE 系列

LFCS: 了解 Linux 的帮助文档和工具

当你习惯了在命令行下进行工作,你会发现 Linux 已经有了许多使用和配置 Linux 系统所需要的文档。

另一个你必须熟悉命令行帮助工具的理由是,在LFCSLFCE 考试中,它们是你唯一能够使用的信息来源,没有互联网也没有百度。你只能依靠你自己和命令行。

基于上面的理由,在这一章里我们将给你一些建议来可以让你有效的使用这些安装的文档和工具,以帮助你通过Linux 基金会认证考试。

Linux 帮助手册 man

man 手册是 manual 手册的缩写,就是其名字所揭示的那样:一个给定工具的帮助手册。它包含了命令所支持的选项列表(以及解释),有些工具甚至还提供一些使用范例。

我们用 man 命令 跟上你想要了解的工具名称来打开一个帮助手册。例如:

# man diff

这将打开diff的手册页,这个工具将逐行对比文本文件(如你想退出只需要轻轻的点一下 q 键)。

下面我来比较两个文本文件 file1file2。这两个文本文件包含了使用同一个 Linux 发行版相同版本安装的两台机器上的的安装包列表。

输入diff 命令它将告诉我们 file1file2 有什么不同:

# diff file1 file2

在Linux中比较两个文本文件

< 这个符号是说file2缺失的行。如果是 file1缺失,我们将用 > 符号来替代指示。

另外,7d6 意思是说file1的第7行要删除了才能和file2一致(24d2241d38 也是同样的意思) 65,67d61 告诉需要删除从第 65 行到 67 行。我们完成了以上步骤,那么这两个文件将完全一致。

此外,根据 man 手册说明,你还可以通过 -y 选项来以两路的方式显示文件。你可以发现这对于你找到两个文件间的不同根据方便容易。

# diff -y file1 file2

比较并列出两个文件的不同

此外,你也可以用diff来比较两个二进制文件。如果它们完全一样,diff 将什么也不会输出。否则,它将会返回如下信息:“Binary files X and Y differ”。

–help 选项

--help选项,大多数命令都支持它(并不是所有), 它可以理解为一个命令的简短帮助手册。尽管它没有提供工具的详细介绍,但是确实是一个能够快速列出程序的所支持的选项的不错的方法。

例如,

# sed --help

将显示 sed (流编辑器)的每个支持的选项。

sed命令的一个典型用法是替换文件中的字符。用 -i 选项(意思是 “原地编辑编辑文件”),你可以编辑一个文件而且并不需要打开它。 如果你想要同时备份一个原始文件,用 -i 选项加后缀来创建一个原始文件的副本。

例如,替换 lorem.txt 中的LoremTecmint(忽略大小写),并且创建一个原文件的备份副本,命令如下:

# less lorem.txt | grep -i lorem
# sed -i.orig 's/Lorem/Tecmint/gI' lorem.txt
# less lorem.txt | grep -i lorem
# less lorem.txt.orig | grep -i lorem

请注意lorem.txt文件中Lorem 都已经替换为 Tecmint,并且原文件 lorem.txt 被保存为lorem.txt.orig

替换文件中的文本

/usr/share/doc 内的文档

这可能是我最喜欢的方法。如果你进入 /usr/share/doc 目录,并列出该目录,你可以看到许多以安装在你的 Linux 上的工具为名称的文件夹。

根据 文件系统层级标准,这些文件夹包含了许多帮助手册没有的信息,还有一些可以使配置更方便的模板和配置文件。

例如,让我们来看一下 squid-3.3.8 (不同发行版的版本可能会不同),这还是一个非常受欢迎的 HTTP 代理和 squid 缓存服务器

让我们用cd命令进入目录:

# cd /usr/share/doc/squid-3.3.8

列出当前文件夹列表:

# ls

使用 ls 列出目录

你应该特别注意 QUICKSTARTsquid.conf.documented。这些文件分别包含了 Squid 详细文档及其经过详细备注的配置文件。对于别的安装包来说,具体的名字可能不同(有可能是 QuickRef 或者00QUICKSTART),但意思是一样的。

对于另外一些安装包,比如 Apache web 服务器,在/usr/share/doc目录提供了配置模板,当你配置独立服务器或者虚拟主机的时候会非常有用。

GNU 信息文档

你可以把它看做帮助手册的“开挂版”。它不仅仅提供工具的帮助信息,而且还是超级链接的形式(没错,在命令行中的超级链接),你可以通过箭头按钮从一个章节导航到另外章节,并按下回车按钮来确认。

一个典型的例子是:

# info coreutils

因为 coreutils 包含了每个系统中都有的基本文件、shell 和文本处理工具,你自然可以从 coreutils 的 info 文档中得到它们的详细介绍。

Info Coreutils

和帮助手册一样,你可以按 q 键退出。

此外,GNU info 还可以显示标准的帮助手册。 例如:

# info tune2fs

它将显示 tune2fs的帮助手册, 这是一个 ext2/3/4 文件系统管理工具。

我们现在看到了,让我们来试试怎么用tune2fs

显示 /dev/mapper/vg00-vol\_backups 文件系统信息:

# tune2fs -l /dev/mapper/vg00-vol_backups

修改文件系统标签(修改为 Backups):

# tune2fs -L Backups /dev/mapper/vg00-vol_backups

设置文件系统的自检间隔及挂载计数(用-c 选项设置挂载计数间隔, 用 -i 选项设置自检时间间隔,这里 d 表示天,w 表示周,m 表示月)。

# tune2fs -c 150 /dev/mapper/vg00-vol_backups # 每 150 次挂载检查一次
# tune2fs -i 6w /dev/mapper/vg00-vol_backups # 每 6 周检查一次

以上这些内容也可以通过 --help 选项找到,或者查看帮助手册。

摘要

不管你选择哪种方法,知道并且会使用它们在考试中对你是非常有用的。你知道其它的一些方法吗? 欢迎给我们留言。


via: http://www.tecmint.com/explore-linux-installed-help-documentation-and-tools/

作者:Gabriel Cánepa 译者:kokialoves 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

由于 LFCS 考试中的一些改变已在 2016 年 2 月 2 日生效,我们添加了一些必要的专题到 LFCS 系列。我们也非常推荐备考的同学,同时阅读 LFCE 系列

LFCS:管理 LVM 和创建 LVM 分区

在安装 Linux 系统的时候要做的最重要的决定之一便是给系统文件、home 目录等分配空间。在这个地方犯了错,再要扩大空间不足的分区,那样既麻烦又有风险。

逻辑卷管理LVM)相较于传统的分区管理有许多优点,已经成为大多数(如果不能说全部的话) Linux 发行版安装时的默认选择。LVM 最大的优点应该是能方便的按照你的意愿调整(减小或增大)逻辑分区的大小。

LVM 的组成结构:

  • 把一块或多块硬盘或者一个或多个分区配置成物理卷(PV)。
  • 一个用一个或多个物理卷创建出的卷组(VG)。可以把一个卷组想象成一个单独的存储单元。
  • 在一个卷组上可以创建多个逻辑卷。每个逻辑卷相当于一个传统意义上的分区 —— 优点是它的大小可以根据需求重新调整大小,正如之前提到的那样。

本文,我们将使用三块 8 GB 的磁盘(/dev/sdb/dev/sdc/dev/sdd)分别创建三个物理卷。你既可以直接在整个设备上创建 PV,也可以先分区在创建。

在这里我们选择第一种方式,如果你决定使用第二种(可以参考本系列第四讲:创建分区和文件系统)确保每个分区的类型都是 8e

创建物理卷,卷组和逻辑卷

要在 /dev/sdb/dev/sdc/dev/sdd上创建物理卷,运行:

# pvcreate /dev/sdb /dev/sdc /dev/sdd

你可以列出新创建的 PV ,通过:

# pvs

并得到每个 PV 的详细信息,通过:

# pvdisplay /dev/sdX

X 即 b、c 或 d)

如果没有输入 /dev/sdX ,那么你将得到所有 PV 的信息。

使用 /dev/sdb/dev/sdc创建卷组 ,命名为vg00(在需要时是可以通过添加其他设备来扩展空间的,我们等到说明这点的时候再用,所以暂时先保留/dev/sdd`):

# vgcreate vg00 /dev/sdb /dev/sdc

就像物理卷那样,你也可以查看卷组的信息,通过:

# vgdisplay vg00

由于 vg00 是由两个 8 GB 的磁盘组成的,所以它将会显示成一个 16 GB 的硬盘:

LVM 卷组列表

当谈到创建逻辑卷,空间的分配必须考虑到当下和以后的需求。根据每个逻辑卷的用途来命名是一个好的做法。

举个例子,让我们创建两个 LV,命名为 vol_projects10 GB) 和 vol_backups (剩下的空间), 在日后分别用于部署项目文件和系统备份。

参数 -n 用于为 LV 指定名称,而 -L 用于设定固定的大小,还有 -l (小写的 L)在 VG 的预留空间中用于指定百分比大小的空间。

# lvcreate -n vol_projects -L 10G vg00
# lvcreate -n vol_backups -l 100%FREE vg00

和之前一样,你可以查看 LV 的列表和基础信息,通过:

# lvs

或是查看详细信息,通过:

# lvdisplay

若要查看单个 LV 的信息,使用 lvdisplay 加上 VGLV 作为参数,如下:

# lvdisplay vg00/vol_projects

逻辑卷列表

如上图,我们看到 LV 已经被创建成存储设备了(参考 LV Path 那一行)。在使用每个逻辑卷之前,需要先在上面创建文件系统。

这里我们拿 ext4 来做举例,因为对于每个 LV 的大小, ext4 既可以增大又可以减小(相对的 xfs 就只允许增大):

# mkfs.ext4 /dev/vg00/vol_projects
# mkfs.ext4 /dev/vg00/vol_backups

我们将在下一节向大家说明,如何调整逻辑卷的大小并在需要的时候添加额外的外部存储空间。

调整逻辑卷大小和扩充卷组

现在设想以下场景。vol_backups 中的空间即将用完,而 vol_projects 中还有富余的空间。由于 LVM 的特性,我们可以轻易的减小后者的大小(比方说 2.5 GB),并将其分配给前者,与此同时调整每个文件系统的大小。

幸运的是这很简单,只需:

# lvreduce -L -2.5G -r /dev/vg00/vol_projects
# lvextend -l +100%FREE -r /dev/vg00/vol_backups

减小逻辑卷和卷组

在调整逻辑卷的时候,其中包含的减号 (-) 或加号 (+) 是十分重要的。否则 LV 将会被设置成指定的大小,而非调整指定大小。

有些时候,你可能会遭遇那种无法仅靠调整逻辑卷的大小就可以解决的问题,那时你就需要购置额外的存储设备了,你可能需要再加一块硬盘。这里我们将通过添加之前配置时预留的 PV (/dev/sdd),用以模拟这种情况。

想把 /dev/sdd 加到 vg00,执行:

# vgextend vg00 /dev/sdd

如果你在运行上条命令的前后执行 vgdisplay vg00 ,你就会看出 VG 的大小增加了。

# vgdisplay vg00

查看卷组磁盘大小

现在,你可以使用新加的空间,按照你的需求调整现有 LV 的大小,或者创建一个新的 LV。

在启动和需求时挂载逻辑卷

当然,如果我们不打算实际的使用逻辑卷,那么创建它们就变得毫无意义了。为了更好的识别逻辑卷,我们需要找出它的 UUID (用于识别一个格式化存储设备的唯一且不变的属性)。

要做到这点,可使用 blkid 加每个设备的路径来实现:

# blkid /dev/vg00/vol_projects
# blkid /dev/vg00/vol_backups

寻找逻辑卷的 UUID

为每个 LV 创建挂载点:

# mkdir /home/projects
# mkdir /home/backups

并在 /etc/fstab 插入相应的条目(确保使用之前获得的UUID):

UUID=b85df913-580f-461c-844f-546d8cde4646 /home/projects    ext4 defaults 0 0
UUID=e1929239-5087-44b1-9396-53e09db6eb9e /home/backups ext4    defaults 0 0

保存并挂载 LV:

# mount -a
# mount | grep home

挂载逻辑卷

在涉及到 LV 的实际使用时,你还需要按照曾在本系列第八讲:管理用户和用户组中讲解的那样,为其设置合适的 ugo+rwx

总结

本文介绍了 逻辑卷管理,一个用于管理可扩展存储设备的多功能工具。与 RAID(曾在本系列讲解过的 第六讲:组装分区为RAID设备——创建和管理系统备份)结合使用,你将同时体验到(LVM 带来的)可扩展性和(RAID 提供的)冗余。

在这类的部署中,你通常会在 RAID 上发现 LVM,这就是说,要先配置好 RAID 然后它在上面配置 LVM。

如果你对本问有任何的疑问和建议,可以直接在下方的评论区告诉我们。


via: http://www.tecmint.com/manage-and-create-lvm-parition-using-vgcreate-lvcreate-and-lvextend/

作者:Gabriel Cánepa 译者:martin2011qi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux 基金会发起了 LFCS 认证 ( Linux 基金会认证系统管理员 Linux Foundation Certified Sysadmin ),这是一个全新的认证体系,旨在让世界各地的人能够参与到中等水平的 Linux 系统的基本管理操作的认证考试中去,这项认证包括:维护正在运行的系统和服务的能力、全面监控和分析的能力以及何时向上游团队请求支持的决策能力。

Basic Shell Scripting and Filesystem Troubleshooting

LFCS 系列第十讲

请看以下视频,这里边介绍了 Linux 基金会认证程序。

本讲是系列教程中的第十讲,主要集中讲解简单的 Shell 脚本编程和文件系统故障排除。这两块内容都是 LFCS 认证中的必备考点。

理解 终端 Terminals 和 Shell

首先要声明一些概念。

  • Shell 是一个程序,它将命令传递给操作系统来执行。
  • Terminal 也是一个程序,允许最终用户使用它与 Shell 来交互。比如,下边的图片是 GNOME Terminal。

Gnome Terminal

Gnome Terminal

启动 Shell 之后,会呈现一个命令提示符 (也称为命令行) 提示我们 Shell 已经做好了准备,接受标准输入设备输入的命令,这个标准输入设备通常是键盘。

你可以参考该系列文章的 第一讲 如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件 来温习一些常用的命令。

Linux 为提供了许多可以选用的 Shell,下面列出一些常用的:

bash Shell

Bash 代表 Bourne Again Shell,它是 GNU 项目默认的 Shell。它借鉴了 Korn shell (ksh) 和 C shell (csh) 中有用的特性,并同时对性能进行了提升。它同时也是 LFCS 认证中所涵盖的各发行版中默认 Shell,也是本系列教程将使用的 Shell。

sh Shell

Bourne SHell 是一个比较古老的 shell,多年来一直都是很多类 Unix 系统的默认 shell。

ksh Shell

Korn SHell (ksh shell) 也是一个 Unix shell,是 贝尔实验室 Bell Labs 的 David Korn 在 19 世纪 80 年代初的时候开发的。它兼容 Bourne shell ,并同时包含了 C shell 中的多数特性。

一个 shell 脚本仅仅只是一个可执行的文本文件,里边包含一条条可执行命令。

简单的 Shell 脚本编程

如前所述,一个 shell 脚本就是一个纯文本文件,因此,可以使用自己喜欢的文本编辑器来创建和编辑。你可以考虑使用 vi/vim (参考本系列 第二讲 如何安装和使用纯文本编辑器 vi/vim),它的语法高亮让我的编辑工作非常方便。

输入如下命令来创建一个名为 myscript.sh 的脚本文件:

# vim myscript.sh

shell 脚本的第一行 (著名的 释伴行 shebang line ) 必须如下:

#!/bin/bash<ruby> <rp>  ( </rp> <rt> </rt> <rp>  ) </rp></ruby>

这条语句“告诉”操作系统需要用哪个解释器来运行这个脚本文件之后命令。

现在可以添加需要执行的命令了。通过注释,我们可以声明每一条命令或者整个脚本的具体含义。注意,shell 会忽略掉以井号 (#) 开始的注释语句。

#!/bin/bash
echo 这是关于 LFCS 认证系列的第十部分
echo 今天是 $(date +%Y-%m-%d)

编写并保存脚本之后,通过以下命令来使脚本文件成为可执行文件:

# chmod 755 myscript.sh

在执行脚本之前,我们需要说一下环境变量 ($PATH),运行:

echo $PATH

我们就会看到环境变量 ($PATH) 的具体内容:这是当输入命令时系统所搜索可执行程序的目录,每一项之间使用冒号 (:) 隔开。称它为环境变量,是因为它本是就是 shell 环境的一部分 —— 这是当 shell 每次启动时 shell 及其子进程可以获取的一系列信息。

当我们输入一个命令并按下回车时,shell 会搜索 $PATH 变量中列出的目录并执行第一个知道的实例。请看如下例子:

Linux Environment Variables

环境变量

假如存在两个同名的可执行程序,一个在 /usr/local/bin,另一个在 /usr/bin,则会执行环境变量中最先列出的那个,并忽略另外一个。

如果我们自己编写的脚本没有放在 $PATH 变量列出目录中的任何一个,则需要输入 ./filename 来执行它。而如果存储在 $PATH 变量中的任意一个目录,我们就可以像运行其他命令一样来运行之前编写的脚本了。

# pwd
# ./myscript.sh
# cp myscript.sh ../bin
# cd ../bin
# pwd
# myscript.sh

Execute Script in Linux

执行脚本

if 条件语句

无论何时,当你需要在脚本中根据某个命令的运行结果来采取相应动作时,你应该使用 if 结构来定义条件。基本语法如下:

if CONDITION; then
    COMMANDS;
else
    OTHER-COMMANDS
fi

其中,CONDITION 可以是如下情形的任意一项 (仅列出常用的),并且达到以下条件时返回 true:

  • [ -a file ] → 指定文件存在。
  • [ -d file ] → 指定文件存在,并且是一个目录。
  • [ -f file ] → 指定文件存在,并且是一个普通文件。
  • [ -u file ] → 指定文件存在,并设置了 SUID 权限位。
  • [ -g file ] → 指定文件存在,并设置了 SGID 权限位。
  • [ -k file ] → 指定文件存在,并设置了“黏连 (Sticky)”位。
  • [ -r file ] → 指定文件存在,并且文件可读。
  • [ -s file ] → 指定文件存在,并且文件不为空。
  • [ -w file ] → 指定文件存在,并且文件可写入。
  • [ -x file ] → 指定文件存在,并且可执行。
  • [ string1 = string2 ] → 字符串相同。
  • [ string1 != string2 ] → 字符串不相同。

[ int1 op int2 ] 为前述列表中的一部分 (例如: -eq –> int1 与 int2 相同时返回 true) ,其中比较项也可以是一个列表子项, 其中 op 为以下比较操作符。

  • -eq –> int1 等于 int2 时返回 true。
  • -ne –> int1 不等于 int2 时返回 true。
  • -lt –> int1 小于 int2 时返回 true。
  • -le –> int1 小于或等于 int2 时返回 true。
  • -gt –> int1 大于 int2 时返回 true。
  • -ge –> int1 大于或等于 int2 时返回 true。

for 循环语句

循环语句可以在某个条件下重复执行某个命令。基本语法如下:

for item in SEQUENCE; do
        COMMANDS;
done

其中,item 为每次执行 COMMANDS 时,在 SEQUENCE 中匹配到的值。

While 循环语句

该循环结构会一直执行重复的命令,直到控制命令(EVALUATION\_COMMAND)执行的退出状态值等于 0 时 (即执行成功) 停止。基本语法如下:

while EVALUATION_COMMAND; do
        EXECUTE_COMMANDS;
done

其中,EVALUATION\_COMMAND 可以是任何能够返回成功 (0) 或失败 (0 以外的值) 的退出状态值的命令,EXECUTE\_COMMANDS 则可以是任何的程序、脚本或者 shell 结构体,包括其他的嵌套循环。

综合使用

我们会通过以下例子来演示 if 条件语句和 for 循环语句。

在基于 systemd 的发行版中探测某个服务是否在运行

先建立一个文件,列出我们想要想要查看的服务名。

# cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Script to Monitor Linux Services

使用脚本监控 Linux 服务

我们编写的脚本看起来应该是这样的:

#!/bin/bash

# This script iterates over a list of services and
# is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
        systemctl status $service | grep --quiet "running"
        if [ $? -eq 0 ]; then
                echo $service "is [ACTIVE]"
        else
                echo $service "is [INACTIVE or NOT INSTALLED]"
        fi
done

Linux Service Monitoring Script

Linux 服务监控脚本

我们来解释一下这个脚本的工作流程

1). for 循环每次读取 myservices.txt 文件中的一项记录,每一项纪录表示一个服务的通用变量名。各项记录组成如下:

# cat myservices.txt

2). 以上命令由圆括号括着,并在前面添加美元符,表示它需要从 myservices.txt 的记录列表中取值并作为变量传递给 for 循环。

3). 对于记录列表中的每一项纪录 (即每一项纪录的服务变量),都会执行以下动作:

# systemctl status $service | grep --quiet "running"

此时,需要在每个通用变量名 (即每一项纪录的服务变量) 的前面添加美元符,以表明它是作为变量来传递的。其输出则通过管道符传给 grep。

其中,-quiet 选项用于阻止 grep 命令将发现的 “running” 的行回显到屏幕。当 grep 捕获到 “running” 时,则会返回一个退出状态码 “0” (在 if 结构体表示为 $?),由此确认某个服务正在运行中。

如果退出状态码是非零值 (即 systemctl status $service 命令中的回显中没有出现 “running”),则表明某个服务未运行。

Services Monitoring Script

服务监控脚本

我们可以增加一步,在开始循环之前,先确认 myservices.txt 是否存在。

#!/bin/bash

# This script iterates over a list of services and
# is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
        for service in $(cat myservices.txt); do
                systemctl status $service | grep --quiet "running"
                if [ $? -eq 0 ]; then
                        echo $service "is [ACTIVE]"
                else
                        echo $service "is [INACTIVE or NOT INSTALLED]"
                fi
        done
else
        echo "myservices.txt is missing"
fi

Ping 一系列网络或者 Internet 主机名以获取应答数据

你可能想把自己维护的主机写入一个文本文件,并使用脚本探测它们是否能够 ping 得通 (脚本中的 myhosts 可以随意替换为你想要的名称)。

shell 的内置 read 命令将告诉 while 循环一行行的读取 myhosts,并将读取的每行内容传给 host 变量,随后 host 变量传递给 ping 命令。

#!/bin/bash

# This script is used to demonstrate the use of a while loop

while read host; do
        ping -c 2 $host
done < myhosts

Script to Ping Servers

使用脚本 Ping 服务器

扩展阅读:

文件系统排错

尽管 Linux 是一个很稳定的操作系统,但仍然会因为某些原因出现崩溃时 (比如因为断电等),正好你有一个 (或者更多个) 文件系统未能正确卸载,Linux 重启的时候就会自动检测其中可能发生的错误。

此外,每次系统正常启动的时候,都会在文件系统挂载之前校验它们的完整度。而这些全部都依赖于 fsck 工具 ( 文件系统校验 file system check )。

如果对 fsck 进行设定,它除了校验文件系统的完整性之外,还可以尝试修复错误。fsck 能否成功修复错误,取决于文件系统的损伤程度;如果可以修复,被损坏部分的文件会恢复到位于每个文件系统根目录的 lost+found。

最后但同样重要的是,我们必须注意,如果拔掉系统正在写入数据的 USB 设备同样会发生错误,甚至可能发生硬件损坏。

fsck 的基本用如下:

# fsck [options] filesystem

检查文件系统错误并尝试自动修复

想要使用 fsck 检查文件系统,我们需要首先卸载文件系统。

# mount | grep sdg1
# umount /mnt
# fsck -y /dev/sdg1

Scan Linux Filesystem for Errors

检查文件系统错误

除了 -y 选项,我们也可以使用 -a 选项来自动修复文件系统错误,而不必做出交互式应答,并在文件系统看起来 “干净” 卸载的情况下强制校验。

# fsck -af /dev/sdg1

如果只是要找出什么地方发生了错误 (不用在检测到错误的时候修复),我们可以使用 -n 选项,这样只会将文件系统错误输出到标准输出设备上。

# fsck -n /dev/sdg1

根据 fsck 输出的错误信息,我们可以知道是否可以自己修复或者需要将问题提交给工程师团队来做详细的硬件校验。

总结

至此,系列教程的第十讲就全部结束了,全系列教程涵盖了通过 LFCS 测试所需的基础内容。

但显而易见的,本系列的十讲并不足以在单个主题方面做到全面描述,我们希望这一系列教程可以成为你学习的基础素材,并一直保持学习的热情(LCTT 译注:还有后继补充的几篇)。

我们欢迎你提出任何问题或者建议,所以你可以毫不犹豫的通过以下链接联系到我们: 成为一个 Linux 认证系统工程师


via: http://www.tecmint.com/linux-basic-shell-scripting-and-linux-filesystem-troubleshooting/

作者:Gabriel Cánepa 译者:GHLandy 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

去年八月, Linux基金会宣布了一个全新的LFCS( Linux基金会认证系统管理员 Linux Foundation Certified Sysadmin )认证计划,这对广大系统管理员来说是一个很好的机会,管理员们可以通过认证考试来表明自己可以成功支持Linux系统的整体运营。 一个Linux基金会认证的系统管理员能有足够的专业知识来确保系统高效运行,提供第一手的故障诊断和监视,并且在需要的情况下将问题提交给工程师支持团队。

Linux Package Management

Linux基金会认证系统管理员 – 第九讲

请观看下面关于Linux基金会认证计划的演示。

本文是本系列教程中的第九讲,今天在这篇文章中我们会引导你学习Linux软件包管理,这也是LFCS认证考试所需要的。

软件包管理

简单的说,软件包管理是系统中安装和维护软件的一种方法,这里说的维护包含更新和卸载。

在Linux早期,程序只以源代码的方式发行,还带有所需的用户使用手册和必备的配置文件,甚至更多。现如今,大多数发行商一般使用预装程序或者被称为软件包的程序集合。用户可以使用这些预装程序或者软件包安装到该发行版中。然而,Linux最伟大的一点是我们仍然能够获得程序的源代码用来学习、改进和编译。

软件包管理系统是如何工作的

如果某一个软件包需要一定的资源,如共享库,或者需要另一个软件包,这就称之为依赖性。所有现在的包管理系统提供了一些解决依赖性的方法,以确保当安装一个软件包时,相关的依赖包也安装好了。

打包系统

几乎所有安装在现代Linux系统上的软件都会能互联网上找到。它要么由发行商通过中央仓库(中央仓库能包含几千个软件包,每个软件包都已经为发行版构建、测试并且维护好了)提供,要么能够直接得到可以下载和手动安装的源代码。

由于不同的发行版使用不同的打包系统(Debian的*.deb文件/CentOS的*.rpm文件/openSUSE的专门为openSUSE构建的*.rpm文件),因此为一个发行版开发的软件包会与其他发行版不兼容。然而,大多数发行版都属于LFCS认证所涉及的三个发行版家族之一。

高级和低级打包工具

为了有效地进行软件包管理的任务,你需要知道,有两种类型的实用工具:低级工具(能在后端实际安装、升级、卸载软件包文件),以及高级工具(负责确保能很好的执行依赖性解决和元数据检索的任务——元数据也称为数据的数据)。

发行版低级工具高级工具
Debian版及其衍生版dpkgapt-get / aptitude
CentOS版rpmyum
openSUSE版rpmzypper

让我们来看下低级工具和高级工具的描述。

dpkg的是基于Debian的系统的一个低级包管理器。它可以安装,删除,提供有关资料,以及建立*.deb包,但它不能自动下载并安装它们相应的依赖包。

apt-get是Debian及其衍生版的高级包管理器,并提供命令行方式来从多个来源检索和安装软件包,其中包括解决依赖性。和dpkg不同的是,apt-get不是直接基于.deb文件工作,而是基于软件包的正确名称。

Aptitude是基于Debian的系统的另一个高级包管理器,它可用于快速简便的执行管理任务(安装,升级和删除软件包,还可以自动处理解决依赖性)。它在atp-get的基础上提供了更多功能,例如提供对软件包的几个版本的访问。

rpm是Linux标准基础(LSB)兼容发行版所使用的一种软件包管理器,用来对软件包进行低级处理。就像dpkg一样,rpm可以查询、安装、检验、升级和卸载软件包,它多数用于基于Fedora的系统,比如RHEL和CentOS。

相对于基于RPM的系统,yum增加了系统自动更新的功能和带依赖性管理的软件包管理功能。作为一个高级工具,和apt-get或者aptitude相似,yum需要配合仓库工作。

低级工具的常见用法

使用低级工具处理最常见的任务如下。

1. 从已编译(*.deb或*.rpm)的文件安装一个软件包

这种安装方法的缺点是没有提供解决依赖性的方案。当你在发行版本库中无法获得某个软件包并且又不能通过高级工具下载安装时,你很可能会从一个已编译文件安装该软件包。因为低级工具不会解决依赖性问题,所以当安装一个没有解决依赖性的软件包时会出现出错并且退出。

# dpkg -i file.deb      [Debian版和衍生版]
# rpm -i file.rpm       [CentOS版 / openSUSE版]

注意:不要试图在CentOS中安装一个为openSUSE构建的.rpm文件,反之亦然!

2. 从已编译文件中更新一个软件包

同样,当某个安装的软件包不在中央仓库中时,你只能手动升级该软件包。

# dpkg -i file.deb      [Debian版和衍生版]
# rpm -U file.rpm       [CentOS版 / openSUSE版]

3. 列举安装的软件包

当你第一次接触一个已经在工作中的系统时,很可能你会想知道安装了哪些软件包。

# dpkg -l       [Debian版和衍生版]
# rpm -qa       [CentOS版 / openSUSE版]

如果你想知道一个特定的软件包安装在哪儿,你可以使用管道命令从以上命令的输出中去搜索,这在这个系列的第一讲 操作Linux文件 中有介绍。例如我们需要验证mysql-common这个软件包是否安装在Ubuntu系统中:

# dpkg -l | grep mysql-common

Check Installed Packages in Linux

检查安装的软件包

另外一种方式来判断一个软件包是否已安装。

# dpkg --status package_name        [Debian版和衍生版]
# rpm -q package_name           [CentOS版 / openSUSE版]

例如,让我们找出sysdig软件包是否安装在我们的系统。

# rpm -qa | grep sysdig

Check sysdig Package

检查sysdig软件包

4. 查询一个文件是由哪个软件包安装的

# dpkg --search file_name
# rpm -qf file_name

例如,pw\_dict.hwm文件是由那个软件包安装的?

# rpm -qf /usr/share/cracklib/pw_dict.hwm

Query File in Linux

Linux中查询文件

高级工具的常见用法

使用高级工具处理最常见的任务如下。

1. 搜索软件包

aptitude的更新操作将会更新可用的软件包列表,而aptitude的搜索操作会根据软件包名进行实际搜索。

# aptitude update && aptitude search package_name

在search all选项中,yum不仅可以通过软件包名还可以通过软件包的描述搜索。

# yum search package_name
# yum search all package_name
# yum whatprovides “*/package_name”

假定我们需要一个名为sysdig文件,想知道我们需要安装哪个软件包才行,那么运行。

# yum whatprovides “*/sysdig”

Check Package Description in Linux

检查软件包描述

whatprovides告诉yum搜索一个含有能够匹配上述正则表达式的文件的软件包。

# zypper refresh && zypper search package_name      [在openSUSE上]

2. 从仓库安装一个软件包

当安装一个软件包时,在软件包管理器解决了所有依赖性问题后,可能会提醒你确认安装。需要注意的是运行更新( update)或刷新(refresh)(根据所使用的软件包管理器)不是绝对必要,但是考虑到安全性和依赖性的原因,保持安装的软件包是最新的是系统管理员的一个好经验。

# aptitude update && aptitude install package_name      [Debian版和衍生版]
# yum update && yum install package_name            [CentOS版]
# zypper refresh && zypper install package_name         [openSUSE版]

3. 卸载软件包

remove选项将会卸载软件包,但把配置文件保留完好,然而purge选项将从系统中完全删去该程序以及相关内容。

# aptitude remove / purge package_name
# yum erase package_name

###---注意要卸载的openSUSE包前面的减号 ---

# zypper remove -package_name

在默认情况下,大部分(如果不是全部的话)的软件包管理器会提示你,在你实际卸载之前你是否确定要继续卸载。所以,请仔细阅读屏幕上的信息,以避免陷入不必要的麻烦!

4. 显示软件包的信息

下面的命令将会显示birthday这个软件包的信息。

# aptitude show birthday
# yum info birthday
# zypper info birthday

Check Package Information in Linux

检查包信息

总结

作为一个系统管理员,软件包管理器是你不能回避的东西。你应该立即去使用本文中介绍的这些工具。希望你在准备LFCS考试和日常工作中会觉得这些工具好用。欢迎在下面留下您的意见或问题,我们将尽可能快的回复你。


via: http://www.tecmint.com/linux-package-management/

作者:Gabriel Cánepa 译者:Flowsnow 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出