Linux管理员快速指南



Linux管理员 - CentOS概述

CentOS作为商业级Linux发行版中独树一帜的存在,忠实于Linux的开源本质。第一个Linux内核是由赫尔辛基大学的一名大学生(Linus Torvalds)开发的,并结合了Richard Stallman创建和推广的GNU实用程序。CentOS拥有经过验证的开源许可,可以为当今的商业世界提供动力。

CentOS已迅速成为世界上最著名的服务器平台之一。任何寻求就业的Linux管理员都一定会遇到“优先考虑CentOS Linux经验”这样的字眼。从初创公司到《财富》10强科技巨头,CentOS已跻身全球服务器操作系统的高端行列。

使CentOS区别于其他Linux发行版的是以下几个方面的完美结合:

  • 开源许可

  • 致力于Linux专业的用户群体

  • 良好的硬件支持

  • 坚如磐石的稳定性和可靠性

  • 专注于安全性和更新

  • 严格遵守企业环境所需的软件打包标准

在开始学习之前,我们假设读者具备Linux和管理基础知识,例如:

  • 什么是root用户?

  • root用户的权限

  • 安全组和用户的基本概念

  • 使用Linux终端模拟器的经验

  • 基本的网络概念

  • 对解释型编程语言(Perl、Python、Ruby)的基本理解

  • 网络协议,例如HTTP、LDAP、FTP、IMAP、SMTP

  • 构成计算机操作系统的核心:文件系统、驱动程序和内核

基本的CentOS Linux命令

在学习CentOS Linux管理员的工具之前,重要的是要注意Linux管理员命令行背后的理念。

Linux的设计基于Unix的“小型、精确的工具链,简化大型任务”的理念。从根本上说,Linux通常没有针对特定用途的大型单一用途应用程序。相反,它有数百个基本实用程序,当结合起来时,可以提供强大的功能,以高效的方式完成大型任务。

Linux理念的示例

例如,如果管理员想要列出系统上所有当前用户,可以使用以下链式命令来获取系统上所有用户的列表。执行命令后,系统上的用户将按字母顺序列出。

[root@centosLocal centos]# cut /etc/passwd -d":" -f1 | sort 
abrt 
adm 
avahi 
bin 
centos 
chrony 
colord 
daemon 
dbus

可以使用以下命令轻松地将此列表导出到文本文件。

[root@localhost /]# cut /etc/passwd -d ":" -f1 > system_users.txt        
[root@localhost /]# cat ./system_users.txt | sort | wc –l 
40       
[root@localhost /]#

还可以将用户列表与以后的导出进行比较。

[root@centosLocal centos]#  cut /etc/passwd -d ":" -f1 > system_users002.txt && 
   cat system_users002.txt | sort | wc -l 
41 
[root@centosLocal centos]# diff ./system_users.txt ./system_users002.txt  
evilBackdoor [root@centosLocal centos]#

通过这种使用小型工具链来完成大型任务的方法,编写执行这些命令的脚本比定期自动发送电子邮件结果要简单得多。

每个Linux管理员都应该熟练掌握的基本命令包括:

在Linux世界中,管理员每天都使用**过滤**命令来解析日志、过滤命令输出以及使用交互式shell脚本执行操作。如前所述,这些命令的功能在于它们能够通过称为**管道**的过程相互修改。

以下命令显示CentOS主用户字典中以字母a开头的单词有多少个。

[root@centosLocal ~]# egrep '^a.*$' /usr/share/dict/words | wc -l 
25192 
[root@centosLocal ~]#

Linux管理员 - 文件/文件夹管理

为了介绍CentOS Linux中目录和文件适用的权限,让我们看一下以下命令输出。

[centos@centosLocal etc]$ ls -ld /etc/yum* 
drwxr-xr-x. 6 root root 100 Dec  5 06:59 /etc/yum 
-rw-r--r--. 1 root root 970 Nov 15 08:30 /etc/yum.conf 
drwxr-xr-x. 2 root root 187 Nov 15 08:30 /etc/yum.repos.d

**注意** - 你将看到的三个主要对象类型是

  • **"-"** - 表示普通文件

  • **"d"** - 表示目录

  • **"l"** - 表示符号链接

我们将重点关注每个目录和文件的三个输出块:

  • drwxr-xr-x : root : root
  • -rw-r--r-- : root : root
  • drwxr-xr-x : root : root

现在让我们分解一下,以便更好地理解这些行:

d 表示对象类型是目录
rwx 指示应用于所有者的**目录**权限
r-x 指示应用于组的**目录**权限
r-x 指示应用于世界的**目录**权限
root 第一个实例指示目录的所有者
root 第二个实例指示应用组权限的组

理解所有者、组和世界之间的区别非常重要。如果不理解这一点,可能会对托管互联网服务的服务器产生重大影响。

在我们给出实际示例之前,让我们首先了解应用于目录和文件的权限。

请查看下表,然后继续操作。

八进制 符号 权限 目录
1 x 执行 进入目录并访问文件
2 w 写入 删除或修改目录中的文件
4 r 读取 列出目录中的文件

**注意** - 当文件应该在目录中可读时,通常会应用读取和执行权限。否则,用户将难以处理文件。禁用写入将确保无法重命名、删除、复制或修改文件权限。

将权限应用于目录和文件

应用权限时,需要理解两个概念:

  • 符号权限
  • 八进制权限

本质上,两者相同,只是指代和分配文件权限的方式不同。有关快速指南,请学习并参考下表:

读取 写入 执行
八进制 4 2 1
符号 r w x

使用**八进制**方法分配权限时,使用 3 字节数字,例如:760。数字 760 转换为:所有者:rwx;组:rw;其他(或世界)无权限。

另一种情况:733 将转换为:所有者:rwx;组:wx;其他:wx。

使用八进制方法设置权限有一个缺点。无法修改现有的权限集。只能重新分配对象的整个权限集。

现在你可能会想,总是重新分配权限有什么问题?想象一下大型目录结构,例如生产 Web 服务器上的`/var/www/`。我们要递归地从所有目录的“其他”用户那里移除`w` 或写入位。因此,强制只有在需要安全措施时才主动添加它。如果我们重新分配整个权限集,我们将移除分配给每个子目录的所有其他自定义权限。

因此,这将给管理员和系统用户都带来问题。在某些时候,一个人(或多个人)需要重新分配所有被重新分配每个目录和对象的整个权限集而清除的自定义权限。

在这种情况下,我们希望使用符号方法来修改权限:

chmod -R o-w /var/www/

上述命令不会“覆盖权限”,而是修改当前权限集。因此,请习惯于使用最佳实践

  • 仅使用八进制分配权限
  • 使用符号修改权限集

重要的是,CentOS管理员应该熟练掌握八进制和符号权限,因为权限对于数据的完整性和整个操作系统都很重要。如果权限不正确,最终结果将是敏感数据和整个操作系统都将受到损害。

在介绍完这些内容后,让我们来看一些用于修改权限和对象所有者/成员的命令:

  • chmod
  • chown
  • chgrp
  • umask

chmod:更改文件模式权限位

命令 操作
-c 类似于详细模式,但只会报告所做的更改
-v 详细模式,输出每个请求的诊断信息
-R 递归地将操作应用于文件和目录

chmod 将允许我们使用八进制或符号权限集更改目录和文件的权限。我们将使用它来修改我们的作业和上传目录。

chown:更改文件所有者和组

命令 操作
-c 类似于详细模式,但只会报告所做的更改
-v 详细模式,输出每个请求的诊断信息
-R 递归地将操作应用于文件和目录

chown 可以修改对象的所有者用户和组。但是,除非需要同时修改两者,否则通常使用 chgrp 来处理组。

chgrp:更改文件或目录的组所有权

命令 操作
-c 类似于详细模式,但只会报告所做的更改
-v 详细模式,输出每个请求的诊断信息
-R 递归地将操作应用于文件和目录

chgrp 将更改组所有者为提供的组。

实际操作

让我们更改`/var/www/students/`中的所有子目录作业,以便所有者组为`students`组。然后将`students`的根目录分配给`professors`组。稍后,让 Terry Thomas 博士成为`students`目录的所有者,因为他负责学校所有计算机科学方面的学术工作。

正如我们所看到的,创建目录时,目录的状态相当原始。

[root@centosLocal ~]# ls -ld /var/www/students/ 
drwxr-xr-x. 4 root root 40 Jan  9 22:03 /var/www/students/

[root@centosLocal ~]# ls -l /var/www/students/ 
total 0 
drwxr-xr-x. 2 root root 6 Jan  9 22:03 assignments 
drwxr-xr-x. 2 root root 6 Jan  9 22:03 uploads 

[root@centosLocal ~]#

作为管理员,我们永远不想将我们的root权限交给任何人。但与此同时,我们需要允许用户能够完成他们的工作。因此,让我们允许 Terry Thomas 博士对文件结构进行更多控制,并限制学生可以执行的操作。

[root@centosLocal ~]# chown -R drterryt:professors /var/www/students/ 
[root@centosLocal ~]# ls -ld /var/www/students/ 
drwxr-xr-x. 4 drterryt professors 40 Jan  9 22:03 /var/www/students/

[root@centosLocal ~]# ls -ls /var/www/students/ 
total 0 
0 drwxr-xr-x. 2 drterryt professors 6 Jan  9 22:03 assignments 
0 drwxr-xr-x. 2 drterryt professors 6 Jan  9 22:03 uploads

[root@centosLocal ~]#

现在,每个目录和子目录的所有者都是`drterryt`,所有者组是`professors`。由于`assignments`目录用于学生提交作业,让我们取消`students`组列出和修改文件的权限。

[root@centosLocal ~]# chgrp students /var/www/students/assignments/ && chmod 
736 /var/www/students/assignments/

[root@centosLocal assignments]# ls -ld /var/www/students/assignments/ 
drwx-wxrw-. 2 drterryt students 44 Jan  9 23:14 /var/www/students/assignments/

[root@centosLocal assignments]#

学生可以将作业复制到`assignments`目录。但他们不能列出目录的内容、复制当前文件或修改`assignments`目录中的文件。因此,它只允许学生提交已完成的作业。CentOS文件系统将提供作业提交时间的日期戳。

作为`assignments`目录的所有者:

[drterryt@centosLocal assignments]$ whoami 
drterryt

[drterryt@centosLocal assignments]$ ls -ld /var/www/students/assignment 
drwx-wxrw-. 2 drterryt students 44 Jan  9 23:14 /var/www/students/assignments/

[drterryt@centosLocal assignments]$ ls -l /var/www/students/assignments/ 
total 4 
-rw-r--r--. 1 adama  students  0 Jan  9 23:14 myassign.txt 
-rw-r--r--. 1 tammyr students 16 Jan  9 23:18 terryt.txt

[drterryt@centosLocal assignments]$

我们可以看到,目录所有者可以列出文件以及修改和删除文件。

umask 命令:提供创建文件和目录权限时的默认模式

umask 是一个重要的命令,它为创建的文件和目录权限提供默认模式。

umask 权限使用一元反向逻辑。

权限 操作
0 读、写、执行
1 读和写
2 读和执行
3 只读
4 读和执行
5 只写
6 只执行
7 无权限
[adama@centosLocal umask_tests]$ ls -l ./ 
-rw-r--r--. 1 adama students 0 Jan 10 00:27 myDir 
-rw-r--r--. 1 adama students 0 Jan 10 00:27 myFile.txt

[adama@centosLocal umask_tests]$ whoami 
adama

[adama@centosLocal umask_tests]$ umask 
0022

[adama@centosLocal umask_tests]$

现在,让我们更改当前用户的 umask,并创建一个新的文件和目录。

[adama@centosLocal umask_tests]$ umask 077

[adama@centosLocal umask_tests]$ touch mynewfile.txt

[adama@centosLocal umask_tests]$ mkdir myNewDir

[adama@centosLocal umask_tests]$ ls -l 
total 0 
-rw-r--r--. 1 adama students 0 Jan 10 00:27 myDir 
-rw-r--r--. 1 adama students 0 Jan 10 00:27 myFile.txt 
drwx------. 2 adama students 6 Jan 10 00:35 myNewDir 
-rw-------. 1 adama students 0 Jan 10 00:35 mynewfile.txt

我们可以看到,新创建的文件比以前更严格了一些。

必须更改用户的 umask,方法如下:

  • /etc/profile
  • ~/bashrc
[root@centosLocal centos]# su adama 
[adama@centosLocal centos]$ umask 
0022 
[adama@centosLocal centos]$

通常,CentOS 中的默认 umask 就足够了。当我们遇到默认值为 0022 的问题时,通常是因为不同部门的不同组需要协作完成项目。

这就是系统管理员的作用所在,需要平衡 CentOS 操作系统的操作和设计。

Linux管理员 - 用户管理

在讨论用户管理时,我们需要理解三个重要术语:

  • 用户
  • 权限

我们已经深入讨论了应用于文件和文件夹的权限。在本章中,让我们讨论用户和组。

CentOS 用户

在 CentOS 中,有两种类型的帐户:

  • 系统帐户 - 用于守护进程或其他软件。

  • 交互式帐户 - 通常分配给用户以访问系统资源。

这两种用户类型的主要区别在于:

  • 系统帐户 由守护进程用来访问文件和目录。这些帐户通常不允许通过 shell 或物理控制台登录进行交互式登录。

  • 交互式帐户 由最终用户用来通过 shell 或物理控制台登录访问计算资源。

有了对用户的基本了解,现在让我们为会计部门的 Bob Jones 创建一个新用户。使用 adduser 命令添加新用户。

以下是 adduser 常用开关:

开关 操作
-c 向用户帐户添加注释
-m 如果不存在,则在默认位置创建用户主目录
-g 分配给用户的默认组
-n 不为用户创建专用组,通常是用户名组
-M 不创建主目录
-s 除 /bin/bash 之外的默认 shell
-u 指定 UID(否则由系统分配)
-G 分配给用户的附加组

创建新用户时,请按如下方式使用 -c, -m, -g, -n 开关:

[root@localhost Downloads]# useradd -c "Bob Jones  Accounting Dept Manager" 
-m -g accounting -n bjones

现在让我们看看新用户是否已创建:

[root@localhost Downloads]# id bjones 
(bjones) gid = 1001(accounting) groups = 1001(accounting)

[root@localhost Downloads]# grep bjones /etc/passwd 
bjones:x:1001:1001:Bob Jones  Accounting Dept Manager:/home/bjones:/bin/bash

[root@localhost Downloads]#

现在我们需要使用 passwd 命令启用新帐户:

[root@localhost Downloads]# passwd bjones 
Changing password for user bjones. 
New password:  
Retype new password:  
passwd: all authentication tokens updated successfully.

[root@localhost Downloads]#

用户帐户未启用,不允许用户登录系统。

禁用用户帐户

有多种方法可以禁用系统上的帐户。这些方法范围从手动编辑 /etc/passwd 文件,甚至使用带有 -l 开关的 passwd 命令。这两种方法都有一个很大的缺点:如果用户具有 ssh 访问权限并使用 RSA 密钥进行身份验证,他们仍然可以使用此方法登录。

现在让我们使用 chage 命令,将密码过期日期更改为之前的日期。此外,最好在帐户中记下我们禁用它的原因。

[root@localhost Downloads]# chage -E 2005-10-01 bjones
 
[root@localhost Downloads]# usermod  -c "Disabled Account while Bob out of the country 
for five months" bjones

[root@localhost Downloads]# grep bjones /etc/passwd 
bjones:x:1001:1001:Disabled Account while Bob out of the country for four 
months:/home/bjones:/bin/bash

[root@localhost Downloads]#

管理组

在 Linux 中管理组使管理员可以方便地将用户组合到容器中,并应用适用于所有组成员的权限集。例如,会计部门的所有用户可能都需要访问相同的文件。因此,我们创建一个会计组,并添加会计用户。

在大多数情况下,任何需要特殊权限的操作都应该在组内完成。这种方法通常比只对一个用户应用特殊权限更省时。例如,Sally 负责报告,只有 Sally 需要访问某些用于报告的文件。但是,如果 Sally 有一天生病了,Bob 也要制作报告怎么办?或者报告的需求增加了怎么办?创建一个组后,管理员只需执行一次即可。添加用户会根据需要进行更改或扩展。

以下是用于管理组的一些常用命令:

  • chgrp
  • groupadd
  • groups
  • usermod

chgrp - 更改文件或目录的组所有权。

让我们为会计组中的人员创建一个目录,用于存储文件和创建文件目录。

[root@localhost Downloads]# mkdir /home/accounting

[root@localhost Downloads]# ls -ld /home/accounting
drwxr-xr-x. 2 root root 6 Jan 13 10:18 /home/accounting

[root@localhost Downloads]#

接下来,让我们将组所有权授予会计组。

[root@localhost Downloads]# chgrp -v  accounting /home/accounting/ 
changed group of ‘/home/accounting/’ from root to accounting

[root@localhost Downloads]# ls -ld /home/accounting/ 
drwxr-xr-x. 2 root accounting 6 Jan 13 10:18 /home/accounting/

[root@localhost Downloads]#

现在,会计组中的每个人都对/home/accounting具有读取执行权限。他们也需要写入权限。

[root@localhost Downloads]# chmod g+w /home/accounting/

[root@localhost Downloads]# ls -ld /home/accounting/ 
drwxrwxr-x. 2 root accounting 6 Jan 13 10:18 /home/accounting/

[root@localhost Downloads]#

由于会计组可能处理敏感文档,我们需要对其他用户或世界用户应用一些限制性权限。

[root@localhost Downloads]# chmod o-rx /home/accounting/

[root@localhost Downloads]# ls -ld /home/accounting/ 
drwxrwx---. 2 root accounting 6 Jan 13 10:18 /home/accounting/

[root@localhost Downloads]#

groupadd - 用于创建一个新组。

开关 操作
-g 为组指定 GID
-K 覆盖 /etc/login.defs 中 GID 的规范
-o 允许覆盖非唯一组 ID 不允许
-p 组密码,允许用户自行激活

让我们创建一个名为 secret 的新组。我们将向组添加密码,允许用户使用已知密码添加自己。

[root@localhost]# groupadd secret

[root@localhost]# gpasswd secret 
Changing the password for group secret 
New Password:  
Re-enter new password:

[root@localhost]# exit 
exit

[centos@localhost ~]$ newgrp secret 
Password:

[centos@localhost ~]$ groups 
secret wheel rdc

[centos@localhost ~]$

实际上,组密码很少使用。辅助组就足够了,在其他用户之间共享密码并不是一个很好的安全做法。

groups 命令用于显示用户属于哪个组。我们将在对当前用户进行一些更改后使用它。

usermod 用于更新帐户属性。

以下是常见的 usermod 开关。

开关 操作
-a 追加,仅使用 -G 选项将用户添加到辅助组
-c 注释,更新用户注释值
-d 主目录,更新用户的主目录
-G 组,添加或删除辅助用户组
-g 组,用户的默认主组
[root@localhost]# groups centos 
centos : accounting secret

[root@localhost]#

[root@localhost]# usermod -a -G wheel centos

[root@localhost]# groups centos
centos : accounting wheel secret

[root@localhost]#

Linux管理员 - 配额管理

CentOS 磁盘配额既可以启用;在磁盘容量超过限制之前提醒系统管理员并拒绝用户进一步访问磁盘存储。当磁盘已满时,根据磁盘上存放的内容,整个系统可能会完全停止运行,直到恢复为止。

在 CentOS Linux 中启用配额管理基本上是一个 4 步过程:

  • 步骤 1 - 在 /etc/fstab 中为组和用户启用配额管理。

  • 步骤 2 - 重新挂载文件系统。

  • 步骤 3 - 创建配额数据库并生成磁盘使用情况表。

  • 步骤 4 - 分配配额策略。

在 /etc/fstab 中启用配额管理

首先,我们要备份我们的 /etc/fstab 文件:

[root@centosLocal centos]# cp -r /etc/fstab ./

现在我们在当前工作目录中有了已知工作/etc/fstab的副本。

# 
# /etc/fstab 
# Created by anaconda on Sat Dec 17 02:44:51 2016 
# 
# Accessible filesystems, by reference, are maintained under '/dev/disk' 
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# 
/dev/mapper/cl-root        /         xfs     defaults                      0 0
UUID = 4b9a40bc-9480-4     /boot     xfs     defaults                      0 0

/dev/mapper/cl-home        /home     xfs     defaults,usrquota,grpquota    0 0

/dev/mapper/cl-swap        swap      swap    defaults                      0 0

我们在要为用户和组应用配额的卷或标签的/etc/fstab选项部分进行了以下更改。

  • usrquota
  • grpquota

如您所见,我们使用的是xfs文件系统。使用 xfs 时,会涉及额外的步骤。/home与 / 在同一磁盘上。进一步调查显示 / 设置为 noquota,这是一个内核级挂载选项。我们必须重新配置内核引导选项。

root@localhost rdc]# mount | grep ' / ' 
/dev/mapper/cl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

[root@localhost rdc]#

重新配置 XFS 文件系统的内核引导选项

此步骤仅在以下两种情况下才需要:

  • 当我们正在启用配额的磁盘/分区使用 xfs 文件系统时
  • 当内核在引导时将 noquota 参数传递给 /etc/fstab 时

步骤 1 - 备份 /etc/default/grub。

cp /etc/default/grub ~/

步骤 2 - 修改/etc/default/grub

这是默认文件。

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="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet" 
GRUB_DISABLE_RECOVERY="true"

我们要修改以下行:

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet" 

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv 
=cl/swap rhgb quiet rootflags=usrquota,grpquota"

注意 - 正确复制这些更改非常重要。重新配置 grub.cfg 后,如果配置中出现任何错误,我们的系统将无法启动。请在非生产系统上尝试本教程的这一部分。

步骤 3 - 备份您的工作 grub.cfg

cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak

创建一个新的 grub.cfg

[root@localhost rdc]# grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ... 
Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64 
Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img 
Found linux image: /boot/vmlinuz-0-rescue-dbba7fa47f73457b96628ba8f3959bfd 
Found initrd image: /boot/initramfs-0-rescuedbba7fa47f73457b96628ba8f3959bfd.img 
done

[root@localhost rdc]#

重启

[root@localhost rdc]#reboot

如果所有修改都准确无误,我们就不应该能够向 xfs 文件系统添加配额了。

[rdc@localhost ~]$ mount | grep ' / ' 
/dev/mapper/cl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)
 
[rdc@localhost ~]$

我们已经通过 grub 传递了 usrquotagrpquota 参数。

现在,再次编辑/etc/fstab以包含 /,因为/home在同一物理磁盘上。

/dev/mapper/cl-root/xfs
defaults,usrquota,grpquota        0 0

现在让我们启用配额数据库。

[root@localhost rdc]# quotacheck -acfvugM

确保已启用配额。

[root@localhost rdc]# quotaon -ap 
group quota on / (/dev/mapper/cl-root) is on 
user quota on / (/dev/mapper/cl-root) is on 
group quota on /home (/dev/mapper/cl-home) is on 
user quota on /home (/dev/mapper/cl-home) is on 
[root@localhost rdc]#

重新挂载文件系统

如果分区或磁盘与正在主动引导的分区分开,我们可以无需重新引导即可重新挂载。如果在根目录 / 中引导的磁盘/分区上配置了配额,则可能需要重新引导操作系统。强制重新挂载并应用更改,重新挂载文件系统的需要可能会有所不同。

[rdc@localhost ~]$ df 
Filesystem              1K-blocks     Used      Available      Use%     Mounted on
/dev/mapper/cl-root     22447404      4081860   18365544       19%         /
devtmpfs                903448        0         903448         0%          /dev
tmpfs                   919308        100       919208         1%          /dev/shm
tmpfs                   919308        9180      910128         1%          /run
tmpfs                   919308        0         919308         0%          /sys/fs/cgroup
/dev/sda2               1268736       176612    1092124        14%         /boot
/dev/mapper/cl-var      4872192       158024    4714168        4%          /var
/dev/mapper/cl-home     18475008      37284     18437724       1%          /home
tmpfs                   183864        8         183856         1%          /run/user/1000

[rdc@localhost ~]$

我们可以看到,正在使用 LVM 卷。因此,只需重新引导即可。这将重新挂载/home并将/etc/fstab配置更改加载到活动配置中。

创建配额数据库文件

CentOS 现在能够使用 /home 上的磁盘配额。要启用完全配额支持,我们必须运行quotacheck命令。

quotacheck 将创建两个文件:

  • aquota.user
  • aquota.group

这些文件用于存储已启用配额的磁盘/分区的配额信息。

以下是常见的 quotacheck 开关。

开关 操作
-u 检查用户配额
-g 检查组配额
-c 应为每个启用配额的文件系统启用配额
-v 显示详细输出

添加每个用户的配额限制

为此,我们将使用 edquota 命令,后跟用户名:

[root@localhost rdc]# edquota centos

Disk quotas for user centos (uid 1000):  
Filesystem                   blocks       soft       hard     inodes     soft     hard 
/dev/mapper/cl-root              12          0          0         13        0        0  
/dev/mapper/cl-home            4084          0          0        140        0        0

让我们看看每一列。

  • 文件系统 - 这是应用于用户的每个文件系统的配额。

  • - 用户当前在每个文件系统上使用的块数。

  • 软限制 - 设置软限制的块数。软限制允许用户在给定时间段内使用配额。

  • 硬限制 - 设置硬限制的块数。硬限制是允许的总配额。

  • inode - 用户当前使用的 inode 数。

  • 软限制 - 软 inode 限制。

  • 硬限制 - 硬 inode 限制。

要检查我们当前用户的配额:

[centos@localhost ~]$ quota 
Disk quotas for user centos (uid 1000):  
Filesystem             blocks     quota      limit grace    files   quota   limit   grace 
/dev/mapper/cl-home    6052604    56123456   61234568       475     0       0       [centos@localhost ~]$

以下是当用户超过硬配额限制时给出的错误。

[centos@localhost Downloads]$ cp CentOS-7-x86_64-LiveKDE-1611.iso.part ../Desktop/

cp: cannot create regular file ‘../Desktop/CentOS-7-x86_64-LiveKDE-
1611.iso.part’: Disk quota exceeded

[centos@localhost Downloads]$

我们可以看到,我们非常接近此用户的磁盘配额。让我们设置一个软限制警告。这样,用户在配额限制过期前将收到预先通知。根据经验,当用户上班时需要花费 45 分钟来清除文件才能真正开始工作时,您会收到最终用户的投诉。

作为管理员,我们可以使用repquota命令检查配额使用情况。

[root@localhost Downloads]# repquota  /home  
                    Block limits                            File limits  
User            used     soft     hard     grace       used     soft     hard     grace 
----------------------------------------------------------------------------------------
root      --       0         0        0                   3        0        0        
centos    -+ 6189824  56123456 61234568                 541      520      540      6days 

[root@localhost Downloads]#

我们可以看到,centos 用户已超过其硬块配额,并且不能再在/home上使用任何磁盘空间了。

-+ 表示文件系统上的硬配额已超过。

规划配额时,需要进行一些计算。管理员需要知道:系统上有多少用户?如何在用户/组之间分配可用空间?文件系统上的一个块包含多少字节?

根据可用磁盘空间定义以块为单位的配额。建议在文件系统上保留一个“安全”的空闲空间缓冲区,即使在最坏的情况下:所有配额同时超出,这个缓冲区也能保持空闲。这尤其适用于系统用于写入日志的分区。

Systemd服务的启动和停止

systemd是运行Linux服务的新的方式。systemd已经取代了sysvinitsystemd为Linux带来了更快的启动时间,现在已成为管理Linux服务的标准方式。虽然稳定,但systemd仍在不断发展。

systemd作为初始化系统,用于管理在Linux内核启动后需要状态更改的服务和守护进程。状态更改包括启动、停止、重新加载和调整服务状态。

首先,让我们检查当前在服务器上运行的systemd版本。

[centos@localhost ~]$ systemctl --version 
systemd 219 
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP 
+GCRYPT +GNUTLS +ACL     +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN

[centos@localhost ~]$

截至本文撰写时,CentOS 7版本已完全更新,systemd版本219是当前的稳定版本。

我们还可以使用systemd-analyze分析上次服务器启动时间。

[centos@localhost ~]$ systemd-analyze    
Startup finished in 1.580s (kernel) + 908ms (initrd) + 53.225s (userspace) = 55.713s 
[centos@localhost ~]$

当系统启动时间较慢时,我们可以使用systemd-analyze blame命令。

[centos@localhost ~]$ systemd-analyze blame 
   40.882s kdump.service 
   5.775s NetworkManager-wait-online.service 
   4.701s plymouth-quit-wait.service 
   3.586s postfix.service 
   3.121s systemd-udev-settle.service 
   2.649s tuned.service 
   1.848s libvirtd.service 
   1.437s network.service 
   875ms packagekit.service 
   855ms gdm.service 
   514ms firewalld.service 
   438ms rsyslog.service
   436ms udisks2.service 
   398ms sshd.service 
   360ms boot.mount 
   336ms polkit.service 
   321ms accounts-daemon.service

在使用systemd时,了解单元的概念非常重要。单元systemd知道如何解释的资源。单元分为以下12种类型:

  • .service
  • .socket
  • .device
  • .mount
  • .automount
  • .swap
  • .target
  • .path
  • .timer
  • .snapshot
  • .slice
  • .scope

