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 : 根 : 根
  • -rw-r--r-- : 根 : 根
  • drwxr-xr-x : 根 : 根

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

d 表示对象类型是目录
读写 表示应用于所有者的目录权限
接收 表示应用于组的目录权限
接收 表示应用于世界的目录权限
第一个实例,表示目录的所有者
第二个实例,表示应用组权限的组

理解所有者群体世界之间的区别很重要。不了解这一点可能会对托管互联网服务的服务器产生重大影响。

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

请查看下表,然后继续执行说明。

八进制 象征性的 烫发。 目录
1 X 执行 进入目录并访问文件
2 w 删除或修改目录下的文件
4 r 列出目录中的文件

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

对目录和文件应用权限

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

  • 符号权限
  • 八进制权限

本质上,它们都是相同的,但引用和分配文件权限的方式不同。如需快速指南,请研究并参考下表 -

执行
八进制 4 2 1
象征性的 r w X

使用八进制方法分配权限时,请使用3字节数字,例如:760。数字760翻译为:所有者:rwx;组:RW;其他(或世界)没有权限。

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

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

现在您可能想知道,总是重新分配权限有什么问题吗?想象一个大型目录结构,例如生产 Web 服务器上的/var/www/ 。我们希望递归地去掉“其他”所有目录上的wwrite 位。因此,只有在安全措施需要时才强制主动添加它。如果我们重新分配整个权限集,我们就会取消分配给每个子目录的所有其他自定义权限。

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

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

chmod -R o-w /var/www/

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

  • 八进制仅用于分配权限
  • 象征性修改权限集

CentOS 管理员必须精通八进制符号权限,因为权限对于数据和整个操作系统的完整性很重要。如果权限不正确,最终结果将是敏感数据,并且整个操作系统将受到损害。

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

  • chmod
  • 乔恩
  • chgrp
  • 掩码

chmod :更改文件模式权限位

命令 行动
-C 与 verbose 类似,但只会报告所做的更改
-v 详细,输出每个请求的诊断信息
-R 递归地对文件和目录应用操作

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

chown :更改文件所有者和组

命令 行动
-C 与 verbose 类似,但只会报告所做的更改
-v 详细,输出每个请求的诊断信息
-R 递归地对文件和目录应用操作

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

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

命令 行动
-C 与 verbose 类似,但只会报告更改
-v 详细,输出每个请求的诊断信息
-R 递归地对文件和目录应用操作

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

现实世界的实践

让我们更改/var/www/students/中的所有子目录分配,以便拥有组是学生组。然后将学生的根分配给教授组。之后,让 Terry Thomas 博士成为学生名录的所有者,因为他的任务是负责学校所有计算机科学学术界。

正如我们所看到的,在创建时,该目录非常原始。

[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 ~]#

作为管理员,我们永远不想将我们的凭据泄露给任何人。但与此同时,我们需要让用户能够完成他们的工作。因此,让我们让 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。由于作业目录是供学生提交作业的,因此我们取消学生组中列出和修改文件的功能。

[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]#

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

作为作业目录所有者 -

[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/配置文件
  • 〜/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 需要访问某些文件来进行报告。但是,如果有一天莎莉生病了而鲍勃来报告怎么办?或者报告的需求增加了?创建群组后,管理员只需创建一次。添加用户是随着需求的变化或扩展而应用的。

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

  • chgrp
  • 组添加
  • 团体
  • 用户模式

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 群组密码,允许用户自行激活

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

[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用于更新帐户属性。

以下是常见的用户模式开关。

转变 行动
-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的选项部分中对要为用户和组应用配额的卷或标签进行了以下更改。

  • 用户配额
  • 总配额

正如您所看到的,我们正在使用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.用户
  • aquota集团

它们用于存储启用配额的磁盘/分区的配额信息。

以下是常见的配额检查开关。

转变 行动
-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

让我们看看每一列。

  • 文件系统- 这是应用到的用户的文件系统配额

  • - 用户当前在每个文件系统上使用多少块

  • soft - 设置软限制块。软限制允许用户在给定时间段内携带配额

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

  • inodes - 用户当前正在使用多少个 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作为 init 系统,用于管理 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-analyzeblame命令。

[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 作为单位目标。建议对其他类型进行进一步研究。因为只有.service单元适用于启动和停止systemd服务。

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

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

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

使用 systemctl 管理服务

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

转变 行动
-t 单位类型的逗号分隔值,例如服务或套接字
-A 显示所有已加载的单位
- 状态 显示处于定义状态的所有单元:负载、子、活动、非活动等。
-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扩展名来阐明我们正在从事服务单元操作。

可以对服务执行的主要操作是 -

开始 启动服务
停止 停止服务
重新加载 重新加载服务的活动配置而不停止它(例如 system v init 中的kill -HUP)
重新开始 启动然后停止服务
使能够 在启动时启动服务
禁用 阻止服务在运行时自动启动

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

开始 启动已处于停止状态的服务。
停止 暂时关闭服务(例如,必须停止服务才能访问该服务锁定的文件,如升级服务时)
重新加载 当配置文件被编辑并且我们想要应用新的更改而不停止服务时。
重新开始 与 reload 场景相同,但服务不支持reload
使能够 当我们希望禁用的服务在启动时运行时。
禁用 主要在需要停止服务但在启动时启动的情况下使用。

检查服务的状态 -

[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]#

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

[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中使用的常用命令-

  • 开始
  • 停止
  • 重新开始
  • 重新加载
  • 地位
  • 活跃
  • 列表单位
  • 使能够
  • 禁用
  • 展示

我们已经讨论了使用 systemctl启动停止重新加载重新启动启用禁用。那么让我们回顾一下其余的常用命令。

地位

以最简单的形式,状态命令可用于查看整个系统状态 -

[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 命令允许我们列出某种类型的所有单位。让我们检查一下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命令是 systemctl 命令的一个示例,旨在返回单元的状态信息。

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

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 ,让我们使用它们来管理cgroupcontrol groups中的资源。

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实现重新定义。在考虑服务的资源管理时,主要关注的是cgroupcgroups在功能性和简单性方面都比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片 CPU份额
内存限制 内存限制
软内存限制 内存软限制
块 IO 重量 块IO权重
块设备限制(在 /volume/path 中指定) BlockIO设备权重
读IO 块IO读取带宽
磁盘写IO 块IO读取带宽

大多数情况下,服务会受到CPU 使用内存限制读/写 IO 的限制。

更改每个之后,需要重新加载 systemd 并重新启动服务 -

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

在 CentOS Linux 中配置 CGroup

要在 CentOS Linux 中创建自定义 cgroup,我们需要首先安装服务并配置它们。

步骤 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只会像它的名字一样,Hibernate一段定义的时间: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,发送第一个作业i