- Linux 管理教程
- 家
- CentOS概述
- CentOS Linux 基本命令
- 文件/文件夹管理
- 用户管理
- 配额管理
- Systemd 服务启动和停止
- 使用 systemctl 进行资源管理
- 使用 crgroups 进行资源管理
- 流程管理
- 防火墙设置
- 在 CentOS Linux 中配置 PHP
- 在 CentOS Linux 上设置 Python
- 在 CentOS Linux 上配置 Ruby
- 为 CentOS Linux 设置 Perl
- 安装和配置开放 LDAP
- 创建 SSL 证书
- 安装 Apache Web 服务器 CentOS 7
- CentOS 7 上的 MySQL 设置
- 设置 Postfix MTA 和 IMAP/POP3
- 安装匿名 FTP
- 远程管理
- CentOS中的流量监控
- 日志管理
- 备份与恢复
- 系统升级
- 外壳脚本
- 包管理
- 卷管理
- Linux 管理有用资源
- Linux 管理员 - 快速指南
- Linux 管理员 - 有用的资源
- Linux 管理员 - 讨论
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/ 。我们希望递归地去掉“其他”所有目录上的w或write 位。因此,只有在安全措施需要时才强制主动添加它。如果我们重新分配整个权限集,我们就会取消分配给每个子目录的所有其他自定义权限。
因此,这会给系统的管理员和用户带来问题。在某些时候,一个人(或多个人)需要重新分配通过为每个目录和对象重新分配整个权限集而被清除的所有自定义权限。
在这种情况下,我们希望使用符号方法来修改权限 -
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 传递了usrquota和grpquota参数。
现在,再次编辑/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有一个被取代的sysvinit。systemd为 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]#
现在我们已经更详细地探索了systemd和systemctl ,让我们使用它们来管理cgroup或control 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实现重新定义。在考虑服务的资源管理时,主要关注的是cgroup。cgroups在功能性和简单性方面都比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 命令sleep。sleep只会像它的名字一样,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