在大多数情况下,我们将使用.service作为单元目标。建议进一步研究其他类型,因为只有.service单元适用于启动和停止systemd服务。

每个单元都在以下位置的文件中定义:

  • /lib/systemd/system − 基本单元文件

  • /etc/systemd/system − 运行时启动的修改后的单元文件

使用systemctl管理服务

要使用systemd,我们需要非常熟悉systemctl命令。以下是systemctl最常用的命令行开关。

开关 操作
-t 单元类型的逗号分隔值,例如service或socket
-a 显示所有已加载的单元
--state 显示处于已定义状态的所有单元,例如:load、sub、active、inactive等。
-H 远程执行操作。指定主机名或主机名和用户名,用@分隔。

基本的systemctl用法

systemctl [operation]
example: systemctl --state [servicename.service]

快速查看我们系统上运行的所有服务。

[root@localhost rdc]# systemctl -t service 
UNIT                       LOAD     ACTIVE      SUB     DESCRIPTION

abrt-ccpp.service          loaded   active   exited     Install ABRT coredump   hook 
abrt-oops.service          loaded   active   running    ABRT kernel log watcher 
abrt-xorg.service          loaded   active   running    ABRT Xorg log watcher 
abrtd.service              loaded   active   running    ABRT Automated Bug  Reporting Tool 
accounts-daemon.service    loaded   active   running    Accounts Service 
alsa-state.service         loaded   active   running    Manage Sound Card State (restore and store) 
atd.service                loaded   active   running    Job spooling tools 
auditd.service             loaded   active   running    Security Auditing Service 
avahi-daemon.service       loaded   active   running    Avahi mDNS/DNS-SD Stack 
blk-availability.service   loaded   active   exited     Availability of block devices 
bluetooth.service          loaded   active   running    Bluetooth service 
chronyd.service            loaded   active   running    NTP client/server

停止服务

首先,让我们停止蓝牙服务。

[root@localhost]# systemctl stop bluetooth

[root@localhost]# systemctl --all -t service | grep bluetooth      
bluetooth.service   loaded    inactive dead    Bluetooth service

[root@localhost]#

我们可以看到,蓝牙服务现在处于非活动状态。

要再次启动蓝牙服务。

[root@localhost]# systemctl start bluetooth

[root@localhost]# systemctl --all -t service | grep bluetooth 
bluetooth.service  loaded    active   running Bluetooth     service

[root@localhost]#

注意 − 我们没有指定bluetooth.service,因为.service是隐含的。最好将单元类型添加到我们正在处理的服务中。因此,从现在开始,我们将使用.service扩展名来明确我们正在执行服务单元操作。

可以对服务执行的主要操作包括:

Start 启动服务
Stop 停止服务
Reload 重新加载服务的活动配置,无需停止它(类似于system v init中的kill -HUP)
Restart 启动然后停止服务
Enable 在启动时启动服务
Disable 阻止服务在运行时自动启动

上述操作主要用于以下场景:

Start 启动已停止的服务。
Stop 临时关闭服务(例如,当必须停止服务才能访问服务锁定的文件时,例如升级服务时)。
Reload 编辑配置文件后,我们希望应用新更改而不停止服务。
Restart 与重新加载相同的场景,但服务不支持重新加载
Enable 当我们希望在启动时运行禁用的服务时。
Disable 主要用于需要停止服务但它在启动时启动的情况。

检查服务状态:

[root@localhost]# systemctl status network.service 
network.service - LSB: Bring up/down networking 
Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled) 
Active: active (exited) since Sat 2017-01-14 04:43:48 EST; 1min 31s ago 
Docs: man:systemd-sysv-generator(8)

Process: 923 ExecStart = /etc/rc.d/init.d/network start (code=exited, status = 0/SUCCESS)

localhost.localdomain systemd[1]: Starting LSB: Bring up/down networking... 
localhost.localdomain network[923]: Bringing up loopback interface:  [  OK  ] 
localhost.localdomain systemd[1]: Started LSB: Bring up/down networking.

[root@localhost]#

向我们显示networking服务的当前状态。如果我们想查看与网络相关的所有服务,我们可以使用:

[root@localhost]# systemctl --all -t service | grep -i network 
network.service                       loaded    active    exited    LSB: Bring up/ 
NetworkManager-wait-online.service    loaded    active    exited    Network Manager  
NetworkManager.service                loaded    active    running   Network Manager 
ntpd.service                          loaded    inactive  dead      Network Time  
rhel-import-state.service             loaded    active    exited    Import network      

[root@localhost]#

对于熟悉sysinit服务管理方法的人来说,过渡到systemd非常重要。systemd是在Linux中启动和停止守护进程服务的新方法。

Linux管理员 - 使用systemctl进行资源管理

systemctl是用于控制systemd的实用程序。systemctl使CentOS管理员能够对systemd执行多种操作,包括:

  • 配置systemd单元
  • 获取systemd单元的状态
  • 启动和停止服务
  • 启用/禁用systemd服务以进行运行时等操作。

systemctl的命令语法非常简单,但可能会与开关和选项纠缠在一起。我们将介绍管理CentOS Linux所需的systemctl最基本的功能。

Basic systemctl syntax: 
systemctl [OPTIONS] COMMAND [NAME]

以下是与systemctl一起使用的常用命令:

  • start
  • stop
  • restart
  • reload
  • status
  • is-active
  • list-units
  • enable
  • disable
  • cat
  • show

我们已经讨论了startstopreloadrestartenabledisable以及systemctl。所以让我们回顾一下其余常用的命令。

status

在最简单的形式中,status命令可用于查看整个系统的状态:

[root@localhost rdc]# systemctl status 
 ● localhost.localdomain 
  State: running 
  Jobs: 0 queued
  Failed: 0 units 
  Since: Thu 2017-01-19 19:14:37 EST; 4h 5min ago 
CGroup: / 
       ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 
       ├─user.slice 
       │ └─user-1002.slice 
       │   └─session-1.scope 
       │     ├─2869 gdm-session-worker [pam/gdm-password] 
       │     ├─2881 /usr/bin/gnome-keyring-daemon --daemonize --login 
       │     ├─2888 gnome-session --session gnome-classic 
       │     ├─2895 dbus-launch --sh-syntax --exit-with-session

上面的输出已被压缩。在实际应用中,systemctl status将输出大约100行树状进程状态。

假设我们要检查防火墙服务的状况:

[root@localhost rdc]# systemctl status firewalld 
● firewalld.service - firewalld - dynamic firewall daemon 
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) 
Active: active (running) since Thu 2017-01-19 19:14:55 EST; 4h 12min ago 
 Docs: man:firewalld(1) 
Main PID: 825 (firewalld) 
CGroup: /system.slice/firewalld.service 
       └─825 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

正如你所看到的,我们的防火墙服务当前处于活动状态,并且已经运行了超过4个小时。

list-units

list-units命令允许我们列出特定类型的所有单元。让我们检查由systemd管理的套接字:

[root@localhost]# systemctl list-units --type=socket 
UNIT                         LOAD     ACTIVE     SUB     DESCRIPTION     
avahi-daemon.socket          loaded   active  running    Avahi mDNS/DNS-SD Stack Activation Socket 
cups.socket                  loaded   active  running    CUPS Printing Service Sockets 
dbus.socket                  loaded   active  running    D-Bus System Message Bus Socket 
dm-event.socket              loaded   active  listening  Device-mapper event daemon FIFOs 
iscsid.socket                loaded   active  listening  Open-iSCSI iscsid Socket
iscsiuio.socket              loaded   active  listening  Open-iSCSI iscsiuio Socket 
lvm2-lvmetad.socket          loaded   active  running    LVM2 metadata daemon socket 
lvm2-lvmpolld.socket         loaded   active  listening  LVM2 poll daemon socket 
rpcbind.socket               loaded   active  listening  RPCbind Server Activation Socket 
systemd-initctl.socket       loaded   active  listening  /dev/initctl Compatibility Named Pipe 
systemd-journald.socket      loaded   active  running    Journal Socket 
systemd-shutdownd.socket     loaded   active  listening  Delayed Shutdown Socket 
systemd-udevd-control.socket loaded   active  running    udev Control Socket 
systemd-udevd-kernel.socket  loaded   active  running    udev Kernel Socket 
virtlockd.socket             loaded   active  listening  Virtual machine lock manager socket 
virtlogd.socket              loaded   active  listening  Virtual machine log manager socket

现在让我们检查当前正在运行的服务:

[root@localhost rdc]# systemctl list-units --type=service 
UNIT                      LOAD     ACTIVE     SUB     DESCRIPTION 
abrt-ccpp.service         loaded   active   exited    Install ABRT coredump hook 
abrt-oops.service         loaded   active   running   ABRT kernel log watcher 
abrt-xorg.service         loaded   active   running   ABRT Xorg log watcher 
abrtd.service             loaded   active   running   ABRT Automated Bug Reporting Tool 
accounts-daemon.service   loaded   active   running   Accounts Service 
alsa-state.service        loaded   active   running   Manage Sound Card State (restore and store) 
atd.service               loaded   active   running   Job spooling tools 
auditd.service            loaded   active   running   Security Auditing Service

is-active

is-active命令是systemctl命令的一个示例,旨在返回单元的状态信息。

[root@localhost rdc]# systemctl is-active ksm.service 
active

cat

cat是一个很少使用的命令。无需在shell中使用cat并键入单元文件的路径,只需使用systemctl cat

[root@localhost]# systemctl cat firewalld 
# /usr/lib/systemd/system/firewalld.service
[Unit] 
Description=firewalld - dynamic firewall daemon 
Before=network.target 
Before=libvirtd.service 
Before = NetworkManager.service 
After=dbus.service 
After=polkit.service 
Conflicts=iptables.service ip6tables.service ebtables.service ipset.service 
Documentation=man:firewalld(1)

[Service] 
EnvironmentFile = -/etc/sysconfig/firewalld 
ExecStart = /usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS 
ExecReload = /bin/kill -HUP $MAINPID 
# supress to log debug and error output also to /var/log/messages 
StandardOutput = null 
StandardError = null

Type = dbus 
BusName = org.fedoraproject.FirewallD1

[Install] 
WantedBy = basic.target 
Alias = dbus-org.fedoraproject.FirewallD1.service

[root@localhost]#

现在我们已经更详细地探讨了systemdsystemctl,让我们使用它们来管理cgroups控制组中的资源。

Linux管理员 - 使用crgoups进行资源管理

cgroups或控制组是Linux内核的一项功能,允许管理员为服务和组分配或限制系统资源。

要列出正在运行的活动控制组,我们可以使用以下ps命令:

[root@localhost]# ps xawf -eo pid,user,cgroup,args 
8362 root     -                            \_ [kworker/1:2] 
1 root        -                           /usr/lib/systemd/systemd --switched-
   root --system --    deserialize 21 
507 root     7:cpuacct,cpu:/system.slice  /usr/lib/systemd/systemd-journald 
527 root     7:cpuacct,cpu:/system.slice  /usr/sbin/lvmetad -f 
540 root     7:cpuacct,cpu:/system.slice  /usr/lib/systemd/systemd-udevd 
715 root     7:cpuacct,cpu:/system.slice  /sbin/auditd -n 
731 root     7:cpuacct,cpu:/system.slice   \_ /sbin/audispd 
734 root     7:cpuacct,cpu:/system.slice       \_ /usr/sbin/sedispatch 
737 polkitd  7:cpuacct,cpu:/system.slice  /usr/lib/polkit-1/polkitd --no-debug 
738 rtkit    6:memory:/system.slice/rtki  /usr/libexec/rtkit-daemon 
740 dbus     7:cpuacct,cpu:/system.slice  /bin/dbus-daemon --system --
   address=systemd: --nofork --nopidfile --systemd-activation

截至CentOS 6.X,资源管理已通过systemd init实现重新定义。在考虑服务的资源管理时,主要关注的是cgroupscgroups在功能和简易性方面都随着systemd的改进而得到提升。

cgroups在资源管理中的目标是 - 任何服务都不能使整个系统崩溃。或者没有单个服务进程(可能是编写不当的PHP脚本)会通过消耗过多资源来削弱服务器功能。

cgroups允许对以下资源的单元进行资源控制:

  • CPU − 限制不重要的CPU密集型任务,与其他不太密集的任务相比

  • 内存 − 限制服务可以消耗的内存量

  • 磁盘 − 限制磁盘I/O

**CPU时间:**

需要较低CPU优先级的任务可以具有自定义配置的CPU时间片。

让我们以以下两个服务为例。

礼貌的CPU服务1

[root@localhost]# systemctl cat polite.service 
# /etc/systemd/system/polite.service 
[Unit] 
Description = Polite service limits CPU Slice and Memory 
After=remote-fs.target nss-lookup.target

[Service] 
MemoryLimit = 1M 
ExecStart = /usr/bin/sha1sum /dev/zero 
ExecStop = /bin/kill -WINCH ${MAINPID} 
WantedBy=multi-user.target

# /etc/systemd/system/polite.service.d/50-CPUShares.conf 
[Service] 
CPUShares = 1024 
[root@localhost]#

邪恶的CPU服务2

[root@localhost]# systemctl cat evil.service 
# /etc/systemd/system/evil.service 
[Unit] 
Description = I Eat You CPU 
After=remote-fs.target nss-lookup.target

[Service] 
ExecStart = /usr/bin/md5sum /dev/zero 
ExecStop = /bin/kill -WINCH ${MAINPID} 
WantedBy=multi-user.target

# /etc/systemd/system/evil.service.d/50-CPUShares.conf 
[Service] 
CPUShares = 1024 
[root@localhost]#

让我们使用较低的CPU优先级设置礼貌服务:

systemctl set-property polite.service CPUShares = 20  
/system.slice/polite.service
1   70.5   124.0K        -        -  

/system.slice/evil.service
1   99.5   304.0K        -        -

我们可以看到,在正常的系统空闲时间内,两个流氓进程仍在使用CPU周期。但是,设置为具有较少时间片的进程使用的CPU时间较少。考虑到这一点,我们可以看到使用较少的时间片将如何允许基本任务更好地访问系统资源。

要为每个资源设置服务,set-property方法定义以下参数:

systemctl set-property name parameter=value

CPU时间片 CPUShares
内存限制 MemoryLimit
软内存限制 MemorySoftLimit
块IO权重 BlockIOWeight
块设备限制(在/volume/path中指定) BlockIODeviceWeight
读取IO BlockIOReadBandwidth
磁盘写入IO BlockIOReadBandwidth

服务最常受到CPU使用率内存限制读/写IO的限制。

更改每个参数后,需要重新加载systemd并重新启动服务:

systemctl set-property foo.service CPUShares = 250 
systemctl daemon-reload 
systemctl restart foo.service

在CentOS Linux中配置CGroups

要在CentOS Linux中创建自定义cgroups,我们需要首先安装服务并对其进行配置。

步骤1 − 安装libcgroup(如果尚未安装)。

[root@localhost]# yum install libcgroup 
Package libcgroup-0.41-11.el7.x86_64 already installed and latest version 
Nothing to do 
[root@localhost]#

我们可以看到,默认情况下,CentOS 7已使用everything安装程序安装了libcgroup。使用最小安装程序将需要我们安装libcgroup实用程序以及任何依赖项。

步骤2 − 启动并启用cgconfig服务。

[root@localhost]# systemctl enable cgconfig 
Created symlink from /etc/systemd/system/sysinit.target.wants/cgconfig.service to /usr/lib/systemd/system/cgconfig.service. 
[root@localhost]# systemctl start cgconfig 
[root@localhost]# systemctl status cgconfig 
● cgconfig.service - Control Group configuration service 
Loaded: loaded (/usr/lib/systemd/system/cgconfig.service; enabled; vendor preset: disabled) 
Active: active (exited) since Mon 2017-01-23 02:51:42 EST; 1min 21s ago 
Main PID: 4692 (code=exited, status = 0/SUCCESS) 
Memory: 0B 
CGroup: /system.slice/cgconfig.service  

Jan 23 02:51:42 localhost.localdomain systemd[1]: Starting Control Group configuration service... 
Jan 23 02:51:42 localhost.localdomain systemd[1]: Started Control Group configuration service. 
[root@localhost]#

Linux管理员 - 进程管理

以下是与进程管理一起使用的常用命令:bg、fg、nohup、ps、pstree、top、kill、killall、free、uptime、nice。

使用进程

快速说明:Linux中的进程PID

在Linux中,每个运行的进程都会被赋予一个PID或进程ID号。这个PID是CentOS识别特定进程的方式。正如我们所讨论的,systemd是CentOS中启动的第一个进程,其PID为1。

Pgrep用于获取给定进程名的Linux PID。

[root@CentOS]# pgrep systemd 
1 
[root@CentOS]#

如上所示,pgrep命令返回systemd的当前PID。

CentOS中基本的CentOS进程和作业管理

在Linux中使用进程时,重要的是要知道如何在命令行执行基本的后台和前台进程。

  • fg − 将进程置于前台

  • bg − 将进程移至后台

  • jobs − 附加到shell的当前进程列表

  • ctrl+z − Control + z键组合可使当前进程休眠

  • & − 在后台启动进程

让我们开始使用shell命令sleepsleep将按其名称执行操作,休眠一段时间:sleep

[root@CentOS ~]$ jobs

[root@CentOS ~]$ sleep 10 & 
[1] 12454

[root@CentOS ~]$ sleep 20 & 
[2] 12479

[root@CentOS ~]$ jobs 
[1]-  Running                 sleep 10 & 
[2]+  Running                 sleep 20 &

[cnetos@CentOS ~]$

现在,让我们将第一个作业置于前台:

[root@CentOS ~]$ fg 1 
sleep 10

如果你正在按照操作步骤进行,你会注意到前台作业卡在你的shell中。现在,让我们使进程休眠,然后在后台重新启用它。

  • 按control+z
  • 键入:bg 1,将第一个作业发送到后台并启动它。
[root@CentOS ~]$ fg 1 
sleep 20 
^Z 
[1]+  Stopped                 sleep 20

[root@CentOS ~]$ bg 1 
[1]+ sleep 20 &

[root@CentOS ~]$

nohup

从shell或终端工作时,值得注意的是,默认情况下,附加到shell的所有进程和作业将在shell关闭或用户注销时终止。使用nohup时,如果用户注销或关闭附加进程的shell,则进程将继续运行。

[root@CentOS]# nohup ping www.google.com & 
[1] 27299 
nohup: ignoring input and appending output to ‘nohup.out’

[root@CentOS]# pgrep ping 
27299

[root@CentOS]# kill -KILL `pgrep ping` 
[1]+  Killed                  nohup ping www.google.com

[root@CentOS rdc]# cat nohup.out  
PING www.google.com (216.58.193.68) 56(84) bytes of data. 
64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 1 ttl = 128
time = 51.6 ms 
64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 2 ttl = 128
time = 54.2 ms 
64 bytes from sea15s07-in-f4.1e100.net (216.58.193.68): icmp_seq = 3 ttl = 128
time = 52.7 ms

ps命令

ps 命令通常由管理员用来查看特定进程的快照。ps 命令通常与 grep 命令一起使用,用于筛选和分析特定进程。

[root@CentOS ~]$ ps axw | grep python 
762   ?        Ssl    0:01 /usr/bin/python -Es /usr/sbin/firewalld --nofork -nopid 
1296  ?        Ssl    0:00 /usr/bin/python -Es /usr/sbin/tuned -l -P 
15550 pts/0    S+     0:00 grep --color=auto python

在上述命令中,我们看到了所有使用 python 解释器的进程。结果中还包括我们的 grep 命令,用于查找字符串 python

以下是 ps 命令最常用的命令行开关。

开关 操作
a 不限制仅报告当前用户的进程
x 显示未附加到 tty 或 shell 的进程
w 以宽格式显示输出
e 显示命令后的环境变量
-e 选择所有进程
-o 用户自定义格式的输出
-u 显示特定用户的全部进程
-C 按名称或进程 ID 显示所有进程
--sort 按定义对进程进行排序

查看 nobody 用户正在使用的所有进程:

[root@CentOS ~]$ ps -u nobody 
PID TTY          TIME CMD 
1853 ?        00:00:00 dnsmasq 

[root@CentOS ~]$

查看 firewalld 进程的所有信息:

[root@CentOS ~]$ ps -wl -C firewalld 
F   S   UID   PID   PPID   C   PRI   NI   ADDR   SZ   WCHAN   TTY   TIME      CMD
0   S     0   762      1   0    80   0     -   81786  poll_s   ?   00:00:01 firewalld 

[root@CentOS ~]$

让我们看看哪些进程消耗的内存最多:

[root@CentOS ~]$ ps aux  --sort=-pmem | head -10 
USER       PID   %CPU   %MEM   VSZ     RSS   TTY   STAT   START   TIME   COMMAND 
cnetos     6130   0.7   5.7   1344512 108364  ?      Sl   02:16   0:29  /usr/bin/gnome-shell 
cnetos     6449   0.0   3.4   1375872 64440   ?      Sl   02:16   0:00  /usr/libexec/evolution-calendar-factory 
root       5404   0.6   2.1   190256  39920 tty1     Ssl+ 02:15   0:27  /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-iDefCt/database -seat seat0 -nolisten tcp vt1 
cnetos     6296   0.0   1.7   1081944 32136   ?      Sl   02:16   0:00  /usr/libexec/evolution/3.12/evolution-alarm-notify 
cnetos     6350   0.0   1.5   560728  29844   ?      Sl   02:16   0:01  /usr/bin/prlsga 
cnetos     6158   0.0   1.4   1026956 28004   ?      Sl   02:16   0:00  /usr/libexec/gnome-shell-calendar-server 
cnetos     6169   0.0   1.4   1120028 27576   ?      Sl   02:16   0:00  /usr/libexec/evolution-source-registry 
root       762    0.0   1.4   327144  26724   ?      Ssl  02:09   0:01  /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid 
cnetos     6026   0.0  1.4 1090832 26376      ?      Sl   02:16   0:00  /usr/libexec/gnome-settings-daemon

[root@CentOS ~]$

查看 centos 用户的所有进程,并以自定义格式显示输出:

[cnetos@CentOS ~]$ ps -u cnetos -o pid,uname,comm 
   PID    USER     COMMAND 
   5802  centos   gnome-keyring-d 
   5812  cnetos   gnome-session 
   5819  cnetos   dbus-launch 
   5820  cnetos   dbus-daemon 
   5888  cnetos   gvfsd 
   5893  cnetos   gvfsd-fuse 
   5980  cnetos   ssh-agent   
   5996  cnetos   at-spi-bus-laun

pstree 命令

pstree 命令类似于 ps 命令,但使用频率较低。它以更清晰的树状方式显示进程。

[centos@CentOS ~]$ pstree 
  systemd─┬─ModemManager───2*[{ModemManager}] 
          ├─NetworkManager─┬─dhclient 
          │                └─2*[{NetworkManager}] 
          ├─2*[abrt-watch-log] 
          ├─abrtd 
          ├─accounts-daemon───2*[{accounts-daemon}] 
          ├─alsactl 
          ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon} 
          │                 └─3*[{at-spi-bus-laun}] 
          ├─at-spi2-registr───2*[{at-spi2-registr}] 
          ├─atd 
          ├─auditd─┬─audispd─┬─sedispatch 
          │        │         └─{audispd} 
          │        └─{auditd} 
          ├─avahi-daemon───avahi-daemon 
          ├─caribou───2*[{caribou}] 
          ├─cgrulesengd 
          ├─chronyd 
          ├─colord───2*[{colord}] 
          ├─crond 
          ├─cupsd

pstree 命令的总输出可能超过 100 行。通常情况下,ps 命令会提供更有用的信息。

top 命令

top 是在 Linux 系统中排查性能问题时最常用的命令之一。它对于实时统计和 Linux 系统中的进程监控非常有用。以下是 top 命令在命令行中启动后的默认输出。

Tasks: 170 total,   1 running, 169 sleeping,   0 stopped,   0 zombie 
%Cpu(s):  2.3 us,  2.0 sy,  0.0 ni, 95.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 
KiB Mem :  1879668 total,   177020 free,   607544 used,  1095104 buff/cache 
KiB Swap:  3145724 total,  3145428 free,      296 used.  1034648 avail Mem 
 
PID    USER     PR   NI    VIRT     RES   SHR    S  %CPU  %MEM   TIME+   COMMAND
5404   root     20   0    197832   48024  6744   S   1.3   2.6  1:13.22   Xorg
8013   centos   20   0    555316   23104  13140  S   1.0   1.2  0:14.89   gnome-terminal-
6339   centos   20   0    332336   6016   3248   S   0.3   0.3  0:23.71   prlcc
6351   centos   20   0    21044    1532   1292   S   0.3   0.1  0:02.66   prlshprof

运行 top 命令时常用的快捷键(快捷键是在 shell 中运行 top 命令时按下的键)。

命令 操作
b 启用/禁用 top 菜单的粗体高亮显示
z 循环切换配色方案
l 循环切换负载平均值标题
m 循环切换内存平均值标题
t 任务信息标题
h 帮助菜单
Shift+F 自定义排序和显示字段

以下是 top 命令常用的命令行开关。

命令 操作
-o 按列排序(可以在前面加上 - 或 + 以进行升序或降序排序)
-u 仅显示指定用户的进程
-d 更新 top 命令的延迟时间
-O 返回 top 命令可以应用排序的列列表

top 命令中的排序选项屏幕,使用 Shift+F 显示。此屏幕允许自定义 top 的显示和排序选项。

Fields Management for window 1:Def, whose current sort field is %MEM 
Navigate with Up/Dn, Right selects for move then <Enter> or Left commits, 
 'd' or <Space> toggles display, 's' sets sort.  Use 'q' or <Esc> to end!
 
* PID     = Process Id             TGID    = Thread Group Id      
* USER    = Effective User Name    ENVIRON = Environment vars     
* PR      = Priority               vMj     = Major Faults delta   
* NI      = Nice Value             vMn     = Minor Faults delta   
* VIRT    = Virtual Image (KiB)    USED    = Res+Swap Size (KiB)  
* RES     = Resident Size (KiB)    nsIPC   = IPC namespace Inode  
* SHR     = Shared Memory (KiB)    nsMNT   = MNT namespace Inode
* S       = Process Status         nsNET   = NET namespace Inode  
* %CPU    = CPU Usage              nsPID   = PID namespace Inode  
* %MEM    = Memory Usage (RES)     nsUSER  = USER namespace Inode 
* TIME+   = CPU Time, hundredths   nsUTS   = UTS namespace Inode  
* COMMAND = Command Name/Line 
PPID    = Parent Process pid
UID     = Effective User Id

top 命令,显示用户 rdc 的进程,并按内存使用情况排序:

 PID   USER  %MEM  PR  NI    VIRT    RES    SHR    S %CPU     TIME+    COMMAND
 6130  rdc    6.2  20   0  1349592  117160  33232  S  0.0   1:09.34    gnome-shell
 6449  rdc    3.4  20   0  1375872   64428  21400  S  0.0   0:00.43    evolution-calen
 6296  rdc    1.7  20   0  1081944   32140  22596  S  0.0   0:00.40    evolution-alarm
 6350  rdc    1.6  20   0   560728   29844   4256  S  0.0   0:10.16    prlsga
 6281  rdc    1.5  20   0  1027176   28808  17680  S  0.0   0:00.78    nautilus
 6158  rdc    1.5  20   0  1026956   28004  19072  S  0.0   0:00.20    gnome-shell-cal

显示有效的 top 字段(简略版):

[centos@CentOS ~]$ top -O 
PID 
PPID 
UID 
USER 
RUID 
RUSER 
SUID 
SUSER 
GID 
GROUP 
PGRP 
TTY 
TPGID

kill 命令

kill 命令用于通过其 PID 从命令 shell 中终止进程。终止进程时,我们需要指定要发送的信号。信号让内核知道我们希望如何结束进程。最常用的信号是:

  • SIGTERM 信号暗示内核让进程知道它应该尽快安全停止。SIGTERM 信号使进程有机会优雅地退出并执行安全的退出操作。

  • SIGHUP 信号大多数守护进程在收到 SIGHUP 信号后会重新启动。这通常用于在对配置文件进行更改后对进程进行操作。

  • SIGKILL 信号由于 SIGTERM 信号相当于请求进程关闭。内核需要一个选项来结束不响应请求的进程。当进程挂起时,使用 SIGKILL 选项明确地关闭进程。

要查看可以使用 kill 命令发送的所有信号列表,可以使用 -l 选项:

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

[root@CentOS rdc]#

使用 SIGHUP 信号重启系统:

[root@CentOS]# pgrep systemd 
1 
464 
500 
643 
15071

[root@CentOS]# kill -HUP 1

[root@CentOS]# pgrep systemd
1 
464 
500 
643 
15196 
15197 
15198

[root@CentOS]#

pkill 命令允许管理员按进程名称发送 kill 信号。

[root@CentOS]# pgrep ping 
19450 
[root@CentOS]# pkill -9 ping 
[root@CentOS]# pgrep ping 
[root@CentOS]#

killall 命令将终止所有进程。小心使用 root 权限运行 killall 命令,因为它会终止所有用户的全部进程。

[root@CentOS]# killall chrome

free 命令

free 命令是一个非常简单的命令,通常用于快速检查系统的内存。它显示已使用的物理内存和交换内存的总量。

