LFCS 系列第十四讲： Linux 进程资源用量监控和按用户设置进程限制
由于 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 上面的命令只会显示 PID、PPID、和进程相关的命令、 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”，它是一个范围从 -20 到 19 的整数）给进程分配更多或更少的系统资源。这个值越小，执行优先级越高。普通用户（而非 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 系列第十三讲：如何配置并排除 GNU 引导加载程序（GRUB）故障
由于 LFCS 考试需求的变动已于 2016 年 2 月 2 日生效，因此我们向 LFCS 系列 添加了一些必要的话题。为了准备认证考试，我们也强烈推荐你去看看 LFCE 系列。LFCS 系列第十三讲：配置并排除 Grub 引导加载程序故障。本文将会向你介绍 GRUB 的知识，并会说明你为什么需要一个引导加载程序，以及它是如何给系统增加功能的。Linux 引导过程 是从你按下你的电脑电源键开始，直到你拥有一个全功能的系统为止，整个过程遵循着这样的主要步骤：一个叫做 POST（上电自检）的过程会对你的电脑硬件组件做全面的检查。当 POST 完成后，它会把控制权转交给引导加载程序，接下来引导加载程序会将 Linux 内核（以及 initramfs）加载到内存中并执行。内核首先检查并访问硬件，然后运行初始化进程（主要以它的通用名 init 而为人熟知），接下来初始化进程会启动一些服务，最后完成系统启动过程。在该系列的第七讲（“SysVinit、Upstart 和 Systemd”）中，我们介绍了现代 Linux 发行版使用的一些服务管理系统和工具。在继续学习之前，你可能想要回顾一下那一讲的知识。GRUB 引导装载程序介绍在现代系统中，你会发现有两种主要的 GRUB 版本（一种是有时被称为 GRUB Legacy 的 v1 版本，另一种则是 v2 版本），虽说多数最新版本的发行版系统都默认使用了 v2 版本。如今，只有 红帽企业版 Linux 6 及其衍生系统仍在使用 v1 版本。因此，在本指南中，我们将着重关注 v2 版本的功能。不管 GRUB 的版本是什么，一个引导加载程序都允许用户：通过指定使用不同的内核来修改系统的行为；从多个操作系统中选择一个启动；添加或编辑配置区块来改变启动选项等。如今，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 年的老笔记本上尝试了衍生自 Slackware 的 Vector 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 （在 CentOS 和 openSUSE 上）命令来更新 grub.cfg 文件（否则，改动会在系统启动时丢失）。这条命令会处理早先提到的那些启动配置文件来更新 grub.cfg 文件。这种方法可以确保改动持久化，而在启动时刻通过 GRUB 传递的选项仅在当前会话期间有效。修复 Linux GRUB 问题如果你安装了第二个操作系统，或者由于人为失误而导致你的 GRUB 配置文件损坏了，依然有一些方法可以让你恢复并能够再次启动系统。在启动画面中按下 c 键进入 GRUB 命令行模式（记住，你也可以按下 e 键编辑默认启动选项），并可以在 GRUB 提示中输入 help 命令获得可用命令：修复 Linux 的 Grub 配置问题我们将会着重关注 ls 命令，它会列出已安装的设备和文件系统，并且我们将会看看它查找到的东西。在下面的图片中，我们可以看到有 4 块硬盘（hd0 到 hd3）。貌似只有 hd0 已经分区了（msdos1 和 msdos2 可以证明，这里的 1 和 2 是分区号，msdos 则是分区方案）。现在我们来看看能否在第一个分区 hd0（msdos1）上找到 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中国 荣誉推出
LFCS 系列第十二讲：如何使用 Linux 的帮助文档和工具
由于 2016 年 2 月 2 号开始启用了新的 LFCS 考试要求, 我们在 LFCS 系列系列添加了一些必要的内容。为了考试的需要，我们强烈建议你看一下LFCE 系列。LFCS: 了解 Linux 的帮助文档和工具当你习惯了在命令行下进行工作，你会发现 Linux 已经有了许多使用和配置 Linux 系统所需要的文档。另一个你必须熟悉命令行帮助工具的理由是，在LFCS 和 LFCE 考试中，它们是你唯一能够使用的信息来源，没有互联网也没有百度。你只能依靠你自己和命令行。基于上面的理由，在这一章里我们将给你一些建议来可以让你有效的使用这些安装的文档和工具，以帮助你通过Linux 基金会认证考试。Linux 帮助手册 （ man ） man 手册是 manual 手册的缩写，就是其名字所揭示的那样：一个给定工具的帮助手册。它包含了命令所支持的选项列表（以及解释），有些工具甚至还提供一些使用范例。我们用 man 命令 跟上你想要了解的工具名称来打开一个帮助手册。例如：# man diff 这将打开diff的手册页，这个工具将逐行对比文本文件（如你想退出只需要轻轻的点一下 q 键）。下面我来比较两个文本文件 file1 和 file2。这两个文本文件包含了使用同一个 Linux 发行版相同版本安装的两台机器上的的安装包列表。输入diff 命令它将告诉我们 file1 和file2 有什么不同:# diff file1 file2 在Linux中比较两个文本文件< 这个符号是说file2缺失的行。如果是 file1缺失，我们将用 > 符号来替代指示。另外，7d6 意思是说file1的第7行要删除了才能和file2一致（24d22 和 41d38 也是同样的意思） 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 中的Lorem 为 Tecmint（忽略大小写），并且创建一个原文件的备份副本，命令如下：# 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 列出目录你应该特别注意 QUICKSTART 和 squid.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 系列第十一讲：如何使用命令 vgcreate、lvcreate 和 lvextend 管理和创建 LVM
由于 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_projects （10 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 加上 VG 和 LV 作为参数，如下：# 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中国 荣誉推出
LFCS 系列第十讲：学习简单的 Shell 脚本编程和文件系统故障排除
Linux 基金会发起了 LFCS 认证 ( Linux 基金会认证系统管理员 （ Linux Foundation Certified Sysadmin ） )，这是一个全新的认证体系，旨在让世界各地的人能够参与到中等水平的 Linux 系统的基本管理操作的认证考试中去，这项认证包括：维护正在运行的系统和服务的能力、全面监控和分析的能力以及何时向上游团队请求支持的决策能力。LFCS 系列第十讲请看以下视频，这里边介绍了 Linux 基金会认证程序。本讲是系列教程中的第十讲，主要集中讲解简单的 Shell 脚本编程和文件系统故障排除。这两块内容都是 LFCS 认证中的必备考点。理解 终端 （ Terminals ） 和 Shell首先要声明一些概念。Shell 是一个程序，它将命令传递给操作系统来执行。Terminal 也是一个程序，允许最终用户使用它与 Shell 来交互。比如，下边的图片是 GNOME Terminal。Gnome Terminal启动 Shell 之后，会呈现一个命令提示符 (也称为命令行) 提示我们 Shell 已经做好了准备，接受标准输入设备输入的命令，这个标准输入设备通常是键盘。你可以参考该系列文章的 第一讲 如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件 来温习一些常用的命令。Linux 为提供了许多可以选用的 Shell，下面列出一些常用的：bash ShellBash 代表 Bourne Again Shell，它是 GNU 项目默认的 Shell。它借鉴了 Korn shell (ksh) 和 C shell (csh) 中有用的特性，并同时对性能进行了提升。它同时也是 LFCS 认证中所涵盖的各发行版中默认 Shell，也是本系列教程将使用的 Shell。sh ShellBourne SHell 是一个比较古老的 shell，多年来一直都是很多类 Unix 系统的默认 shell。ksh ShellKorn 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 （ ） 这条语句“告诉”操作系统需要用哪个解释器来运行这个脚本文件之后命令。现在可以添加需要执行的命令了。通过注释，我们可以声明每一条命令或者整个脚本的具体含义。注意，shell 会忽略掉以井号 (#) 开始的注释语句。#!/bin/bash echo 这是关于 LFCS 认证系列的第十部分 echo 今天是 $(date +%Y-%m-%d) 编写并保存脚本之后，通过以下命令来使脚本文件成为可执行文件：# chmod 755 myscript.sh 在执行脚本之前，我们需要说一下环境变量 ($PATH)，运行：echo $PATH 我们就会看到环境变量 ($PATH) 的具体内容：这是当输入命令时系统所搜索可执行程序的目录，每一项之间使用冒号 (:) 隔开。称它为环境变量，是因为它本是就是 shell 环境的一部分 —— 这是当 shell 每次启动时 shell 及其子进程可以获取的一系列信息。当我们输入一个命令并按下回车时，shell 会搜索 $PATH 变量中列出的目录并执行第一个知道的实例。请看如下例子：环境变量假如存在两个同名的可执行程序，一个在 /usr/local/bin，另一个在 /usr/bin，则会执行环境变量中最先列出的那个，并忽略另外一个。如果我们自己编写的脚本没有放在 $PATH 变量列出目录中的任何一个，则需要输入 ./filename 来执行它。而如果存储在 $PATH 变量中的任意一个目录，我们就可以像运行其他命令一样来运行之前编写的脚本了。# pwd # ./myscript.sh # cp myscript.sh ../bin # cd ../bin # pwd # myscript.sh 执行脚本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 使用脚本监控 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 服务监控脚本我们来解释一下这个脚本的工作流程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”)，则表明某个服务未运行。服务监控脚本我们可以增加一步，在开始循环之前，先确认 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 使用脚本 Ping 服务器扩展阅读:Learn Shell Scripting: A Guide from Newbies to System Administrator5 Shell Scripts to Learn Shell Programming文件系统排错尽管 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 检查文件系统错误除了 -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基金会认证系统管理员 – 第九讲请观看下面关于Linux基金会认证计划的演示。本文是本系列教程中的第九讲，今天在这篇文章中我们会引导你学习Linux软件包管理，这也是LFCS认证考试所需要的。软件包管理简单的说，软件包管理是系统中安装和维护软件的一种方法，这里说的维护包含更新和卸载。在Linux早期，程序只以源代码的方式发行，还带有所需的用户使用手册和必备的配置文件，甚至更多。现如今，大多数发行商一般使用预装程序或者被称为软件包的程序集合。用户可以使用这些预装程序或者软件包安装到该发行版中。然而，Linux最伟大的一点是我们仍然能够获得程序的源代码用来学习、改进和编译。软件包管理系统是如何工作的如果某一个软件包需要一定的资源，如共享库，或者需要另一个软件包，这就称之为依赖性。所有现在的包管理系统提供了一些解决依赖性的方法，以确保当安装一个软件包时，相关的依赖包也安装好了。打包系统几乎所有安装在现代Linux系统上的软件都会能互联网上找到。它要么由发行商通过中央仓库（中央仓库能包含几千个软件包，每个软件包都已经为发行版构建、测试并且维护好了）提供，要么能够直接得到可以下载和手动安装的源代码。由于不同的发行版使用不同的打包系统（Debian的*.deb文件/CentOS的*.rpm文件/openSUSE的专门为openSUSE构建的*.rpm文件），因此为一个发行版开发的软件包会与其他发行版不兼容。然而，大多数发行版都属于LFCS认证所涉及的三个发行版家族之一。高级和低级打包工具为了有效地进行软件包管理的任务，你需要知道，有两种类型的实用工具：低级工具（能在后端实际安装、升级、卸载软件包文件），以及高级工具（负责确保能很好的执行依赖性解决和元数据检索的任务——元数据也称为数据的数据）。发行版低级工具高级工具Debian版及其衍生版dpkgapt-get / aptitudeCentOS版rpmyumopenSUSE版rpmzypper让我们来看下低级工具和高级工具的描述。dpkg的是基于Debian的系统的一个低级包管理器。它可以安装，删除，提供有关资料，以及建立*.deb包，但它不能自动下载并安装它们相应的依赖包。阅读更多： 15个dpkg命令实例apt-get是Debian及其衍生版的高级包管理器，并提供命令行方式来从多个来源检索和安装软件包，其中包括解决依赖性。和dpkg不同的是，apt-get不是直接基于.deb文件工作，而是基于软件包的正确名称。阅读更多： 25个apt-get命令实例Aptitude是基于Debian的系统的另一个高级包管理器，它可用于快速简便的执行管理任务（安装，升级和删除软件包，还可以自动处理解决依赖性）。它在atp-get的基础上提供了更多功能，例如提供对软件包的几个版本的访问。rpm是Linux标准基础（LSB）兼容发行版所使用的一种软件包管理器，用来对软件包进行低级处理。就像dpkg一样，rpm可以查询、安装、检验、升级和卸载软件包，它多数用于基于Fedora的系统，比如RHEL和CentOS。阅读更多： 20个rpm命令实例相对于基于RPM的系统，yum增加了系统自动更新的功能和带依赖性管理的软件包管理功能。作为一个高级工具，和apt-get或者aptitude相似，yum需要配合仓库工作。阅读更多： 20个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 检查安装的软件包另外一种方式来判断一个软件包是否已安装。# dpkg --status package_name [Debian版和衍生版] # rpm -q package_name [CentOS版 / openSUSE版] 例如，让我们找出sysdig软件包是否安装在我们的系统。# rpm -qa | grep sysdig 检查sysdig软件包4. 查询一个文件是由哪个软件包安装的# dpkg --search file_name # rpm -qf file_name 例如，pw\_dict.hwm文件是由那个软件包安装的？# rpm -qf /usr/share/cracklib/pw_dict.hwm 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” 检查软件包描述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 检查包信息总结作为一个系统管理员，软件包管理器是你不能回避的东西。你应该立即去使用本文中介绍的这些工具。希望你在准备LFCS考试和日常工作中会觉得这些工具好用。欢迎在下面留下您的意见或问题，我们将尽可能快的回复你。via： http://www.tecmint.com/linux-package-management/作者：Gabriel Cánepa 译者：Flowsnow 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
LFCS 系列第八讲：管理用户和用户组、文件权限和属性以及启用账户 sudo 访问权限
去年八月份，Linux 基金会发起了全新的 LFCS（ Linux 基金会认证系统管理员 （ Linux Foundation Certified Sysadmin ） ）认证，旨在让世界各地的人能够参与到中等水平的 Linux 系统的基本管理操作的认证考试中去，这项认证包括：维护正在运行的系统和服务的能力、全面监控和分析的能力以及何时向上游团队请求支持的决策能力。第八讲： Linux 基金会认证系统管理员请看以下视频，里边将描述 LFCS 认证程序。本讲是系列教程的第八讲，在这一讲中，我们将引导你学习如何在 Linux 管理用户和用户组权限的设置，这些内容是 LFCS 认证的必备知识。由于 Linux 是一个多用户的操作系统（允许多个用户通过不同主机或者终端访问一个独立系统），因此你需要知道如何才能有效地管理用户：如何添加、编辑、禁用和删除用户账户，并赋予他们足以完成自身任务的必要权限。（LCTT 译注：本篇原文章节顺序有误，根据理解做了调整。）添加用户账户添加新用户账户，你需要以 root 运行以下两条命令中的任意一条：# adduser [new_account] # useradd [new_account] 当新用户账户添加到系统时，会自动执行以下操作：自动创建用户家目录（默认是 /home/username）。自动拷贝下列隐藏文件到新建用户的家目录，用来设置新用户会话的环境变量。.bash_logout .bash_profile .bashrc 自动创建邮件缓存目录 /var/spool/mail/username。自动创建与用户名相同的用户组。理解 /etc/passwd 中的内容/etc/passwd 文件中存储了所有用户账户的信息，每个用户在里边都有一条对应的记录，其格式（每个字段用冒号隔开）如下：[username]:[x]:[UID]:[GID]:[Comment]:[Home directory]:[Default shell] 字段 [username] 和 [Comment] 是不言自明的。第二个字段中 x 表明通过用户名 username 登录系统是有密码保护的， 密码保存在 /etc/shadow 文件中。[UID] 和 [GID] 字段用整数表示，代表该用户的用户标识符和对应所在组的组标志符。字段 [Home directory] 为 username 用户家目录的绝对路径。字段 [Default shell] 指定用户登录系统时默认使用的 shell。理解 /etc/group 中的内容/etc/group 文件存储所有用户组的信息。每行记录的格式如下：[Group name]:[Group password]:[GID]:[Group members] [Group name] 为用户组名称。字段 [Group password] 为 x 的话，则说明不使用用户组密码。[GID] 与 /etc/passwd 中保存的 GID 相同。[Group members] 用户组中的用户使用逗号隔开。添加用户账户修改用户信息添加用户账户之后，你可以使用 usermod 命令来修改用户信息中的部分字段，该命令基本语法如下：# usermod [options] [username] 设置账户的过期时间通过 –expiredate 标记后边接 年-月-日 格式的日期，如下：# usermod --expiredate 2014-10-30 tecmint 将用户添加到其他组使用 -aG 或者 –append –groups 选项，后边跟着用户组，如果有多个用户组，每个用户组之间使用逗号隔开。# usermod --append --groups root,users tecmint 改变用户家目录的默认位置使用 -d 或者 –home 选项，后边跟着新的家目录的绝对路径。# usermod --home /tmp tecmint 改变用户的默认 shell使用 –shell 选项，后边跟着新 shell 的路径。# usermod --shell /bin/sh tecmint 下面，我们一次运行上述命令：# usermod --expiredate 2014-10-30 --append --groups root,users --home /tmp --shell /bin/sh tecmint usermod 命令例示扩展阅读15 useradd Command Examples in Linux15 usermod Command Examples in Linux锁定和解锁账户对于已有用户账户，我们还可以：通过锁定密码来禁用账户使用 -L （大写 l）或者 –lock 选项来锁定用户密码。# usermod --lock tecmint 解锁用户密码使用 –u 或者 –unlock 选项来解锁我们之前锁定的账户。# usermod --unlock tecmint 锁定用户账户删除用户账户你可以通过 userdel --remove 命令来删除用户账户。这样会删除用户拥有的家目录和家目录下的所有文件，以及邮件缓存目录。# userdel --remove [username] 用户组管理每次添加新用户，系统会为该用户创建同名的用户组，此时用户组里边只有新建的用户，其他用户可以随后添加进去。建立用户组的目的之一，就是为了通过对指定资源设置权限来完成对这些资源和文件进行访问控制。比如，你有下列用户：user1 (主组 user1)user2 (主组 user2)user3 (主组 user3)他们都需要对你系统里边某个位置的 common.txt 文件，或者 user1 用户刚刚创建的共享进行读写。你可能会运行下列命令：# chmod 660 common.txt 或 # chmod u=rw,g=rw,o= common.txt [注意最后那个 = 号和文件名之间的空格] 然而，这样仅仅给文件所属的用户和用户组（本例为 user1）成员的提供了读写权限。你还需要将 user2 和 user3 添加到 user1 组，打这样做也将 user1 用户和用户组的其他文件的权限开放给了 user2 和 user3。这时候，用户组就派上用场了，下面将演示怎么做。显示用户所属的用户组# groups tecmint # id tecmint 为需要对指定文件进行读写的多个用户建立用户组运行下列几条命令来完成：# groupadd common_group # 添加新用户组 # chown :common_group common.txt # 将 common.txt 的用户组修改为 common_group # usermod -aG common_group user1 # 添加用户 user1 到 common_group 用户组 # usermod -aG common_group user2 # 添加用户 user2 到 common_group 用户组 # usermod -aG common_group user3 # 添加用户 user3 到 common_group 用户组 删除用户组通过以下命令删除用户组：# groupdel [group_name] 属于这个 group\_name 用户组的文件是不会被删除的，而仅仅是删除了用户组。Linux 文件权限除了我们在 LFCS 系列第三讲：归档/压缩文件及目录、设置文件属性和搜索文件 中说到的基本的读取、写入和执行权限外，文件还有一些不常用却很重要的的权限设置，有时候把它当做“特殊权限”。就像之前我们讨论的基本权限，这里同样使用八进制数字或者一个字母（象征性符号）表示该权限类型。理解 Setuid 位当为可执行文件设置 setuid 位之后，用户运行程序时会继承该程序属主的有效特权。由于这样做会引起安全风险，因此设置 setuid 权限的文件及程序必须尽量少。你会发现，当系统中有用户需要访问属于 root 用户的文件是所运行的程序就带有了 setuid 权限。也就是说，用户不仅仅可以运行这个可执行文件，而且能以 root 权限来运行。比如，让我们来看看 /bin/passwd 的权限，这个可执行文件用于改变账户的密码，修改 /etc/shadow 文件。超级用户可以改变任意账户的密码，但是其他用户只能改变自己账户的密码。passwd 命令例示因此，所有用户都有权限运行 /bin/passwd，但只有 root 用户可以指定改变指定用户账户的密码。其他用户只能改变其自身的密码。修改用户密码# chmod o+u [filename] 以八进制形式来设置 setuid 位，在当前基本权限（或者想要设置的权限）前加上数字 4 就行了。# chmod 4755 [filename] 理解 Setgid 位设置 setgid 位之后，真实用户的有效 GID 变为属组的 GID。因此，任何用户都能以属组用户的权限来访问文件。另外，当目录置了 setgid 位之后，新建的文件将继承其所属目录的 GID，并且新建的子目录会继承父目录的 setgid 位。通过这个方法，你能够以一个指定的用户组身份来访问该目录里边的文件，而不必管文件属主的主属组。# chmod g+s [filename] 以八进制形式来设置 setgid 位，在当前基本权限（或者想要设置的权限）前加上数字 2 就行了。# chmod 2755 [filename] 给目录设置 Setgid 位给命令设置 setgid 位理解 黏连 （ Sticky ） 位文件设置了黏连位是没有意义，Linux 会忽略该位。如果设置到目录上，会防止其内的文件被删除或改名，除非你是该目录或文件的属主、或者是 root 用户。# chmod o+t [directory] 以八进制形式来设置黏连位，在当前基本权限（或者想要设置的权限）前加上数字 1 就行了。# chmod 1755 [directory] 若没有黏连位，任何有权限读写目录的用户都可删除和重命名其中的文件。因此，黏连位通常出现在像 /tmp 之类的目录，这些目录是所有人都具有写权限的。给目录设置黏连位Linux 特殊文件属性文件还有其他一些属性，用来做进一步的操作限制。比如，阻止对文件的重命名、移动、删除甚至是修改。可以通过使用 chattr 命令 来设置，并可以使用 lsattr 工具来查看这些属性。设置如下：# chattr +i file1 # chattr +a file2 运行这些命令之后，file1 成为不可变状态（即不可移动、重命名、修改或删除），而 file2 进入“仅追加”模式（仅在追加内容模式中打开）。通过 Chattr 命令来包含文件访问 root 账户并启用 sudo访问 root 账户的方法之一，就是通过输入：$ su 然后输入 root 账户密码。倘若授权成功，你将以 root 身份登录，工作目录则是登录前所在的位置。如果是想要一登录就自动进入 root 用户的家目录，请运行：$ su - 然后输入 root 账户密码。用户通过 su 切换执行上个步骤需要普通用户知道 root 账户的密码，这样会引起非常严重的安全问题。于是，系统管理员通常会配置 sudo 命令来让普通用户在严格控制的环境中以其他用户身份（通常是 root）来执行命令。所以，可以在严格控制用户的情况下，又允许他运行一条或多条特权命令。扩展阅读：Difference Between su and sudo User普通用户通过他自己的用户密码来完成 sudo 授权。输入命令之后会出现输入密码（并不是超级用户密码）的提示，授权成功（只要赋予了用户运行该命令的权限）的话，指定的命令就会运行。系统管理员必须编辑 /etc/sudoers 文件，才能为 sudo 赋予相应权限。通常建议使用 visudo 命令来编辑这个文件，而不是使用文本编辑器来打开它。# visudo 这样会使用 vim（你可以按照 LFCS 系列第二讲：如何安装和使用纯文本编辑器 vi/vim 里边说的来编辑文件）来打开 /etc/sudoers 文件。以下是需要设置的相关的行：Defaults secure_path="/usr/sbin:/usr/bin:/sbin" root ALL=(ALL) ALL tecmint ALL=/bin/yum update gacanepa ALL=NOPASSWD:/bin/updatedb %admin ALL=(ALL) ALL 来更加深入了解这些项：Defaults secure_path="/usr/sbin:/usr/bin:/sbin:/usr/local/bin" 这一行指定 sudo 将要使用的目录，这样可以阻止使用某些用户指定的目录，那样的话可能会危及系统。下一行是用来指定权限的：root ALL=(ALL) ALL 第一个 ALL 关键词表明这条规则适用于所有主机。第二个 ALL 关键词表明第一个字段中所指定的用户能以任何用户身份的权限来运行相应命令。第三个 ALL 关键词表明可以运行任何命令。tecmint ALL=/bin/yum update如果 = 号后边没有指定用户，sudo 则默认为 root 用户。本例中，tecmint 用户能以 root 身份运行 yum update 命令。gacanepa ALL=NOPASSWD:/bin/updatedb NOPASSWD 关键词表明 gacanepa 用户不需要密码，可以直接运行 /bin/updatedb 命令。%admin ALL=(ALL) ALL % 符号表示该行应用于 admin 用户组。其他部分的含义与对于用户的含义是一样的。本例表示 admin 用户组的成员可以通过任何主机连接来运行任何命令。通过 sudo -l 命令可以查看，你的账户拥有什么样的权限。Sudo 访问规则总结对于系统管理员来说，高效能的用户和文件管理技能是非常必要的。本文已经涵盖了这些内容，我们希望你将这些作为一个开始，然后慢慢进步。随时在下边发表评论或提问，我们会尽快回应的。via: http://www.tecmint.com/manage-users-and-groups-in-linux/作者：Gabriel Cánepa 译者：GHLandy 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
LFCS 系列第七讲：通过 SysVinit、Systemd 和 Upstart 管理系统自启动进程和服务
几个月前， Linux 基金会宣布 LFCS (Linux 基金会认证系统管理员) 认证诞生了，这个令人兴奋的新计划定位于让来自全球各地的初级到中级的 Linux 系统管理员得到认证。这其中包括维护已经在运行的系统和服务的能力、第一手的问题查找和分析能力、以及决定何时向开发团队提交问题的能力。第七讲： Linux 基金会认证系统管理员下面的视频简要介绍了 Linux 基金会认证计划。本讲是系列教程中的第七讲，在这篇文章中，我们会介绍如何管理 Linux 系统自启动进程和服务，这是 LFCS 认证考试要求的一部分。管理 Linux 自启动进程Linux 系统的启动程序包括多个阶段，每个阶段由一个不同的图示块表示。下面的图示简要总结了启动过程以及所有包括的主要组件。Linux 启动过程当你按下你机器上的电源键时，存储在主板 EEPROM 芯片中的固件初始化 POST(通电自检) 检查系统硬件资源的状态。POST 结束后，固件会搜索并加载位于第一块可用磁盘上的 MBR 或 EFI 分区的第一阶段引导程序，并把控制权交给引导程序。MBR 方式MBR 是位于 BIOS 设置中标记为可启动磁盘上的第一个扇区，大小是 512 个字节。前面 446 个字节：包括可执行代码和错误信息文本的引导程序接下来的 64 个字节：四个分区（主分区或扩展分区）中每个分区一条记录的分区表。其中，每条记录标示了每个一个分区的状态（是否活跃）、大小以及开始和结束扇区。最后 2 个字节： MBR 有效性检查的魔法数。下面的命令对 MBR 进行备份（在本例中，/dev/sda 是第一块硬盘）。结果文件 mbr.bkp 在分区表被破坏、例如系统不可引导时能排上用场。当然，为了后面需要的时候能使用它，我们需要把它保存到别的地方（例如一个 USB 设备）。该文件能帮助我们重新恢复 MBR，这只在我们操作过程中没有改变硬盘驱动布局时才有效。备份 MBR# dd if=/dev/sda of=mbr.bkp bs=512 count=1 在 Linux 中备份 MBR恢复 MBR# dd if=mbr.bkp of=/dev/sda bs=512 count=1 在 Linux 中恢复 MBREFI/UEFI 方式对于使用 EFI/UEFI 方式的系统， UEFI 固件读取它的设置来决定从哪里启动哪个 UEFI 应用。（例如， EFI 分区位于哪块磁盘或分区。接下来，加载并运行第二阶段引导程序(又名引导管理器)。GRUB[GRand Unified Boot] 是 Linux 中最常使用的引导管理器。今天大部分使用的系统中都能找到它两个中的其中一个版本。GRUB 有效配置文件： /boot/grub/menu.lst（旧发行版， EFI/UEFI 固件不支持）。GRUB2 配置文件： 通常是 /etc/default/grub。尽管 LFCS 考试目标没有明确要求了解 GRUB 内部知识，但如果你足够大胆并且不怕把你的系统搞乱（为了以防万一，你可以先在虚拟机上进行尝试）你可以运行：# update-grub 为了使更改生效，你需要以 root 用户修改 GRUB 的配置。首先， GRUB 加载默认的内核以及 initrd 或 initramfs 镜像。补充一句，initrd 或者 initramfs 帮助完成硬件检测、内核模块加载、以及发现挂载根目录文件系统需要的设备。一旦真正的根目录文件系统启动，为了显示用户界面，内核就会执行系统和服务管理器（init 或 systemd，进程号 PID 一般为 1）开始普通用户态的引导程序。init 和 systemd 都是管理其它守护进程的守护进程（后台进程），它们总是最先启动（系统引导时），最后结束（系统关闭时）。Systemd 和 Init自启动服务(SysVinit)Linux 中运行等级通过控制运行哪些服务来以不同方式使用系统。换句话说，运行等级控制着当前执行状态下可以完成什么任务（以及什么不能完成）。传统上，这个启动过程是基于起源于 System V Unix 的形式，通过执行脚本启动或者停止服务从而使机器进入指定的运行等级(换句话说，是一个不同的系统运行模式)。在每个运行等级中，独立服务可以设置为运行、或者在运行时关闭。一些主流发行版的最新版本中，已经移除了标准的 System V，而用一个称为 systemd（表示系统守护进程）的新服务和系统管理器代替，但为了兼容性，通常也支持 sysv 命令。这意味着你可以在基于 systemd 的发行版中运行大部分有名的 sysv 初始化工具。推荐阅读： Linux 为什么用 ‘systemd’ 代替 ‘init’除了启动系统进程，init 还会查看 /etc/inittab 来决定进入哪个运行等级。RunlevelDescription0停止系统。运行等级 0 是一个用于快速关闭系统的特殊过渡状态。1别名为 s 或 S，这个运行等级有时候也称为维护模式。在这个运行等级启动的服务由于发行版不同而不同。通常用于正常系统操作损坏时低级别的系统维护。2多用户。在 Debian 系统及其衍生版中，这是默认的运行等级，还包括了一个图形化登录（如果有的话）。在基于红帽的系统中，这是没有网络的多用户模式。3在基于红帽的系统中，这是默认的多用户模式，运行除了图形化环境以外的所有东西。基于 Debian 的系统中通常不会使用这个运行等级以及等级 4 和 5。4通常默认情况下不使用，可用于自定制。5基于红帽的系统中，支持 GUI 登录的完全多用户模式。这个运行等级和等级 3 类似，但是有可用的 GUI 登录。6重启系统。要在运行等级之间切换，我们只需要使用 init 命令更改运行等级：init N（其中 N 是上面列出的一个运行等级）。 请注意这并不是运行中的系统切换运行等级的推荐方式，因为它不会给已经登录的用户发送警告（因而导致他们丢失工作以及进程异常终结）。相反，应该用 shutdown 命令重启系统（它首先发送警告信息给所有已经登录的用户，并锁住任何新的登录；然后再给 init 发送信号切换运行等级）但是，首先要在 /etc/inittab 文件中设置好默认的运行等级（系统引导到的等级）。因为这个原因，按照下面的步骤切当地切换运行等级。以 root 用户在 /etc/inittab 中查找下面的行。id:2:initdefault: 并用你喜欢的文本编辑器，例如 vim（本系列的 LFCS 系列第二讲：如何安装和使用纯文本编辑器 vi/vim），更改数字 2 为想要的运行等级。然后，以 root 用户执行# shutdown -r now 最后一个命令会重启系统，并使它在下一次引导时进入指定的运行等级，并会执行保存在 /etc/rc[runlevel].d 目录中的脚本以决定应该启动什么服务、不应该启动什么服务。例如，在下面的系统中运行等级 2。在 Linux 中更改运行等级使用 chkconfig 管理服务为了在启动时启动或者停用系统服务，我们可以在 CentOS / openSUSE 中使用 chkconfig 命令，在 Debian 及其衍生版中使用 sysv-rc-conf 命令。这个工具还能告诉我们对于一个指定的运行等级预先配置的状态是什么。推荐阅读： 如何在 Linux 中停止和停用不想要的服务列出某个服务的运行等级配置。# chkconfig --list [service name] # chkconfig --list postfix # chkconfig --list mysqld 列出运行等级配置从上图中我们可以看出，当系统进入运行等级 2 到 5 的时候就会启动 postfix，而默认情况下运行等级 2 到 4 时会运行 mysqld。现在假设我们并不希望如此。例如，我们希望运行等级为 5 时也启动 mysqld，运行等级为 4 或 5 时关闭 postfix。下面分别针对两种情况进行设置（以 root 用户执行以下命令）。为特定运行等级启用服务# chkconfig --level [level(s)] service on # chkconfig --level 5 mysqld on 为特定运行等级停用服务# chkconfig --level [level(s)] service off # chkconfig --level 45 postfix off 启用/停用服务我们在基于 Debian 的系统中使用 sysv-rc-conf 完成类似任务。使用 sysv-rc-conf 管理服务配置服务自动启动时进入指定运行等级，同时禁止启动时进入其它运行等级。我们可以用下面的命令查看启动 mdadm 时的运行等级。# ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm' 查看运行中服务的运行等级我们使用 sysv-rc-conf 设置防止 mdadm 在运行等级2 之外的其它等级启动。只需根据需要（你可以使用上下左右按键）选中或取消选中（通过空格键）。# sysv-rc-conf Sysv 运行等级配置然后输入 q 退出。重启系统并从步骤 1 开始再操作一遍。# ls -l /etc/rc[0-6].d | grep -E 'rc[0-6]|mdadm' 验证服务运行等级从上图中我们可以看出 mdadm 配置为只在运行等级 2 上启动。那关于 systemd 呢？systemd 是另外一个被多种主流 Linux 发行版采用的服务和系统管理器。它的目标是允许系统启动时多个任务尽可能并行（而 sysvinit 并非如此，sysvinit 一般比较慢，因为它每次只启动一个进程，而且会检查彼此之间是否有依赖，在启动其它服务之前还要等待守护进程启动），充当运行中系统动态资源管理的角色。因此，服务只在需要的时候启动，而不是系统启动时毫无缘由地启动（为了防止消耗系统资源）。要查看你系统中运行的原生 systemd 服务和 Sysv 服务，可以用以下的命令。# systemctl 查看运行中的进程LOAD 一列显示了单元（UNIT 列，显示服务或者由 systemd 维护的其它进程）是否正确加载，ACTIVE 和 SUB 列则显示了该单元当前的状态。显示服务当前状态的信息当 ACTIVE 列显示某个单元状态并非活跃时，我们可以使用以下命令查看具体原因。# systemctl status [unit] 例如，上图中 media-samba.mount 处于失败状态。我们可以运行：# systemctl status media-samba.mount 查看服务状态我们可以看到 media-samba.mount 失败的原因是 host dev1 上的挂载进程无法找到 //192.168.0.10/gacanepa 上的共享网络。启动或停止服务一旦 //192.168.0.10/gacanepa 上的共享网络可用，我们可以再来尝试启动、停止以及重启 media-samba.mount 单元。执行每次操作之后，我们都执行 systemctl stats media-samba.mout 来查看它的状态。# systemctl start media-samba.mount # systemctl status media-samba.mount # systemctl stop media-samba.mount # systemctl restart media-samba.mount # systemctl status media-samba.mount 启动停止服务启用或停用某服务随系统启动使用 systemd 你可以在系统启动时启用或停用某服务# systemctl enable [service] # 启用服务 # systemctl disable [service] # 阻止服务随系统启动 启用或停用某服务随系统启动包括在 /etc/systemd/system/multi-user.target.wants 目录添加或者删除符号链接。启用或停用服务你也可以用下面的命令查看某个服务的当前状态（启用或者停用）。# systemctl is-enabled [service] 例如，# systemctl is-enabled postfix.service 另外，你可以用下面的命令重启或者关闭系统。# systemctl reboot # systemctl shutdown Upstart基于事件的 Upstart 是 /sbin/init 守护进程的替代品，它仅为在需要那些服务的时候启动服务而生，（或者当它们在运行时管理它们），以及处理发生的实践，因此 Upstart 优于基于依赖的 sysvinit 系统。一开始它是为 Ubuntu 发行版开发的，但在红帽企业版 Linux 6.0 中得到使用。尽管希望它能在所有 Linux 发行版中替代 sysvinit，但它已经被 systemd 超越。2014 年 2 月 14 日，Mark Shuttleworth（Canonical Ltd. 创建者）发布声明之后的 Ubuntu 发行版采用 systemd 作为默认初始化守护进程。由于 Sysv 启动脚本已经流行很长时间了，很多软件包中都包括了 Sysv 启动脚本。为了兼容这些软件， Upstart 提供了兼容模式：它可以运行保存在常用位置（/etc/rc.d/rc?.d, /etc/init.d/rc?.d, /etc/rc?.d或其它类似的位置）的Sysv 启动脚本。因此，如果我们安装了一个还没有 Upstart 配置脚本的软件，仍然可以用原来的方式启动它。另外，如果我们还安装了类似 chkconfig 的工具，你还可以和在基于 sysvinit 的系统中一样用它们管理基于 Sysv 的服务。Upstart 脚本除了支持 Sysv 启动脚本，还支持基于多种方式启动或者停用服务；例如， Upstart 可以在一个特定硬件设备连接上的时候启动一个服务。使用 Upstart以及它原生脚本的系统替换了 /etc/inittab 文件和 /etc/init 目录下和运行等级相关的以 .conf 作为后缀的 Sysv 启动脚本目录。这些 *.conf 脚本（也称为任务定义）通常包括以下几部分：进程描述进程的运行等级或者应该触发它们的事件应该停止进程的运行等级或者触发停止进程的事件选项启动进程的命令例如，# My test service - Upstart script demo description "Here goes the description of 'My test service'" author "Dave Null <dave.null@example.com>" # Stanzas # # Stanzas define when and how a process is started and stopped # See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn # When to start the service start on runlevel [2345] # When to stop the service stop on runlevel [016] # Automatically restart process in case of crash respawn # Specify working directory chdir /home/dave/myfiles # Specify the process/command (add arguments if needed) to run exec bash backup.sh arg1 arg2 要使更改生效，你要让 upstart 重新加载它的配置文件。# initctl reload-configuration 然后用下面的命令启动你的任务。$ sudo start yourjobname 其中 yourjobname 是之前 yourjobname.conf 脚本中添加的任务名称。关于 Upstart 更完整和详细的介绍可以参考该项目网站的 “Cookbook” 栏目。总结了解 Linux 启动进程对于你进行错误处理、调整计算机系统以及根据需要运行服务非常有用。在这篇文章中，我们分析了你按下电源键启动机器的一刻到你看到完整的可操作用户界面这段时间发生了什么。我希望你能像我一样把它们放在一起阅读。欢迎在下面留下你的评论或者疑问。我们总是期待听到读者的回复。via: http://www.tecmint.com/linux-boot-process-and-manage-services/作者：Gabriel Cánepa 译者：ictlyh 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
LFCS 系列第六讲：组装分区为RAID设备——创建和管理系统备份
Linux 基金会已经发起了一个全新的 LFCS（ Linux 基金会认证系统管理员 （ Linux Foundation Certified Sysadmin ） ）认证，旨在让来自世界各地的人有机会参加到 LFCS 测试，获得关于有能力在 Linux 系统中执行中级系统管理任务的认证。该认证包括：维护正在运行的系统和服务的能力、全面监控和分析的能力以及何时向上游团队请求支持的决策能力。LFCS 系列第六讲以下视频介绍了 Linux 基金会认证程序。本讲是系列教程中的第六讲，在这一讲里，我们将会解释如何将分区组装为 RAID 设备——创建和管理系统备份。这些都是 LFCS 认证中的必备知识。了解RAID这种被称为独立磁盘冗余阵列（Redundant Array of Independent Disks）(RAID)的技术是将多个硬盘组合成一个单独逻辑单元的存储解决方案，它提供了数据冗余功能并且改善硬盘的读写操作性能。然而，实际的容错和磁盘 I/O 性能硬盘取决于如何将多个硬盘组装成磁盘阵列。根据可用的设备和容错/性能的需求，RAID 被分为不同的级别，你可以参考 RAID 系列文章以获得每个 RAID 级别更详细的解释。在 Linux 下使用 RAID（一）：介绍 RAID 的级别和概念我们选择用于创建、组装、管理、监视软件 RAID 的工具，叫做 mdadm (multiple disk admin 的简写）。---------------- Debian 及衍生版 ---------------- # aptitude update && aptitude install mdadm ---------------- Red Hat 和基于 CentOS 的系统 ---------------- # yum update && yum install mdadm ---------------- openSUSE 上 ---------------- # zypper refresh && zypper install mdadm # 将分区组装成 RAID 设备组装已有分区作为 RAID 设备的过程由以下步骤组成。1. 使用 mdadm 创建阵列如果先前其中一个分区已经格式化，或者作为了另一个 RAID 阵列的一部分，你会被提示以确认创建一个新的阵列。假设你已经采取了必要的预防措施以避免丢失重要数据，那么可以安全地输入 Y 并且按下回车。# mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb1 /dev/sdc1 创建 RAID 阵列2. 检查阵列的创建状态在创建了 RAID 阵列之后，你可以检查使用以下命令检查阵列的状态。# cat /proc/mdstat or # mdadm --detail /dev/md0 [More detailed summary] 检查 RAID 阵列的状态3. 格式化 RAID 设备如本系列第四讲所介绍的，按照你的需求/要求采用某种文件系统格式化你的设备。4. 监控 RAID 阵列服务让监控服务时刻监视你的 RAID 阵列。把# mdadm --detail --scan命令输出结果添加到 /etc/mdadm/mdadm.conf(Debian及其衍生版)或者/etc/mdadm.conf(Cent0S/openSUSE)，如下。# mdadm --detail --scan 监控 RAID 阵列# mdadm --assemble --scan [Assemble the array] 为了确保服务能够开机启动，需要以 root 权限运行以下命令。Debian 及其衍生版Debian 及其衍生版能够通过下面步骤使服务默认开机启动：# update-rc.d mdadm defaults 在 /etc/default/mdadm 文件中添加下面这一行AUTOSTART=true CentOS 和 openSUSE(systemd-based)# systemctl start mdmonitor # systemctl enable mdmonitor CentOS 和 openSUSE(SysVinit-based)# service mdmonitor start # chkconfig mdmonitor on 5. 检查RAID磁盘故障在支持冗余的的 RAID 级别中，在需要时会替换故障的驱动器。当磁盘阵列中的设备出现故障时，仅当存在我们第一次创建阵列时预留的备用设备时，磁盘阵列会将自动启动重建。检查 RAID 故障磁盘否则，我们需要手动将一个额外的物理驱动器插入到我们的系统，并且运行。# mdadm /dev/md0 --add /dev/sdX1 /dev/md0 是出现了问题的阵列，而 /dev/sdx1 是新添加的设备。6. 拆解一个工作阵列如果你需要使用工作阵列的设备创建一个新的阵列，你可能不得不去拆解已有工作阵列——(可选步骤)# mdadm --stop /dev/md0 # Stop the array # mdadm --remove /dev/md0 # Remove the RAID device # mdadm --zero-superblock /dev/sdX1 # Overwrite the existing md superblock with zeroes 7. 设置邮件通知你可以配置一个用于发送通知的有效邮件地址或者系统账号(确保在 mdadm.conf 文件中有下面这一行)。——(可选步骤)MAILADDR root 在这种情况下，来自 RAID 后台监控程序所有的通知将会发送到你的本地 root 账号的邮件箱中。其中一个类似的通知如下。说明：此次通知事件和第5步中的例子相关。此处一个设备被标志为错误，并且一个空闲的设备自动地被 mdadm 加入到阵列。我们用完了所有“健康的”空闲设备，因此我们得到了通知。RAID 监控通知了解 RAID 级别RAID 0阵列总大小是最小分区大小的 n 倍，n 是阵列中独立磁盘的个数(你至少需要两个驱动器/磁盘)。运行下面命令，使用 /dev/sdb1 和 /dev/sdc1 分区组装一个 RAID 0 阵列。# mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb1 /dev/sdc1 常见用途：用于支持性能比容错更重要的实时应用程序的设置RAID 1 (又名镜像)阵列总大小等于最小分区大小(你至少需要两个驱动器/磁盘)。运行下面命令，使用 /dev/sdb1 和 /dev/sdc1 分区组装一个 RAID 1 阵列。# mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 常见用途：操作系统的安装或者重要的子文件夹，例如 /homeRAID 5 (又名奇偶校验码盘)阵列总大小将是最小分区大小的 (n-1) 倍。所减少的大小用于奇偶校验(冗余)计算(你至少需要3个驱动器/磁盘)。说明：你可以指定一个空闲设备 (/dev/sde1) 替换问题出现时的故障部分(分区)。运行下面命令，使用 /dev/sdb1, /dev/sdc1, /dev/sdd1，/dev/sde1 组装一个 RAID 5 阵列，其中 /dev/sde1 作为空闲分区。# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 --spare-devices=1 /dev/sde1 常见用途：Web 和文件服务RAID 6 (又名双重奇偶校验码盘)阵列总大小为(ns)-2s，其中n为阵列中独立磁盘的个数，s为最小磁盘大小。说明：你可以指定一个空闲分区(在这个例子为 /dev/sdf1)替换问题出现时的故障部分(分区)。运行下面命令，使用 /dev/sdb1, /dev/sdc1, /dev/sdd1, /dev/sde1 和 /dev/sdf1 组装 RAID 6 阵列，其中 /dev/sdf1 作为空闲分区。# mdadm --create --verbose /dev/md0 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde --spare-devices=1 /dev/sdf1 常见用途：大容量、高可用性要求的文件服务器和备份服务器。RAID 1+0 (又名镜像条带)因为 RAID 1+0 是 RAID 0 和 RAID 1 的组合，所以阵列总大小是基于两者的公式计算的。首先，计算每一个镜像的大小，然后再计算条带的大小。# mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sd[b-e]1 --spare-devices=1 /dev/sdf1 常见用途：需要快速 IO 操作的数据库和应用服务器创建和管理系统备份记住， RAID 其所有的价值不是在于备份的替换者！在黑板上写上1000次，如果你需要的话，但无论何时一定要记住它。在我们开始前，我们必须注意的是，没有一个放之四海皆准的针对所有系统备份的解决方案，但这里有一些东西，是你在规划一个备份策略时需要考虑的。你的系统将用于什么？(桌面或者服务器？如果系统是应用于后者，那么最重要的服务是什么？哪个配置是痛点？)你每隔多久备份你的系统？你需要备份的数据是什么(比如文件/文件夹/数据库转储)？你还可以考虑是否需要备份大型文件(比如音频和视频文件)。这些备份将会存储在哪里(物理位置和媒体)？备份你的数据方法1：使用 dd 命令备份整个磁盘。你可以在任意时间点通过创建一个准确的镜像来备份一整个硬盘或者是分区。注意当设备是离线时，这种方法效果最好，也就是说它没有被挂载并且没有任何进程的 I/O 操作访问它。这种备份方法的缺点是镜像将具有和磁盘或分区一样的大小，即使实际数据占用的是一个很小的比例。比如，如果你想要为只使用了10%的20GB的分区创建镜像，那么镜像文件将仍旧是20GB。换句话来讲，它不仅包含了备份的实际数据，而且也包含了整个分区。如果你想完整备份你的设备，那么你可以考虑使用这个方法。从现有的设备创建一个镜像文件# dd if=/dev/sda of=/system_images/sda.img 或者 --------------------- 可选地，你可以压缩镜像文件 ------------------- # dd if=/dev/sda | gzip -c > /system_images/sda.img.gz 从镜像文件恢复备份# dd if=/system_images/sda.img of=/dev/sda 或者 --------------------- 根据你创建镜像文件时的选择(译者注:比如压缩) ---------------- # gzip -dc /system_images/sda.img.gz | dd of=/dev/sda 方法2：使用 tar 命令备份确定的文件/文件夹——已经在本系列第三讲中讲了。如果你想要备份指定的文件/文件夹(配置文件，用户主目录等等)，你可以使用这种方法。方法3：使用 rsync 命令同步文件。rsync 是一种多功能远程（和本地）文件复制工具。如果你想要从网络设备备份或同步文件，rsync 是一种选择。无论是你是正在同步两个本地文件夹还是本地 < — > 挂载在本地文件系统的远程文件夹，其基本语法是一样的。# rsync -av source_directory destination_directory 在这里，-a 递归遍历子目录(如果它们存在的话)，维持符号链接、时间戳、权限以及原本的属主/属组，-v 显示详细过程。rsync 同步文件除此之外，如果你想增加在网络上传输数据的安全性，你可以通过 ssh 协议使用 rsync。通过 ssh 同步本地到远程文件夹# rsync -avzhe ssh backups root@remote_host:/remote_directory/ 这个示例，本地主机上的 backups 文件夹将与远程主机上的 /root/remote\_directory 的内容同步。在这里，-h 选项以易读的格式显示文件的大小，-e 标志用于表示一个 ssh 连接。rsync 同步远程文件通过ssh同步远程到本地文件夹在这种情况下，交换前面示例中的 source 和 destination 文件夹。# rsync -avzhe ssh root@remote_host:/remote_directory/ backups 请注意这些只是 rsync 用法的三个示例而已(你可能遇到的最常见的情形)。对于更多有关 rsync 命令的示例和用法 ，你可以查看下面的文章。在 Linux 下同步文件的10个 rsync命令总结作为一个系统管理员，你需要确保你的系统表现得尽可能好。如果你做好了充分准备，并且如果你的数据完整性能被诸如 RAID 和系统日常备份的存储技术支持，那你将是安全的。如果你有有关完善这篇文章的问题、评论或者进一步的想法，可以在下面畅所欲言。除此之外，请考虑通过你的社交网络简介分享这系列文章。via: http://www.tecmint.com/creating-and-managing-raid-backups-in-linux/作者：Gabriel Cánepa 译者：cpsoture 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
LFCS 系列第五讲：如何在 Linux 中挂载/卸载本地文件系统和网络文件系统（Samba 和 NF
Linux 基金会已经发起了一个全新的 LFCS（ Linux 基金会认证系统管理员 （ Linux Foundation Certified Sysadmin ） ）认证，旨在让来自世界各地的人有机会参加到 LFCS 测试，获得关于有能力在 Linux 系统中执行中间系统管理任务的认证。该认证包括：维护正在运行的系统和服务的能力、全面监控和分析的能力以及何时向上游团队请求支持的决策能力。LFCS 系列第五讲请看以下视频，这里边介绍了 Linux 基金会认证程序。本讲是系列教程中的第五讲，在这一讲里边，我们会解释如何在 Linux 中挂载/卸载本地和网络文件系统。这些都是 LFCS 认证中的必备知识。挂载文件系统在个硬盘分好区之后，Linux 需要通过某些方式对硬盘分区上的数据进行访问。Linux 并不会像 DOS 或者 Windows 那样给每个硬盘分区分配一个字母来作为盘符，而是将硬盘分区挂载到统一的目录树上的挂载点。挂载点是一个目录，挂载是一种访问分区上文件系统的方法，挂载文件系统实际上是将一个确切的文件系统（比如一个分区）和目录树中指定的目录联系起来的过程。换句话说，管理存储设备的第一步就是把设备关联到文件系统树。要完成这一步，通常可以这样：用 mount 命令来进行临时挂载（用完的时候，使用 umount 命令来卸载），或者通过编辑 /etc/fstab 文件之后重启系统来永久性挂载，这样每次开机都会进行挂载。不带任何选项的 mount 命令，可以显示当前已挂载的文件系统。# mount 检查已挂载的文件系统另外，mount 命令通常用来挂载文件系统。其基本语法如下：# mount -t type device dir -o options 该命令会指引内核将在设备上找到的文件系统（如已格式化为指定类型的文件系统）挂载到指定目录。像这样的形式，mount 命令不会再到 /etc/fstab 文件中进行确认。除非像下面，挂载指定的目录或者设备：# mount /dir -o options 或 # mount device -o options mount 命令会尝试寻找挂载点，如果找不到就会查找设备（上述两种情况下，mount 命令会在 /etc/fstab 查找相应的设备或挂载点），最后尝试完成挂载操作（这个通常可以成功执行，除非你的挂载点或者设备正在使用中，或者你调用 mount 命令的时候没有 root 权限）。你可以看到，mount 命令的每行输出都是如下格式：device on directory type (options) 例如：/dev/mapper/debian-home on /home type ext4 (rw,relatime,user_xattr,barrier=1,data=ordered) 读作：设备 dev/mapper/debian-home 挂载在 /home 下，它被格式化为 ext4，并且有以下挂载选项： rw，relatime，user\_xattr，barrier=1，data=ordered。mount 命令选项下面列出 mount 命令的常用选项async：允许在将要挂载的文件系统上进行异步 I/O 操作auto：标示该文件系统通过 mount -a 命令挂载，与 noauto 相反。defaults：该选项相当于 async,auto,dev,exec,nouser,rw,suid 的组合。注意，多个选项必须由逗号隔开并且中间没有空格。倘若你不小心在两个选项中间输入了一个空格，mount 命令会把后边的字符解释为另一个参数。loop：将镜像文件（如 .iso 文件）挂载为 loop 设备。该选项可以用来模拟显示光盘中的文件内容。noexec：阻止该文件系统中可执行文件的执行。与 exec 选项相反。nouser：阻止任何用户（除 root 用户外） 挂载或卸载文件系统。与 user 选项相反。remount：重新挂载文件系统。ro：只读模式挂载。rw：读写模式挂载。relatime：只要访问时间早于修改时间，就更新文件的的访问时间。user\_xattr：允许用户设置和移除可扩展文件系统属性。以 ro 和 noexec 模式挂载设备# mount -t ext4 /dev/sdg1 /mnt -o ro,noexec 在本例中，我们可以看到，在挂载点 /mnt 中尝试写入文件或者运行可执行文件都会显示相应的错误信息。# touch /mnt/myfile # /mnt/bin/echo “Hi there” 可读写模式挂载设备以默认模式挂载设备以下场景，我们在重新挂载设备的挂载点中，像上例一样尝试你写入文件和运行可执行文件。# mount -t ext4 /dev/sdg1 /mnt -o defaults 挂载设备在这个例子中，我们发现写入文件和命令都完美执行了。卸载设备使用 umount 命令卸载设备，意味着将所有的“在使用”数据全部写入到文件系统，然后可以安全移除文件系统。请注意，倘若你移除一个没有事先正确卸载的设备，就会有造成设备损坏和数据丢失的风险。也就是说，你必须“离开”设备的块设备描述符或者挂载点，才能卸载设备。换言之，你的当前工作目录不能是需要卸载设备的挂载点。否则，系统将返回设备繁忙的提示信息。卸载设备离开需卸载设备的挂载点最简单的方法就是，运行不带任何选项的 cd 命令，这样会回到当前用户的家目录。挂载常见的网络文件系统最常用的两种网络文件系统是 SMB（ 服务器消息块 （ Server Message Block ） ）和 NFS（ 网络文件系统 （ Network File System ） ）。如果你只向类 Unix 客户端提供共享，用 NFS 就可以了，如果是向 Windows 和其他类 Unix 客户端提供共享服务，就需要用到 Samba 了。扩展阅读Setup Samba Server in RHEL/CentOS and FedoraSetting up NFS (Network File System) on RHEL/CentOS/Fedora and Debian/Ubuntu下面的例子中，假设 Samba 和 NFS 已经在地址为 192.168.0.10 的服务器上架设好了（请注意，架设 NFS 服务器也是 LFCS 考试中需要考核的能力，我们会在后边中提到）。在 Linux 中挂载 Samba 共享第一步：在 Red Hat 以 Debian 系发行版中安装 samba-client、samba-common 和 cifs-utils 软件包，如下：# yum update && yum install samba-client samba-common cifs-utils # aptitude update && aptitude install samba-client samba-common cifs-utils 然后运行下列命令，查看服务器上可用的 Samba 共享。# smbclient -L 192.168.0.10 并输入远程机器上 root 账户的密码。挂载 Samba 共享上图中，已经对可以挂载到我们本地系统上的共享进行高亮显示。你只需要与一个远程服务器上的合法用户名及密码就可以访问共享了。第二步：当挂载有密码保护的网络文件系统时候，将你的访问凭证写入到 /etc/fstab 文件中并非明智的选择。你需要将这些信息写入到具有 600 权限的隐藏文件中，像这样：# mkdir /media/samba # echo “username=samba_username” > /media/samba/.smbcredentials # echo “password=samba_password” >> /media/samba/.smbcredentials # chmod 600 /media/samba/.smbcredentials 第三步：然后将下面的内容添加到 /etc/fstab 文件中。# //192.168.0.10/gacanepa /media/samba cifs credentials=/media/samba/.smbcredentials,defaults 0 0 第四步：现在可以挂载你的 Samba 共享了。手动挂载（mount //192.168.0.10/gacanepa）或者重启系统并应用 /etc/fstab 中相应行来用就挂载都可以。挂载有密码保护的 Samba 共享在 Linux 系统中挂载 NFS 共享第一步：在 Red Hat 以 Debian 系发行版中安装 nfs-common 和 portmap 软件包。如下：# yum update && yum install nfs-utils nfs-utils-lib # aptitude update && aptitude install nfs-common 第二步：为 NFS 共享创建挂载点。# mkdir /media/nfs 第三步：将下面的内容添加到 /etc/fstab 文件中。192.168.0.10:/NFS-SHARE /media/nfs nfs defaults 0 0第四步：现在可以挂载你的 Samba 共享了。手动挂载（mount 192.168.0.10:/NFS-SHARE）或者重启系统并应用 /etc/fstab 中相应行来用就挂载都可以。挂载 NFS 共享永久性挂载文件系统像前面两个例子那样，/etc/fstab 控制着Linux如何访问硬盘分区及可移动设备。/etc/fstab 由六个字段的内容组成，各个字段之间通过一个空格符或者制表符来分开。井号（#）开始的行只是会被忽略的注释。每一行都按照这个格式来写入：<file system> <mount point> <type> <options> <dump> <pass> 其中：: 第一个字段指定挂载的设备。大多数发行版本都通过分区的标卷（label）或者 UUID 来指定。这样做可以避免分区号改变时带来的错误。: 第二个字段指定挂载点。 ：文件系统的类型代码与 mount 命令挂载文件系统时使用的类型代码是一样的。通过 auto 类型代码可以让内核自动检测文件系统，这对于可移动设备来说非常方便。注意，该选项可能不是对所有文件系统可用。: 一个（或多个）挂载选项。: 你可能把这个字段设置为 0（否则设置为 1），使得系统启动时禁用 dump 工具（dump 程序曾经是一个常用的备份工具，但现在越来越少用了）对文件系统进行备份。: 这个字段指定启动系统是是否通过 fsck 来检查文件系统的完整性。0 表示 fsck 不对文件系统进行检查。数字越大，优先级越低。因此，根分区（/）最可能使用数字 1，其他所有需要检查的分区则是以数字 2.Mount 命令例示1、在系统启动时，通过 TECMINT 标卷来挂载文件系统，并具备 rw 和 noexec 属性，你应该将以下语句添加到 /etc/fstab 文件中。LABEL=TECMINT /mnt ext4 rw,noexec 0 0 2、若你想在系统启动时挂载 DVD 光驱中的内容，添加以下语句。/dev/sr0 /media/cdrom0 iso9660 ro,user,noauto 0 0其中 /dev/sr0 为你的 DVD 光驱。总结不用怀疑，在命令行中挂载/卸载本地和网络文件系统将是你作为系统管理员的日常责任的一部分。同时，你需要掌握 /etc/fstab 文件的编写。希望本文对你有帮助。随时在下边发表评论（或者提问），并分享本文到你的朋友圈。参考链接关于 LFCS为什么需要 Linux 基金会认证?注册 LFCS 考试via: http://www.tecmint.com/mount-filesystem-in-linux/作者：Gabriel Cánepa 译者：GHLandy 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出