[root@CentOS]# free 
             total       used      free      shared      buff/cache      available 
Mem:        1879668     526284    699796     10304        653588          1141412 
Swap:       3145724          0    3145724

[root@CentOS]# 

nice 命令

nice 命令允许管理员根据 CPU 使用情况设置进程的调度优先级。nice 值基本上是指内核如何为进程或作业调度 CPU 时间片。默认情况下,假设进程获得对 CPU 资源的平等访问。

首先,让我们使用 top 命令检查当前正在运行的进程的 nice 值。

PID   USER   PR   NI    VIRT    RES    SHR   S  %CPU  %MEM     TIME+    COMMAND
28    root   39   19       0      0      0   S  0.0   0.0    0:00.17    khugepaged
690   root   39   19   16808   1396   1164   S  0.0   0.1    0:00.01    alsactl]
9598  rdc    39   19  980596  21904  10284   S  0.0   1.2    0:00.27    tracker-extract
9599  rdc    39   19  469876   9608   6980   S  0.0   0.5    0:00.04    tracker-miner-a
9609  rdc    39   19  636528  13172   8044   S  0.0   0.7    0:00.12    tracker-miner-f
9611  rdc    39   19  469620   8984   6496   S  0.0   0.5    0:00.02    tracker-miner-u
27    root   25    5       0      0      0   S  0.0   0.0    0:00.00    ksmd
637   rtkit  21    1  164648   1276   1068   S  0.0   0.1    0:00.11    rtkit-daemon
1     root   20    0  128096   6712   3964   S  0.3   0.4    0:03.57    systemd
2     root   20    0       0      0      0   S  0.0   0.0    0:00.01    kthreadd
3     root   20    0       0      0      0   S  0.0   0.0    0:00.50    ksoftirqd/0
7     root   20    0       0      0      0   S  0.0   0.0    0:00.00    migration/0
8     root   20    0       0      0      0   S  0.0   0.0    0:00.00    rcu_bh
9     root   20    0       0      0      0   S  0.0   0.0    0:02.07    rcu_sched

我们要关注 NICE 列(由 NI 表示)。nice 值范围可以从 -20 到 19。-20 表示最高的优先级。

nohup nice --20 ping www.google.com &

renice

renice 命令允许我们更改当前正在运行的进程的优先级。

renice 17 -p 30727

上述命令将降低我们的 ping 进程命令的优先级。

Linux 管理员 - 防火墙设置

firewalld 是 CentOS 上 iptables 的默认前端控制器。firewalld 前端相比于原始的 iptables 有两个主要优点:

  • 使用易于配置和实现的区域来抽象链和规则。

  • 规则集是动态的,这意味着当设置更改和/或修改时,有状态连接不会中断。

请记住,firewalld 是 iptables 的包装器,而不是替代品。虽然可以使用 firewalld 使用自定义 iptables 命令,但建议使用 firewalld 以避免破坏防火墙功能。

首先,让我们确保 firewalld 已启动并启用。

[root@CentOS rdc]# systemctl status firewalld 
● firewalld.service - firewalld - dynamic firewall daemon 
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) 
Active: active (running) since Thu 2017-01-26 21:42:05 MST; 3h 46min ago 
 Docs: man:firewalld(1) 
Main PID: 712 (firewalld) 
  Memory: 34.7M 
 CGroup: /system.slice/firewalld.service 
       └─712 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

我们可以看到,firewalld 既处于活动状态(在启动时启动),又当前正在运行。如果处于非活动状态或未启动,我们可以使用:

systemctl start firewalld && systemctl enable firewalld

现在我们已经配置了 firewalld 服务,让我们确保它正在运行。

[root@CentOS]# firewall-cmd --state 
running 
[root@CentOS]#

我们可以看到,firewalld 服务完全正常运行。

Firewalld 基于区域的概念。区域通过网络管理器应用于网络接口。我们将在配置网络中讨论这一点。但就目前而言,默认情况下,更改默认区域将更改保留在“默认区域”默认状态的任何网络适配器。

让我们快速浏览一下 firewalld 自带的每个区域。

序号 区域和描述
1

drop

低信任级别。所有传入连接和数据包都将被丢弃,只有通过有状态性才能进行传出连接。

2

block

传入连接将回复一条 icmp 消息,让发起者知道请求被禁止。

3

public

所有网络都被限制。但是,可以选择明确允许选定的传入连接。

4

external

配置 firewalld 进行 NAT。内部网络保持私有,但可以访问。

5

dmz

只允许某些传入连接。用于 DMZ 隔离中的系统。

6

work

默认情况下,更信任网络上的计算机,假设系统位于安全的办公环境中。

7

hone

默认情况下,更多服务未过滤。假设系统位于家庭网络上,其中将使用 NFS、SAMBA 和 SSDP 等服务。

8

trusted

网络上的所有机器都受信任。大多数传入连接都被无限制地允许。这并不适用于暴露于互联网的接口

最常用的区域是:public、drop、work 和 home。

以下是一些使用每个常用区域的场景:

  • public - 这是管理员最常用的区域。它允许您应用自定义设置并遵守 LAN 上操作的 RFC 规范。

  • drop - 使用 drop 的一个很好的例子是在安全会议、公共 WiFi 或直接连接到互联网的接口上。drop 假设所有未经请求的请求都是恶意的,包括 ICMP 探测。因此,任何超出状态的请求都不会收到回复。drop 的缺点是它可能会在某些情况下破坏应用程序的功能,这些应用程序需要严格遵守 RFC 规范。

  • work - 您位于半安全的公司 LAN 上。可以假设所有流量都相对安全。这意味着它不是 WiFi,我们可能已经部署了 IDS、IPS 和物理安全或 802.1x。我们也应该熟悉使用 LAN 的人员。

  • home - 您位于家庭 LAN 上。您对 LAN 上的每个系统和用户都负有个人责任。您了解 LAN 上的每一台机器,并且没有一台机器受到入侵。通常,会启动新的服务以便在受信任的个人之间共享媒体,而您无需为了安全而花费额外的时间。

区域和网络接口的工作方式是一对多的关系。一个网络接口一次只能应用一个区域。而一个区域可以同时应用于多个接口。

让我们看看有哪些可用的区域以及当前应用的区域。

[root@CentOS]# firewall-cmd --get-zones 
 work drop internal external trusted home dmz public block

[root@CentOS]# firewall-cmd --get-default-zone 
public
[root@CentOS]#

准备好向 firewalld 添加一些自定义规则了吗?

首先,让我们看看从外部端口扫描器看来我们的盒子是什么样的。

bash-3.2# nmap -sS -p 1-1024 -T 5  10.211.55.1
 
Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:36 MST 
Nmap scan report for centos.shared (10.211.55.1) 
Host is up (0.00046s latency). 
Not shown: 1023 filtered ports 
PORT   STATE SERVICE 
22/tcp open  ssh


Nmap done: 1 IP address (1 host up) scanned in 3.71 seconds 
bash-3.2#

让我们允许传入的 80 端口请求。

首先,检查应用的默认区域。

[root@CentOs]# firewall-cmd --get-default-zone 
public
[root@CentOS]#

然后,设置允许 80 端口的规则到当前默认区域。

[root@CentOS]# firewall-cmd --zone=public --add-port = 80/tcp 
success
[root@CentOS]#

现在,让我们在允许 80 端口连接后检查我们的盒子。

bash-3.2# nmap -sS -p 1-1024 -T 5  10.211.55.1

Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:42 MST 
Nmap scan report for centos.shared (10.211.55.1) 
Host is up (0.00053s latency). 
Not shown: 1022 filtered ports 
PORT   STATE  SERVICE 
22/tcp open   ssh 
80/tcp closed http

Nmap done: 1 IP address (1 host up) scanned in 3.67 seconds 
bash-3.2#

它现在允许对 80 端口的未经请求的流量。

让我们将默认区域设置为 drop 并看看端口扫描会发生什么。

[root@CentOS]# firewall-cmd --set-default-zone=drop 
success

[root@CentOS]# firewall-cmd --get-default-zone 
drop

[root@CentOs]#

现在让我们扫描网络接口处于更安全区域的主机。

bash-3.2# nmap -sS -p 1-1024 -T 5  10.211.55.1 
Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-27 23:50 MST 
Nmap scan report for centos.shared (10.211.55.1) 
Host is up (0.00094s latency). 
All 1024 scanned ports on centos.shared (10.211.55.1) are filtered

Nmap done: 1 IP address (1 host up) scanned in 12.61 seconds 
bash-3.2#

现在,所有内容都从外部过滤。

如下所示,当处于 drop 区域时,主机甚至不会响应 ICMP ping 请求。

bash-3.2# ping 10.211.55.1 
PING 10.211.55.1 (10.211.55.1): 56 data bytes 
Request timeout for icmp_seq 0 
Request timeout for icmp_seq 1 
Request timeout for icmp_seq 2

让我们再次将默认区域设置为 public

[root@CentOs]# firewall-cmd --set-default-zone=public 
success

[root@CentOS]# firewall-cmd --get-default-zone 
public

[root@CentOS]#

现在让我们检查 public 区域中当前的过滤规则集。

[root@CentOS]# firewall-cmd --zone=public --list-all 
public (active) 
target: default 
icmp-block-inversion: no 
interfaces: enp0s5 
sources:  
services: dhcpv6-client ssh 
ports: 80/tcp 
protocols:  
masquerade: no 
forward-ports:  
sourceports:  
icmp-blocks:  
rich rules:

[root@CentOS rdc]#

根据配置,我们的 80 端口过滤规则仅存在于正在运行的配置中。这意味着一旦系统重新启动或 firewalld 服务重新启动,我们的规则将被丢弃。

我们很快就会配置 httpd 守护进程,所以让我们使我们的更改持久化:

[root@CentOS]# firewall-cmd --zone=public --add-port=80/tcp --permanent 
success

[root@CentOS]# systemctl restart firewalld

[root@CentOS]#

现在,public 区域中的 80 端口规则在重新启动和服务重启后仍然有效。

以下是使用 firewall-cmd 应用的常用 firewalld 命令。

命令 操作
firewall-cmd --get-zones 列出可以应用于接口的所有区域
firewall-cmd --status 返回 firewalld 服务的当前状态
firewall-cmd --get-default-zone 获取当前默认区域
firewall-cmd --set-default-zone=<zone> 将默认区域设置为当前上下文
firewall-cmd --get-active-zone 获取当前应用于接口的上下文区域
firewall-cmd --zone=<zone> --list-all 列出指定区域的配置
firewall-cmd --zone=<zone> --addport=<port/transport protocol> 将端口规则应用于区域过滤器
--permanent 使区域更改持久化。此标志与修改命令一起使用。

这些是管理和配置firewalld 的基本概念。

在更复杂的网络场景中,配置 CentOS 中基于主机的防火墙服务可能是一项复杂的任务。CentOS 中firewalld 和 iptables 的高级用法和配置需要一个完整的教程。但是,我们已经介绍了足以完成大部分日常任务的基础知识。

在CentOS Linux中配置PHP

PHP 是当今使用最广泛的 Web 语言之一。在 CentOS 上安装LAMP 栈是每个系统管理员都需要执行的操作,很可能越早越好。

传统的 LAMP 栈由 (L)inux (A)pache (M)ySQL (P)HP 组成。

CentOS 上的LAMP 栈主要包含三个组件:

  • Web 服务器
  • Web 开发平台/语言
  • 数据库服务器

注意LAMP 栈这一术语还可以包括以下技术:PostgreSQL、MariaDB、Perl、Python、Ruby、NGINX Web 服务器。

在本教程中,我们将坚持使用 CentOS GNU Linux 的传统LAMP 栈:Apache Web 服务器、MySQL 数据库服务器和 PHP。

我们实际上将使用 MariaDB。MariaDB 对 MySQL 配置文件、数据库和表具有透明性。由于 Oracle 接管了 MySQL 的开发,并且由于许可和开源合规性的限制,MariaDB 现在包含在标准 CentOS 存储库中,而不是 MySQL。

我们需要做的第一件事是安装 Apache。

[root@CentOS]# yum install httpd
Loaded plugins: fastestmirror, langpacks
base
| 3.6 kB  00:00:00
extras
| 3.4 kB  00:00:00
updates
| 3.4 kB  00:00:00
extras/7/x86_64/primary_d
| 121 kB  00:00:00
Loading mirror speeds from cached hostfile
* base: mirror.sigmanet.com
* extras: linux.mirrors.es.net
* updates: mirror.eboundhost.com
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-45.el7.centos will be installed
--> Processing Dependency: httpd-tools = 2.4.6-45.el7.centos for package:
httpd-2.4.6-45.el7.centos.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.645.el7.centos.x86_64
--> Running transaction check
---> Package httpd-tools.x86_64 0:2.4.6-45.el7.centos will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution
Installed:
httpd.x86_64 0:2.4.6-45.el7.centos

Dependency Installed:
httpd-tools.x86_64 0:2.4.6-45.el7.centos
mailcap.noarch 0:2.1.41-2.el7

Complete!
[root@CentOS]#

让我们配置httpd 服务。

[root@CentOS]# systemctl start httpd && systemctl enable httpd

现在,让我们确保 Web 服务器可以通过 firewalld 访问。

bash-3.2# nmap -sS -p 1-1024 -T 5  -sV 10.211.55.1 
Starting Nmap 7.30 ( https://nmap.org ) at 2017-01-28 02:00 MST 
Nmap scan report for centos.shared (10.211.55.1) 
Host is up (0.00054s latency). 
Not shown: 1022 filtered ports 
PORT   STATE SERVICE VERSION 
22/tcp open  ssh     OpenSSH 6.6.1 (protocol 2.0) 
80/tcp open  http    Apache httpd 2.4.6 ((CentOS))

Service detection performed. Please report any incorrect results at 
https://nmap.org/submit/ . 
Nmap done: 1 IP address (1 host up) scanned in 10.82 seconds bash-3.2#

正如 nmap 服务探测所示,Apache Web 服务器正在监听并响应 CentOS 主机上的请求。

安装 MySQL 数据库服务器

[root@CentOS rdc]# yum install mariadb-server.x86_64 && yum install mariadb-
devel.x86_64 && mariadb.x86_64 && mariadb-libs.x86_64

我们正在安装以下 MariaDB 存储库软件包:

mariadb-server.x86_64

主要的 MariaDB 服务器守护进程程序包。

mariadb-devel.x86_64

需要使用 MySQL/MariaDB 兼容性从源代码编译的文件。

mariadb.x86_64

用于从命令行管理 MariaDB 服务器的 MariaDB 客户端实用程序。

mariadb-libs.x86_64

MariaDB 的常用库,其他使用 MySQL/MariaDB 支持编译的应用程序可能需要这些库。

现在,让我们启动并启用 MariaDB 服务。

[root@CentOS]# systemctl start mariadb 
[root@CentOS]# systemctl enable  mariadb

注意 − 与 Apache 不同,我们不会通过基于主机的防火墙 (firewalld) 启用对 MariaDB 的连接。使用数据库服务器时,最佳安全实践是仅允许本地套接字连接,除非特别需要远程套接字访问。

让我们确保 MariaDB 服务器正在接受连接。

[root@CentOS#] netstat -lnt 
Active Internet connections (only servers) 
Proto     Recv-Q     Send-Q     Local Address        Foreign Address      State       
tcp            0          0     0.0.0.0:3306         0.0.0.0:*            LISTEN      
tcp            0          0     0.0.0.0:111          0.0.0.0:*            LISTEN      
tcp            0          0     192.168.122.1:53     0.0.0.0:*            LISTEN      
tcp            0          0     0.0.0.0:22           0.0.0.0:*            LISTEN      
tcp            0          0     127.0.0.1:631        0.0.0.0:*            LISTEN      
tcp            0          0     127.0.0.1:25         0.0.0.0:*            LISTEN 
     
[root@CentOS rdc]#

我们可以看到,MariaDB 正在 3306 tcp 端口监听。我们将保持基于主机的防火墙 (firewalld) 阻止对 3306 端口的传入连接。

安装和配置 PHP

[root@CentOS#]  yum install php.x86_64 && php-common.x86_64 && php-mysql.x86_64 
&& php-mysqlnd.x86_64 && php-pdo.x86_64 && php-soap.x86_64 && php-xml.x86_64

我建议安装以下 php 包以实现常见的兼容性:

  • php-common.x86_64
  • php-mysql.x86_64
  • php-mysqlnd.x86_64
  • php-pdo.x86_64
  • php-soap.x86_64
  • php-xml.x86_64
[root@CentOS]# yum install -y php-common.x86_64 php-mysql.x86_64 php-
mysqlnd.x86_64 php-pdo.x86_64 php-soap.x86_64 php-xml.x86_64

这是位于 Apache webroot /var/www/html/ 的简单 php 文件。

[root@CentOS]# cat /var/www/html/index.php  
<html> 
   <head> 
      <title>PHP Test Page</title> 
   </head>
   
   <body> 
      PHP Install 
      <?php 
         echo "We are now running PHP on GNU Centos Linux!<br />" 
      ?> 
   </body> 
</html>

[root@CentOS]#

让我们将页面的拥有组更改为我们的 http 守护程序在其下运行的系统用户。

[root@CentOS]# chgrp httpd /var/www/html/index.php && chmod g+rx /var/www/html/index.php
---

通过 ncat 手动请求时。

bash-3.2# ncat 10.211.55.1 80 
   GET / index.php 
   HTTP/1.1 200 OK 
   Date: Sat, 28 Jan 2017 12:06:02 GMT 
   Server: Apache/2.4.6 (CentOS) PHP/5.4.16 
   X-Powered-By: PHP/5.4.16 
   Content-Length: 137 
   Connection: close 
   Content-Type: text/html; charset=UTF-8
   
<html> 
   <head> 
      <title>PHP Test Page</title> 
   </head>
   
   <body> 
      PHP Install 
      We are now running PHP on GNU Centos Linux!<br />
   </body> 
</html>

bash-3.2#

PHP 和 LAMP 非常流行的 Web 编程技术。作为 CentOS 管理员,LAMP 的安装和配置肯定会出现在您的需求列表中。易于使用的 CentOS 软件包省去了从源代码编译 Apache、MySQL 和 PHP 的许多工作。

在CentOS Linux中设置Python

Python 是一种广泛使用的解释型语言,它为在 Linux(和其他操作系统)上编写脚本应用程序的世界带来了专业性。曾经 Perl 是行业标准,而 Python 在许多方面已经超越了 Perl。

与 Perl 相比,Python 的一些优势:

  • 快速改进

  • 作为语言标准的库

  • 代码的可读性在语言定义中得到了体现

  • 许多专业的框架,从 GUI 支持到 Web 开发,无所不包

Python 可以完成 Perl 可以完成的所有事情,并且在很多情况下做得更好。尽管 Perl 在 Linux 管理员的工具箱中仍然占有一席之地,但学习 Python 作为一项技能是一个不错的选择。

Python 最大的缺点有时与其优势有关。历史上,Python 最初是为教学编程而设计的。有时,它“易于阅读”和“以正确的方式做事”的核心基础会在编写简单代码时造成不必要的复杂性。此外,它的标准库在从 2.X 版本过渡到 3.X 版本时也造成了一些问题。

Python 脚本实际上用于 CentOS 的核心功能,这些功能对操作系统的功能至关重要。因此,将我们的开发 Python 环境与 CentOS 的核心 Python 环境隔离非常重要。

首先,目前有两个版本的 Python:Python 2.XPython 3.X

这两个阶段仍在积极生产中,尽管 2.X 版本很快就要被淘汰(并且已经持续了几年)。出现两个活动版本的 Python 的原因基本上是修复了 2.X 版本的缺点。这需要 3.X 版本的一些核心功能以无法支持某些 2.X 脚本的方式重做。

基本上,克服这种过渡的最佳方法是:为 3.X 开发,并跟上最新版本的 2.X 以用于旧版脚本。目前,CentOS 7.X 依赖于 2.X 的半当前版本。

在撰写本文时,Python 的最新版本为:3.4.62.7.13

不要让这使你感到困惑或得出任何关于 Python 的结论。设置 Python 环境非常简单。借助 Python 框架和库,这项任务实际上很容易完成。

在设置 Python 环境之前,我们需要一个合理的的环境。首先,让我们确保我们的 CentOS 安装已完全更新并安装了一些构建实用程序。

步骤 1 − 更新 CentOS。

[root@CentOS]# yum -y update

步骤 2 − 安装构建实用程序。

[root@CentOS]# yum -y groupinstall "development tools"

步骤 3 − 安装一些需要的软件包。

[root@CentOS]# yum install -y zlib-dev openssl-devel sqlite-devel bip2-devel

现在我们需要从源代码安装最新的 Python 2.X 和 3.X。

  • 下载压缩存档
  • 解压文件
  • 编译源代码

让我们首先为/usr/src/ 中的每个 Python 安装创建一个构建目录。

[root@CentOS]# mkdir -p /usr/src/pythonSource

现在让我们下载每个版本的源代码包:

[root@CentOS]# wget https://www.pythonlang.cn/ftp/python/2.7.13/Python-2.7.13.tar.xz
[root@CentOS]# wget https://www.pythonlang.cn/ftp/python/3.6.0/Python-3.6.0.tar.xz

现在我们需要从存档中解压每个文件。

步骤 1 − 安装 xz-libs 并解压 tarballs。

[root@CentOS]# yum install xz-libs
[root@CentOS python3]# xz -d ./*.xz
[root@CentOS python3]# ls
Python-2.7.13.tar  Python-3.6.0.tar
[root@CentOS python3]#

步骤 2 − 从其 tarball 中解压每个安装程序。

[root@CentOS]# tar -xvf ./Python-2.7.13.tar
[root@CentOS]# tar -xvf ./Python-3.6.0.tar

步骤 3 − 进入每个目录并运行配置脚本。

[root@CentOS]# ./configure --prefix=/usr/local 
root@CentOS]# make altinstall

注意 − 确保使用altinstall 而不是 install。这将使 CentOS 和开发版本的 Python 保持分离。否则,您可能会破坏 CentOS 的功能。

您现在将看到编译过程开始。喝杯咖啡,休息 15 分钟,直到完成。由于我们安装了 Python 的所有必要依赖项,因此编译过程应该能够顺利完成,不会出错。

让我们确保我们安装了最新的 2.X 版本的 Python。

[root@CentOS Python-2.7.13]# /usr/local/bin/python2.7 -V 
Python 2.7.13
[root@CentOS Python-2.7.13]#

注意 − 您需要为指向我们开发环境的 Python 2.X 的 Shebang 行添加前缀。

[root@CentOS Python-2.7.13]# cat ver.py  
#!/usr/local/bin/python2.7 
import sys 
print(sys.version)

[root@CentOS Python-2.7.13]# ./ver.py 
2.7.13 (default, Jan 29 2017, 02:24:08)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

就这样,我们为 2.X 和 3.X 版本分别安装了 Python。从这里,我们可以使用每个版本以及pipvirtualenv 等实用程序来进一步简化管理 Python 环境和软件包安装的负担。

在CentOS Linux中配置Ruby

Ruby 是一种非常适合 Web 开发和 Linux 管理的语言。Ruby 提供了前面讨论的所有语言(PHP、Python 和 Perl)中发现的许多好处。

要安装 Ruby,最好通过rbenv 引导,这允许管理员轻松安装和管理 Ruby 环境。

安装 Ruby 的另一种方法是使用 Ruby 的标准 CentOS 软件包。建议使用rbenv 方法及其所有优点。对于不熟悉 Ruby 的用户,CentOS 软件包会更容易。

首先,让我们获取 rbenv 安装程序所需的一些依赖项。

  • git-core
  • zlib
  • zlib-devel
  • gcc-c++
  • patch
  • readline
  • readline-devel
  • libyaml-devel
  • libffi-devel
  • openssl-devel
  • make
  • bzzip2
  • autoconf
  • automake
  • libtool
  • bison
  • curl
  • sqlite-devel

根据安装 CentOS 时选择的选项和角色,这些软件包中的大部分可能已经安装。最好安装所有我们不确定的软件包,因为这可以减少安装需要依赖项的软件包时的麻烦。

[root@CentOS]# yum -y install git-core zlib zlib-devel gcc-c++ patch readline 
readline-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf 
automake libtool bison curl sqlite-devel 

方法 1:用于动态 Ruby 开发环境的 rbenv

现在作为将使用Ruby 的用户:

[rdc@CentOS ~]$ git clone https://github.com/rbenv/rbenv.git
[rdc@CentOS ~]$  https://github.com/rbenv/ruby-build.git

ruby-build 将为rbenv 提供安装功能:

注意 − 在运行install.sh 之前,我们需要切换到 root 或管理员用户。

[rdc@CentOS ruby-build]$ cd ~/ruby-build
[rdc@CentOS ruby-build]# ./install.sh

让我们设置 rbenv 的 shell 并确保我们安装了正确的选项。

[rdc@CentOS ~]$ source ~/rbenv/rbenv.d/exec/gem-rehash.bash

[rdc@CentOS ruby-build]$ ~/rbenv/bin/rbenv  
rbenv 1.1.0-2-g4f8925a 
Usage: rbenv <command> [<args>]

一些有用的 rbenv 命令:

命令 操作
local 设置或显示特定于应用程序的本地 Ruby 版本
global 设置或显示全局 Ruby 版本
shell 设置或显示特定于 shell 的 Ruby 版本
install 使用 ruby-build 安装 Ruby 版本
uninstall 卸载特定 Ruby 版本
rehash 重新散列 rbenv shims(安装可执行文件后运行此命令)
version 显示当前 Ruby 版本及其来源
versions 列出 rbenv 可用的所有 Ruby 版本
which 显示可执行文件的完整路径
whence 列出包含给定可执行文件的所有 Ruby 版本

现在让我们安装 Ruby:

[rdc@CentOS bin]$ ~/rbenv/bin/rbenv install -v 2.2.1

编译完成后:

[rdc@CentOS ~]$ ./ruby -v 
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux] 
[rdc@CentOS ~]$

我们现在拥有一个功能正常的 Ruby 环境,其中包含更新且可用的 Ruby 2.X 分支版本。

方法 2:从 CentOS 软件包安装 Ruby

这是最简单的方法。但是,它可能会受到 CentOS 打包的版本和 gem 的限制。对于重要的开发工作,强烈建议使用rbenv 方法来安装 Ruby。

安装 Ruby、所需的开发软件包和一些常用 gem。

[root@CentOS rdc]# yum install -y ruby.x86_64 ruby-devel.x86_64 ruby-
libs.x86_64 ruby-gem-json.x86_64 rubygem-rake.noarch

不幸的是,我们剩下的只是稍微过时的 Ruby 版本。

[root@CentOS rdc]# ruby -v 
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
[root@CentOS rdc]#

Linux 管理员 - 为 CentOS Linux 设置 Perl

Perl 已经存在很长时间了。它最初被设计为用于解析文本文件的报告语言。随着流行度的提高,Perl 添加了模块支持或 CPAN、套接字、线程和其他在强大的脚本语言中需要的功能。

与 PHP、Python 或 Ruby 相比,Perl 最大的优势在于:它可以轻松完成任务。Perl 的这种理念并不总是意味着它以正确的方式完成任务。但是,对于 Linux 上的管理任务,Perl 被认为是脚本语言的首选。

与 Python 或 Ruby 相比,Perl 的一些优势:

  • 强大的文本处理能力

  • Perl 能够快速编写脚本(通常,Perl 脚本的代码行数比等效的 Python 或 Ruby 脚本少几十行)

  • Perl 几乎无所不能

Perl 的一些缺点包括:

  • 语法可能令人困惑

  • Perl 的编码风格可能独特,从而影响协作

  • Perl 并不是真正的面向对象语言

  • 通常情况下,在使用 Perl 时,并没有过多考虑标准化和最佳实践。

在决定使用 Perl、Python 或 PHP 时,应该问以下问题:

  • 这个应用程序将来需要版本控制吗?
  • 其他人将来需要修改代码吗?
  • 其他人需要使用这个应用程序吗?
  • 这个应用程序将来会在其他机器或 CPU 架构上使用吗?

如果以上所有问题的答案都是“否”,那么 Perl 是一个不错的选择,并且可以加快最终结果的实现速度。

说完了这些,让我们配置 CentOS 服务器以使用最新版本的 Perl。

在安装 Perl 之前,我们需要了解对 Perl 的支持。正式来说,Perl 只支持最近两个稳定版本。因此,我们希望确保我们的开发环境与 CentOS 版本隔离。

隔离的原因是:如果有人向 CentOS 社区发布了一个 Perl 工具,则很可能对其进行修改以使其能够在 CentOS 附带的 Perl 版本上运行。但是,我们也希望安装最新版本以用于开发目的。与 Python 一样,CentOS 提供的 Perl 重点在于可靠性,而不是前沿技术。

让我们检查一下 CentOS 7 上当前的 Perl 版本。

[root@CentOS]# perl -v 
This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi

我们目前运行的是 Perl 5.16.3。截至撰写本文时,最新版本是:perl-5.24.0

我们肯定希望升级我们的版本,以便能够在我们的代码中使用最新的 Perl 模块。幸运的是,有一个很好的工具可以维护 Perl 环境并保持 CentOS 版本的 Perl 与之隔离。它被称为perlbrew

让我们安装 Perl Brew。

[root@CentOS]# curl -L https://install.perlbrew.pl | bash 
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
                             Dload  Upload   Total   Spent    Left  Speed 
100   170  100   170    0     0    396      0 --:--:-- --:--:-- --:--:--   397 
100  1247  100  1247    0     0   1929      0 --:--:-- --:--:-- --:--:--  1929

现在我们已经安装了 Perl Brew,让我们为最新版本的 Perl 创建一个环境。

首先,我们需要当前安装的 Perl 版本来引导 perlbrew 安装。因此,让我们从 CentOS 存储库获取一些必要的 Perl 模块。

注意 - 当可用时,我们总是希望使用 CentOS Perl 模块而不是使用 CPAN 来安装 CentOS Perl。

步骤 1 - 安装 CentOS Perl Make::Maker 模块。

[root@CentOS]# yum -y install perl-ExtUtils-MakeMaker.noarch

步骤 2 - 安装最新版本的 perl。

[root@CentOS build]# source ~/perl5/perlbrew/etc/bashrc
[root@CentOS build]# perlbrew install -n -j4 --threads perl-5.24.1

我们为 Perl 安装选择的选项包括:

  • n - 不进行测试

  • j4 - 为安装例程并行执行 4 个线程(我们使用的是四核 CPU)

  • threads - 为 Perl 启用线程支持

安装成功后,让我们切换到最新的 Perl 环境。

[root@CentOS]# ~/perl5/perlbrew/bin/perlbrew use perl-5.24.1

A sub-shell is launched with perl-5.24.1 as the activated perl. Run 'exit' to finish it.

[root@CentOS]# perl -v

This is perl 5, version 24, subversion 1 (v5.24.1) built for x86_64-linuxthread-multi

(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2017, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the GNU General
Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on this system 
using "man perl" or "perldoc perl".  If you have access to the Internet, point your 
browser at https://www.perl5.cn/, the Perl Home Page.

[root@CentOS]#

简单的 Perl 脚本,打印在我们的 perlbrew 环境中运行的 perl 版本:

[root@CentOS]# cat ./ver.pl  
#!/usr/bin/perl
print $^V . "\n";

[root@CentOS]# perl ./ver.pl  
v5.24.1 
[root@CentOS]#

安装 perl 后,我们可以使用 perl brew 的 cpanm 加载 cpan 模块:

[root@CentOS]# perl-brew install-cpanm

现在让我们使用 cpanm 安装程序使用 perl brew 中当前的 5.24.1 Perl 版本来安装 LWP 模块。

步骤 1 - 切换到当前 Perl 版本的上下文。

[root@CentOS ~]# ~/perl5/perlbrew/bin/perlbrew use perl-5.24.1

启动一个子 shell,其中 perl-5.24.1 作为激活的 perl。运行 'exit' 以结束它。

[root@CentOS ~]#

步骤 2 - 安装 LWP 用户代理 Perl 模块。

[root@CentOS ~]# ~/perl5/perlbrew/bin/cpanm -i LWP::UserAgent

步骤 3 - 现在让我们使用新的 CPAN 模块测试我们的 Perl 环境。

[root@CentOS ~]# cat ./get_header.pl  
#!/usr/bin/perl 
use LWP; 
my $browser = LWP::UserAgent->new(); 
my $response = $browser->get("http://www.slcc.edu/"); 
unless(!$response->is_success) { 
   print $response->header("Server"); 
}

[root@CentOS ~]# perl ./get_header.pl  
Microsoft-IIS/8.5 [root@CentOS ~]#

就是这样!Perl Brew 使隔离 perl 环境变得轻而易举,并且可以被认为是 Perl 最佳实践。

安装和配置Open LDAP

LDAP,即轻量级目录访问协议,是一种用于访问企业中已知的目录内的 X.500 服务容器的协议。熟悉 Windows 服务器管理的人可以认为 LDAP 的性质与 Active Directory 非常相似。它甚至是一个将 Windows 工作站与 OpenLDAP CentOS 企业互联的广泛使用的概念。另一方面,CentOS Linux 工作站可以共享资源并参与 Windows 域中的基本功能。

在 CentOS 上部署 LDAP 作为目录服务器代理、目录系统代理或 DSA(这些首字母缩写词都是同一个意思)类似于使用具有 NDS 的目录树结构的旧版 Novell Netware 安装。

LDAP 的简史

LDAP 的创建是为了高效地访问具有企业资源的 X.500 目录。X.500 和 LDAP 具有相同的特性,并且非常相似,以至于 LDAP 客户端可以使用一些辅助程序来访问 X.500 目录。虽然 LDAP 也有自己的目录服务器,称为slapdLDAPDAP 之间的区别在于,轻量级版本设计为通过 TCP 运行。

DAP 使用完整的 OSI 模型。随着互联网、TCP/IP 和以太网在当今网络中的兴起,在特定遗留计算模型之外,使用 DAP 和本地 X.500 企业目录的目录服务实施很少见。

CentOS Linux 的 openldap 主要组件包括:

openldap LDAP 支持库
openldap-server LDAP 服务器
openldap-clients LDAP 客户端实用程序
openldap-devel OpenLDAP 的开发库
compay-openldap OpenLDAP 共享库
slapd OpenLDAP 的目录服务器守护程序
slurpd 用于在企业域中进行 LDAP 复制

注意 - 命名企业时,最佳实践是使用.local TLD。使用.net.com 可能会在隔离在线和内部域基础架构时造成困难。想象一下,一家公司在内部同时使用acme.com 进行内部和外部操作所需要做的额外工作。因此,明智的做法是将互联网资源称为acme.comacme.net。然后,本地网络企业资源显示为acme.local。这需要配置 DNS 记录,但会带来简单性、流畅性和安全性。

在 CentOS 上安装 Open LDAP

YUM 安装 openldap、openldap-servers、openldap-clients 和 migrationstools。

[root@localhost]# yum -y install openldap openldap-servers openldap-clients
migration tools
 Loaded plugins: fastestmirror, langpacks
 updates
 | 3.4 kB  00:00:00
 updates/7/x86_64/primary_db
 | 2.2 MB  00:00:05
 Determining fastest mirrors
 (1/2): extras/7/x86_64/primary_db
 | 121 kB  00:00:01
 (2/2): base/7/x86_64/primary_db
 | 5.6 MB  00:00:16
 Package openldap-2.4.40-13.el7.x86_64 already installed and latest version
 Resolving Dependencies
 --> Running transaction check
 ---> Package openldap-clients.x86_64 0:2.4.40-13.el7 will be installed
 ---> Package openldap-servers.x86_64 0:2.4.40-13.el7 will be installed
 --> Finished Dependency Resolution
 base/7/x86_64/group_gz
 | 155 kB  00:00:00
 
 Dependencies Resolved
 
=============================================================================== 
=============================================================================== 
Package                                Arch
Version                             Repository                        Size 
=============================================================================== 
=============================================================================== 
Installing: 
openldap-clients                    x86_64
2.4.40-13.el7                    base                                 188 k 
openldap-servers                    x86_64
2.4.40-13.el7                    base                                 2.1 M  

Transaction Summary 
=============================================================================== 
===============================================================================
Install  2 Packages

Total download size: 2.3 M 
Installed size: 5.3 M 
Downloading packages:

Installed: 
openldap-clients.x86_64 0:2.4.40-13.el7                                       
openldap-servers.x86_64 0:2.4.40-13.el7                                       
Complete! 
[root@localhost]#

现在,让我们启动并启用slapd 服务:

[root@centos]# systemctl start slapd 
[root@centos]# systemctl enable  slapd

此时,让我们确保我们的openldap 结构位于/etc/openldap 中。

root@localhost]# ls /etc/openldap/ 
certs  check_password.conf  ldap.conf  schema  slapd.d
[root@localhost]#

然后确保我们的 slapd 服务正在运行。

root@centos]# netstat -antup | grep slapd
tcp        0      0 0.0.0.0:389            0.0.0.0:*              LISTEN      1641/slapd
tcp6       0      0 :::389                 :::*                   LISTEN      1641/slapd
 
[root@centos]#

接下来,让我们配置Open LDAP 安装。

确保已创建我们的系统ldap 用户。

[root@localhost]# id ldap 
uid=55(ldap) gid=55(ldap) groups=55(ldap)
[root@localhost]#

生成我们的 LDAP 凭据。

[root@localhost]# slappasswd  
New password:  
Re-enter new password:  
{SSHA}20RSyjVv6S6r43DFPeJgASDLlLoSU8g.a10

[root@localhost]#

我们需要保存 slappasswd 的输出。

配置 Open LDAP

步骤 1 - 为域配置 LDAP 并添加管理员用户。

首先,我们希望设置我们的 openLDAP 环境。以下是与ldapmodify 命令一起使用的模板。

dn: olcDatabase={2}hdb,cn=config 
changetype: modify 
replace: olcSuffix 
olcSuffix: dc=vmnet,dc=local 
dn: olcDatabase = {2}hdb,cn=config 
changetype: modify 
replace: olcRootDN 
olcRootDN: cn=ldapadm,dc=vmnet,dc=local 
dn: olcDatabase = {2}hdb,cn=config 
changetype: modify 
replace: olcRootPW 
olcRootPW: <output from slap

使用 ldapmodify 命令更改:/etc/openldap/slapd.d/cn=config/olcDatabase = {1}monitor.ldif。

[root@localhost]# ldapmodify -Y EXTERNAL -H ldapi:/// -f /home/rdc/Documents/db.ldif  
SASL/EXTERNAL authentication started 
SASL username: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth 
SASL SSF: 0 
modifying entry "olcDatabase = {2}hdb,cn=config" 
modifying entry "olcDatabase = {2}hdb,cn=config" 
modifying entry "olcDatabase = {2}hdb,cn=config" 

[root@localhost cn=config]#

让我们检查修改后的 LDAP 配置。

root@linux1 ~]# vi /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif

[root@centos]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
 # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. 
 # CRC32 a163f14c
dn: olcDatabase = {2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: 1bd9aa2a-8516-1036-934b-f7eac1189139
creatorsName: cn=config
createTimestamp: 20170212022422Z
olcSuffix: dc=vmnet,dc=local
olcRootDN: cn=ldapadm,dc=vmnet,dc=local
olcRootPW:: e1NTSEF1bUVyb1VzZTRjc2dkYVdGaDY0T0k = 
entryCSN: 20170215204423.726622Z#000000#000#000000 
modifiersName: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20170215204423Z

[root@centos]#

正如您所看到的,我们的 LDAP 企业修改成功了。

接下来,我们希望为 OpenLDAP 创建一个自签名 ssl 证书。这将保护企业服务器和客户端之间的通信安全。

步骤 2 - 为 OpenLDAP 创建自签名证书。

我们将使用openssl 创建自签名 ssl 证书。请转到下一章使用 openssl 创建 LDAP SSL 证书,了解有关保护与 OpenLDAP 通信安全的说明。然后,在配置 ssl 证书后,我们将完成 OpenLDAP 企业配置。

步骤 3 - 配置 OpenLDAP 以使用证书进行安全通信。

使用vim 创建一个包含以下信息的certs.ldif 文件:

dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/yourGeneratedCertFile.pem

dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/youGeneratedKeyFile.pem

接下来,再次使用ldapmodify 命令将更改合并到 OpenLDAP 配置中。

[root@centos rdc]# ldapmodify -Y EXTERNAL  -H ldapi:/// -f certs.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber = 0+uidNumber = 0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

[root@centos]#

最后,让我们测试我们的 OpenLADP 配置。

[root@centos]# slaptest -u 
config file testing succeeded 
[root@centos]#

步骤 4 - 设置 slapd 数据库。

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG && 
chown ldap:ldap /var/lib/ldap/*

更新 OpenLDAP 模式。

添加 cosine 和 nis LDAP 模式。

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

最后,创建企业模式并将其添加到当前的 OpenLDAP 配置中。

以下是适用于名为 vmnet.local 的域以及名为ldapadm 的 LDAP 管理员的配置。

dn: dc=vmnet,dc=local
dc: vmnet
objectClass: top
objectClass: domain

dn: cn=ldapadm ,dc=vmnet,dc=local
objectClass: organizationalRole
cn: ldapadm
description: LDAP Manager

dn: ou = People,dc=vmnet,dc=local
objectClass: organizationalUnit
ou: People

dn: ou = Group,dc=vmnet,dc=local 
objectClass: organizationalUnit 
ou: Group

最后,将其导入到当前的 OpenLDAP 模式中。

[root@centos]# ldapadd -x -W -D "cn=ldapadm,dc=vmnet,dc=local" -f ./base.ldif
 Enter LDAP Password:
adding new entry "dc=vmnet,dc=local"

adding new entry "cn=ldapadm ,dc=vmnet,dc=local"

adding new entry "ou=People,dc=vmnet,dc=local"

adding new entry "ou=Group,dc=vmnet,dc=local"

[root@centos]#

步骤 5 - 设置 OpenLDAP 企业用户。

打开vim 或您喜欢的文本编辑器并复制以下格式。此设置适用于“vmnet.local”LDAP 域上的名为“entacct”的用户。

dn: uid=entacct,ou=People,dc=vmnet,dc=local 
objectClass: top
objectClass: account 
objectClass: posixAccount 
objectClass: shadowAccount 
cn: entacct 
uid: entacct 
uidNumber: 9999 
gidNumber: 100 
homeDirectory: /home/enyacct 
loginShell: /bin/bash 
gecos: Enterprise User Account 001 
userPassword: {crypt}x 
shadowLastChange: 17058 
shadowMin: 0 
shadowMax: 99999 
shadowWarning: 7

现在,将上面保存的文件导入到 OpenLdap 模式中。

[root@centos]# ldapadd -x -W -D "cn=ldapadm,dc=vmnet,dc=local" -f entuser.ldif 
 Enter LDAP Password:
adding new entry "uid=entacct,ou=People,dc=vmnet,dc=local" 

[root@centos]#

在用户可以访问 LDAP 企业之前,我们需要按如下方式分配密码:

ldappasswd -s password123 -W -D "cn=ldapadm,dc=entacct,dc=local" -x "uid=entacct 
,ou=People,dc=vmnet,dc=local"

-s 指定用户的密码

-x 是应用密码更新的用户名

-D 是用于针对 LDAP 模式进行身份验证的“区分名称”。

最后,在登录企业帐户之前,让我们检查我们的OpenLDAP 条目。

[root@centos rdc]# ldapsearch -x cn=entacct -b dc=vmnet,dc=local
 # extended LDIF
 #
 # LDAPv3
 # base <dc=vmnet,dc=local> with scope subtree
 # filter: cn=entacct
 # requesting: ALL 
 # 
 # entacct, People, vmnet.local 
dn: uid=entacct,ou=People,dc=vmnet,dc=local 
objectClass: top 
objectClass: account 
objectClass: posixAccount 
objectClass: shadowAccount 
cn: entacct 
uid: entacct 
uidNumber: 9999 
gidNumber: 100 
homeDirectory: /home/enyacct 
loginShell: /bin/bash 
gecos: Enterprise User Account 001 
userPassword:: e2NyeXB0fXg= 
shadowLastChange: 17058 
shadowMin: 0 
shadowMax: 99999 
shadowWarning: 7

/etc/passwd/etc/groups 等内容转换为 OpenLDAP 身份验证需要使用迁移工具。这些工具包含在migrationtools 软件包中。然后安装到/usr/share/migrationtools

[root@centos openldap-servers]# ls -l /usr/share/migrationtools/
total 128
-rwxr-xr-x. 1 root root  2652 Jun  9  2014 migrate_aliases.pl
-rwxr-xr-x. 1 root root  2950 Jun  9  2014 migrate_all_netinfo_offline.sh
-rwxr-xr-x. 1 root root  2946 Jun  9  2014 migrate_all_netinfo_online.sh
-rwxr-xr-x. 1 root root  3011 Jun  9  2014 migrate_all_nis_offline.sh
-rwxr-xr-x. 1 root root  3006 Jun  9  2014 migrate_all_nis_online.sh
-rwxr-xr-x. 1 root root  3164 Jun  9  2014 migrate_all_nisplus_offline.sh
-rwxr-xr-x. 1 root root  3146 Jun  9  2014 migrate_all_nisplus_online.sh
-rwxr-xr-x. 1 root root  5267 Jun  9  2014 migrate_all_offline.sh
-rwxr-xr-x. 1 root root  7468 Jun  9  2014 migrate_all_online.sh
-rwxr-xr-x. 1 root root  3278 Jun  9  2014 migrate_automount.pl
-rwxr-xr-x. 1 root root  2608 Jun  9  2014 migrate_base.pl

步骤 6 - 最后,我们需要允许访问 slapd 服务,以便它可以提供服务请求。

firewall-cmd --permanent --add-service=ldap 
firewall-cmd --reload

配置 LDAP 客户端访问

配置 LDAP 客户端访问需要客户端上安装以下软件包:openldap、open-ldap clients 和 nss_ldap。

为客户端系统配置 LDAP 身份验证相对容易。

步骤 1 - 安装依赖软件包:

# yum install -y openldap-clients nss-pam-ldapd

步骤 2 - 使用authconfig 配置 LDAP 身份验证。

authconfig --enableldap --enableldapauth --ldapserver=10.25.0.1 --
ldapbasedn="dc=vmnet,dc=local" --enablemkhomedir --update

步骤 3 - 重启 nslcd 服务。

systemctl restart  nslcd

Linux管理员 - 创建SSL证书

TLS 和 SSL 背景

TLS 是继 SSL 之后套接字层安全的新标准。TLS 提供了更好的加密标准以及其他安全和协议包装器功能,从而提升了 SSL。通常,TLS 和 SSL 术语可以互换使用。但是,作为专业的 CentOS 管理员,务必注意两者之间的区别和历史。

SSL 最高版本为 3.0。SSL 是在 Netscape 的推动下成为行业标准的。在 Netscape 被 AOL(90 年代流行的 ISP,又名 America Online)收购后,AOL 从未真正推动 SSL 所需的安全改进。

在 3.1 版中,SSL 技术转向开放系统标准,并更名为TLS。由于SSL 的版权仍归 AOL 所有,因此创造了一个新术语 - TLS - 传输层安全。因此,重要的是要承认TLS 实际上与SSL 不同。特别是,由于较旧的SSL 技术存在已知安全问题,因此现在有些技术已被认为已过时。

注意 - 本教程在谈到 3.1 及更高版本的技术时将使用术语TLS。在评论特定于 3.0 和更低版本的 SSL 技术时,将使用SSL

SSL 与 TLS 版本

下表显示了 TLS 和 SSL 版本之间的关系。我听说过一些人谈论SSL 3.2 版本。但是,他们可能是从阅读博客中获得的术语。作为专业的管理员,我们总是希望使用标准术语。因此,谈论SSL 应该指的是过去的技术。一些简单的事情可以让一个 CentOS 求职者看起来像一个经验丰富的计算机科学专业毕业生。

TLS SSL
- 3.0
1.0 3.1
1.1 3.2
1.2 3.3

TLS 执行当今互联网用户重要的两个主要功能:一,验证一方的身份,称为身份验证。二,它为缺乏此原生功能的上层协议(ftp、http、电子邮件协议等)提供传输层的端到端加密

首先,验证一方的身份,这对于端到端加密的安全至关重要。如果消费者与未授权进行支付的网站建立了加密连接,则财务数据仍然存在风险。这就是每个网络钓鱼网站都无法做到的:一个由受信任的CA正确签署的TLS证书,用于验证网站运营商的身份是否与其声称的身份一致

只有两种方法可以绕过没有正确签署的证书:诱骗用户允许浏览器信任自签名证书,或者希望用户缺乏技术知识,不会知道受信任的证书颁发机构(或CA)的重要性。

在本教程中,我们将使用所谓的自签名证书。这意味着,如果没有明确地将此证书设置为访问该网站的每个Web浏览器的受信任状态,则会显示错误,阻止用户访问该站点。然后,它会让用户在访问具有自签名证书的站点之前执行一些操作。记住,为了安全起见,这是一件好事。

安装和配置openssl

openssl是TLS开源实现的标准。openssl用于Linux、BSD发行版、OS X等系统,甚至支持Windows。

openssl很重要,因为它提供了传输层安全,并为开发人员抽象了身份验证端到端加密的详细编程。这就是为什么openssl几乎用于每个使用TLS的开源应用程序的原因。它也默认安装在每个现代版本的Linux上。

默认情况下,从CentOS 5版本开始就应该安装openssl。为了确保,让我们尝试通过YUM安装openssl。只需运行安装命令,因为YUM足够智能,可以让我们知道是否已安装软件包。如果由于兼容性原因我们运行的是旧版本的CentOS,则执行yum -y install将确保openssl针对最新的心脏滴血漏洞进行更新。

运行安装程序时,发现openssl实际上有更新。

[root@centos]# yum -y install openssl
Resolving Dependencies
--> Running transaction check
---> Package openssl.x86_64 1:1.0.1e-60.el7 will be updated
---> Package openssl.x86_64 1:1.0.1e-60.el7_3.1 will be an update
--> Processing Dependency: openssl-libs(x86-64) = 1:1.0.1e-60.el7_3.1 for 
package: 1:openssl-1.0.1e-60.el7_3.1.x86_64
--> Running transaction check
---> Package openssl-libs.x86_64 1:1.0.1e-60.el7 will be updated
---> Package openssl-libs.x86_64 1:1.0.1e-60.el7_3.1 will be an update
--> Finished Dependency Resolution 
Dependencies Resolved

===============================================================================
=============================================================================== 
 Package                               Arch
 Version                            Repository                        Size 
=============================================================================== 
=============================================================================== 
Updating: 
openssl                               x86_64                          
1:1.0.1e-60.el7_3.1                 updates                           713 k
Updating for dependencies:

为OpenLDAP创建自签名证书

这是一种为我们之前的OpenLDAP安装创建自签名证书的方法。

创建OpenLDAP自签名证书。

openssl req -new -x509 -nodes -out /etc/openldap/certs/myldaplocal.pem -keyout
/etc/openldap/certs/myldaplocal.pem -days 365

[root@centos]# openssl req -new -x509 -nodes -out /etc/openldap/certs/vmnet.pem 
-keyout /etc/openldap/certs/vmnet.pem -days 365 
Generating a 2048 bit RSA private key
.............................................+++
................................................+++
writing new private key to '/etc/openldap/certs/vmnet.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Califonia
Locality Name (eg, city) [Default City]:LA
Organization Name (eg, company) [Default Company Ltd]:vmnet
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:centos
Email Address []:[email protected]
[root@centos]#

现在我们的OpenLDAP证书应该放在/etc/openldap/certs/目录下。

[root@centos]# ls /etc/openldap/certs/*.pem 
/etc/openldap/certs/vmnetcert.pem  /etc/openldap/certs/vmnetkey.pem
[root@centos]#

如您所见,我们已将证书和密钥都安装在/etc/openldap/certs/目录中。最后,我们需要更改每个文件的权限,因为它们当前归root用户所有。

[root@centos]# chown -R  ldap:ldap /etc/openldap/certs/*.pem
[root@centos]# ls -ld /etc/openldap/certs/*.pem
-rw-r--r--. 1 ldap ldap 1395 Feb 20 10:00 /etc/openldap/certs/vmnetcert.pem 
-rw-r--r--. 1 ldap ldap 1704 Feb 20 10:00 /etc/openldap/certs/vmnetkey.pem
[root@centos]#

为Apache Web服务器创建自签名证书

在本教程中,我们假设Apache已安装。我们在另一个教程(配置CentOS防火墙)中安装了Apache,并将把Apache的高级安装留到以后的教程中。因此,如果您尚未安装Apache,请继续阅读。

一旦安装Apache HTTPd,可以使用以下步骤:

步骤1 - 为Apache httpd服务器安装mod_ssl。

首先,我们需要使用mod_ssl配置Apache。使用YUM包管理器,这非常简单:

[root@centos]# yum -y install mod_ssl

然后重新加载Apache守护进程,以确保Apache使用新的配置。

[root@centos]# systemctl reload httpd

此时,Apache已配置为支持本地主机上的TLS连接。

步骤2 - 创建自签名ssl证书。

首先,让我们配置我们的私有TLS密钥目录。

[root@centos]# mkdir /etc/ssl/private 
[root@centos]# chmod 700 /etc/ssl/private/

注意 - 请确保只有root用户具有对此目录的读/写权限。如果具有世界读/写权限,则可以使用您的私钥解密嗅探到的流量。

生成证书和密钥文件。

[root@centos]# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout 
/etc/ssl/private/self-gen-apache.key -out /etc/ssl/certs/self-sign-apache.crt 
Generating a 2048 bit RSA private key
..........+++
....+++
-----
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:xx
Locality Name (eg, city) [Default City]:xxxx
Organization Name (eg, company) [Default Company Ltd]:VMNET
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:centos.vmnet.local
Email Address []:

[root@centos]#

注意 - 如果您没有注册域名,可以使用服务器的公网IP地址。

让我们看看我们的证书:

[root@centos]# openssl x509 -in self-sign-apache.crt -text -noout
Certificate:
   Data:
      Version: 3 (0x2)
      Serial Number: 17620849408802622302 (0xf489d52d94550b5e)
   Signature Algorithm: sha256WithRSAEncryption
   Issuer: C=US, ST=UT, L=xxxx, O=VMNET, CN=centos.vmnet.local
   Validity
      Not Before: Feb 24 07:07:55 2017 GMT
      Not After : Feb 24 07:07:55 2018 GMT
   Subject: C=US, ST=UT, L=xxxx, O=VMNET, CN=centos.vmnet.local
   Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
         Public-Key: (2048 bit)
            Modulus:
               00:c1:74:3e:fc:03:ca:06:95:8d:3a:0b:7e:1a:56:
               f3:8d:de:c4:7e:ee:f9:fa:79:82:bf:db:a9:6d:2a:
               57:e5:4c:31:83:cf:92:c4:e7:16:57:59:02:9e:38:
               47:00:cd:b8:31:b8:34:55:1c:a3:5d:cd:b4:8c:b0:
               66:0c:0c:81:8b:7e:65:26:50:9d:b7:ab:78:95:a5:
               31:5e:87:81:cd:43:fc:4d:00:47:5e:06:d0:cb:71:
               9b:2a:ab:f0:90:ce:81:45:0d:ae:a8:84:80:c5:0e:
               79:8a:c1:9b:f4:38:5d:9e:94:4e:3a:3f:bd:cc:89:
               e5:96:4a:44:f5:3d:13:20:3d:6a:c6:4d:91:be:aa:
               ef:2e:d5:81:ea:82:c6:09:4f:40:74:c1:b1:37:6c:
               ff:50:08:dc:c8:f0:67:75:12:ab:cd:8d:3e:7b:59:
               e0:83:64:5d:0c:ab:93:e2:1c:78:f0:f4:80:9e:42: 
               7d:49:57:71:a2:96:c6:b8:44:16:93:6c:62:87:0f:
               5c:fe:df:29:89:03:6e:e5:6d:db:0a:65:b2:5e:1d:
               c8:07:3d:8a:f0:6c:7f:f3:b9:32:b4:97:f6:71:81:
               6b:97:e3:08:bd:d6:f8:19:40:f1:15:7e:f2:fd:a5:
               12:24:08:39:fa:b6:cc:69:4e:53:1d:7e:9a:be:4b:

以下是我们使用openssl命令的每个选项的解释:

命令 操作
req -X509 使用X.509 CSR管理PKI标准进行密钥管理。
-nodes 不要使用密码保护我们的证书。Apache必须能够在不中断密码的情况下使用证书。
-days 2555 将证书的有效期设置为7年或2555天。时间段可以根据需要调整。
-newkey rsa:2048 指定使用RSA以2048位长度生成密钥和证书。

接下来,我们想为与客户端协商PFS创建一个Diffie-Hellman组。

[centos#] openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

这将花费5到15分钟。

完美前向保密 (Perfect Forward Secrecy) - 用于保护会话数据,以防私钥被泄露。这将生成一个在客户端和服务器之间使用的密钥,该密钥对于每个会话都是唯一的。

现在,将完美前向保密配置添加到我们的证书中。

[root@centos]# cat /etc/ssl/certs/dhparam.pem | tee -a /etc/ssl/certs/self-sign-apache.crt

配置Apache使用密钥和证书文件

我们将对/etc/httpd/conf.d/ssl.conf进行更改:

我们将对ssl.conf进行以下更改。但是,在这样做之前,我们应该备份原始文件。在使用像viemacs这样的高级文本编辑器更改生产服务器时,最好先备份配置文件然后再进行编辑。

[root@centos]# cp /etc/httpd/conf.d/ssl.conf ~/

现在,在我们已将已知可用的ssl.conf副本复制到主目录的根目录之后,让我们继续进行编辑。

  • 找到
  • 按如下方式编辑DocumentRoot和ServerName:
\\# General setup for the virtual host, inherited from global configuration
DocumentRoot "/var/www/html"
ServerName centos.vmnet.local:443

DocumentRoot 这是您默认Apache目录的路径。此文件夹中应该有一个默认页面,该页面将显示一个HTTP请求,请求您的Web服务器或站点的默认页面。例如:访问http://www.yoursite.com/ 将检索并提供来自您的DocumentRoot的index文件。

ServerName 是服务器名称,可以是IP地址或服务器的主机名。对于TLS,最好使用主机名创建证书。在我们之前的OpenLDAP教程中,我们在本地企业域中创建了主机名centos:vmnet.local

现在我们要注释掉以下几行:

SSLProtocol

#   SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect.  Disable SSLv2 access by default:
 ~~~~> #SSLProtocol all -SSLv2
 
#   SSL Cipher Suite:
#   List the ciphers that the client is permitted to negotiate.
#   See the mod_ssl documentation for a complete list.
 ~~~~> #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

然后让Apache知道在哪里可以找到我们的证书和私钥/公钥对。

指定我们自签名证书文件的路径

#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
~~~~> SSLCertificateFile /etc/ssl/certs/self-sign-apache.crt
specify path to our private key file
#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
~~~~> SSLCertificateKeyFile /etc/ssl/private/self-gen-apache.key

最后,我们需要允许通过443端口进行入站https连接。

安装Apache Web服务器CentOS 7

在本章中,我们将简要了解Apache HTTP服务器的背景知识,然后在CentOS Linux 7上安装最新的稳定版本。

Apache Web服务器简史

Apache是一个存在了很长时间的Web服务器。事实上,几乎和http本身一样久远!

Apache最初是国家超级计算应用中心(也称为NCSA)的一个小型项目。在90年代中期,“httpd”(当时的名称)是互联网上最流行的Web服务器平台,市场份额约为90%或更高。

那时,这是一个简单的项目。被称为网站管理员的熟练IT人员负责:维护Web服务器平台和Web服务器软件以及前端和后端站点开发。httpd的核心是它能够使用称为插件或扩展的自定义模块。网站管理员也足够熟练,可以编写核心服务器软件的补丁。

在90年代中后期,httpd的资深开发者和项目经理离开了NCSA去做其他事情。这使得最流行的Web守护程序处于停滞状态。

由于httpd的使用非常广泛,一群经验丰富的httpd网站管理员呼吁举行关于httpd未来的峰会。决定协调并将最好的扩展和补丁应用到当前的稳定版本中。然后,当前的http服务器鼻祖诞生并被命名为Apache HTTP服务器。

鲜为人知的历史事实 - Apache并非以美洲原住民的某个部落命名。事实上,它的命名带有一个巧妙的转折:它是由许多才华横溢的计算机科学家提供的许多修复程序(或补丁)组成的:一个充满补丁的Apache

在CentOS Linux 7上安装当前稳定版本

步骤1 - 通过yum安装httpd。

yum -y install httpd

此时,Apache HTTP服务器将通过yum安装。

步骤2 - 根据您的httpd需求编辑httpd.conf文件。

默认的Apache安装中,Apache的配置文件名为httpd.conf,位于/etc/httpd/目录下。因此,让我们在vim中打开它。

vim中打开的httpd.conf的前几行:

# 
# This is the main Apache HTTP server configuration file.  It contains the 
# configuration directives that give the server its instructions.
# See <URL:https://httpd.apache.org/docs/2.4/> for detailed information. 
# In particular, see  
# <URL:https://httpd.apache.org/docs/2.4/mod/directives.html> 
# for a discussion of each configuration directive.

我们将进行以下更改,以允许我们的CentOS安装通过http端口80提供http请求。

监听主机和端口

# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80

在这里,我们将Apache更改为监听某个端口或IP地址。例如,如果我们想在备用端口(例如8080)上运行httpd服务。或者如果我们的Web服务器配置了多个具有独立IP地址的接口。

Listen

阻止Apache附加到每个监听守护程序到每个IP地址上。这对于停止仅指定IPv6或IPv4流量非常有用。或者甚至绑定到多宿主主机上的所有网络接口。

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
Listen 10.0.0.25:80
#Listen 80

DocumentRoot

“文档根目录”是Apache在访问您的服务器时查找要提供请求的索引文件的默认目录:访问http://www.yoursite.com/ 将检索并提供来自您的文档根目录的index文件。

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"

步骤3 - 启动并启用httpd服务。

[root@centos rdc]# systemctl start httpd && systemctl reload httpd 
[root@centos rdc]#

步骤4 - 配置防火墙以允许访问端口80请求。

[root@centos]# firewall-cmd --add-service=http --permanent

Linux管理员 - 在CentOS 7上设置MySQL

正如在配置CentOS以与Maria DB一起使用时简要提到的那样,CentOS 7 yum存储库中没有原生的MySQL软件包。为此,我们需要添加一个MySQL托管存储库。

CentOS上的MariaDB与MySQL

需要注意的是,MySQL将需要与MariaDB不同的基本依赖项集。此外,使用MySQL会破坏CentOS的概念和理念:旨在最大限度提高可靠性的生产软件包。

因此,在决定使用Maria还是MySQL时,应该权衡以下两个选项:我的当前数据库模式是否适用于Maria?安装MySQL而不是Maria有什么优势?

Maria组件对于MySQL结构来说是100%透明的,并且效率更高,许可证也更好。除非出现令人信服的原因,否则建议将CentOS配置为使用MariaDB。

在CentOS上偏爱Maria的主要原因是:

  • 大多数人将使用MariaDB。遇到问题时,您将获得更多关于Maria的帮助。

  • CentOS旨在与Maria一起运行。因此,Maria将提供更好的稳定性。

  • Maria获得CentOS的官方支持。

下载并添加MySQL存储库

我们将要从以下位置下载并安装MySQL存储库:

http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

步骤 1 − 下载仓库。

该仓库方便地打包在一个 rpm 包中,便于安装。可以使用 wget 下载 −

[root@centos]# wget http://repo.mysql.com/mysql-community-release-el75.noarch.rpm
   --2017-02-26 03:18:36--  http://repo.mysql.com/mysql-community-release-el75.noarch.rpm
   Resolving repo.mysql.com (repo.mysql.com)... 104.86.98.130

步骤 2 − 从 YUM 安装 MySQL。

现在我们可以使用 yum 包管理器来安装 MySQL

[root@centos]# yum -y install mysql-server

步骤 3 − 启动并启用 MySQL 守护进程服务。

[root@centos]# systemctl start mysql 
[root@centos]# systemctl enable  mysql

步骤 4 − 确保我们的 MySQL 服务正在运行。

[root@centos]# netstat -antup | grep 3306 
tcp6       0       0 :::3306       :::*       LISTEN       6572/mysqld
[root@centos]#

注意 − 我们不会允许任何防火墙规则通过。通常情况下,MySQL 会配置为使用Unix 域套接字。这确保只有 LAMP 架构的 Web 服务器(本地)可以访问 MySQL 数据库,从而消除了数据库软件攻击向量的完整维度。

设置Postfix MTA和IMAP/POP3

为了从我们的 CentOS 7 服务器发送电子邮件,我们需要设置来配置一个现代邮件传输代理 (MTA)。邮件传输代理是负责通过 SMTP 为系统用户或企业互联网域名发送外发邮件的守护进程。

值得注意的是,本教程只讲解了设置本地使用的守护进程的过程。我们不会详细介绍为业务运营设置 MTA 的高级配置。这需要结合许多技能,包括但不限于:DNS、获取未被列入黑名单的静态可路由 IP 地址以及配置高级安全和服务设置。简而言之,本教程旨在让您熟悉基本配置。请勿将本教程用于面向互联网主机的 MTA 配置。

由于其兼顾安全性和易于管理的特点,我们选择Postfix作为本教程的 MTA。较旧版本的 CentOS 中安装的默认 MTA 是SendmailSendmail是一个很棒的 MTA。但是,就作者个人拙见而言,Postfix 在解决 MTA 的以下注意事项时达到了一个最佳点。在最新版本的 CentOS 中,Postfix 已取代 Sendmail 成为默认 MTA。

Postfix 是一款广泛使用且文档齐全的 MTA。它得到积极维护和开发。它只需要最少的配置(这只是电子邮件),并且在系统资源方面效率很高(同样,这只是电子邮件)。

步骤 1 − 从 YUM 包管理器安装 Postfix。

[root@centos]# yum -y install postfix

步骤 2 − 配置 Postfix 配置文件。

Postfix 配置文件位于 − /etc/postfix/main.cf

在简单的 Postfix 配置中,必须为特定主机配置以下内容:主机名、域名、发件人、inet_interfaces 和目标。

配置主机名 − 主机名是 Postfix 主机的完全限定域名。在 OpenLDAP 章节中,我们将 CentOS 机器命名为:centos,域名是vmnet.local。让我们在本节中继续使用它。

# The myhostname parameter specifies the internet hostname of this
# mail system. The default is to use the fully-qualified domain name
# from gethostname(). $myhostname is used as a default value for many
# other configuration parameters.
#
myhostname = centos.vmnet.local

配置域名 − 如上所述,本教程中将使用的域名是vmnet.local

# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
mydomain = vmnet.local

配置发件人 − 对于单服务器和域名设置,我们只需要取消注释以下部分并保留默认的 Postfix 变量。

# SENDING MAIL
#
# The myorigin parameter specifies the domain that locally-posted
# mail appears to come from. The default is to append $myhostname,
# which is fine for small sites.  If you run a domain with multiple
# machines, you should (1) change this to $mydomain and (2) set up
# a domain-wide alias database that aliases each user to
# [email protected].
#
# For the sake of consistency between sender and recipient addresses,
# myorigin also specifies the default domain name that is appended
# to recipient addresses that have no @domain part. 
#
myorigin = $myhostname
myorigin = $mydomain

配置网络接口 − 我们将让 Postfix 监听我们的单个网络接口以及与该接口关联的所有协议和 IP 地址。这只需保留 Postfix 的默认设置即可。

# The inet_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on.  By default,
# the software claims all active interfaces on the machine. The
# parameter also controls delivery of mail to user@[ip.address].
#
# See also the proxy_interfaces parameter, for network addresses that
# are forwarded to us via a proxy or network address translator.
#
# Note: you need to stop/start Postfix when this parameter changes. 
#
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
# Enable IPv4, and IPv6 if supported
inet_protocols = all

步骤 3 − 为 Postfix 配置 SASL 支持。

如果没有 SASL 身份验证支持,Postfix 将只允许从本地用户发送电子邮件。或者,当用户从本地域名之外发送电子邮件时,它会给出中继被拒绝错误。

注意SASL简单应用程序安全层框架是一个旨在支持不同应用程序层协议之间不同技术的身份验证框架。SASL 开发人员(和使用者)利用当前的身份验证协议来处理可能没有内置方便或更安全身份验证(在谈论对安全服务的访问时)的高级协议,而不是将身份验证机制留给应用程序层协议。

安装 "cyrus-sasl*" 包

[root@centos]# yum -y install  cyrus-sasl 
Loaded plugins: fastestmirror, langpacks 
Loading mirror speeds from cached hostfile 
 * base: repos.forethought.net 
 * extras: repos.dfw.quadranet.com 
 * updates: mirrors.tummy.com 
Package cyrus-sasl-2.1.26-20.el7_2.x86_64 already installed and latest version
Nothing to do

为 SASL Auth 配置/etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

我在main.conf中的 SASL 选项

##Configure SASL Options Entries:
smtpd_sasl_auth_enable = yes
smptd_recipient_restrictions =
permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtp_sasl_type = dovecot
smtp_sasl_path = private/auth/etc

步骤 4 − 配置 FirewallD 以允许传入 SMTP 服务。

[root@centos]# firewall-cmd --permanent --add-service=smtp 
success

[root@centos]# firewall-cmd --reload 
success

[root@centos]#

现在让我们检查一下以确保我们的 CentOS 主机允许并在端口 25(SMTP)上响应请求。

Nmap scan report for 172.16.223.132 
Host is up (0.00035s latency). 
Not shown: 993 filtered ports 
PORT    STATE  SERVICE 
   20/tcp  closed ftp-data 
   21/tcp  open   ftp 
   22/tcp  open   ssh 
   25/tcp  open   smtp 
   80/tcp  open   http 
   389/tcp open   ldap 
   443/tcp open   https 
MAC Address: 00:0C:29:BE:DF:5F (VMware)

如您所见,SMTP 正在监听,并且守护进程正在响应来自我们内部 LAN 的请求。

安装 Dovecot IMAP 和 POP3 服务器

Dovecot 是一个安全的 IMAP 和 POP3 服务器,旨在处理中小型组织的传入邮件需求。由于它在 CentOS 中大量使用,我们将使用 Dovecot 作为在 CentOS 和 MTA SASL 提供程序上安装和配置传入邮件服务器的示例。

如前所述,我们不会为 DNS 配置 MX 记录,也不会创建允许我们的服务处理域邮件的安全规则。因此,仅在面向互联网的主机上设置这些服务可能会在没有 SPF 记录的情况下留下安全漏洞。

步骤 1 − 安装 Dovecot。

[root@centos]# yum -y install dovecot

步骤 2 − 配置 dovecot。

dovecot 的主要配置文件位于:/etc/dovecot.conf。我们首先备份主配置文件。在进行编辑之前始终备份配置文件是一个好习惯。这样,如果(例如)换行符被文本编辑器破坏,并且多年来的更改丢失了,则很容易通过将当前备份复制到生产环境来恢复。

启用dovecot的协议和守护进程服务

# Protocols we want to be serving. 
protocols = imap imaps pop3 pop3s

现在,我们需要启用 dovecot 守护进程在启动时监听 −

[root@localhost]# systemctl start  dovecot 
[root@localhost]# systemctl enable dovecot

让我们确保 Dovecot 在为以下内容指定的端口上本地监听:imap、pop3、安全的 imap 和安全的 pop3。

[root@localhost]# netstat -antup | grep dovecot 
 tcp        0        0 0.0.0.0:110        0.0.0.0:*        LISTEN        4368/dovecot
 tcp        0        0 0.0.0.0:143        0.0.0.0:*        LISTEN        4368/dovecot
 tcp        0        0 0.0.0.0:993        0.0.0.0:*        LISTEN        4368/dovecot
 tcp        0        0 0.0.0.0:995        0.0.0.0:*        LISTEN        4368/dovecot
 tcp6       0        0 :::110                :::*          LISTEN        4368/dovecot
 tcp6       0        0 :::143                :::*          LISTEN        4368/dovecot
 tcp6       0        0 :::993                :::*          LISTEN        4368/dovecot
 tcp6       0        0 :::995                :::*          LISTEN        4368/dovecot

[root@localhost]#

如您所见,dovecot正在为 IPv4 和 IPv4 指定的端口上监听。

POP3 110
POP3s 995
IMAP 143
IMAPs 993

现在,我们需要创建一些防火墙规则。

[root@localhost]# firewall-cmd --permanent --add-port=110/tcp 
success
 
[root@localhost]# firewall-cmd --permanent --add-port=143/tcp 
success
 
[root@localhost]# firewall-cmd --permanent --add-port=995/tcp 
success
 
[root@localhost]# firewall-cmd --permanent --add-port=993/tcp 
success
 
[root@localhost]# firewall-cmd --reload 
success
 
[root@localhost]#

我们的传入邮件服务器正在接受对 LAN 上主机的POP3POP3sIMAPIMAPs的请求。

Port Scanning host: 192.168.1.143

   Open TCP Port:   21          ftp 
   Open TCP Port:   22          ssh 
   Open TCP Port:   25          smtp 
   Open TCP Port:   80          http 
   Open TCP Port:   110         pop3 
   Open TCP Port:   143         imap 
   Open TCP Port:   443         https 
   Open TCP Port:   993         imaps 
   Open TCP Port:   995         pop3s 

Linux 管理员 - 安装匿名 FTP

在深入研究在 CentOS 上安装 FTP 之前,我们需要了解一下它的用途和安全性。FTP是一种非常高效且经过完善的协议,用于在计算机系统之间传输文件。FTP 已经使用和完善了几十年了。对于通过具有延迟的网络高效传输文件或为了纯粹的速度,FTP 是一个不错的选择。比 SAMBA 或 SMB 都要好。

但是,FTP 确实存在一些安全问题。实际上,是一些严重的安全问题。FTP 使用一种非常弱的纯文本身份验证方法。出于这个原因,经过身份验证的会话应该依赖于 sFTP 或 FTPS,其中 TLS 用于登录和传输会话的端到端加密。

考虑到上述警告,普通的 FTP 今天仍在业务环境中使用。主要用途是匿名 FTP 文件存储库。在这种情况下,不需要身份验证即可下载或上传文件。匿名 FTP 使用的一些示例包括 −

  • 大型软件公司仍然使用匿名 ftp 存储库,允许互联网用户下载共享软件和补丁。

  • 允许互联网用户上传和下载公共文档。

  • 某些应用程序会自动通过 FTP 将加密的存档日志或配置文件发送到存储库。

因此,作为 CentOS 管理员,能够安装和配置 FTP 仍然是一项重要的技能。

我们将使用名为vsFTP或非常安全的 FTP 守护程序的 FTP 守护程序。vsFTP 已经开发了一段时间了。它以安全、易于安装和配置以及可靠而闻名。

步骤 1 − 使用 YUM 包管理器安装 vsFTPd。

[root@centos]# yum -y install vsftpd.x86_64

步骤 2 − 配置 vsFTP 使用 systemctl 在启动时启动。

[root@centos]# systemctl start vsftpd 
[root@centos]# systemctl enable vsftpd 
Created symlink from /etc/systemd/system/multi-
user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

步骤 3 − 配置 FirewallD 以允许 FTP 控制和传输会话。

[root@centos]# firewall-cmd --add-service=ftp --permanent 
success 
[root@centos]#

确保我们的 FTP 守护进程正在运行。

[root@centos]# netstat -antup | grep vsftp 
tcp6       0       0 :::21       :::*       LISTEN       13906/vsftpd         
[root@centos]#

步骤 4 − 为 vsFTPD 配置匿名访问。

创建一个根 FTP 目录

[root@centos]# mkdir /ftp

将 FTP 根目录的所有者和组更改为ftp

[root@centos]# chown ftp:ftp /ftp
Set minimal permissions for FTP root:

[root@centos]# chmod -R 666 /ftp/

[root@centos]# ls -ld /ftp/
drw-rw-rw-. 2 ftp ftp 6 Feb 27 02:01 /ftp/

[root@centos]#

在这种情况下,我们授予用户对整个根 FTP 树的读写访问权限。

配置/etc/vsftpd/vsftpd.conf"

[root@centos]# vim /etc/vsftpd/vsftpd.conf
# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.

我们希望更改vsftp.conf文件中的以下指令。

  • 通过取消注释anon_mkdir_write_enable=YES启用匿名上传

  • 将上传的文件所有者更改为系统ftp用户

    chown_uploads = YES

    chown_username = ftp

  • 将 vsftp 使用的系统用户更改为 ftp 用户:nopriv_user = ftp

  • 设置用户在登录前阅读的自定义横幅。

    ftpd_banner = 欢迎使用我们的匿名 FTP 存储库。所有连接都会被监控和记录。

  • 让我们只设置 IPv4 连接 −

    listen = YES

    listen_ipv6 = NO

现在,我们需要重新启动或HUP vsftp 服务以应用我们的更改。

[root@centos]# systemctl restart vsftpd

让我们连接到我们的 FTP 主机,并确保我们的 FTP 守护进程正在响应。

[root@centos rdc]# ftp 10.0.4.34 
Connected to localhost (10.0.4.34). 
220 Welcome to our Anonymous FTP Repo. All connections are monitored and logged. 
Name (localhost:root): anonymous 
331 Please specify the password. 
Password: 
'230 Login successful. 
Remote system type is UNIX. 
Using binary mode to transfer files. 
ftp>

Linux 管理员 - 远程管理

在谈论 CentOS 中作为管理员的远程管理时,我们将探讨两种方法 −

  • 控制台管理
  • GUI 管理

远程控制台管理

远程控制台管理意味着通过 ssh 等服务通过命令行执行管理任务。要有效地使用 CentOS Linux 作为管理员,您需要熟练掌握命令行。Linux 的核心设计就是从控制台使用。即使在今天,一些系统管理员也更喜欢命令的强大功能,并通过运行没有物理终端且未安装 GUI 的精简版 Linux 机器来节省硬件成本。

远程 GUI 管理

远程 GUI 管理通常通过两种方式完成:远程 X 会话或 VNC 等 GUI 应用程序层协议。每种方法都有其优点和缺点。但是,在大多数情况下,VNC 是最好的管理选择。它允许从其他操作系统(例如 Windows 或 OS X)进行图形控制,这些操作系统本身不支持 X Windows 协议。

使用远程 X 会话是运行在 X 上的 X-Window 的窗口管理器和桌面管理器的原生功能。但是,整个 X 会话架构主要用于 Linux。并非每个系统管理员都会有 Linux 笔记本电脑来建立远程 X 会话。因此,最常见的是使用 VNC 服务器的适配版本。

VNC 最大的缺点是:VNC 本身不支持多用户环境,例如远程 X 会话。因此,对于最终用户的 GUI 访问,远程 X 会话是最佳选择。但是,我们主要关注的是远程管理 CentOS 服务器。

我们将讨论为多个管理员配置 VNC 与为数百个最终用户配置远程 X 会话的方案。

使用 SSH 打下远程控制台访问的安全基础

sshSecure Shell 现在是远程管理任何 Linux 服务器的标准方法。与 telnet 不同,SSH 使用 TLS 进行身份验证并对通信进行端到端加密。如果配置正确,管理员可以确信他们的密码和服务器在远程访问时都是安全的。

在配置 SSH 之前,让我们简单讨论一下基本安全性和最小权限访问。当 SSH 运行在其默认端口 22 上时;很快你就会遇到针对常用用户名和密码的暴力破解字典攻击。这是不可避免的。无论你将多少主机添加到你的拒绝文件,它们每天都会从不同的 IP 地址发起攻击。

通过一些常见的规则,你可以采取一些主动措施,让坏人浪费时间。以下是使用 SSH 进行生产服务器远程管理时应遵循的一些安全规则:

  • 切勿使用常用用户名或密码。系统上的用户名不应是系统默认用户名,也不应与公司电子邮件地址相关联,例如:[email protected]

  • 不允许通过 SSH 进行 root 访问或管理员访问。使用唯一的用户名,并在通过 SSH 身份验证后使用 su 切换到 root 或管理员帐户。

  • 密码策略是必须的:使用复杂的 SSH 用户密码,例如:“This&IS&a&GUD&P@ssW0rd&24&me”。每隔几个月更改一次密码,以消除对增量暴力破解攻击的易感性。

  • 禁用长时间未使用的帐户。例如,如果招聘经理的语音信箱显示一个月内不会进行面试,这可能会导致技术精湛且时间充裕的人有机可乘。

  • 每天检查日志。作为系统管理员,每天早上至少花 30-40 分钟查看系统和安全日志。如果被问到,告诉每个人你没有时间不积极主动。这种做法将有助于在问题影响最终用户和公司利润之前隔离警告信号。

关于 Linux 安全性的说明 - 任何对 Linux 管理感兴趣的人都应该积极关注当前的网络安全新闻和技术。虽然我们大多听到的是其他操作系统被入侵,但对于网络罪犯来说,一个不安全的 Linux 系统是一个备受追捧的宝藏。凭借高速互联网连接上的 Linux 强大功能,熟练的网络罪犯可以使用 Linux 来利用其他操作系统的漏洞发起攻击。

安装和配置 SSH 以进行远程访问

步骤 1 - 安装 SSH 服务器和所有依赖包。

[root@localhost]# yum -y install openssh-server 
'Loaded plugins: fastestmirror, langpacks 
Loading mirror speeds from cached hostfile 
* base: repos.centos.net 
* extras: repos.dfw.centos.com 
* updates: centos.centos.com 
Resolving Dependencies 
   --> Running transaction check 
   ---> Package openssh-server.x86_64 0:6.6.1p1-33.el7_3 will be installed 
   --> Finished Dependency Resolution 
Dependencies Resolved

步骤 2 - 创建一个安全的常规用户用于 shell 访问。

[root@localhost ~]# useradd choozer 
[root@localhost ~]# usermod -c "Remote Access" -d /home/choozer -g users -G 
wheel -a choozer

注意 - 我们将新用户添加到 wheel 组,这样在 SSH 身份验证后就可以 su 到 root 用户。我们还使用了在常用词表中找不到的用户名。这样,当 SSH 受到攻击时,我们的帐户就不会被锁定。

保存 sshd 服务器配置设置的文件是 /etc/ssh/sshd_config

我们最初需要编辑的部分是:

LoginGraceTime 60m
PermitRootLogin no

步骤 3 - 重新加载 SSH 守护进程 sshd

[root@localhost]# systemctl reload sshd

最好将注销宽限期设置为 60 分钟。一些复杂的管理任务可能超过默认的 2 分钟。当配置或研究更改时,SSH 会话超时真是令人沮丧的事情。

步骤 4 - 让我们尝试使用 root 凭据登录。

bash-3.2# ssh centos.vmnet.local 
[email protected]'s password:   
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

步骤 5 - 我们现在无法再使用 root 凭据通过 ssh 远程登录。所以让我们登录到我们的非特权用户帐户,然后 suroot 帐户。

bash-3.2# ssh [email protected]
[email protected]'s password:
[choozer@localhost ~]$ su root
Password:

[root@localhost choozer]#

步骤 6 - 最后,让我们确保 SSHD 服务在启动时加载,并且 firewalld 允许外部 SSH 连接。

[root@localhost]# systemctl enable sshd

[root@localhost]# firewall-cmd --permanent --add-service=ssh 
success

[root@localhost]# firewall-cmd --reload 
success
 
[root@localhost]#
 

SSH 现在已设置好并可用于远程管理。根据您的企业边界,可能需要配置数据包过滤边界设备以允许来自公司局域网外部的 SSH 远程管理。

配置 VNC 以进行远程 CentOS 管理

有几种方法可以在 CentOS 6-7 上通过 VNC 启用 CentOS 的远程管理。最简单但限制最多的一种方法是简单地使用名为 vino 的软件包。Vino 是一个为 Linux 设计的虚拟网络桌面连接应用程序,基于 Gnome 桌面平台。因此,假设安装已完成 Gnome 桌面。如果尚未安装 Gnome 桌面,请在继续之前安装。Vino 将默认情况下与 Gnome GUI 安装一起安装。

要在 Gnome 下使用 Vino 配置屏幕共享,我们需要进入 CentOS 系统首选项进行屏幕共享。

Applications->System Tools->Settings->Sharing

Sharing

Screen Sharing

Screen Sharing Authentication

配置 VNC 桌面共享的说明:

  • 禁用“新连接必须请求访问” - 此选项需要物理访问才能批准每个连接。此选项将阻止远程管理,除非有人在物理桌面前。

  • 启用“需要密码” - 这与用户密码是分开的。它将控制对虚拟桌面的访问,并且仍然需要用户密码才能访问锁定的桌面(这对安全性很有好处)。

  • 转发 UP&P 端口:如果可用,请保持禁用 - 转发 UP&P 端口将发送通用即插即用请求,以便 3 层设备自动允许 VNC 连接到主机。我们不想要这个。

确保 vino 正在 VNC 端口 5900 上监听。

[root@localhost]# netstat -antup | grep vino 
tcp        0        0 0.0.0.0:5900        0.0.0.0:*        LISTEN        4873/vino-server
tcp6       0        0 :::5900                :::*          LISTEN        4873/vino-server
   
[root@localhost]#

现在让我们配置防火墙以允许传入的 VNC 连接。

[root@localhost]# firewall-cmd --permanent --add-port=5900/tcp 
success

[root@localhost]# firewall-cmd --reload 
success

[root@localhost rdc]#

最后,正如您所看到的,我们能够连接我们的 CentOS 系统并在 Windows 或 OS X 上使用 VNC 客户端进行管理。

VNC client

遵守与我们为 SSH 制定的相同规则对于 VNC 同样重要。与 SSH 一样,VNC 不断地被扫描 IP 范围并测试弱密码。还值得注意的是,保留启用的默认 CentOS 登录名以及控制台超时有助于提高远程 VNC 安全性。由于攻击者需要 VNC 和用户密码,请确保屏幕共享密码不同,并且与用户密码一样难以猜测。

输入 VNC 屏幕共享密码后,我们还必须输入用户密码才能访问锁定的桌面。

VNC Screen Sharing Password

安全说明 - 默认情况下,VNC 不是加密协议。因此,应通过 SSH 建立 VNC 连接隧道以进行加密。

设置通过 VNC 的 SSH 隧道

设置 SSH 隧道将提供 SSH 加密层以通过隧道传输 VNC 连接。另一个很棒的功能是它使用 SSH 压缩为 VNC GUI 屏幕更新添加另一层压缩。在处理 CentOS 服务器管理时,更安全和更快总是好的!

因此,从将启动 VNC 连接的客户端开始,让我们设置一个远程 SSH 隧道。在此演示中,我们使用的是 OS X。首先,我们需要使用 sudo -s 切换到 root 用户。

bash-3.2# sudo -s 
password:

输入用户密码,我们现在应该拥有带 # 提示符的 root shell -

bash-3.2#

现在,让我们创建我们的 SSH 隧道

ssh -f [email protected] -L 2200:192.168.1.143:5900 -N

让我们分解这个命令:

  • ssh - 运行本地 ssh 实用程序

  • -f - 任务完全执行后,ssh 应在后台运行

  • [email protected] - 托管 VNC 服务的 CentOS 服务器上的远程 ssh 用户

  • -L 2200:192.168.1.143:5900 - 创建我们的隧道 [本地端口]:[远程主机]:[VNC 服务的远程端口]

  • -N 告诉 ssh 我们不希望在远程系统上执行命令

bash-3.2# ssh -f [email protected] -L 2200:192.168.1.143:5900 -N
[email protected]'s password:

成功输入远程 ssh 用户的密码后,我们的 ssh 隧道 就创建好了。现在是精彩的部分!要连接,我们将 VNC 客户端指向本地主机上的隧道端口,在本例中为端口 2200。以下是 Mac 笔记本电脑的 VNC 客户端配置:

SSH Tunnel

最后,我们的远程 VNC 桌面连接!

VNC Desktop Connection

SSH 隧道的好处在于它几乎可以用于任何协议。SSH 隧道通常用于绕过 ISP 的出站和入站端口过滤,以及在规避其他会话层监控的同时欺骗应用程序层 IDS/IPS。

  • 您的 ISP 可能会为非商业帐户过滤端口 5900,但允许在端口 22 上使用 SSH(如果端口 22 被过滤,则可以在任何端口上运行 SSH)。

  • 应用程序级 IPS 和 IDS 会查看有效负载。例如,常见的缓冲区溢出或 SQL 注入。端到端 SSH 加密将加密应用程序层数据。

SSH 隧道是 Linux 管理员工具箱中完成任务的好工具。但是,作为管理员,我们希望探索限制特权较低的用户的 SSH 隧道访问权限。

管理安全说明 - 限制 SSH 隧道需要管理员进行思考。评估用户首先需要 SSH 隧道的理由;哪些用户需要隧道;以及实际的风险概率和最坏情况的影响。

这是一个高级主题,超出了中级入门指南的范围。建议那些希望达到 CentOS Linux 管理高级水平的人对这个主题进行研究。

使用 SSH 隧道进行远程 X-Windows

与 Windows 相比,Linux 中 X-Windows 的设计非常巧妙。如果我们想从另一台 Linux 机器控制远程 Linux 机器,我们可以利用 X 中内置的机制。

X-Windows(通常简称为“X”)提供了一种机制,可以将来自一台 Linux 机器上的应用程序窗口显示到另一台 Linux 机器上的 X 显示部分。因此,通过 SSH,我们可以请求将 X-Windows 应用程序转发到世界各地的另一台 Linux 机器的显示器!

要通过 ssh 隧道远程运行 X 应用程序,我们只需要运行一个命令:

[root@localhost]# ssh -X [email protected]

语法是 - ssh -X [用户]@[主机],并且主机必须运行具有有效用户的 ssh。

以下是通过远程 XWindows ssh 隧道在 Ubuntu 工作站上运行 GIMP 的屏幕截图。

Use SSH Tunnel for Remote X-Windows

从另一台 Linux 服务器或工作站远程运行应用程序非常简单。还可以通过几种方法启动整个 X 会话并远程拥有整个桌面环境。

  • XDMCP

  • 无头软件包,例如 NX

  • 在X和GNOME或KDE等桌面管理器中配置备用显示器和桌面

此方法最常用于没有物理显示器的无头服务器,并且确实超出了中级入门指南的范围。但是,了解可用的选项仍然很有益。

Linux管理员 - CentOS中的流量监控

有一些第三方工具可以增强CentOS流量监控的功能。在本教程中,我们将重点介绍CentOS主发行版存储库和Fedora EPEL存储库中打包的那些工具。

总有一些情况,管理员(由于某种原因)只能使用CentOS主存储库中的工具。讨论的大多数实用程序都设计供管理员通过shell进行物理访问使用。当使用可访问的web-gui进行流量监控时,使用ntop-ng或Nagios等第三方实用程序是最佳选择(而不是从头创建此类工具)。

有关可配置web-gui解决方案的更多研究,以下是一些入门研究的链接。

局域网/广域网流量监控

Nagios

Nagios已经存在很长时间了,因此它经过了验证。曾经它完全是免费和开源的,但后来发展成为一个企业解决方案,并采用付费许可模式来满足企业复杂性的需求。因此,在计划任何使用Nagios的部署之前,请确保开源许可版本能够满足您的需求,或者计划预算用于企业级解决方案。

大多数开源Nagios流量监控软件都可以在以下网站找到:− https://www.nagios.org

有关Nagios的简要历史,请访问Nagios官方历史页面:https://www.nagios.org/about/history/

ntopng

另一个很棒的工具,允许通过web-gui进行带宽和流量监控,称为ntopngntopng类似于Unix实用程序ntop,可以收集整个局域网或广域网的数据。提供用于管理、配置和制图的web-gui,使整个IT部门易于使用。

与Nagios一样,ntopng也有开源和付费企业版可用。有关ntopng的更多信息,请访问以下网站:− http://www.ntop.org/

安装Fedora EPEL存储库 ─ 企业版Linux的额外软件包

要访问流量监控所需的一些工具,我们需要将CentOS系统配置为使用EPEL存储库。

EPEL存储库并非由CentOS官方维护或支持。但是,它由一群Fedora Core志愿者维护,以解决企业Linux专业人员常用的软件包,这些软件包未包含在CentOS、Fedora Core或Red Hat Enterprise Linux中。

警告

请记住,EPEL存储库并非CentOS官方存储库,可能会破坏生产服务器上具有公共依赖项的兼容性和功能。考虑到这一点,建议您始终在运行与生产服务器相同服务的非生产服务器上进行测试,然后再部署到关键系统。

实际上,与CentOS的任何其他第三方存储库相比,使用EHEL存储库的最大优势是我们可以确保二进制文件未被篡改。不使用来自不受信任来源的存储库被认为是最佳实践。

综上所述,EPEL官方存储库在CentOS中非常常见,可以通过YUM轻松安装。

[root@CentOS rdc]# yum -y install epel-release
 Loaded plugins: fastestmirror, langpacks
 Loading mirror speeds from cached hostfile
 * base: repo1.dal.innoscale.net
 * extras: repo1.dal.innoscale.net
 * updates: mirror.hmc.edu
Resolving Dependencies
   --> Running transaction check
   ---> Package epel-release.noarch 0:7-9 will be installed
   --> Finished Dependency Resolution
Dependencies Resolved
--{ condensed output }--

安装EPEL存储库后,我们需要更新它。

[root@CentOS rdc]# yum repolist 
Loaded plugins: fastestmirror, langpacks 
epel/x86_64/metalink
|  11 kB  00:00:00      
epel
| 4.3 kB  00:00:00      
(1/3): epel/x86_64/group_gz
| 170 kB  00:00:00      
(2/3): epel/x86_64/updateinfo
| 753 kB  00:00:01      
(3/3): epel/x86_64/primary_db
--{ condensed output }--

此时,我们的EPEL存储库应该已配置并可以使用。让我们首先安装nload来监控接口带宽。

本教程将重点介绍以下工具:

  • nload
  • ntop
  • ifstst
  • iftop
  • vnstat
  • net hogs
  • Wireshark
  • TCP Dump
  • Traceroute

这些都是Linux企业中监控流量的标准工具。每个工具的使用范围从简单到高级不等,因此我们只简要讨论Wireshark和TCP Dump等工具。

安装和使用nload

在CentOS中安装和配置EPEL存储库后,我们现在应该能够安装和使用nload。此实用程序旨在实时绘制每个接口的带宽。

与大多数其他基本安装一样,nload是通过YUM包管理器安装的。

[root@CentOS rdc]# yum -y install nload
Resolving Dependencies
--> Running transaction check
---> Package nload.x86_64 0:0.7.4-4.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================== 
=============================================================================== 
 Package                             Arch
 Version                           Repository                          Size 
=============================================================================== 
=============================================================================== 
Installing: 
 nload                               x86_64
 0.7.4-4.el7                        epel                                70 k  
Transaction Summary
=============================================================================== 
=============================================================================== 
Install  1 Package
Total download size: 70 k
Installed size: 176 k
Downloading packages:
--{ condensed output }--

现在我们已经安装了nload,使用它非常简单。

[root@CentOS rdc]# nload enp0s5

nload将监控指定的接口。在本例中,enp0s5是一个以太网接口,它将实时从终端监控网络流量负载和总带宽使用情况。

NLoad

如所见,nload将绘制指定接口的传入和传出数据,并提供带井号“#”的数据流的物理表示。

所示截图显示了一个简单的网页加载,其中包含一些后台守护程序流量。

nload的常用命令行开关:

命令 操作
-a 时间段
-t 时间更新间隔(毫秒),默认为500
-u 设置流量测量单位的显示 h
-U 设置总的输入/输出流量测量单位,选项与-u相同

nload的标准语法:

nload [options] <interface>

如果未指定接口,nload将自动获取第一个以太网接口。让我们尝试以兆字节为单位测量总数据输入/输出,并以兆位为单位测量当前数据传输速度。

[root@CentOS rdc]# nload -U M -u m

Speeds in Megabits

当前接口的传入/传出数据以兆比特每秒为单位测量,每行“Ttl”表示总的传入/传出数据,以兆字节显示。

nload可帮助管理员查看有多少数据已通过接口以及当前有多少数据正在传入/传出指定的接口。

要查看其他接口而不关闭nload,只需使用左右箭头键。这将循环遍历系统上所有可用的接口。

可以使用-m开关同时监控多个接口:

[root@CentOS rdc]# nload -u K -U M -m lo -m enp0s5

nload同时监控两个接口(lo和enp0s5):

Load

Linux管理员 - 日志管理

systemd改变了CentOS Linux系统日志的管理方式。系统上的每个守护程序不再将日志放置在单独的位置,然后使用tailgrep等工具作为排序和过滤日志条目的主要方式,而journald则为分析系统日志带来了单点管理。

systemd日志记录背后的主要组件是:journal、jounralctl和journald.conf

journald是主要的日志记录守护程序,通过编辑journald.conf进行配置,而journalctl用于分析journald记录的事件。

journald记录的事件包括:内核事件、用户进程和守护程序服务。

设置正确的系统时区

在使用journalctl之前,我们需要确保系统时间设置为正确的时间。为此,我们需要使用timedatectl

让我们检查当前的系统时间。

[root@centos rdc]# timedatectl status 
Local time: Mon 2017-03-20 00:14:49 MDT 
Universal time: Mon 2017-03-20 06:14:49 UTC 
RTC time: Mon 2017-03-20 06:14:49 
Time zone: America/Denver (MDT, -0600) 
NTP enabled: yes 
NTP synchronized: yes 
RTC in local TZ: no 
DST active: yes 
Last DST change: DST began at 
              Sun 2017-03-12 01:59:59 MST 
              Sun 2017-03-12 03:00:00 MDT 
Next DST change: DST ends (the clock jumps one hour backwards) at 
              Sun 2017-11-05 01:59:59 MDT 
              Sun 2017-11-05 01:00:00 MST
              
[root@centos rdc]#

目前,系统时间与本地时区一致。如果您的系统时间不正确,让我们设置正确的时区。更改设置后,CentOS将自动计算当前时区的时区偏移量,立即调整系统时钟。

让我们使用timedatectl列出所有时区:

[root@centos rdc]# timedatectl list-timezones 
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau

这是timedatectl list-timezones的输出结果。要查找特定的本地时区,可以使用grep命令:

[root@centos rdc]# timedatectl list-timezones | grep -i "america/New_York" 
America/New_York
[root@centos rdc]#

CentOS使用的标签通常是国家/地区,使用下划线而不是空格(New_York而不是“New York”)。

现在让我们设置我们的时区:

[root@centos rdc]# timedatectl set-timezone "America/New_York"

[root@centos rdc]# date 
Mon Mar 20 02:28:44 EDT 2017

[root@centos rdc]#

您的系统时钟应该会自动调整时间。

使用journalctl分析日志

使用journalctl时的常用命令行开关:

开关 操作
-k 仅列出内核消息
-u 按特定单元列出(httpd、sshd等…)
-b 引导标签偏移量
-o 日志输出格式
-p 按日志类型过滤(名称或编号)
-F 字段名或字段名值
--utc UTC偏移时间
--since 按时间范围过滤

检查引导日志

首先,我们将检查和配置CentOS Linux中的引导日志。您首先会注意到,CentOS默认情况下不存储跨重启的持久引导日志。

要检查每次重启的引导日志,我们可以发出以下命令:

[root@centos rdc]# journalctl --list-boots 
-4 bca6380a31a2463aa60ba551698455b5 Sun 2017-03-19 22:01:57 MDT—Sun 2017-03-19 22:11:02 MDT
-3 3aaa9b84f9504fa1a68db5b49c0c7208 Sun 2017-03-19 22:11:09 MDT—Sun 2017-03-19 22:15:03 MDT
-2 f80b231272bf48ffb1d2ce9f758c5a5f Sun 2017-03-19 22:15:11 MDT—Sun 2017-03-19 22:54:06 MDT
-1 a071c1eed09d4582a870c13be5984ed6 Sun 2017-03-19 22:54:26 MDT—Mon 2017-03-20 00:48:29 MDT
 0 9b4e6cdb43b14a328b1fa6448bb72a56 Mon 2017-03-20 00:48:38 MDT—Mon 2017-03-20 01:07:36 MDT

[root@centos rdc]#  

重启系统后,我们可以看到另一个条目。

[root@centos rdc]# journalctl --list-boots 
-5 bca6380a31a2463aa60ba551698455b5 Sun 2017-03-19 22:01:57 MDT—Sun 2017-03-19 22:11:02 MDT
-4 3aaa9b84f9504fa1a68db5b49c0c7208 Sun 2017-03-19 22:11:09 MDT—Sun 2017-03-19 22:15:03 MDT
-3 f80b231272bf48ffb1d2ce9f758c5a5f Sun 2017-03-19 22:15:11 MDT—Sun 2017-03-19 22:54:06 MDT
-2 a071c1eed09d4582a870c13be5984ed6 Sun 2017-03-19 22:54:26 MDT—Mon 2017-03-20 00:48:29 MDT
-1 9b4e6cdb43b14a328b1fa6448bb72a56 Mon 2017-03-20 00:48:38 MDT—Mon 2017-03-20 01:09:57 MDT
 0 aa6aaf0f0f0d4fcf924e17849593d972 Mon 2017-03-20 01:10:07 MDT—Mon 2017-03-20 01:12:44 MDT
 
[root@centos rdc]#

现在,让我们检查上次引导日志:

root@centos rdc]# journalctl -b -5 
-- Logs begin at Sun 2017-03-19 22:01:57 MDT, end at Mon 2017-03-20 01:20:27 MDT. --
Mar 19 22:01:57 localhost.localdomain systemd-journal[97]: Runtime journal is using 8.0M 
(max allowed 108.4M
Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpuset
Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpu
Mar 19 22:01:57 localhost.localdomain kernel: Initializing cgroup subsys cpuacct
Mar 19 22:01:57 localhost.localdomain kernel: Linux version 3.10.0514.6.2.el7.x86_64 
([email protected].
Mar 19 22:01:57 localhost.localdomain kernel: Command line: 
BOOT_IMAGE=/vmlinuz-3.10.0-514.6.2.el7.x86_64 ro
Mar 19 22:01:57 localhost.localdomain kernel: Disabled fast string operations
Mar 19 22:01:57 localhost.localdomain kernel: e820: BIOS-provided physical RAM map:

以上是上次引导的简化输出。我们还可以参考数小时、数天、数周、数月甚至数年前的引导日志。但是,CentOS默认情况下不存储持久引导日志。要启用持久存储引导日志,我们需要进行一些配置更改:

  • 创建引导日志的中央存储点
  • 为新的日志文件夹赋予正确的权限
  • 配置journald.conf以进行持久日志记录

配置持久引导日志的引导位置

journald最初想要存储持久引导日志的位置是/var/log/journal。由于默认情况下不存在此位置,让我们创建它:

[root@centos rdc]# mkdir /var/log/journal

现在,让我们为目录赋予journald守护程序访问权限:

systemd-tmpfiles --create --prefix /var/log/journal

最后,让我们告诉journald它应该存储持久引导日志。在vim或您喜欢的文本编辑器中,打开/etc/systemd/jounrald.conf"

# See journald.conf(5) for details.  
[Journal]=Storage=peristent

我们关注的行是Storage=。首先删除注释#,然后更改为Storage = persistent,如上所示。保存并重启CentOS系统,注意运行journalctl list-boots时应该有多个条目。

注意 − 来自VPS提供商的不断变化的machine-id可能会导致journald无法存储持久引导日志。对于这种情况,有很多解决方法。最好仔细阅读CentOS管理员论坛上发布的当前修复程序,然后遵循那些找到可行VPS解决方法的人的可靠建议。

要检查特定的引导日志,我们只需要使用journald --list-boots获取每个偏移量,然后使用-b开关加上偏移量。因此,要检查第二个引导日志,我们将使用:

journalctl -b -2

如果未指定引导日志偏移量,-b的默认值始终是上次重启后的当前引导日志。

按日志类型分析日志

journald的事件编号并分为7种不同的类型:

0 - emerg   :: System is unusable 
1 - alert   :: Action must be taken immediatly    
2 - crit    :: Action is advised to be taken immediatly 
3 - err     :: Error effecting functionality of application 
4 - warning :: Usually means a common issue that can affect security or usilbity 
5 - info    :: logged informtation for common operations 
6 - debug   :: usually disabled by default to troubleshoot functionality

因此,如果我们想查看所有警告,可以通过journalctl发出以下命令:

[root@centos rdc]# journalctl -p 4
-- Logs begin at Sun 2017-03-19 22:01:57 MDT, end at Wed 2017-03-22 22:33:42 MDT. --
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: RSDP 00000000000f6a10 00024
(v02 PTLTD )
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: XSDT 0000000095eea65b 0005C
(v01 INTEL  440BX    06040000 VMW  01
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: FACP 0000000095efee73 000F4
(v04 INTEL  440BX    06040000 PTL  00
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: DSDT 0000000095eec749 1272A
(v01 PTLTD  Custom   06040000 MSFT 03
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: FACS 0000000095efffc0 00040
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: BOOT 0000000095eec721 00028
(v01 PTLTD  $SBFTBL$ 06040000  LTP 00
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: APIC 0000000095eeb8bd 00742
(v01 PTLTD  ? APIC   06040000  LTP 00 
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: MCFG 0000000095eeb881 0003C
(v01 PTLTD  $PCITBL$ 06040000  LTP 00 
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: SRAT 0000000095eea757 008A8
(v02 VMWARE MEMPLUG  06040000 VMW  00 
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: HPET 0000000095eea71f 00038
(v01 VMWARE VMW HPET 06040000 VMW  00 
Mar 19 22:01:57 localhost.localdomain kernel: ACPI: WAET 0000000095eea6f7 00028
(v01 VMWARE VMW WAET 06040000 VMW  00 
Mar 19 22:01:57 localhost.localdomain kernel: Zone ranges: 
Mar 19 22:01:57 localhost.localdomain kernel:   DMA      [mem 0x000010000x00ffffff] 
Mar 19 22:01:57 localhost.localdomain kernel:   DMA32    [mem 0x010000000xffffffff] 
Mar 19 22:01:57 localhost.localdomain kernel:   Normal   empty 
Mar 19 22:01:57 localhost.localdomain kernel: Movable zone start for each node 
Mar 19 22:01:57 localhost.localdomain kernel: Early memory node ranges 
Mar 19 22:01:57 localhost.localdomain kernel:   node   0: [mem 0x000010000x0009dfff] 
Mar 19 22:01:57 localhost.localdomain kernel:   node   0: [mem 0x001000000x95edffff] 
Mar 19 22:01:57 localhost.localdomain kernel:   node   0: [mem 0x95f000000x95ffffff] 
Mar 19 22:01:57 localhost.localdomain kernel: Built 1 zonelists in Node order,
mobility grouping on.  Total pages: 60 
Mar 19 22:01:57 localhost.localdomain kernel: Policy zone: DMA32 
Mar 19 22:01:57 localhost.localdomain kernel: ENERGY_PERF_BIAS: Set to
'normal', was 'performance'

以上显示了系统过去4天中的所有警告。

使用systemd查看和浏览日志的新方法确实需要一些练习和研究才能熟悉。但是,凭借不同的输出格式,并特别注意使所有打包的守护程序日志通用化,它值得采用。journald比传统的日志分析方法提供了更大的灵活性和效率。

Linux管理员 - 备份与恢复

在探索CentOS中部署标准备份计划的特定方法之前,让我们首先讨论标准级别备份策略的典型考虑因素。我们首先要习惯的是3-2-1备份规则

3-2-1备份策略

在整个行业中,您经常会听到3-2-1备份模型这个术语。在实施备份计划时,这是一个非常好的方法。3-2-1定义如下:3份数据副本;例如,我们可能有工作副本;使用rsync在CentOS服务器上设计的冗余副本;并从备份服务器上的数据进行轮换的异地USB备份。2种不同的备份介质。在这种情况下,我们实际上将拥有三种不同的备份介质:笔记本电脑或工作站SSD上的工作副本,RADI6阵列上的CentOS服务器数据以及放在USB驱动器上的异地备份。1份异地数据副本;我们正在每晚轮换异地USB驱动器。另一种现代方法可能是云备份提供商。

系统恢复

裸机恢复计划仅仅是CentOS管理员制定的一个计划,用于使关键系统在线并保持所有数据完整。假设100%的系统故障和所有过去系统硬件的丢失,管理员必须有一个计划来实现正常运行时间,并保持用户数据完整,同时最大限度地减少停机时间。Linux中使用的单内核实际上使得使用系统映像进行裸机恢复比Windows更容易。而Windows使用的是微内核架构。

完整的 数据恢复和裸机恢复通常是通过多种方法组合完成的,包括关键运行服务器的工作配置生产磁盘映像,遵守3-2-1规则的用户数据的冗余备份。甚至一些敏感文件也可能存储在安全的防火安全柜中,只有值得信赖的公司人员才能有限地访问。

使用原生CentOS工具的多阶段裸机恢复数据恢复计划可能包括:

  • 使用dd创建和恢复已配置服务器的生产磁盘映像

  • 使用rsync制作所有用户数据的增量备份

  • 使用tar & gzip存储带有管理员密码和注释的加密备份文件。通常,这可以放在USB驱动器上,加密并锁在一个高级经理可以访问的安全柜中。此外,这还可以确保如果当前管理员中了彩票并消失到某个阳光明媚的岛屿上,其他人也会知道重要的安全凭据。

如果系统由于硬件故障或灾难而崩溃,则恢复操作的不同阶段如下:

  • 使用已配置的裸机映像构建工作服务器

  • 从备份中将数据恢复到工作服务器

  • 可以物理访问执行前两个操作所需的凭据

使用rsync进行文件级备份

rsync是一个用于在本地或其他服务器之间同步文件目录的强大实用程序。系统管理员多年来一直在使用rsync,因此它对于备份数据非常完善。在我看来,sync最好的功能之一是它可以从命令行进行脚本化。

在本教程中,我们将以各种方式讨论rsync:

  • 探讨和讨论一些常见选项
  • 创建本地备份
  • 通过SSH创建远程备份
  • 恢复本地备份

rsync的名称来源于其用途:远程同步,它功能强大且灵活。

以下是通过ssh进行的基本rsync远程备份:

MiNi:~ rdc$ rsync -aAvz --progress ./Desktop/ImportantStuff/ 
[email protected]:home/rdc/ Documents/RemoteStuff/
[email protected]'s password:
sending incremental file list
   6,148 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=23/25)
2017-02-14 16_26_47-002 - Veeam_Architecture001.png
   33,144 100%   31.61MB/s    0:00:00 (xfr#2, to-chk=22/25)
A Guide to the WordPress REST API | Toptal.pdf
   892,406 100%   25.03MB/s    0:00:00 (xfr#3, to-chk=21/25)
Rick Cardon Technologies, LLC..webloc
   77 100%    2.21kB/s    0:00:00 (xfr#4, to-chk=20/25)
backbox-4.5.1-i386.iso
   43,188,224   1%    4.26MB/s    0:08:29
sent 2,318,683,608 bytes  received 446 bytes  7,302,941.90 bytes/sec
total size is 2,327,091,863  speedup is 1.00
MiNi:~ rdc$

以下同步通过我们的局域网发送了近2.3GB的数据。rsync的美妙之处在于它在文件的基础上以块级别增量工作。这意味着,如果我们在1MB的文本文件中只更改了两个字符,那么在下一次同步时,只有1个或2个块将通过局域网传输!

此外,可以禁用增量功能,以便使用更多的网络带宽来减少CPU利用率。如果每10分钟在1Gb专用备份局域网上不断复制多个10MB的数据库文件,这可能被证明是可取的。原因是:这些文件将始终发生变化,并将每10分钟增量传输,这可能会增加远程CPU的负载。由于总传输负载不会超过5分钟,我们可能只想完整地同步数据库文件。

以下是rsync最常见的开关:

rsync syntax:
rsync [options] [local path] [[remote host:remote path] or [target path

开关 操作
-a 存档模式,包含-r、-p、-t、-g、-l
-d 仅同步目录树,不包含文件
-r 递归进入目录
-l 将符号链接复制为符号链接
-p 保留权限
-g 保留组
-v 详细输出
-z 通过网络链接压缩
-X 保留扩展属性
-A 保留ACL
-t 保留时间戳
-W 传输整个文件,而不是增量块
-u 不要覆盖目标上的文件
--progress 显示传输进度
--delete 删除目标上的旧文件
--max-size = XXX 要同步的最大文件大小

何时使用rsync

我个人更喜欢在将文件从源主机备份到目标主机时使用rsync。例如,所有用于数据恢复的主目录,甚至用于灾难恢复的异地和云端。

使用rsync进行本地备份

我们已经看到了如何将文件从一台主机传输到另一台主机。相同的方法可用于在本地同步目录和文件。

让我们手动对root用户目录中的/etc/进行增量备份。

首先,我们需要在~/root下为同步备份创建一个目录:

[root@localhost rdc]# mkdir /root/etc_baks

然后,确保有足够的可用磁盘空间。

[root@localhost rdc]# du -h --summarize /etc/ 
49M    /etc/
 
[root@localhost rdc]# df -h 
Filesystem           Size     Used     Avail    Use%     Mounted on 
/dev/mapper/cl-root   43G      15G        28G    35%         /

我们可以同步整个/etc/目录:

rsync -aAvr /etc/ /root/etc_baks/

我们同步的/etc/目录:

[root@localhost etc_baks]# ls -l ./
total 1436
drwxr-xr-x.   3 root root      101 Feb  1 19:40 abrt
-rw-r--r--.   1 root root       16 Feb  1 19:51 adjtime
-rw-r--r--.   1 root root     1518 Jun  7  2013 aliases
-rw-r--r--.   1 root root    12288 Feb 27 19:06 aliases.db
drwxr-xr-x.   2 root root       51 Feb  1 19:41 alsa
drwxr-xr-x.   2 root root     4096 Feb 27 17:11 alternatives
-rw-------.   1 root root      541 Mar 31  2016 anacrontab
-rw-r--r--.   1 root root       55 Nov  4 12:29 asound.conf
-rw-r--r--.   1 root root        1 Nov  5 14:16 at.deny
drwxr-xr-x.   2 root root       32 Feb  1 19:40 at-spi2
--{ condensed output }--

现在让我们进行增量rsync:

[root@localhost etc_baks]# rsync -aAvr --progress  /etc/ /root/etc_baks/
sending incremental file list

test_incremental.txt 
   0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=1145/1282)
   
sent 204620 bytes  received 2321 bytes  413882.00 bytes/sec
total size is 80245040  speedup is 387.77

[root@localhost etc_baks]#

只有我们的test_incremental.txt文件被复制。

使用rsync进行远程差分备份

让我们将初始rsync完整备份到已部署备份计划的服务器上。此示例实际上是将Mac OS X工作站上的文件夹备份到CentOS服务器。rsync的另一个优点是它可以用于任何已移植rsync的平台。

MiNi:~ rdc$ rsync -aAvz Desktop/ImportanStuff/
[email protected]:Documents/RemoteStuff
[email protected]'s password:
sending incremental file list
./
A Guide to the WordPress REST API | Toptal.pdf
Rick Cardon Tech LLC.webloc
VeeamDiagram.png
backbox-4.5.1-i386.iso
dhcp_admin_script_update.py
DDWRT/
DDWRT/.DS_Store
DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin
DDWRT/ddwrt_mod_notes.docx
DDWRT/factory-to-ddwrt.bin
open_ldap_config_notes/
open_ldap_config_notes/ldap_directory_a.png
open_ldap_config_notes/open_ldap_notes.txt
perl_scripts/
perl_scripts/mysnmp.pl
php_scripts/
php_scripts/chunked.php
php_scripts/gettingURL.php
sent 2,318,281,023 bytes  received 336 bytes  9,720,257.27 bytes/sec
total size is 2,326,636,892  speedup is 1.00
MiNi:~ rdc$

我们现在已将工作站上的文件夹备份到运行RAID6卷的服务器上,并对异地存储的轮换灾难恢复介质进行了备份。使用rsync使我们仅使用一台具有昂贵冗余磁盘阵列和轮换差分备份的服务器就实现了标准的3-2-1备份。

现在,让我们在添加名为test_file.txt的单个新文件后,使用rsync再次备份同一文件夹。

MiNi:~ rdc$ rsync -aAvz Desktop/ImportanStuff/
[email protected]:Documents/RemoteStuff 
[email protected]'s password:  
sending incremental file list 
 ./ 
test_file.txt

sent 814 bytes  received 61 bytes  134.62 bytes/sec
total size is 2,326,636,910  speedup is 2,659,013.61
MiNi:~ rdc$

正如您所看到的,只有新文件通过rsync传递到服务器。文件比较是在逐文件的基础上进行的。

需要注意的是:这只会复制新文件:test_file.txt,因为它只是唯一更改的文件。rsync使用ssh。我们不需要在任何一台机器上使用root帐户。

rsync简单、强大且有效,非常适合备份整个文件夹和目录结构。但是,rsync本身并不自动化此过程。我们需要深入研究我们的工具箱,找到最适合这项工作的简单工具。

要使用cronjobs自动执行rsync备份,必须使用SSH密钥进行身份验证来设置SSH用户。这与cronjobs相结合,使rsync能够按定时间隔自动执行。

使用DD进行逐块裸机恢复映像

DD是一个Linux实用程序,自从Linux内核满足GNU实用程序以来就存在了。

dd最简单的说法是复制选定磁盘区域的映像。然后提供复制物理磁盘选定块的能力。因此,除非您有备份,否则一旦dd覆盖磁盘,所有块都将被替换。即使是价格昂贵的高级数据恢复也无法恢复以前的数据丢失。

使用dd创建可启动系统映像的整个过程如下:

  • 从具有可启动Linux发行版的CentOS服务器启动
  • 查找要成像的可启动磁盘的名称
  • 确定存储恢复映像的位置
  • 查找磁盘上使用的块大小
  • 启动dd映像操作

在本教程中,为了节省时间和简便起见,我们将从CentOS虚拟机创建主引导记录的ISO映像。然后,我们将此映像存储在异地。如果我们的MBR损坏且需要恢复,则可以将相同的过程应用于整个可启动磁盘或分区。但是,对于本教程来说,所需的时间和磁盘空间确实有点过分了。

鼓励CentOS管理员在测试环境中熟练掌握恢复完全可启动的磁盘/分区并执行裸机恢复。当最终需要在现实生活中与管理人员和几十个最终用户一起进行练习时,这将减轻很多压力。在这种情况下,10分钟的摸索时间似乎像一个永恒,让人汗流浃背。

注意:使用dd时,请确保不要混淆源卷和目标卷。您可以通过将备份位置复制到启动驱动器来破坏数据和可启动服务器。或者,可能更糟糕的是,使用DD在非常低的级别覆盖数据,从而永远破坏数据。

以下是dd常见的命令行开关和参数:

开关 操作
if= 要复制的输入文件或源
of= 输出文件或输入文件的副本
bs 设置输入和输出块大小
obs 设置输出文件块大小
ibs 设置输入文件块大小
count 设置要复制的块数
conv 要添加的额外成像选项
Noerror 不要停止处理错误
同步 如果发生错误或未对齐,则填充不合适的输入块

关于块大小的说明 − dd 的默认块大小为 512 字节。这是较低密度硬盘的标准块大小。如今,更高密度硬盘的块大小已增加到 4096 字节 (4kB),以支持 1TB 及更大的磁盘。因此,在使用 dd 处理较新、较高容量的硬盘之前,我们需要检查磁盘块大小。

在本教程中,我们将使用在 VMware 中运行的 CentOS 安装程序,而不是在生产服务器上使用 *dd*。我们还将配置 VMware 以引导可启动的 Linux ISO 镜像,而不是使用可启动的 USB 闪存盘。

首先,我们需要下载名为 *CentOS Gnome ISO* 的 CentOS 镜像。该镜像大小接近 3GB,建议始终保留一份副本,用于创建可启动的 USB 闪存盘以及引导虚拟服务器安装程序以进行故障排除和裸机镜像。

其他可启动的 Linux 发行版也能正常工作。Linux Mint 可用于可启动的 ISO 镜像,因为它具有强大的硬件支持和完善的 GUI 磁盘维护工具。

CentOS GNOME Live 可启动镜像可从以下地址下载:http://buildlogs.centos.org/rolling/7/isos/x86_64/CentOS-7-x86_64-LiveGNOME.iso

让我们配置 VMware Workstation 安装程序以从我们的 Linux 可启动镜像引导。这些步骤适用于 OS X 上的 VMware。但是,它们在 Linux、Windows 上的 VMware Workstation 甚至 Virtual Box 上也类似。

注意 − 使用 Virtual Box 或 VMware Workstation 等虚拟桌面解决方案是设置实验室场景以学习 CentOS 管理任务的好方法。它提供了安装多个 CentOS 安装程序的能力,几乎无需硬件配置,从而使人们能够专注于管理,甚至可以在进行更改之前保存服务器状态。

首先,让我们配置一个虚拟 CD-ROM 并连接我们的 ISO 镜像以进行引导,而不是虚拟 CentOS 服务器安装程序 −

ISO image

现在,设置启动磁盘 −

Startup Disk

现在引导时,我们的虚拟机将从 CentOS 可启动 ISO 镜像引导,并允许访问先前配置的虚拟 CentOS 服务器上的文件。

让我们检查我们的磁盘,看看我们想从哪里复制 MBR(精简输出如下所示)。

MiNt ~ # fdisk -l
Disk /dev/sda: 60 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

我们已经找到我们的物理磁盘:*sda* 和 *sdb*。每个磁盘的块大小为 512 字节。因此,我们现在将运行 *dd* 命令来复制 SDA1 上 MBR 的前 512 字节。

最好的方法是 −

[root@mint rdc]# dd if=/dev/sda bs=512 count=1  | gzip -c >
/mnt/sdb/images/mbr.iso.gz 
1+0 records in 
1+0 records out 
512 bytes copied, 0.000171388 s, 3.0 MB/s

[root@mint rdc]# ls /mnt/sdb/ 
   mbr-iso.gz
   
[root@mint rdc]#

就这样,我们得到了主引导记录的完整镜像。如果我们有足够的存储空间来镜像引导驱动器,我们可以轻松地制作完整的系统引导镜像 −

dd if=/dev/INPUT/DEVICE-NAME-HERE conv=sync,noerror bs=4K | gzip -c >
/mnt/sdb/boot-server-centos-image.iso.gz

*conv=sync* 用于必须对物理介质进行字节对齐的情况。在这种情况下,如果未读取精确的 4K 对齐(例如…只有 3K 但需要在磁盘上占用至少一个 4K 块的文件。或者,读取时 simply 出现错误且 dd 无法读取文件。),则 dd 可能会出错。因此,带有 *conv=sync,noerror* 的 *dd* 将使用无关紧要但有用的数据将 3K 填充到 4K 块对齐的物理介质中。同时不会出现可能结束大型操作的错误。

处理来自磁盘的数据时,我们始终希望包含:*conv=sync,noerror* 参数。

这仅仅是因为磁盘不像 TCP 数据那样是流。它们是由对齐到特定大小的块组成的。例如,如果我们有 512 字节的块,则只有 300 字节的文件仍然需要 512 字节的磁盘空间(可能需要 2 个块用于 inode 信息,例如权限和其他文件系统信息)。

使用 gzip 和 tar 进行安全存储

gzip 和 tar 是 CentOS 管理员必须习惯使用的两个实用程序。它们的用途远不止于解压缩存档。

在 CentOS Linux 中使用 Gnu Tar

Tar 是一种存档实用程序,类似于 Windows 上的 *winrar*。其名称 *Tape Archive*(缩写为 *tar*)几乎概括了该实用程序的功能。*tar* 将获取文件并将它们放入存档中,以方便逻辑处理。因此,我们可以将存储在 /etc 中的数十个文件“tar”成一个存档,以便备份和存储。

*tar* 多年来一直是 Unix 和 Linux 上存储存档文件的标准。因此,将 *tar* 与 *gzip* 或 *bzip* 结合使用被认为是每个系统上存档的最佳实践。

以下是 *tar* 常用的常用命令行开关和选项列表 −

开关 操作
-c 创建一个新的 .tar 存档
-C 解压到不同的目录
-j 使用 bzip2 压缩
-z 使用 gzip 压缩
-v 详细显示存档进度
-t 列出存档内容
-f 存档的文件名
-x 解压 tar 存档

以下是创建 *tar* 存档的基本语法。

tar -cvf [tar archive name]

关于 tar 的压缩机制的说明 − 建议在使用 tar 时坚持使用两种常见的压缩方案之一:gzip 和 bzip2。gzip 文件消耗的 CPU 资源较少,但通常大小较大。虽然 bzip2 的压缩时间较长,它们会使用更多的 CPU 资源;但最终文件大小会更小。

使用文件压缩时,我们始终希望使用标准文件扩展名,让包括我们在内的每个人都知道(而不是通过反复试验来猜测)需要什么压缩方案来解压存档。

bzip2 .tbz
bzip2 .tar.tbz
bzip2 .tb2
gzip .tar.gz
gzip .tgz

如果需要可能在 Windows 机器上解压存档或在 Windows 上使用,建议使用 * .tar.tbz* 或 * .tar.gz*,因为大多数三个字符的单个扩展名会混淆 Windows 和仅限 Windows 的管理员(但是,这有时是预期的结果)

让我们从 Mac 工作站复制的远程备份创建一个 *gzipped* tar 存档 −

[rdc@mint Documents]$ tar -cvz -f RemoteStuff.tgz ./RemoteStuff/ 
./RemoteStuff/
./RemoteStuff/.DS_Store
./RemoteStuff/DDWRT/
./RemoteStuff/DDWRT/.DS_Store
./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin
./RemoteStuff/DDWRT/ddwrt_mod_notes.docx
./RemoteStuff/DDWRT/factory-to-ddwrt.bin
./RemoteStuff/open_ldap_config_notes/
./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png
./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt
./RemoteStuff/perl_scripts/
./RemoteStuff/perl_scripts/mysnmp.pl
./RemoteStuff/php_scripts/
./RemoteStuff/php_scripts/chunked.php
./RemoteStuff/php_scripts/gettingURL.php
./RemoteStuff/A Guide to the WordPress REST API | Toptal.pdf
./RemoteStuff/Rick Cardon Tech LLC.webloc
./RemoteStuff/VeeamDiagram.png
./RemoteStuff/backbox-4.5.1-i386.iso
./RemoteStuff/dhcp_admin_script_update.py
./RemoteStuff/test_file.txt
[rdc@mint Documents]$ ls -ld RemoteStuff.tgz
-rw-rw-r--. 1 rdc rdc 2317140451 Mar 12 06:10 RemoteStuff.tgz

注意 − 我们没有直接将所有文件添加到存档中,而是存档了整个文件夹 *RemoteStuff*。这是最简单的方法。因为解压后,整个目录 *RemoteStuff* 将与当前工作目录中的所有文件一起解压为 *./currentWorkingDirectory/RemoteStuff/*

现在让我们在 */root/* 主目录中解压存档。

[root@centos ~]# tar -zxvf RemoteStuff.tgz
./RemoteStuff/
./RemoteStuff/.DS_Store
./RemoteStuff/DDWRT/
./RemoteStuff/DDWRT/.DS_Store
./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin
./RemoteStuff/DDWRT/ddwrt_mod_notes.docx
./RemoteStuff/DDWRT/factory-to-ddwrt.bin
./RemoteStuff/open_ldap_config_notes/
./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png
./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt
./RemoteStuff/perl_scripts/
./RemoteStuff/perl_scripts/mysnmp.pl
./RemoteStuff/php_scripts/
./RemoteStuff/php_scripts/chunked.php
./RemoteStuff/php_scripts/gettingURL.php
./RemoteStuff/A Guide to the WordPress REST API | Toptal.pdf
./RemoteStuff/Rick Cardon Tech LLC.webloc
./RemoteStuff/VeeamDiagram.png
./RemoteStuff/backbox-4.5.1-i386.iso
./RemoteStuff/dhcp_admin_script_update.py
./RemoteStuff/test_file.txt
[root@mint ~]# ping www.google.com

如上所示,所有文件都只是解压到当前工作目录中的包含目录中。

[root@centos ~]# ls -l 
total 2262872 
-rw-------.   1   root   root       1752   Feb   1   19:52   anaconda-ks.cfg 
drwxr-xr-x. 137   root   root       8192   Mar   9   04:42   etc_baks 
-rw-r--r--.   1   root   root       1800   Feb   2   03:14   initial-setup-ks.cfg 
drwxr-xr-x.   6   rdc    rdc        4096   Mar  10   22:20   RemoteStuff 
-rw-r--r--.   1   root   root 2317140451   Mar  12   07:12   RemoteStuff.tgz 
-rw-r--r--.   1   root   root       9446   Feb  25   05:09   ssl.conf [root@centos ~]#

使用 gzip 压缩文件备份

如前所述,我们可以使用命令行开关 * -j* 或 * -z* 从 tar 中使用 bzip2 或 gzip。我们还可以使用 gzip 压缩单个文件。但是,单独使用 bzip 或 gzip 并没有提供与与 *tar* 结合使用时一样多的功能。

使用 *gzip* 时,默认操作是删除原始文件,并用添加了 .gz 扩展名的压缩版本替换每个原始文件。

gzip 的一些常用命令行开关是 −

开关 操作
-c 放入存档后保留文件
-l 获取压缩存档的统计信息
-r 递归压缩目录中的文件
-1 到 9 指定 1 到 9 级别的压缩级别

*gzip* 或多或少基于逐个文件进行工作,而不是像某些 Windows 操作系统 zip 实用程序那样基于存档进行工作。其主要原因是 *tar* 已经提供了高级存档功能。*gzip* 的设计仅提供压缩机制。

因此,想到 *gzip* 时,请考虑单个文件。想到多个文件时,请考虑 *tar* 存档。现在让我们通过之前的 *tar* 存档来探索这一点。

注意 − 经验丰富的 Linux 专业人员通常将 tar 存档称为 tarball(tar 包)。

让我们从我们的 *rsync* 备份中创建另一个 *tar* 存档。

[root@centos Documents]# tar -cvf RemoteStuff.tar ./RemoteStuff/
[root@centos Documents]# ls
RemoteStuff.tar RemoteStuff/

为了演示,让我们 *gzip* 新创建的 tarball,并告诉 *gzip* 保留旧文件。默认情况下,如果没有 * -c* 选项,gzip 将用 *.gz* 文件替换整个 tar 存档。

[root@centos Documents]# gzip -c RemoteStuff.tar > RemoteStuff.tar.gz
[root@centos Documents]# ls
RemoteStuff  RemoteStuff.tar  RemoteStuff.tar.gz
We now have our original directory, our tarred directory and finally our gziped tarball.

让我们尝试使用 *gzip* 测试 * -l* 开关。

[root@centos Documents]# gzip -l RemoteStuff.tar.gz  
     compressed        uncompressed        ratio uncompressed_name 
     2317140467          2326661120        0.4% RemoteStuff.tar
     
[root@centos Documents]#

为了演示 *gzip* 与 Windows Zip 实用程序的不同之处,让我们在文本文件文件夹上运行 gzip。

[root@centos Documents]# ls text_files/
 file1.txt  file2.txt  file3.txt  file4.txt  file5.txt
[root@centos Documents]#

现在让我们使用 -r 选项递归压缩目录中的所有文本文件。

[root@centos Documents]# gzip -9 -r text_files/

[root@centos Documents]# ls ./text_files/
file1.txt.gz  file2.txt.gz  file3.txt.gz  file4.txt.gz  file5.txt.gz
 
[root@centos Documents]#

看到?并非有些人预期的那样。所有原始文本文件都被删除,每个文件都被单独压缩。由于这种行为,最好只在需要处理单个文件时考虑使用 *gzip*。

使用 *tarball*,让我们将 *rsynced* tarball 解压到新目录。

[root@centos Documents]# tar -C /tmp -zxvf RemoteStuff.tar.gz
./RemoteStuff/
./RemoteStuff/.DS_Store
./RemoteStuff/DDWRT/
./RemoteStuff/DDWRT/.DS_Store
./RemoteStuff/DDWRT/ddwrt-linksys-wrt1200acv2-webflash.bin
./RemoteStuff/DDWRT/ddwrt_mod_notes.docx
./RemoteStuff/DDWRT/factory-to-ddwrt.bin
./RemoteStuff/open_ldap_config_notes/
./RemoteStuff/open_ldap_config_notes/ldap_directory_a.png
./RemoteStuff/open_ldap_config_notes/open_ldap_notes.txt
./RemoteStuff/perl_scripts/
./RemoteStuff/perl_scripts/mysnmp.pl
./RemoteStuff/php_scripts/
./RemoteStuff/php_scripts/chunked.php

如上所示,我们将 tarball 解压到 /tmp 目录。

[root@centos Documents]# ls /tmp 
hsperfdata_root
RemoteStuff

加密 Tarball 存档

加密 tarball 存档以存储可能需要其他组织员工访问的安全文档(例如灾难恢复)可能是一个棘手的概念。基本上有三种方法可以做到这一点:使用 GnuPG,或使用 openssl,或使用第三方实用程序。

GnuPG 主要设计用于非对称加密,并且考虑到身份关联,而不是密码短语。诚然,它可以与对称加密一起使用,但这并不是 GnuPG 的主要优势。因此,当需要多于原始人员访问的人员(例如,可能需要保护公司经理免受管理员利用所有“王国钥匙”作为杠杆的情况)时,我会不考虑使用 GnuPG 来存储具有物理安全性的存档。

像 GnuPG 一样,openssl 可以做我们想做的事情,并且随 CentOS 一起提供。但是,它并非专门设计用于实现我们想要的功能,并且加密在安全社区中受到质疑。

我们的选择是一个名为 **7zip** 的实用程序。7zip 是一种类似于 *gzip* 的压缩实用程序,但具有更多功能。与 Gnu Gzip 一样,7zip 及其标准也在开源社区中。我们只需要从我们的 EHEL 存储库安装 7zip(下一章将详细介绍安装扩展企业存储库)。

在 Centos 上安装 7zip

一旦我们的 EHEL 存储库在 CentOS 中加载并配置,7zip 的安装就非常简单。

[root@centos Documents]# yum -y install p7zip.x86_64 p7zip-plugins.x86_64
Loaded plugins: fastestmirror, langpacks
base
| 3.6 kB  00:00:00
epel/x86_64/metalink
|  13 kB  00:00:00
epel
| 4.3 kB  00:00:00
extras
| 3.4 kB  00:00:00
updates
| 3.4 kB  00:00:00
(1/2): epel/x86_64/updateinfo
| 756 kB  00:00:04      
(2/2):
epel/x86_64/primary_db
| 4.6 MB  00:00:18
Loading mirror speeds from cached hostfile
--> Running transaction check
---> Package p7zip.x86_64 0:16.02-2.el7 will be installed
---> Package p7zip-plugins.x86_64 0:16.02-2.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved

就这么简单,7zip 已安装并可以使用 256 位 AES 加密来加密我们的 tarball 存档。

现在让我们使用 7z 使用密码加密我们的 gzip 存档。执行此操作的语法非常简单 −

7z a -p <output filename><input filename>

其中,**a:** 添加到存档,**-p:** 加密并提示输入密码

[root@centos Documents]# 7z a -p RemoteStuff.tgz.7z RemoteStuff.tar.gz

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R)
Core(TM) i5-4278U CPU @ 2.60GHz (40651),ASM,AES-NI)
Scanning the drive:
1 file, 2317140467 bytes (2210 MiB)

Creating archive: RemoteStuff.tgz.7z

Items to compress: 1

Enter password (will not be echoed):
Verify password (will not be echoed) :

Files read from disk: 1
Archive size: 2280453410 bytes (2175 MiB)
Everything is Ok
[root@centos Documents]# ls
RemoteStuff  RemoteStuff.tar  RemoteStuff.tar.gz  RemoteStuff.tgz.7z  slapD
text_files

[root@centos Documents]#

现在,我们有一个 .7z 压缩包,它使用 256 位 AES 加密 gzip 压缩的 tar 包。

注意 − 7zip 使用 256 位 AES 加密,并使用密码的 SHA-256 哈希值和计数器,重复最多 512K 次进行密钥派生。如果使用复杂的密钥,这应该足够安全。

对于较大的压缩包,加密和重新压缩归档文件的过程可能需要一些时间。

7zip 是一款高级工具,功能比 gzip 或 bzip2 更强大。但是,它在 CentOS 或 Linux 世界中并不像其他工具那样标准。因此,应尽可能多地使用其他实用程序。

Linux 管理员 - 系统更新

CentOS 7 系统可以通过三种方式更新:

  • 手动
  • 自动
  • 手动更新主要安全问题并配置自动更新

在生产环境中,建议手动更新生产服务器。或者至少制定一个更新计划,以便管理员可以确保对业务运营至关重要的服务。

简单的安全更新可能会导致常用应用程序出现递归问题,这需要管理员进行升级和重新配置。因此,在生产环境中安排自动更新之前,请务必先在开发服务器和桌面进行测试。

手动更新 CentOS 7

要更新 CentOS 7,我们需要熟悉 `yum` 命令。`yum` 用于处理 CentOS 7 中的软件包存储库。`yum` 是通常用于执行以下操作的工具:

  • 更新 CentOS 7 Linux 系统
  • 搜索软件包
  • 安装软件包
  • 检测并安装软件包所需的依赖项

为了使用 `yum` 进行更新,您的 CentOS 服务器需要连接到互联网。大多数配置将安装基本系统,然后使用 `yum` 查询主要的 CentOS 存储库以获取软件包中的其他功能并应用系统更新。

我们已经使用 `yum` 安装了一些软件包。使用 `yum` 时,始终需要以 root 用户身份执行操作。或者具有 root 权限的用户。

[root@centos rdc]# yum search nano
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.rackspace.com
 * epel: mirror.chpc.utah.edu
 * extras: repos.forethought.net 
 * updates: repos.forethought.net 
====================================================================== 
      N/S matched: nano 
======================================================================
nano.x86_64 : A small text editor
nodejs-nano.noarch : Minimalistic couchdb driver for Node.js
perl-Time-Clock.noarch : Twenty-four hour clock object with nanosecond precision
 Name and summary matches only, use "search all" for everything.
 
[root@centos rdc]#

现在,让我们安装 `nano` 文本编辑器。

[root@centos rdc]# yum install nano
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.keystealth.org
 * epel: pubmirror1.math.uh.edu
 * extras: centos.den.host-engine.com
 * updates: repos.forethought.net
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.3.1-10.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================  
Package                             Arch
Version                          Repository                            Size  
================================================================================  
 Installing: 
 nano                               x86_64
 2.3.1-10.el7                    base                                  440 k
 
Transaction Summary
Install  1 Package
Total download size: 440 k
Installed size: 1.6 M
Is this ok [y/d/N]: y
Downloading packages:
nano-2.3.1-10.el7.x86_64.rpm
| 440 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : nano-2.3.1-10.el7.x86_64
1/1  
 Verifying  : nano-2.3.1-10.el7.x86_64
1/1  
Installed: 
 nano.x86_64 0:2.3.1-10.el7
 
Complete!

[root@centos rdc]#

我们已经安装了 nano 文本编辑器。我认为,这种方法比在网站上搜索实用程序并手动运行安装程序要容易得多。此外,存储库使用数字签名来验证软件包,确保它们来自受信任的来源。当信任新的存储库时,管理员有责任验证其真实性。这就是为什么建议谨慎对待第三方存储库的原因。

Yum 也可以用来删除软件包。

[root@centos rdc]# yum remove nano 
Loaded plugins: fastestmirror, langpacks 
Resolving Dependencies 
--> Running transaction check 
---> Package nano.x86_64 0:2.3.1-10.el7 will be erased 
--> Finished Dependency Resolution

Dependencies Resolved 

现在让我们检查更新。

[root@centos rdc]# yum list updates
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.keystealth.org
 * epel: pubmirror1.math.uh.edu
 * extras: centos.den.host-engine.com
 * updates: repos.forethought.net
Updated Packages
NetworkManager.x86_64           1:1.4.0-17.el7_3       updates
NetworkManager-adsl.x86_64      1:1.4.0-17.el7_3       updates
NetworkManager-glib.x86_64      1:1.4.0-17.el7_3       updates
NetworkManager-libnm.x86_64     1:1.4.0-17.el7_3       updates
NetworkManager-team.x86_64      1:1.4.0-17.el7_3       updates
NetworkManager-tui.x86_64       1:1.4.0-17.el7_3       updates
NetworkManager-wifi.x86_64      1:1.4.0-17.el7_3       updates
audit.x86_64                    2.6.5-3.el7_3.1        updates
audit-libs.x86_64               2.6.5-3.el7_3.1        updates
audit-libs-python.x86_64

如所示,我们有几十个更新等待安装。实际上,由于我们尚未配置自动更新,因此大约有 100 个更新。因此,让我们安装所有挂起的更新。

[root@centos rdc]# yum update
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.usc.edu
 * epel: pubmirror1.math.uh.edu
 * extras: repos.forethought.net
 * updates: repos.forethought.net
Resolving Dependencies
--> Running transaction check
---> Package NetworkManager.x86_64 1:1.4.0-14.el7_3 will be updated
---> Package NetworkManager.x86_64 1:1.4.0-17.el7_3 will be an update
 selinux-policy            noarch      3.13.1102.el7_3.15      updates     414 k
 selinux-policy-targeted   noarch      3.13.1102.el7_3.15      updates     6.4 M 
 systemd                   x86_64      21930.el7_3.7           updates     5.2 M 
 systemd-libs              x86_64      21930.el7_3.7           updates     369 k 
 systemd-python            x86_64      21930.el7_3.7           updates     109 k 
 systemd-sysv              x86_64      21930.el7_3.7           updates     63 k 
 tcsh                      x86_64      6.18.01-13.el7_3.1      updates     338 k 
 tzdata                    noarch      2017a1.el7              updates     443 k 
 tzdata-java               noarch      2017a1.el7              updates     182 k 
wpa_supplicant             x86_64      1:2.021.el7_3           updates     788 k  

Transaction Summary 
=============================================================================== 
  Install   2 Packages 
  Upgrade  68 Packages 
Total size: 196 M 
Total download size: 83 M 
Is this ok [y/d/N]:

按下“y”键后,CentOS 7 的更新将开始。`yum` 更新时通常会经历以下过程:

  • 检查当前软件包
  • 在存储库中查找更新的软件包
  • 计算更新的软件包所需的依赖项
  • 下载更新
  • 安装更新

现在,让我们确保我们的系统是最新的:

[root@centos rdc]# yum list updates 
Loaded plugins: fastestmirror, langpacks 
Loading mirror speeds from cached hostfile 
 * updates: mirror.compevo.com

[root@centos rdc]#

如您所见,没有列出任何更新。

配置 YUM 的自动更新

如前所述,在企业环境中,自动更新可能不是首选的安装方法。让我们来看一下使用 yum 配置自动更新的步骤。

首先,我们安装一个名为 `yum-cron` 的软件包。

[root@centos rdc]# yum -y install yum-cron
Install  1 Package
Total download size: 61 k
Installed size: 51 k
Downloading packages:
yum-cron-3.4.3-150.el7.centos.noarch.rpm
|  61 kB  00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : yum-cron-3.4.3-150.el7.centos.noarch
1/1
  Verifying  : yum-cron-3.4.3-150.el7.centos.noarch
1/1

Installed: 
 yum-cron.noarch 0:3.4.3-150.el7.centos
 
Complete!

[root@centos rdc]#  

默认情况下,`yum-cron` 只下载更新,而不安装它们。是否自动安装更新取决于管理员。最大的问题是:有些更新需要重新启动系统。此外,有些更新可能需要在服务再次运行之前进行配置更改。

更新依赖项可能会在以下情况下导致递归问题:

  • yum 建议更新某个库

  • 该库只支持 Apache 服务器 2.4,但我们有 2.3 服务器

  • 我们的电子商务网站依赖于特定版本的 PHP

  • 为该库安装的新版 Apache 需要升级 PHP

  • 我们的生产 Web 应用程序尚未在新版 PHP 版本上进行测试

除非配置为不这样做,否则 yum 可能会在未经通知的情况下自动升级 Apache 和 PHP。

如果所有 5 种情况都发生,可能会导致从早上的一场大麻烦到可能危及用户数据的安全漏洞。虽然上述示例是一种完美的风暴,但我们永远不想发生这种情况。

管理员需要评估由于更新重新引导和重新配置导致的可能服务停机时间而造成的潜在收入损失的情况。对于每天数百万美元的电子商务网站来说,这种做法可能不够保守。

现在让我们配置 `yum-cron` 以自动安装系统更新。

[root@centos rdc]# vim /etc/yum/yum-cron.conf
# Whether updates should be applied when they are available.  Note
# that download_updates must also be yes for the update to be applied.
apply_updates = yes

我们要将 `apply_updates = no` 更改为 `apply_updates = yes`。现在让我们配置 `yum-cron` 的更新间隔。

同样,是否使用自动更新并根据需要安装更新可能是一把双刃剑,管理员需要针对每种独特情况进行考虑。

Linux 管理员 - Shell 脚本

Bash Shell 简介

与 GNU Linux 的各种发行版一样,shell 也有多种类型,并且兼容性各不相同。CentOS 中的默认 shell 称为 Bash 或 Bourne Again Shell。Bash shell 是 Stephen Bourne 开发的现代修改版 Bourne Shell。Bash 直接取代了 Ken Thompson 和 Dennis Ritchie 在贝尔实验室开发的 Unix 操作系统上的原始 Thompson Shell(Stephen Bourne 也是贝尔实验室的雇员)。

每个人都有自己喜欢的 shell,每个 shell 都有其优点和缺点。但在大多数情况下,Bash 将成为所有 Linux 发行版中的默认 shell,并且是最常用的。随着经验的积累,每个人都希望探索和使用最适合自己的 shell。但与此同时,每个人也都希望掌握 Bash shell。

其他 Linux shell 包括:Tcsh、Csh、Ksh、Zsh 和 Fish。

掌握任何 Linux shell 的专业技能对于 CentOS 管理员来说极其重要。正如我们前面提到的,与 Windows 不同,Linux 本质上是一个命令行操作系统。shell 只是一种用户界面,允许管理员(或用户)向操作系统发出命令。如果 Linux 系统管理员是一位航空公司飞行员,那么使用 shell 就类似于将飞机从自动驾驶仪上移开并抓住手动控制装置以进行更灵活的飞行。

Linux shell(如 Bash)在计算机科学术语中被称为命令行解释器。Microsoft Windows 也有两个命令行解释器,称为 DOS(不要与原始 DOS 操作系统混淆)和 PowerShell。

大多数现代 shell(如 Bash)都提供结构,允许更复杂的shell 脚本来自动执行常见和复杂的任务。

结构包括:

  • 脚本流程控制(ifthen 和 else)
  • 逻辑比较运算(大于、小于、等于)
  • 循环
  • 变量
  • 定义操作的参数(类似于命令的开关)

使用 Shell 脚本与脚本语言

在考虑执行任务时,管理员经常会问自己:我应该使用 shell 脚本还是使用 Perl、Ruby 或 Python 等脚本语言?

这里没有固定的规则。shell 与脚本语言之间只有典型的区别。

Shell

Shell 允许使用 Linux 命令,例如 `sed`、`grep`、`tee`、`cat` 和 Linux 操作系统上的所有其他基于命令行的实用程序。事实上,几乎任何基于命令行的 Linux 实用程序都可以在您的 shell 中编写脚本。

使用 shell 的一个很好的例子是快速脚本,用于检查主机列表的 DNS 解析。

我们简单的 Bash 脚本用于检查 DNS 名称:

#!/bin/bash 
for name in $(cat $1);
   do 
      host $name.$2 | grep "has address" 
   done 
exit

用于测试 DNS 解析的小型词表:

dns 
www 
test 
dev 
mail 
rdp 
remote

针对 google.com 域的输出:

[rdc@centos ~]$  ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote

[rdc@centos ~]$

利用 shell 中简单的 Linux 命令,我们能够创建一个简单的 5 行脚本,用于审核来自词表的 DNS 名称。即使使用良好实现的 DNS 库,这在 Perl、Python 或 Ruby 中也需要相当长的时间。

脚本语言

脚本语言将提供 shell 之外的更多控制。上述 Bash 脚本使用了 Linux `host` 命令的包装器。如果我们想做更多的事情并创建我们自己的类似于 `host` 的应用程序来与 shell 之外进行交互呢?这就是我们将使用脚本语言的地方。

此外,使用维护良好的脚本语言,我们知道我们的操作在大多数情况下可以在不同的系统上运行。例如,Python 3.5 将在运行 Python 3.5 并安装相同库的任何其他系统上运行。但是,如果我们想在 Linux 和 HP-UX 上运行我们的 BASH 脚本,情况就不是这样了。

有时,脚本语言和强大的 shell 之间的界限可能会模糊。可以使用 Python、Perl 或 Ruby 自动执行 CentOS Linux 管理任务。这样做实际上非常普遍。此外,熟练的 shell 脚本开发人员已经在 Bash 中创建了一个简单但功能完善的 Web 服务器守护程序。

在掌握了脚本语言和在 shell 中自动执行任务的经验后,CentOS 管理员将能够快速确定在需要解决问题时从哪里开始。通常情况下,项目是从 shell 脚本开始的。然后随着项目的复杂性增加,再转向脚本(或编译)语言。

此外,可以使用脚本语言和 shell 脚本完成项目的不同部分。一个例子可能是使用 Perl 脚本抓取网站。然后,使用 shell 脚本使用 `sed`、`awk` 和 `egrep` 进行解析和格式化。最后,使用 PHP 脚本通过 Web GUI 将格式化后的数据插入 MySQL 数据库。

在了解了 shell 的一些理论之后,让我们开始学习从 CentOS 的 Bash shell 自动执行任务的基本构建块。

输入输出和重定向

将标准输出处理到另一个命令:

[rdc@centos ~]$ cat ~/output.txt | wc -l 
6039 
[rdc@centos ~]$

上面,我们将 `cat` 的标准输出传递给 `wc` 进行处理,使用管道字符。`wc` 然后处理 `cat` 的输出,将 output.txt 的行数打印到终端。将管道字符视为将一个命令的输出传递给下一个命令的“管道”。

以下是处理命令重定向时需要记住的关键概念:

编号 文件描述符 字符
0 标准输入 <
1 标准输出 >
2 标准错误
追加标准输出 >>
分配重定向 &
将标准输出通过管道传输到标准输入 |

我们在第一章中介绍了这个概念,但并没有过多讨论重定向或重定向的分配。在 Linux 中打开终端时,你的 shell 被视为默认目标 -

  • 标准输入 < 0
  • 标准输出 > 1
  • 标准错误 2

让我们看看它是如何工作的 -

[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 
 COMMAND   PID   USER    **FD**   TYPE DEVICE   SIZE/OFF   NODE      NAME 
 bash    13684    rdc    **0u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **1u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **2u**   CHR  136,0      0t0     3      /dev/pts/0
 
[rdc@centos ~]$  

/dev/pts/0 是我们的伪终端。CentOS Linux 会查看它,并将我们打开的终端应用程序视为一个真正的终端,其键盘和显示器通过串行接口连接。但是,就像 hypervisor 将硬件抽象到操作系统一样,/dev/pts 将我们的终端抽象到应用程序。

从上面的 lsof 命令中,我们可以看到在 **FD** 列中,所有三个文件描述符都设置为我们的虚拟终端 (0,1,2)。现在我们可以发送命令、查看命令输出以及与命令相关的任何错误。

以下是 STDIN 和 STDOUT 的示例 -

STDOUT

[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT. 
[root@centosLocal centos]#

也可以将 stdoutstderr 发送到不同的文件 -

bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt 
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#

在搜索整个文件系统时,遇到两个错误。每个错误都被发送到单独的文件以供以后查看,而返回的结果则被放置到一个单独的文本文件中。

在执行向终端输出大量数据的操作(例如编译应用程序)时,将 stderr 发送到文本文件非常有用。这允许查看可能因终端滚动历史记录而丢失的错误。

将 STDOUT 传递到文本文件时需要注意一点,那就是 **>>** 和 **>** 之间的区别。双“>>”将追加到文件,而单数形式将覆盖文件并写入新内容(因此所有先前的数据都将丢失)。

STDIN

[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.

[root@centosLocal centos]#

在上面的命令中,文本文件 stdin.txt 被重定向到 cat 命令,该命令将其内容回显到 STDOUT

管道字符 "|"

管道字符将获取第一个命令的输出,将其作为输入传递到下一个命令,允许第二个命令对输出执行操作。

现在,让我们将 cat 的 stdout “管道”到另一个命令 -

[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#

上面,wc 对从管道传递的 cat 的输出执行计算。管道命令在过滤 grepegrep 的输出时特别有用 -

[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l  
9000 
[root@centosLocal centos]#

在上面的命令中,我们将每个 4 位数字从包含 65535 到所有数字的文本文件(通过 egrep 过滤器传递)传递到 wc

使用 & 重定向输出

可以使用 **&** 字符重定向输出。如果我们想将 STDOUT 和 STDERR 的输出都重定向到同一个文件,则可以按如下方式完成 -

[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt  
find: /dev/fd/3: Not a directory 
find: /dev/fd/4: Not a directory 
/etc/passwd

[root@centosLocal centos]#

使用 **&** 字符进行重定向的工作原理如下:首先,输出被重定向到 out.txt。其次,STDERR 或文件描述符 2 被重新分配到与 STDOUT 相同的位置,在本例中为 out.txt

重定向非常有用,在解决处理大型文本文件、编译源代码、重定向 shell 脚本中的输出以及发出复杂的 Linux 命令时遇到的问题时非常方便。

虽然功能强大,但对于较新的 CentOS 管理员来说,重定向可能会变得很复杂。练习、研究和偶尔向 Linux 论坛(例如 Stack Overflow Linux)提问将有助于解决高级问题。

Bash Shell 结构

现在我们已经很好地了解了 Bash shell 的工作原理,让我们学习一些常用的基本结构来编写脚本。在本节中,我们将探讨 -

BASH 故障排除提示

与专用脚本语言相比,BASH 可能有点棘手。BASH 脚本中最大的障碍之一是错误转义或未转义传递到 shell 的脚本操作。如果你已经检查过脚本几次,但它没有按预期工作,请不要担心。即使对于那些每天使用 BASH 创建复杂脚本的人来说,这也是很常见的。

快速搜索 Google 或注册专家 Linux 论坛提问将很快得到解决。很有可能有人遇到过完全相同的问题,并且它已经被解决了。

BASH 脚本是一种快速创建强大脚本的绝佳方法,这些脚本可用于从自动化管理任务到创建有用工具的一切用途。成为一名专家级的 BASH 脚本开发者需要时间和实践。因此,尽可能使用 BASH 脚本,它是 CentOS 管理工具箱中的一款强大工具。

Linux 管理员 - 包管理

CentOS 中的包管理可以通过两种方式执行:从终端和从图形用户界面。

CentOS 管理员的大部分时间往往都用于使用终端。更新和安装 CentOS 包也不例外。考虑到这一点,我们将首先探讨终端中的包管理,然后触及使用 CentOS 提供的图形包管理工具。

YUM 包管理器

YUM 是 CentOS 中提供的包管理工具。我们在前几章中简要介绍了这个主题。在本章中,我们将从干净的 CentOS 安装开始。我们将首先完全更新我们的安装,然后安装一个应用程序。

YUM 极大地促进了 Linux 中的软件安装和管理。YUM 会“自动”检查过时的依赖项以及过时的包。与从源代码编译每个应用程序的旧时代相比,这确实减轻了 CentOS 管理员的负担。

yum check-update

检查可以更新的包。在本教程中,我们将假设这是一个将面向互联网的生产系统,没有任何需要在升级包之前由 DevOps 测试的生产应用程序。现在让我们将更新的候选包安装到系统中。

[root@localhost rdc]# yum check-update
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.scalabledns.com
 * extras: mirror.scalabledns.com
 * updates: mirror.clarkson.edu
NetworkManager.x86_64                     1:1.4.0-19.el7_3              updates
NetworkManager-adsl.x86_64                1:1.4.0-19.el7_3              updates 
NetworkManager-glib.x86_64                1:1.4.0-19.el7_3              updates 
NetworkManager-libnm.x86_64               1:1.4.0-19.el7_3              updates 
NetworkManager-team.x86_64                1:1.4.0-19.el7_3              updates 
NetworkManager-tui.x86_64                 1:1.4.0-19.el7_3              updates 
NetworkManager-wifi.x86_64                1:1.4.0-19.el7_3              updates 
audit.x86_64                              2.6.5-3.el7_3.1               updates    
vim-common.x86_64                         2:7.4.160-1.el7_3.1           updates 
vim-enhanced.x86_64                       2:7.4.160-1.el7_3.1           updates 
vim-filesystem.x86_64                     2:7.4.160-1.el7_3.1           updates 
vim-minimal.x86_64                        2:7.4.160-1.el7_3.1           updates 
wpa_supplicant.x86_64                     1:2.0-21.el7_3                updates 
xfsprogs.x86_64                           4.5.0-9.el7_3                 updates

[root@localhost rdc]#

yum update

这将安装所有更新的候选包,使您的 CentOS 安装保持最新。对于新安装,这可能需要一些时间,具体取决于您的安装和互联网连接速度。

[root@localhost rdc]# yum update

vim-minimal                        x86_64    2:7.4.160-1.el7_3.1     updates    436 k 
wpa_supplicant                     x86_64    1:2.0-21.el7_3          updates    788 k 
xfsprogs                           x86_64    4.5.0-9.el7_3           updates    895 k  

Transaction Summary 
======================================================================================
Install    2 Packages 
Upgrade  156 Packages  
Total download size: 371 M

Is this ok [y/d/N]:

通过 YUM 安装软件

除了更新 CentOS 系统外,YUM 包管理器是我们安装软件的首选工具。从网络监控工具、视频播放器到文本编辑器,都可以通过 YUM 从中央存储库安装。

在安装一些软件实用程序之前,让我们看看一些 YUM 命令。对于日常工作,CentOS 管理员 90% 的 YUM 使用量大约是 7 个命令。我们将介绍每一个命令,希望能够熟悉在日常使用中熟练操作 YUM。但是,像大多数 Linux 实用程序一样,YUM 提供了丰富的先进功能,始终可以通过手册页进行探索。使用 man yum 将始终是使用任何 Linux 实用程序执行不熟悉操作的第一步。

最常用的 YUM 命令

以下是常用的 YUM 命令。

命令 操作
list installed 列出通过 YUM 安装的包
list all 列出所有当前可用的包
group list 列出分组的包
info 提供有关包的详细信息
search 搜索包描述和名称
install 安装包
localinstall 安装本地 rpm 包
remove 删除和安装包
clean all 清除 /var/cache/yum 以释放磁盘空间
man yum 像所有 linux 命令一样,帮助文件

使用 YUM 安装软件

我们现在将安装一个名为 Lynx 的基于文本的 Web 浏览器。在安装之前,我们必须首先获取包含 Lynx Web 浏览器的包名称。我们甚至不能 100% 确定我们的默认 CentOS 存储库是否提供 Lynx Web 浏览器的包,所以让我们搜索一下 -

[root@localhost rdc]# yum search web browser
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.scalabledns.com
 * extras: mirror.scalabledns.com 
 * updates: mirror.clarkson.edu 
=================================================================
N/S matched: web, browser
================================================================== 
icedtea-web.x86_64 : Additional Java components for OpenJDK - Java browser
plug-in and Web Start implementation
elinks.x86_64 : A text-mode Web browser
firefox.i686 : Mozilla Firefox Web browser
firefox.x86_64 : Mozilla Firefox Web browser
lynx.x86_64 : A text-based Web browser

Full name and summary matches only, use "search all" for everything.
 
[root@localhost rdc]#

我们看到,CentOS 确实在存储库中提供了 Lynx Web 浏览器。让我们看看有关该包的更多信息。

[root@localhost rdc]# lynx.x86_64
bash: lynx.x86_64: command not found...
[root@localhost rdc]# yum info lynx.x86_64
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.scalabledns.com
 * extras: mirror.scalabledns.com
 * updates: mirror.clarkson.edu
Available Packages
Name        : lynx
Arch        : x86_64
Version     : 2.8.8
Release     : 0.3.dev15.el7
Size        : 1.4 M
Repo        : base/7/x86_64
Summary     : A text-based Web browser
URL         : http://lynx.isc.org/
License     : GPLv2
Description : Lynx is a text-based Web browser. Lynx does not display any images, 
            : but it does support frames, tables, and most other HTML tags. One 
            : advantage Lynx has over graphical browsers is speed; Lynx starts and
            : exits quickly and swiftly displays web pages.
            
[root@localhost rdc]#

很好!2.8 版本足够新,所以让我们安装 Lynx。

[root@localhost rdc]# yum install lynx
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.scalabledns.com
 * extras: mirror.scalabledns.com
 * updates: mirror.clarkson.edu 
Resolving Dependencies
--> Running transaction check 
---> Package lynx.x86_64 0:2.8.8-0.3.dev15.el7 will be installed 
--> Finished Dependency Resolution  
Dependencies Resolved  
===============================================================================
===============================================================================
Package                          Arch
Version                       Repository                    Size 
===============================================================================
===============================================================================
Installing: 
 lynx                           x86_64
2.8.80.3.dev15.el7              base                        1.4 M

Transaction Summary
===============================================================================
===============================================================================
Install  1 Package

Total download size: 1.4 M 
Installed size: 5.4 M 
Is this ok [y/d/N]: y 
Downloading packages: 
No Presto metadata available for base
lynx-2.8.8-0.3.dev15.el7.x86_64.rpm
| 1.4 MB  00:00:10      
Running transaction check 
Running transaction test 
Transaction test succeeded 
Running transaction 
   Installing : lynx-2.8.8-0.3.dev15.el7.x86_64
1/1
   Verifying  : lynx-2.8.8-0.3.dev15.el7.x86_64
1/1

Installed: 
   lynx.x86_64 0:2.8.8-0.3.dev15.el7
Complete!

[root@localhost rdc]#  

接下来,让我们确保 Lynx 确实正确安装了。

[root@localhost rdc]# yum list installed | grep -i lynx

lynx.x86_64                   2.8.8-0.3.dev15.el7              @base     
[root@localhost rdc]#

太棒了!让我们使用 Lynx 并看看没有“点赞”和漂亮图片的网络是什么样的。

[root@localhost rdc]# lynx www.tutorialpoint.in

Install Software with YUM

太好了,现在我们有一个用于生产服务器的 Web 浏览器,可以在无需过多担心通过网络启动的远程攻击的情况下使用。这对生产服务器来说是一件好事。

我们快完成了,但是首先我们需要为开发人员设置此服务器以测试应用程序。因此,让我们确保他们拥有完成工作所需的所有工具。我们可以单独安装所有内容,但 CentOS 和 YUM 使此过程快得多。让我们安装 开发人员组包

[root@localhost rdc]# yum groups list 
Loaded plugins: fastestmirror, langpacks 
Loading mirror speeds from cached hostfile 
 * base: mirror.scalabledns.com 
 * extras: mirror.scalabledns.com 
 * updates: mirror.clarkson.edu
 
Available Groups: 
   Compatibility Libraries 
   Console Internet Tools 
   Development Tools 
   Graphical Administration Tools
   Legacy UNIX Compatibility 
   Scientific Support 
   Security Tools 
   Smart Card Support 
   System Administration Tools 
   System Management 
Done

[root@localhost rdc]#

这是 CentOS 提供的较小的包组列表。让我们看看“开发组”中包含什么。

[root@localhost rdc]# yum group info "Development Tools" 
Loaded plugins: fastestmirror, langpacks 
There is no installed groups file. 
Maybe run: yum groups mark convert (see man yum) 
Loading mirror speeds from cached hostfile 
 * base: mirror.scalabledns.com 
 * extras: mirror.scalabledns.com 
 * updates: mirror.clarkson.edu
 
Group: Development Tools 
Group-Id: development 
Description: A basic development environment. 
Mandatory Packages: 
autoconf 
automake 
binutils 
bison 

输出的第一屏如上所示。整个列表相当全面。但是,随着时间的推移,通常需要完整安装此组。让我们安装整个开发组。

[root@localhost rdc]# yum groupinstall "Development Tools"

这将是一个较大的安装。完成后,您的服务器将拥有大多数 Perl、Python、C 和 C++ 的开发库和编译器。

CentOS 中的图形化包管理

Gnome 桌面提供了一个名为 Software 的图形化包管理工具。它非常易于使用且简单明了。CentOS 的 Gnome 包管理工具 Software 可以通过导航到:应用程序 → 系统工具 → Software 来找到。

软件包管理工具分为几组,允许管理员选择要安装的包。虽然此工具非常易于使用,并且对于最终用户来说非常简单,但 YUM 功能更强大,管理员可能会更多地使用它。

以下是软件包管理工具的屏幕截图,并非真正为系统管理员设计。

Software Package Management Tool

Linux 管理员 - 卷管理

逻辑卷管理 (LVM) 是 Linux 用于跨不同物理硬盘管理存储卷的一种方法。这与 RAID 不同,但其概念类似于 RAID 0 或 J-Bod。使用 LVM,可以(例如)拥有三个各为 1TB 的物理磁盘,然后创建一个大约 3TB 的逻辑卷,例如 /dev/sdb。甚至可以创建两个 1.5TB 的逻辑卷,五个 500GB 的逻辑卷,或者任何组合。单个磁盘甚至可以用于逻辑卷的快照。

注意 − 正确配置后,使用逻辑卷实际上会提高磁盘 I/O 性能。这与 RAID 0 将数据跨多个磁盘条带化的方式类似。

学习使用 LVM 进行卷管理时,如果我们知道 LVM 中每个组件是什么,就会更容易。请学习下表以全面掌握每个组件。如有需要,请使用 Google 搜索学习。了解逻辑卷的每个部分对于管理它们非常重要。

PV 物理卷 sda
PP 物理分区 sda1 , sda2
VG 卷组 合并的物理资源
LV 逻辑卷 对操作系统来说是一个存储设备

物理卷 将显示为 /dev/sda、/dev/sdb;Linux 检测到的物理磁盘。

物理分区 将是磁盘实用程序(如 fdisk)分区的一段磁盘。请记住,在大多数常见的 LVM 设置中不推荐使用物理分区。示例:磁盘 /dev/sda 分区为包含两个物理分区:/dev/sda1/dev/sda1

如果我们有两个各为 1TB 的物理磁盘,我们可以在这两个磁盘之间创建一个近 2TB 的卷组

从卷组中,我们可以创建三个逻辑卷,每个逻辑卷的大小不超过卷组的总大小。

传统的 Linux 磁盘管理工具

在了解 CentOS 7 中用于 LVM 管理的最新最佳功能工具之前,我们应该首先探索用于 Linux 磁盘管理的更传统工具。这些工具将会派上用场,并且仍然可以与当今的先进 LVM 工具(如系统存储管理器 - lsblk、parted 和 mkfs.xfs)一起使用。

现在,假设我们向系统添加了另一个或两个磁盘,我们需要枚举 Linux 检测到的磁盘。我始终建议在执行被认为是破坏性操作之前每次都枚举磁盘。lsblk 是获取磁盘信息的绝佳工具。让我们看看 CentOS 检测到哪些磁盘。

[root@localhost rdc]# lsblk
NAME         MAJ:MIN    RM    SIZE    RO    TYPE MOUNTPOINT
sda            8:0       0     20G     0        disk 
├─sda1         8:1       0      1G     0     part /boot
└─sda2         8:2       0     19G     0        part 
  ├─cl-root  253:0       0     17G     0      lvm  /
  └─cl-swap  253:1       0      2G     0      lvm  [SWAP]
    sdb       8:16       0      6G     0       disk 
    sdc       8:32       0      4G     0       disk 
    sr0       11:0       1   1024M     0       rom 

如您所见,此系统上有三个磁盘:sda、sdb 和 sdc。

磁盘 sda 包含我们正在使用的 CentOS 安装,因此我们不想随意操作 sda。sdbsdc 都是为此教程添加到系统的。让我们使这些磁盘对 CentOS 可用。

创建磁盘标签

[root@localhost rdc]# parted /dev/sdb mklabel GPT
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this
   disk will be lost. Do you want to continue?
Yes/No? Yes                               
[root@localhost rdc]#

我们现在已经标记了一个磁盘。只需以相同的方式在 sdc 上运行 parted 命令。

创建磁盘分区

我们每个磁盘只创建一个分区。要创建分区,再次使用 parted 命令。

[root@localhost rdc]# parted -a opt /dev/sdb mkpart primary ext4 0% 100%

警告 − 您请求从 0.00B 到 6442MB(扇区 0..12582911)的分区。

我们可以管理的最接近的位置是 17.4kB 到 1048kB(扇区 34..2047)。

您仍然接受吗?

是/否?否

[root@localhost rdc]# parted -a opt /dev/sdc mkpart primary ext4 0% 100%

信息 − 您可能需要更新 /etc/fstab。

[root@localhost rdc]# lsblk                                               
NAME        MAJ:MIN   RM    SIZE    RO    TYPE MOUNTPOINT
sda           8:0      0     20G     0        disk 
├─sda1        8:1      0      1G     0      part / boot
└─sda2        8:2      0     19G     0        part 
 ├─cl-root  253:0      0     17G     0       lvm  /
 └─cl-swap  253:1      0      2G     0       lvm  [SWAP]
sdb          8:16      0      6G     0        disk 
└─sdb1       8:17      0      6G     0        part 
 sdc         8:32      0      4G     0        disk 
└─sdc1       8:33      0      4G     0        part 
sr0          11:0      1   1024M     0        rom

[root@localhost rdc]#

从 lsblk 输出可以看出,我们现在有两个分区,每个分区都在 sdb 和 sdc 上。

创建文件系统

最后,在挂载和使用任何卷之前,我们需要添加一个文件系统。我们将使用 XFS 文件系统。

root@localhost rdc]# mkfs.xfs -f /dev/sdb1
meta-data = /dev/sdb1               isize = 512    agcount = 4, agsize = 393088 blks
            =                      sectsz = 512    attr = 2, projid32bit = 1
            =                         crc = 1      finobt = 0, sparse = 0
data        =                       bsize = 4096   blocks = 1572352, imaxpct = 25
            =                       sunit = 0      swidth = 0 blks
naming      = version 2             bsize = 4096   ascii-ci = 0 ftype = 1
log         = internal log          bsize = 4096   blocks = 2560, version = 2
            =                      sectsz = 512    sunit = 0 blks, lazy-count = 1
realtime    = none                  extsz = 4096   blocks = 0, rtextents = 0
[root@localhost rdc]# mkfs.xfs -f /dev/sdc1
meta-data   = /dev/sdc1             isize = 512    agcount = 4, agsize = 262016 blks
            =                      sectsz = 512    attr = 2, projid32bit = 1
            =                         crc = 1      finobt = 0, sparse = 0
data        =                       bsize = 4096   blocks = 1048064, imaxpct = 25
            =                       sunit = 0      swidth = 0 blks
naming      = version 2             bsize = 4096   ascii-ci = 0 ftype = 1
log         = internal log          bsize = 4096   blocks = 2560, version = 2
            =                      sectsz = 512    sunit = 0 blks, lazy-count = 1
realtime    = none                  extsz = 4096   blocks = 0, rtextents = 0

[root@localhost rdc]# 

让我们检查一下每个文件系统是否可用。

[root@localhost rdc]# lsblk -o NAME,FSTYPE
NAME           FSTYPE
sda         
├─sda1         xfs
└─sda2         LVM2_member
 ├─cl-root     xfs
 └─cl-swap     swap
sdb         
└─sdb1         xfs
sdc         
└─sdc1         xfs
sr0

[root@localhost rdc]# 

每个现在都使用 XFS 文件系统。让我们挂载它们,检查挂载点,并将文件复制到每个挂载点。

[root@localhost rdc]# mount -o defaults /dev/sdb1 /mnt/sdb
[root@localhost rdc]# mount -o defaults /dev/sdc1 /mnt/sdc

[root@localhost ~]# touch /mnt/sdb/myFile /mnt/sdc/myFile
[root@localhost ~]# ls /mnt/sdb /mnt/sdc
 /mnt/sdb:
  myFile

 /mnt/sdc:
  myFile

此时我们有两个可用的磁盘。但是,只有手动挂载它们后才能使用它们。要启动时挂载每个磁盘,我们必须编辑 fstab 文件。此外,必须为需要访问新磁盘的组设置权限。

创建卷组和逻辑卷

CentOS 7 最大的改进之一是包含了一个名为系统存储管理器ssm 的实用程序。系统存储管理器极大地简化了在 Linux 上管理 LVM 池和存储卷的过程。

我们将介绍在 CentOS 中创建简单的卷池和逻辑卷的过程。第一步是安装系统存储管理器。

[root@localhost rdc]# yum  install system-storage-manager

让我们使用 ssm list 命令查看我们的磁盘。

SSM List Command

如上所示,系统上总共安装了三个磁盘。

  • /sdba1 − 托管我们的 CentOS 安装

  • /sdb1 − 挂载在 /mnt/sdb

  • /sdc1 − 挂载在 /mnt/sdc

我们要做的是使用两个磁盘(sdb 和 sdc)创建一个卷组。然后使系统可以使用三个 3GB 的逻辑卷。

让我们创建卷组。

[root@localhost rdc]# ssm create -p NEW_POOL /dev/sdb1 /dev/sdc1

默认情况下,ssm 将创建一个扩展整个 10GB 池的单个逻辑卷。我们不想要这个,所以让我们删除它。

[root@localhost rdc]# ssm remove /dev/NEW_POOL/lvol001
 Do you really want to remove active logical volume NEW_POOL/lvol001? [y/n]: y
 Logical volume "lvol001" successfully removed
[root@localhost rdc]# 

最后,让我们创建三个逻辑卷。

[root@localhost rdc]# ssm create -n disk001 --fs xfs -s 3GB -p NEW_POOL
[root@localhost rdc]# ssm create -n disk002 --fs xfs -s 3GB -p NEW_POOL
[root@localhost rdc]# ssm create -n disk003 --fs xfs -s 3GB -p NEW_POOL

现在,让我们检查我们的新卷。

Volumes

我们现在拥有三个跨越两个物理磁盘分区的独立逻辑卷。

逻辑卷是现在内置于 CentOS Linux 的一项强大功能。我们已经接触了管理这些逻辑卷的表面内容。掌握池和逻辑卷需要实践和从 Tutorials Point 等资源中进行扩展学习。目前,您已经学习了 CentOS 中 LVM 管理的基础知识,并且能够在单个主机上创建基本的条带化逻辑卷。

广告