RHCE 9 - RH134
2026-03-02 11:44:06 0 举报AI智能生成
红帽系统管理二
RHCAS
Linux系统管理
运维
系统管理员
模版推荐
作者其他创作
大纲/内容
1. 提高命令行运行效率
编写简单的 Bash 脚本
创建和执行 Bash Shell 脚本
是一种可执行的文件
可以使用任何文本编辑器
高级编辑器(如vim 或 emacs)理解 Bash shell 语法并且可以提供颜色编码的高亮显示
指定命令解析器
脚本的第一行以符号 #! 开头,通常称为 she-bang 或 hash-bang,其源于这两个字符的名称,sharp 或 hash 以及 bang
此符号是一个解释器指令,指示处理文件的其余行所需的命令解释器和可选命令选项
对于普通的 Bash 语法脚本文件,第一行就是这个指令: #!/usr/bin/bash
执行 Bash Shell 脚本
Shell 脚本必须具有执行权限
使用 chmod 命令修改其文件权限
如果脚本存储在 shell 的PATH 环境变量中所列的目录下,可以之间文件名来运行shell 脚本
PATH 解析第一匹配文件名,请避免使用现有的命令来命名脚本文件
如果脚本不在PATH 目录中,请使用其绝对路径名称运行脚本
可以使用 which 查看文件绝对路径
当前目录中运行脚本,例如 ./scriptname
对特殊符号加引号
一些字符和词语对 Bash shell 具有特殊含义
当需要使用这些字符的字面值,需要进行转义
使用反斜杠(\)、单引号('')或双引号("")来去除(或转义)这些字符的特殊含义
反斜杠
转义单个字符
单引号
转义文件字符串中的多个字符
双引号
可以阻止 globbing (文件名模式匹配)和 shell expansion,但依然允许命令和变量替换
变量替换在概念上与命令替换一样 $(),但可能使用可选的大括号语法
echo ""**** hostname is ${var} ****"
从 Shell 脚本提供输出
通过将文本作为参数传递给命令,echo 命令可显示任意文本
默认情况下,文本发送到标准输出(STDOUT),可以使用输出重定向将文件发送到其他地方
echo 命令在 shell 脚本中被广泛用来显示信息或错误信息
echo 命令也可帮助调试有问题的shell 脚本
指导练习:编写简单的 Bash 脚本
脚本中的循环和条件结构
使用循环来迭代命令
for 循环用于任务迭代的 Bash 循环结构
从命令处理项目
for VARIABLE in LIST; do<br>COMMAND VARIABLE<br>done
for HOST in host1 host2 host3; do echo $HOST; done
Bash 脚本退出代码
使用 exit 命令可立即退出脚本
使用0到255之间的可选整数参数(代表退出代码)exit 命令
退出代码值 0 表示脚本成功完成且无错误,所有其他非零值都表示存在错误的退出代码
从内置 $? 变量检索上一个已完成命令的退出代码
echo $?
测试字符串和目录的逻辑,以及比较值
可以使用 test 命令来检查脚本的完整性
所有命令在完成时都会生成退出代码
使用运算符来执行测试,以判断某个数字是否大于(gt)、大于等于(ge)、小于(lt)、小于等于(le)或等于(eq)另一个数字
使用运算符测试文本字符串与另一个文本字符串是否相同(= 或 ==)或不同(!=),或者字符串的长度是否为零(z)或非零(n)
可以测试常规文件(-f)或目录(-d)是否存在,以及一些特殊属性,例如文件是否为符号链接(-L)或用户是否具有读权限(-r)
在执行测试时,可以使用 Bash 测试命令语法 [ <TESTEXPRESSION> ] 或更新的扩展测试命令语法 [[ <TESTEXPRESSION> ]],后者提供文件名通配和正则表达式匹配等功能。在大多数情况下,您应使用[[ <TESTEXPRESSION> ]] 语法<br>
条件结构
简单是 shell 脚本表示从头到尾执行的命令的集合
程序员使用条件结构将决策整合到 shell 脚本中
脚本可以在安装规定条件时执行特定的例程
使用 if/Then 结构
if <CONNDITION>; then<br> <STATEMENT><br> ...<br> <STATEMENT><br>fi
脚本满足给定的条件,则执行语句块中的代码
如果不满足给定条件,则不执行任何操作
if/then 语句中的常见测试条件包括前面讨论的数字、字符串和文件测试
fi 语句用户结束 if/then 结构
使用 if/Then/Else 结构
if <CONDITION>; then<br> <STATEMENT><br> ...<br> <STATEMENT><br>else<br> <STATEMENT><br> ...<br> <STATEMENT><br>fi
根据是否满足某一条件来采取不同的操作集合
使用 If/Then/Elif/Then/Else 结构
if <CONDITION>; then<br> <STATEMENT><br> ...<br> <STATEMENT><br>elif <CONDITION>; then<br> <STATEMENT><br> ...<br> <STATEMENT><br>else<br> <STATEMENT><br> ...<br> <STATEMENT><br>fi<br>
测试多个条件,并在满足特定条件时执行一组不同的操作
指导练习:脚本中的循环和条件结构
使用正则表达式匹配命令输出中的文本
编写正则表达式
正则表达式提供了一种便于查找特定内容的模式匹配机制
vim、grep、less 命令可以使用正则表达式
描述简单的正则表达式
最为简单的正则表达式是完全匹配搜索的字符串
如果正则表达式中的字符与字符串的类型和顺序均匹配,即为完全匹配
匹配行首和行尾
仅在行首匹配,使用脱字符号(^)
仅在行尾匹配,使用美元符号($)
基本和扩展正则表达式
有两种正则表达式
基本正则表达式
扩展正则表达式
基本和扩展正则表达式之间的一个区别在于 |、+、?、(、)、{ 和 } 特殊字符的行为
基本正则表达式语法中,这些字符美元特殊含义,除非加反斜杠 \ 字符前缀
在扩展正则表达式语法中,这些字符特殊,除非它们加反斜杠 \ 字符前缀
在 ^、$、* 字符的处理方式上,还存在其他细微差别
grep、sed、vim 命令使用基本正则表达式
grep -E、sed -E、less 命令使用扩展正则表达式
正则表达式中的通配符和重复匹配用法
正则表达式使用点字符(.)作为通配符来匹配单行上的任何单个字符
使用不受限通配符时,将无法预测与通配符匹配的字符。要匹配具体的字符,将不受限通配符替换为适当的字符
例如 c[aou]t
重复匹配时通常与通配符一起使用的机制
重复匹配应用于正则表达式中的前一位字符或通配符
最为常用的重复匹配符号之一时星号(*)字符,该星号重复匹配符号表示匹配重复匹配表达式中的零项或多项
除了字符外,还可以将星号与表达式搭配使用
例如 c[aou]*t可以匹配 coat 或 coot
例如 c.*t 将匹配cat、coat、culvert,甚至是 ct
任何以c开头、后跟零个或多个字符并以t结尾的字符串
另一种类型的重复匹配将会指明模式中所需字符的更精确个数
例如 'c.\{2\}t'
匹配以c开头、后跟正好两个任意字符并以t结尾的任何词语
从命令行中匹配正则表达式
grep命令使用正则表达式来隔离匹配的数据
可以使用 grep 命令匹配单个文件或多个文件中的数据
使用 grep 匹配多个文件中的数据时,它将显示文件名后跟一个冒号字符,然后显示与正则表达式匹配的行
使用 grep 命令隔离数据
grep 命令指定要解析匹配项的正则表达式和文件
grep '^computer' /usr/share/dict/words
grep 命令可以使用竖线运算符字符(|)处理来自其他命令的输出
ps aux | grep chrony
grep 命令选项
grep 命令示例
默认情况下,正则表达式会区分大小写
使用grep -i 选项可以运行不区分大小写的搜索
使用 grep -v 选项可反向搜索正则表达式。仅显示与正则表达式不匹配的行
要查找不受注释行影响的文件,请使用 grep -v
grep -v '^[#;]' \<br>/etc/systemd/system/multi-user.target.wants/rsyslog.service
排除文件中以井号(#)或分号(;)字符开头的所有行
gerp -e 选项允许一次搜索多个正则表达式
cat /var/log/secure | grep -e 'panm_unix' -e 'user root' -e 'Accepted publickey' | less
要搜索使用vim 或 less 命令打开的文件中的文本,请先输入斜杠字符(/),然后输入要查找的模式。按 Enter 键开始搜索。按 N 查找下一个匹配项
指导练习:实验正则表达式匹配命令输出中的文本
开放研究实验:提高命令行运行效率
总结
创建并执行简单的 Bash 脚本来完成简单的管理任务
使用循环来迭代命令行和 shell 脚本中的项目列表
使用条件结构将决策整合到 shell 脚本中
使用正则表达式和 grep 命令,搜索日志和配置文件中的文本
2. 调度未来任务
调度延迟的用户作业
描述延迟的用户任务
在未来的特定时间运行一个或多个命令
调度的命令通常被称为任务或作业,而延迟一词则表示这些任务或作业在未来运行
at 命令,该命令默认安装并启用
at 软件包中提供了 atd 系统守护进程,以及与该守护进程交互的 at 和 atq
任何用户都可使用 at 命令为 atd 守护进程的作业排队
atd 守护进程提供了用a 到 z 标记的26个队列,作业按字母顺序排列,队列越后,系统优先级越低
调度延迟的用户任务
使用 at TIMESPEC 命令开始输入要调度的新作业
at 命令随后从 STDIN(键盘)读取,以获取有待运行的命令
手动输入命令时,请在空行上按 Ctrl+D 来完成输入
可以使用脚本文件中的输入重定向来输入更为复杂的命令
例如 at now +5min < myscript
myscript 中的命令调度到5分钟后启动
at 命令 TIMESPEC 参数接受用于描述作业运行时间的自然时间规格
例如 02:00pm、15:29、midnight 甚至 teatime 开头,后面接一个可选日期或将来的天数,以此指定时间
TIMESPEC 参数需要按照该顺序指定时间和日期
如果提供日期而非时间,则时间默认为当前时间
如果提供时间而非日期,则日期被视为以匹配,并且作业将在下一场时间匹配时运行
作业调度到今天或明天执行,具体取决于时间是否已过
at 命令的 man page 和其他文档来源使用<font color="#e74f4c">小写字母</font>来编写自然时间规格,但您可以使用<font color="#e74f4c">小写</font>、<font color="#e74f4c">句首大写</font>或<font color="#e74f4c">大写字母</font>
检查和管理延迟的用户作业
要获得当前用户的带出来作业概述,请使用命令 atq 或 at -l 命令
每一行都代表一个调度到将来运行的不同作业
编号 - 已调度作业的执行日期和时间 - 调度的作业已排入默认队列 - 作业的所有者
使用 at -c JOBNUMBER 命令检查在 atd 守护进程执行作业时运行的命令
此命令显示作业的环境(在用户创建作业时从用户环境设置),以及要运行的命令语法
从计划中删除作业
atrm JOBNUMBER 命令将会删除调度的作业
指导练习:调度延迟的用户作业
调度周期性用户作业
描述周期性用户作业
周期性作业时按计划重复运行的作业
系统提供了 crond 守护进程,默认为已启用和启动
crond 守护进程会读取多个配置文件(每个用户对于一个)以及一组系统范围的文件
每个用户都有一个个人文件,可以使用 crontab -e 命令来编辑
在执行周期性作业时,这些配置文件为用户和管理员提供详细控制
如果调度的作业未编写未使用重定向,则 crond 守护进程将通过电子邮件将生成的输出或错误发送给作业所有者
调度周期性用户作业
使用 crontab 命令管理调度的作业
crontab 命令示例
crontab -l
列出当前用户的作业
crontab -r
删除当前用户的所有作业
crontab -e
编辑当前用户的作业
crontab filename
删除所有作业,并替换为从 filename 读取的作业。当未指定文件时,此命令使用 stdin 输入
特权用户可以使用 crontab -u 选项来管理其他用户的作业
crontab 命令从<font color="#e74f4c">不用于</font>管理系统作业,也<font color="#e74f4c">不建议</font>以 root 用户身份使用 crontab 命令,因为它能够利用配置为以 root 身份运行的个人作业
描述用户作业格式
默认 crontab -e 命令调用 vim 编辑器,除非为其他编辑器设置了 EDITOR 环境变量
每个作业必须在 crontab 文件中使用唯一的一行
遵循以下建议获得有效的条目
空行是为了方便阅读
以井号(#)开头的行是注释
格式为 NAME=value 的环境变量会影响声明<font color="#e74f4c">位置后</font>的<font color="#e74f4c">所有行</font>
标准变量设置包括 SHELL 变量,用户声明用于解释 crontab 文件其余行的 shell
MAILTO 变量决定谁应接收通过电子邮件发送的输出
crontab 文件中的字段按以下顺序显示
顺序
分钟
小时
几号
几月
星期几
命令
语法规则
使用* 字符在字段的每个可能实例执行
数字可用于指定几点几分、几号或周几。对于星期几,0等于星期日,1等于星期一,2等于星期二,依此类推。7也等于星期日
使用 x-y 表示范围,它包括 x 和 y 值
使用x,y 表示列表。列表也可以包含范围,例如 Minutes 列中的 5,10-13,17 表示作业在每个整点后的第5、10、11、12、13和17分运行
*/x 表示x 的间隔,例如 Minutes 列中 */7 表示每七分钟运行一次作为
此外,可以使用三字母英文缩写来表示月份和星期几
最后一个字段包含使用默认shell 执行的完整命令及选项和参数。如果命令包含为转义的百分比符号(%),则该百分比符号将被当作换行字符,且百分比符号之后的所有内容将为 stdin 输入传给命令
周期性用户作业示例
每年 2 月 3 日上午 9 点整执行命令 /usr/local/bin/yearly_backup
0 9 3 2 * /usr/local/bin/yearly_backup
在示例中,二月用数字2表示,因为它是一年中的第二个月份
在上午 9 点和下午16 点之间,每五分钟向该作业的所有者发送包含词语 Chime 的电子邮件,但仅仅是七月份的每个星期五
*/5 9-16 * Jul 5 echo "Chime"
上文中 9-16 小时范围表示作业定时器将在9点(09:00)启动并一直次序到16点末尾(16:59)
作业将从09:00开始执行,在16:55结束执行,因为16:55再过五分钟是17:00,而这超出了给定的小时范围
每个工作日(周一到周五)午夜前的两分钟运行/usr/local/bin/daily_report 命令
58 23 * * 1-5 /usr/local/bin/daily_report
每个工作日(周一到周五)上午9点执行mutt 命令,从而将邮件消息 Checking in 发送给收件人 developer@example.om
0 9 * * 1-5 mutt -s "Checkging in" developer@example.com % Hi ther, just checing in.
指导练习:调度周期性用户作业
调度周期性系统作业
调度周期性系统作业
周期性系统作业
系统管理员经常需要运行周期性作业
最好是从系统账户而不是从用户运行这些作业
使用系统范围的crontab <font color="#e74f4c">文件</font>而非crontab <font color="#e74f4c">命令</font>来调度这些作业
系统范围的crontab 文件中的作业条目与用户的crontab 条目类似
系统范围的crontab 文件在命令字段前面有一个额外的字段,用于指定运行命令的用户
/etc/crontab 文件的注释章包含实用的语法图
/etc/crontab 文件和/etc/cron.d/ 目录中的其他文件定义周期性系统作业
始终在/etc/cron.d/ 目录中创建自定义 crontab 文件来调度周期性系统作业
将自定义 crontab 文件存放在/etc/cron.d 目录中,以防止软件包更新覆盖/etc/crontab 文件
需要周期性作业的软件包会将其crontab 文件放入包含作业条目的/etc/cron.d/ 目录中
管理员也实用此位置将相关作业组合到单个文件中
crontab 系统还包含需要每小时、每天、每周和每月运行的脚本的存储库
这些存储库存放在/etc/cron.horly/、/etc/cron.daily/、/etc/cron.weekly/ 和 /etc/cron.monthly/ 目录下
这些目录中包含可执行的shell 脚本,而不是crontab 文件
使用 Anacron 运行定期命令
run-parts 命令也运行每日、每周和每月的作业,这些作业来自于 /etc/anacrontab 配置文件
/etc/anacrontab 文件确保调度的作业始终运行,不会因为系统关闭或休眠而意外跳过
例如,如果由于系统重启导致某个每日运行的系统作业未在指定时间执行,则系统就绪后就会执行此作业
如果在 /etc/anacrontab 文件的Delay in minutes 参数中做了指定,则作业开始前可能会出现延迟
/var/spool/anacron/ 目录中的文件决定了每日、每周和每月运行的作业
当 crond 守护进程从 /etc/anacrontab 文件启动作业时,它会更新这些文件的时间戳
使用此时间戳,你可以确定作业上一次执行的时间
/etc/anacrontab 文件的语法与其他常规crontab 配置文件有所不同
/etc/anacrontab 文件每行包含四个字段
Perion in days
定义按计划重复运行作业的间隔天数
此字段接受整数或宏作为值
例如,宏@daily 等同于整数1,表示每天执行该作业
同样,宏@weekly 等同于整数7,表示每周执行该作业
Delay in minutes
定义 crond 守护进程在启动作业前必须等待时间
Job identifier
此字段在日志消息中标识作业的唯一名称
Command
要执行的命令
/etc/anacrontab 文件中还包含使用 NAME=value 语法的环境变量声明
START_HOURS_RANGE 变量指定作业运行时时间间隔,超出此范围时,作业不会启动。如果某一天作业在此时间间隔内未运行,则必须等到第二天才能执行此作业
System 定时器
systemd 定时器单元可激活另一个不同类型的单元(如某项服务),只要待激活的单元名称与该定时器的单元名称相匹配即可
定时单元支持基于定时器激活其他单元
为了便于调式,systemd 定时器单元在系统日志中记录定时器事件
示例定时器单元
sysstat 软件包提供一个名为 sysstat-collect.timer 服务的systemd 定时器单元,每10 分钟收集一次系统统计信息
输出显示/usr/lib/systemd/system/sysstat-collect.timer 配置文件内容
<br>
OnCalendar=\*:00/10 选项指明该定时器单元每10 分钟激活一次相应的sysstat-collect.service 单元
可以指定更加复杂的时间间隔
例如,2022-04-* 12:35,37,39:16 值用于 OnCalendar 选项会使定时器单元在2022年4月每一天的12:35:16、12:37:16、12:39:16 激活对应的服务单元
也可以使用 OnUnitActiveSec 选项指定相对定时器
例如,使用OnUnitActiveSec=15min 选项,使定时器单元在该定时器单元最好一次激活其相应单元15分钟后触发相应的单元
更改定时器单元配置文件后,请使用systemctl daemon-reload 命令确保systemd 定时器单元加载这些更改
systemctl daemon-reload
重新加载systemd 守护进程配置后,可以使用systemctl 命令激活定时器单元
systemctl enalbe --now <unitname>.timer
指导练习:调度周期性系统作业
管理临时文件
管理临时文件
大多数关键应用和服务使用临时文件和目录
有些应用和用户会使用/tmp 目录来保存临时工作数据,还有一些应用使用特定于任务的位置,例如/run 下特定于守护进程和用户的易失性目录(仅存在于内存中)
但系统重启或断电时,基于内存的文件系统会进行自我清理
通常,只要存在预期的临时文件和目录时,守护进程和脚本才能正常运行
此外,有必要清理持久存储上的临时文件,以防止出现磁盘空间问题或陈旧工作数据
systemd-tmpfiles 工具提供一种结构化和可配置的方法来管理临时目录和文件
系统启动时,首先启动的systemd 服务单元之一时systemd-tmpfiles-setup 服务。此服务运行systemd-tmpfiles 命令 --create --remove 选项,从/usr/lib/tmpfiles.d/*.conf、/run/tmpfiles.d/*.conf、/etc/tmpfiles.d/*.conf 配置文件中读取命令。这些配置文件列出了指示systemd-tmpfiles-setup 服务创建、删除或使用权限保护的文件和目录
使用 Systemd 定时器清理临时文件
为了防止长时间运行的系统在磁盘中填满陈旧数据,名为 systemd-tmpfiles-clean.timer 的 systemd 定时器单元会定期触发 systemd-tmpfiles-clean.service,它会执行systemd-tmpfiles --clean 命令
systemd 定时器单元配置一个 [Timer] 部分,用于指示如何启动于定时器同名的服务
使用以下systemctl 命令可以查看 systemd-tmpfiles-clean.timer 单元配置文件的内容
systemctl cat systemd-tmpfiles-clean.timer
在上述配置中,OnBootSec=15min 参数指出 systemd-tmpfiles-clean.service 单元在系统启动15分钟后被触发
OnUnitActiveSec=1d 参数指出上一次激活服务单元 24 小时后再次触发 systemd-tmpfiles-clean.service 服务单元
可以更改 systemd-tmpfiles-clean.timer 定时器单元配置文件中的参数
更改定时器单元配置文件后,使用systemctl daemon-reload 命令确保systemd 加载新的配置
systemctl daemon-reload
手动清理临时文件
systemd-tmpfiles --clean 命令解析的配置文件与 systemd-tmpfiles --create 命令相同,但前者不会创建文件和目录,而是会清除在比配置文件中定义的最长期限更近的时间未曾访问、更改或修改的所有文件
如需有关 systemd-tmpfiles 服务配置文件格式的更详细信息,请参阅 tmpfilesd.d(5) man page
基本语法有一些七列构成:类型、路径、模式、UID、GID、期限和参数
类型指的是 systemd-tmpfiles 服务应执行的操作;例如d 表示创建还不存在的目录,或者Z 表示以递归方式恢复SELinux 上下文、文件权限和所有权
d /run/systemd/seats 0755 root root -
在创建文件和目录时,如果/run/systemd/seats 目录确实不存在,则创建该目录,所有者为用户 root 和组 root,权限设置为 rwxr-xr-x。如果此目录确实存在,则不执行任何操作。systemd-tmpfiles 服务不会自动清除此目录
D /home/student 0700 student student 1d
如果/home/student 目录不存在,请进行创建。如果存在,则清空其所有内容。当系统运行 systemd-tmpfiles --clean 命令时,它将删除该目录中超过一天未访问、更改或修改的所有文件
L /run/fstablink - root root - /etc/fstab
创建/run/fstablink 符号链接,以指定/etc/fstab 文件夹。绝对不要自动清除这一行
配置文件优先级
systemd-tmpfiles-clean 服务配置文件可位于三个位置
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles.d/*.conf
使用/etc/tmpfiles.d/ 下的文件配置自定义临时位置,以及覆盖供应商提供的默认值
/run/tmpfiles.d/ 下的文件是易失性文件,通常由守护进程用来管理自己的运行临时文件
相关的RPM 软件包在 /usr/lib/tmpfiles.d/ 目录中提供文件;因此,不要编辑这些文件
如果/run/tmpfiles.d/ 目录中的某文件与 /usr/lib/tmpfiles.d/ 目录中的文件同名,则服务将使用 /run/tmpfiles.d/ 目录中的文件
如果/etc/tmpfiles.d/ 目录中的某文件与/run/tmpfiles.d/ 或 /usr/lib/tmpfiles.d/ 目录的文件同名,则服务将使用/etc/tmpfiles.d/ 目录的文件
给定这些优先级规则后,您可以将相关文件复制到/etc/tmpfiles.d/ 目录,然后编辑该文件,轻松地覆盖供应商提供的设置。
通过正确使用这些配置为,您可以从中央配置管理系统管理由管理员配置的配置,而且软件包更新也不会覆盖您配置的设置
指导练习:管理临时文件
小测验:调度未来任务
总结
调度到将来运行一次的作业称为延迟作业或任务
周期性用户作业可按重复的计划执行用户任务
周期性系统作业则是按重复的计划完成影响整个系统的管理任务
systemd 定时器单元既可以执行延迟作业,也可以执行周期性作业
3. 调优系统性能
调整调优配置集
调优系统
系统管理员可以基于各种用例工作负载来调整设备设置,以此优化系统性能。
tuned 守护进程会利用反映特定工作负载要求的调优配置集,以静态和动态两种方式应用调优调整
配置静态调优
tuned 守护进程会在服务启动时或选择新的调优配置集时应用系统设置。
静态调优会对配置集中由 tuned 守护进程在运行在运行时应用的预定义 kernel 参数进行配置。
对于静态调优而言,tuned 守护进程针对整体性能预期来设置内核参数,不随活跃度变化而调整这些参数
配置动态调优
对于动态调优而言,tuned 守护进程会监视系统活动,并根据运行时行为变化来调整设置。
动态调优会从选定调优配置集的初始设置开始,不断调整优化设置以适应当前工作负载
例如,存储设置在启动和登陆期间的使用率会比较高,但如果用户工作负载的内容时使用Web 浏览器和电子邮件客户端,则活动量会很少。同样,CPU和网络设置在整个工作日的高峰使用期间会出现活动增加的情况。tuned 守护进程会监视这些组件的活动并调整参数设置,以最大限度提升高活动量期间的性能,并在低活动量期间降低设置值。预定义调优配置集提供由 tuned 守护进程使用的性能参数
为了监视和调优参数设置,tuned 守护进程使用了名称分别为监视器和调优插件的模块
监视器插件分析系统并从中获取信息,让调优插件使用此信息来进行动态调优。目前tuned 守护进程附带了桑不同的监视器插件
disk:根据每个磁盘设备的IO操作数监控磁盘负载
net:根据每个网卡传输的数据包数量监控网络负载
Load:监视每个CPU的CPU负载
调优插件对各个子系统进行调优。他们使用监视插件获取的数据,以及预定义调优配置提供的性能参数。除了其他插件外,tuned 守护进程附带了以下调优插件
disk:设置不同的磁盘参数,如磁盘调度程序、降速超时或高级电源管理
net:设置接口速度和局域网唤醒(WoL)功能
cpu:设置不同CPU 参数,例如CPU调控器或延迟
默认情况下,动态调优处于禁用状态
可以通过将/etc/tuned/tuned-main.conf 配置文件中的dynamic_tuning 变量设置为1 来启动它
启动动态调优后,tuned 守护进程会定期监视系统并根据运行时行为更改调整调优设置
可以使用/etc/tuned/tuned-main.conf 配置文件中的update_interval 变量,以秒为单位设置更新之间的间隔时间
tuned 实用程序
默认情况下,Linux 的最低配安装包含tuned 软件包
可以使用以下命令手动安装二号启动该软件包
dnf install tuned
tuned 应用提供的配置集分为以下几个类别
节能型配置集
性能提升型配置集
性能提升型配置集中包括侧重于以下方面的配置集
存储和网络的低延迟
存储和网络的高吞吐量
虚拟机性能
虚拟化主机性能
随红帽企业Linux 9 分发的调优配置集
balanced
非常适合需要兼顾节能和性能的系统
powersave
调优系统,以最大程度实现节能
throughput-performance
调优系统,以获得最大吞吐量
accelerator-performance
调优方式与throughput-performance 相同,并且也会将延迟缩短到 100 微秒以下
latency-performance
非常适合需要牺牲能耗来获取低延迟的服务器系统
network-throughput
从throughput-performance 配置集衍生而来。应用其他网络调优参数,以获得最大网络吞吐量
network-latency
从 latency-performance 配置集衍生而来。启用额外的网络调优参数,以提供低网络延迟
desktop
从 balanced 配置集衍生而来。加快交互式应用响应速度
hpc-compute
从 latency-performance 配置集衍生而来。非常适合高性能计算
virtual-guest
对充当虚拟机桑运行的系统进行调优,以获得最高性能
virtual-host
对充当虚拟机主机的系统进行调优,以获得最高性能
intel-sst
针对采用 Intel Speed Select Technology 配置的系统进行了优化。将它用做其他配置集的覆盖层
optimize-serial-console
提高串行控制台的响应能力。将它用作其他配置集的覆盖层
tuned 应用将调优配置集存储在 /usr/lib/tuned 和 /etc/tuned 目录下。每个配置集都有一个单独的目录,目录中包含 tuned.conf 主配置文件以及其他可选文件
从命令行管理配置集
使用 tuned-adm 命令来更改 tuned 守护进程的设置。tuned-adm 命令会查询当前的设置,列出可用的配置集,为系统推荐调优配置集,直接更改配置集或调优
tuned-adm active 命令识别当前活动的调优配置集
tuned-adm list 命令可列出所有可用的调优配置集,包括内置的配置集和自定义创建的调优配置集
tuned-adm profile_info 命令可获取有关给定配置文件的信息
tuned-adm profile_info network-latency
如果未指定配置文件,则 tuned-adm profile_info 命令显示活跃的调优配置文件的信息
使用 tuned-adm profile profilename 命令切换为更符合系统当前调优要求的其他有效配置集
tuned-adm profile throughput-performance
tuned-adm recommed 命令可以为系统推荐调优配置集。使用此机制在安装后确定默认的配置集
要恢复当前配置集所应用的设置更改,可切换到另一个配置集或停用 tuned 守护进程。使用tuned-adm off 命令来关闭 tuned 应用调优活动
通过Web 控制台管理配置集
通过单击 Limited access 或 Turn on administrative access 按钮,在Web 控制台中切换到管理访问模式
然后,在系统提示时输入您的密码。升级特权后,Limited access 按钮将变为Administrative access
作为安全提醒,在系统上执行了需要管理特权的任务后,请季度务必切回到受访问模式
以特权用户的身份,单击左侧导航栏中的 Overview 菜单选项。Performance profile 字段显示当前活跃的配置集
要选择其他配置集,请单击活跃的配置集链接。在 Change performance profile 用户界面,滚动鼠标浏览配置集列表,选择最适合系统用途的配置集,再单击 Change profile 按钮
要验证更改,请返回至主 Overview 页面,并确认 Performance profile 字段显示由活跃的配置集
指导练习:调整调优配置集
影响进程调度
Linux 进程调度
现代计算机系统使用多核、多线程CPU,可以同时执行多个指令线程
Linux 和其他操作系统使用称为时间片或多任务的技术来进行进程管理
操作系统进程调度程序再每个可用CPU核心上的进程线程之间快速切换。此行为给人同时运行大量进程的印象
进程优先级
每个进程都由不同的重要性衡量标准,过去称为进程优先级。
Linux 具有不同的调度策略,用于处理交互应用请求、非交互式批处理应用和实时实用要求。
Nice 值
二进制树的顺序还受到用户可修改的、各个进程的nice 值影响,其范围从 -20(优先级增加)到 19(优先级降低)不等,默认值为0
进程从其父进程继承其初始 nice 值。所有用户都可用调整 nice 值以降低优先级,但只有 root 可用用它提高优先级
较高的 nice 值表示进程优先级越低于默认值,这个可以记忆为使进程对其他进程较为友好。
较低的 nice 值表示进程优先级高于默认值,这可以记忆为使进程对其他进程较为不友好
修改进程的 nice 值会提高或降低进程线程在二进制树中的位置。增大 nice 值将降低线程的位置,而减少 nice 值将提高线程的位置
Nice 值修改权限
特权用户可以减少进程的 nice 值
非特权用只能增大自己进程的 nice 值
查看 Nice 值
nice 值映射到优先级值,两个值均可在进程列表命令中查看。在 top 命令中,nice 值 -20 映射到优先级0。在top 命令中,nice 值 19 映射到优先级39
使用默认格式选项时,ps 命令进程 nice 值
使用用户设置的 Nice 值启动进程
创建进程时,它会继承其父进程的 nice 值。从命令启动某个进程时,它会从 shell 进程那里继承 nice 值。通常,新进程默认的nice 值是 0 运行
所有用户都可以使用 nice 命令来启动具有默认或更改 nice 值的命令。在不带选项时,nice 命令将启动一个默认 nice 值为10 的进程。
nice sleep 60 &
ps -o pid,comm,nice 2736
使用 nice -n 选项可以将用户定义的 nice 值应用于启动的进程
nice -n 15 sleep 60 &
更改现有进程的 nice 值
使用 renice 命令来更改现有进程的 nice 值
renice -n 19 2740
也可以使用top 命令来更改现有进程的nice 值
指导练习:影响进程调度
开放研究实验:调优系统性能
总结
tuned 服务基于预定义的选定调优配置集自动修改设备设置,以满足特定的系统需求
要恢复所选配置集对系统设置所做的所有更改,可以切换到另一个配置集或停用 tuned 服务
系统会为进程分配一个相对优先级,以确定其CPU访问权限。该优先级被称为进程的 nice 值
nice 命令将在进程启动时为其分配优先级
renice 命令可修改正在运行的进程的优先级
4. 管理SELinux 安全性
更改 SELinux 强制模式
描述 SELinux 架构
安全增强型 Linux (SELinux)是Linux 的一项重要安全功能
对文件、端口和其他资源的访问时在精细的基本上进行控制的
策略声明了各个程序、文件和网络端口上配置的预定义标签
SELinux 用法
SELinux 强制执行一组访问规则,明确定义进程和资源之间允许的操作
任何未在访问规则中定义的操作均不被允许
SELinux 具有以下操作模式
Enforcing:SELinux 强制执行加载的策略。此模式是红帽企业Linux 中的默认模式
Permissive:SELinux 加载策略并处于活动状态,但不强制执行访问控制规则,而是记录访问违规。此模式有主要对应用和规则进行测试和故障排除
Disabled:SELinux 已关闭。SELinux 违规不会被拒绝或记录。强烈建议不要禁用 SELinux
SELinux 基本感念
SELinux 的主要目标是保护用户数据,以便被已遭泄露的应用或系统服务访问。
大多数Linux 管理员都熟悉标准的用户、组和全局文件权限的安全模型,这被称为自主访问控制(DAC),因为管理员会根据需要设置文件权限。
SELinux 提供了一个额外的基于对象的安全层,它在粒度规则中定义,称为强制访问控制(MAC),因为MAC 策略适用于所有用户,无法通过自主配置设置来针对特定用户绕过这些策略
SELinux 策略是安全规则,定义了特定进程如果访问相关的文件、目录和端口。每个资源实体(如文件、进程、目录或端口)都有一个标签,称为 SELinux 上下文
上下文标签于定义的SELinux 策略规则匹配,以允许进程访问带有这些标签的资源。
默认情况下,策略不允许任何访问,除非有显式规则授予了访问权限。如果未定义允许规则,则所有访问都被禁止。<br>
SELinux 标签具有 user、role、type 和 secruity level字段。RHEL 中默认启用的目录策略使用type 上下文定义规则。类型上下文名称通常以 _t 结尾
策略访问规则概念
许多列出资源的命令使用 -Z 选项来管理 SELinux 上下文。例如,ps、ls、cp、mkdir 命令都使用 -Z 选项
更改 SELinux 模式
使用getenforce 命令查看当前的SELinux 模式。使用 setenforce 命令更改 SELinux 模式
或者,使用内核参数在引导是设置 SELinux 模式。传递enforcing=0 内核参数将系统引导至 permissive 模式,或传递 enforcing=1 来引导至 enforcing 模式。传递 selinux=0 内核参数禁用 SELinux,或传递 selinux=1 来启用SELinux
建议您在将SELinux 模式从 Permissive 更改为 Enforcing 时重新启动服务器。重新启动可确保以 permissive 模式启动的服务在下一次启动时受到限制
设置默认 SELinux 模式
要持久配置SELinux,请使用/etc/selinux/config 文件。默认设置为 enforcing 模式
系统在启动时会读取此文件,并相应配置SELinux。selinux=0|1 和 enforcing=0|1 内核参数将覆盖此配置
指导练习:更改 SELinux 强制模式
控制SELinux 文件上下文
初始 SELinux 上下文
所有资源(如进程、文件和端口)都标由SELinux 上下文
SELinux 在 /etc/selinux/targeted/contexts/files/ 目录忠维护基于文件的文件标签策略数据库
当新文件的名称宇现有标签策略不匹配是,改文件讲继承宇父级目录相同的标签。使用标签继承时,所有文件在创建时始终都带有标签,无论文件是否存在显式策略
在具有现有标签策略的默认的位置创建文件时,或者存在针对自定义位置的策略时,新文件将使用正确的SElinux 上下文进行标记。但是,如果在没有现有标签的情况下在意外位置创建文件,则继承的标签可能不适合新文件的预期用途
将文件复制到新位置可能会导致该文件的SELinux 上下文发生变化,新的上下文由新位置的标签策略决定,或者从父目录继承(如果不存在策略)。在复制期间可以保持文件的SELinux 上下文,已保留位文件的原始位置的上下文标签。
ls -Z 命令显示文件的 SELinux 上下文
ls -Zd 命令显示指定目录的 SELinux 上下文
更改 SELinux 上下文
使用 semanage fcontext、restorecon、chcon 命令管理文件的 SELinux 上下文
为文件更改上下文的建议方法是,使用 semanage fcontext 命令创建文件上下文策略,然后使用 restorecon 命令将策略中指定的上下文应用到文件。<br>此方法确保你可以在必要时使用 restorecon 命令轻松地将文件重新标记为正确的上下文。这种方法的优点是您不需要记住上下文应该是什么,而且您可以轻松地更正一组文件的上下文
chcon 命令直接在文件上更改 SELinux 上下文,但不引用系统的 SELinux 策略。虽然 chcon 可用于测试和调试,但使用此方法手动更改上下文是暂时的。您可以手动更改的文件上下文在重启后仍然有效,但如果您运行 restorecon 来重新标记文件系统的内容,则上下可能会被替换换掉
定义 SELinux 默认文件上下文策略
semanage fcontext 命令可显示和修改用来确定默认文件上下文的策略。您可以通过运行 semanage fcontext -t 命令来列出所有文件上下文策略规则。这些规则使用扩展的正则表达式语法来指定路径和文件名称
查看策略时,最常见的扩展正则表达式时 (/.*)? , 它通常附加到目录名称。
此语法描述为“一个以斜杠开头并后跟任意数量的字符的字符集,该集合可以存在或不存在”。更简单地说,此与匹配目录本身,即时为空,也会匹配该目录中创建的几乎任何文件名
基本文件上下文操作
semanage fcontext 命令参数选项
-a, --add
添加指定对象类型的记录
-d, --delete
删除指定对象类型的记录
-l, --list
列出指定对象类型的记录
要管理 SELinux 上下文,请安装 policycoreutils 和 policycoreutils-python-utils 软件包,其中包含 restorecon 和 semanage 命令
要将目录中的所有文件重置为默认策略上下文,首先使用 semanage fcontext -l 命令查找并验证是否存在适用于预期文件上下文的正确策略。然后,对通配符目录名称使用 restorecon 命令,以递归方式重置所有文件
指导练习:控制 SELinux 文件上下文
使用布尔值调整SELinux 策略
指导练习:使用布尔值调整 SELinux 策略
使用 setsebool 命令激活和停用 SELinux 策略规则,使用 semanage boolean -l 命令管理 SELinux 布尔值的持久值
SELinux 布尔值
应用或服务开放人员编写 SELinux 目标策略来定义目标应用的允许行为
开放人员可以在 SELinux 策略中包含可选的应用行为,当特定系统上允许相关行为时启用该策略
SELinux 布尔值可启用或禁用 SELinux 策略的可选行为。通过使用布尔值,您可以有选择地调整应用的行为
这些可选行为是特定于应用的,必须为各个目标应用发现和选择
使用 getsebool 命令列出此系统上目标策略的可用布尔值,已经当前的布尔值状态
getsebool -a
使用 setsebool 命令启用或禁用这些行为的运行状态。setsebool -P 命令选项通过写入策略文件使设置持久有效。只有特权用户才能设置 SELinux 布尔值
示例 httpd 策略布尔值
http 服务策略包括 httpd_enable_homedirs 布尔值,它通过 httpd 启用主目录共享
通常用户只有在登陆本地系统后才能访问其本地主目录。或者通过使用远程文件共享协议来共享和访问主目录
主目录默认不利用 https 进行共享,用户也无法通过浏览器访问该目录
可用启用共享并允许用户使用浏览器访问其主目录。启用后,httpsd 服务共享标有 user_home_dir_t 文件上下文的主目录。然后,用户可用从浏览器访问和管理其主目录文件
管理策略布尔值
使用 setsebool 命令但不带 -P 选项设置 SELinux 布尔值使临时的,设置将在重启动后恢复为持久的值
使用 semanage boolean -l 命令可用查看其信息,这将列出策略文件中的布尔值,包括布尔值是否持久、默认值和当前值,以及简短的描述
调查和解决SELinux 问题
对 SELinux 问题进行故障排除
SELinux 由明确定义允许操作的目标策略组成
策略条目定义将要交互的已标记进程和已标记资源
通过使用标签,策略声明进程类型以及文件或端口上下文
策略条目定义一种进程类型、一个资源标签,以及要允许的显式操作
操作可以是系统调用、内核函数或其他特定的编程例程
如果没有为特定的进程资源操作关系创建条目,则操作将被拒绝
当某个操作被拒绝时,该次尝试将与实用的上下文信息一起记录下来
监控 SELinux 违规
当 SELinux 拒绝某一操作时,会在 /var/log/audit/audit.log 安全日志文件中记录一条 Access Vector Cache (AVC) 消息
使用 sealert -l UUID 命令来查看特定事件的综合报告详细信息
使用sealert -a /var/log/audit/audit.log 命令来查看所以现有的事件
使用 restorecon /var/www/html/mypage 命令来设置正确的上下文标签
要以递归方式更正多个文件,请对父目录使用 restorecon -R 命令
使用 ausearch 命令,搜索 /var/log/audit/audit.log 日志文件中的AVC 事件。使用 -m 选项指定AVC 消息类型,并使用 -ts 选项提供时间提示
使用 Web 控制台进行 SELinux 问题故障排除
指导练习:调查和解决 SELinux 问题
开放研究实验:管理 SELinux 安全性
总结
使用 getenforce 和 setenforce 命令可以管理系统的 SELinux 模式
semanage 命令可以管理 SELinux 策略规则。restorecon 命令可以应用策略所定义的上下文
布尔值是可更改SELinux 策略行为的参数。你可以启用或禁用它们来调整策略
sealert 命令可显示有助于 SELinux 故障排除的有用信息
5. 管理基本存储
添加分区、文件系统和持久挂载
分区磁盘
磁盘分区将一个硬盘驱动器划分为多个逻辑存储分区
限制应用或用户的可用空间
将操作系统和程序文件与用户文件分隔开
创建用于内存交换的单独区域
限制磁盘空间使用,以提高诊断工具和备份镜像的性能
MBR 分区方案
主引导记录 (MBR)分区方案是运行 BIOS 固件的系统上的标准方案。
此方案支持最多四个主分区
在 Linux 系统上,您可以使用扩展分区和逻辑分区来创建最多15个分区。
对于 32位分区大小,使用 MBR 分区的磁盘的大小最多可达2 TiB
GPT 分区方案
对于运行统一可扩展固件接口(UEFI)固件的系统,GPT 是磁盘分区的标准,解决了 MBR 方案的限制
GPT 最多可提供 128个分区
GPT 方案为逻辑块地址分配 64位,以支持最多 8泽字节(ZiB)或80亿太字节(TiB)的分区和磁盘
相较于 MBR,GPT 分区提供了额外的功能和优势
GPT 使用全局唯一标识符(GUID)来识别每个磁盘和分区
GPT 使用分区表变得冗余,主要 GPT位于磁盘的开头,备份次要 GPT则位于磁盘末尾
GPT 使用校验和来检测 GPT 头和分区表的错误
管理分区
使用标准分区编辑是 parted
parted 命令取设备命令(代表您要修改的整个存储设备或磁盘)作为其第一个参数,后跟子命令
显示 /dev/vda 块设置(系统检查到的第一个“虚拟化 I/O”磁盘)表示的磁盘上的分区表
parted /dev/vda print
不带子命令的 parted 命令可打开交互分区会话
parted /dev/vda
向新磁盘写入分区表
要对新驱动器进行分区,首先要写入磁盘标签
磁盘标签指示了所用的分区方案
使用 parted 写入 MBR 磁盘标签或 GPT 磁盘标签
parted /dev/vdb mklabel msdos
parted /dev/vdb mklable gpt
创建 MBR 分区
运行 parted 命令并将磁盘设备梦里指定为参数,开始以交互模式操作。会话将显示(parted)作为子命令提示符
parted /dev/vdb
创建主分区或扩展分区
mkpart
primary
指示要分区上创建的我呢见系统类型。此值不会创建文件系统,而只是一个有用的分区类型标签
xfs 或 ext4
列出受支持的文件系统类型
parted /dev/vdb help mkpart
指定磁盘上新分区的起始扇区
2048s
s 后缀提供的值是扇区数,或者也可使用MiB、GiB、TiB、MB、GB、TB
parted 命令默认使用 MB 后缀。parted 命令对提供的值取整,以满足磁盘约束
指定应结束新分区的磁盘扇区,再退出 parted
1000MB
可以将结尾指定为大小或结束位置
quit
运行 udevadm settle 命令。此命令会等待系统检测新分区并在 /dev 目录下创建关联的设备文件。任务完成时返回提示符
udevadm settle
作为交互式的替代方案
parted /dev/vdb mkpart primary xfs 2048s 1000MB
创建 GPT 分区
以 root 用户身份执行 parted 命令,并指定该磁盘设备名称作为参数
parted /dev/vdb
使用 mkpart 子命令开始创建分区。对于GPT 方案而言,每个分区都会获得一个名称
mkpart
userdata
指示要分区上创建的我呢见系统类型。此值不会创建文件系统,而只是一个有用的分区类型标签
xfs 或 ext4
指定磁盘上新分区的起始扇区
2048s
指定应结束新分区的磁盘扇区,再退出 parted
1000MB
quit
运行 udevadm settle 命令。此命令会等待系统检测新分区并在 /dev 目录下创建关联的设备文件。任务完成时返回提示符
udevadm settle
作为交互式的替代方案
parted /dev/vdb mkpart userdata xfs 2048s 1000MB
删除分区
使用磁盘设备作为唯一参数
parted /dev/vdb
确定要删除的分区的分区编号
print
删除分区,并退出 parted。rm 子命令会立即从磁盘的分区表中删除该分区
rm 1
quit
作为交互式的替代方案
parted /dev/vdb rm 1
创建文件系统
创建了块设备后,下一步是向其中添加文件系统
红帽企业 Linux 支持多种文件系统类型,XFS 是建议的默认类型
以 root 用户身份,使用mkfs.xfs 命令为块设备应用 XFS 文件系统。对于 ext4 文件系统,请使用 mkfs.ext4 命令
挂载文件系统
添加文件系统后,最后一步是将文件系统挂载到目录结构的目录上
将文件系统挂载到目录层次结构后,用户空间实用程序可以访问设备上的文件或在设备上写入文件
手动挂载文件系统
使用 mount 命令,将设备手动附件到挂载点目录位置
mount 命令需要指定设备和挂载点,并可包含文件系统挂载选项。文件系统选项将自定义文件系统的行为
mount /dev/vdb1 /mnt
mount | grep vdb1
查看当前已挂载的文件系统、挂载点和选项
持久挂载文件系统
手动挂载文件系统是一种验证已格式化的设备是否可访问已经是否按预期方式工作的好方法。但是,当服务器重新启动时,系统不会再次自动挂载文件系统
要确保系统在启动时自动挂载文件系统,请在 /etc/fstab 文件中添加一个条目。此配置文件列出了在系统启动时要挂载的文件系统
/etc/fstab 是一个以空格分隔的文件,每行具有六个字段
cat /etc/fstab
UUID=a8063676-44dd-409a-b584-68be2c9f5570 / xfs defaults 0 0
第一个字段指定设备。本列使用 UUID 来指定设备。在创建时,文件系统会在其分区超级块中创建和存储 UUID。或者您可以使用设备文件,例如 /dev/vdb1
第二字段时自动挂载点,通过他可以访问目录结构中的块设备。挂载点必须存在;如果不存在,请使用 mkdir 命令进行创建
第三字段包含文件系统类型,如 xfs 或ext4
第四字段是以逗号分隔的、应用于设备的选项列表。defaults 是一组常用选项。
dump 命令使用第五字段来备份设备。其他备份应用通常不使用此字段
最后一个字段是 fsck 顺序字段,决定在系统启动时是否应运行 fsck 命令,以验证文件系统是否干净。<br>该字段中的值指示了 fsck 应该运行的顺序。对于XFS 文件系统,请将该字段设为0,因为 XFS 并不使用 fsck 来检查其文件系统状态。<br>对于 ext4 文件系统,如果是根文件系统,请将该字段设为 1 ;如果是其他 ext4 文件系统,则设为2。<br>借助这种表示法,fsck 实用程序会先处理根文件系统,然后同步检查不同磁盘上的文件系统,并按顺序检查同一磁盘上的文件系统
在 /etc/fstab 文件中添加或删除条目时,请运行 systemctl daemon-reload 命令或重启服务器,以确保 systemd 守护进程加载并使用新配置
建议使用 UUID 来持久挂载文件系统,因为块设备名称在特定情况下可能会变化,例如当云提供商更改虚拟机的基础存储层或在每次系统启动会以不同顺序检测磁盘时。块设备文件名可能会发生改变,但 UUID 在文件系统的超级块中会保持不变
使用 lsblk --fs 命令,扫描连接到计算机的块设备并检索文件系统 UUID
指导练习:添加分区、文件系统和持久挂载
管理交换空间
交换空间概念
交互空是受 Linux 内核内存管理子系统控制的磁盘区域
内核使用交换空间,通过将不活动的页面保存到内存中来补充系统 RAM。系统的虚拟内存包含系统 RAM 和交换空间的总和
交换空间计算
RAM 和交换空间建议
RAM
交换空间
允许休眠时的交换空间
2GB 或更少
RAM 的两倍
RAM 的三倍
2GB 到 8GB
与RAM 相同
RAM的两倍
8GB 到 64GB
至少 4 GB
RAM 的 1.5 倍
64GB 以上
至少 4 GB
不建议休眠
创建交换空间
创建一个文件系统类型为 linux-swap 的分区
为设备放置交换签名
创建交换分区
使用parted 命令,创建适当大小的分区并将其文件系统类型设置为 linux-swap
parted /dev/vdb
print
gpt
mkpart
swap1
linux-swap
1001MB
1257MB
print
quit
创建分区后,运行 udevadm settle 命令
格式化交换空间
mkswap 命令向设备应用交换签名
与其他格式化应用程序不同,mkswap 命令在设备开头写入单个数据块,而将设备的其余部分保留为未格式化,这样内核就可以使用它来存储内存页
mkswap /dev/vdb2
激活交换空间
使用swapon 命令激活已格式化的交换空间
使用 swapon 并将设备作为参数,或使用 swapon -a 来激活 /etc/fstab 文件中所列的所有交换空间
使用 swapon --show 和 free 命令检查可用的交换空间
使用swapoff 命令来停用交换空间
持久激活交换空间
在 /etc/fstab 文件中创建一个条目,确保系统启动时有活动的交换空间
UUID=39e2667a-9458-42fe-9665-c5c854605881 swap swap defaults 0 0
使用 UUID 作为第一个字段
第二个字段通常为挂载点保留
第三个字段是文件系统类型
第四个字段是选项。defaults 选项包括挂载选项 auto,它用于在系统启动时自动激活交换空间
最后两个字段时 dump 标志和 fsck 顺序。交换空间即不需要备份,也不需要文件系统检查
在 /etc/fstab 文件中添加或删除条目时,请运行 systemctl daemon-reload 命令或重启服务器,以便让 systemd 注册新配置
设置交换空间优先级
默认情况下,系统会按顺序使用交换空间,即内核先使用第一个已激活交换空间,直至其空间占满,然后开始使用第二个交换空间
要设置优先级,请在 /etc/fstab 文件中使用 pri 选项。默认优先级为 -2
使用 swapon --show 命令显示交换空间的优先级
当交换空间具有相同的优先级时,内核会以轮询方式向其中写入
指导练习:管理交换空间
开放研究实验:管理基本存储
总结
parted 命令可在采用 MBR 或 GPT 分区方案的磁盘上添加、修改和删除分区
mkfs.xfs 命令可在磁盘分区上创建 XFS 文件系统
/etc/fstab 文件包含必须持久挂载的设备
mkswap 命令可以初始化交换空间
6. 管理存储堆载
创建和扩展逻辑卷
逻辑卷管理器概述
使用逻辑卷管理器(LVM)系统创建逻辑存储卷,作为物理存储上的一个层。
与直接使用物理存储相比,此存储系统可提供更大的灵活性。LVM 对软件隐藏硬件存储配置,让您能够在不停止应用或卸载文件系统的前提下调整卷大小
物理设备
逻辑卷使用物理设备来存储数据
物理卷(PV)
LVM 使用底层物理设备作为 LVM 物理卷。LVM 工具会将物理卷划分为物理区块(PE),形成作为 PV 上最小存储块的小块数据
卷组(VG)
卷组是存储池,由一个或多个 PV 组成。它在功能上物理存储中的整个磁盘相当。一个 PV 必须仅分配给一个 VG。LVM 会自动设置 PE 大小,但也可以指定该大小。VG 可以包含未使用的空间和数个逻辑卷。
逻辑卷(LV)
逻辑卷根据 VG 中的空闲物理区块创建,提供应用、用户和操作系统所使用的存储设备。LV 是逻辑区块(LE)的集合,LE 映射到物理区块。默认情况下,每个 LE 映射到一个 PE。设置特定 LV 选项可更改此映射;例如,镜像会导致每个 LE 映射到两个 PE。
逻辑卷管理器工作流
确定用于创建物理卷的物理设备,并将这些设备初始化为 LVM 物理卷
从多个物理卷创建卷组
从卷组中的可用空间创建逻辑卷
使用文件系统格式化逻辑卷并进行挂载,或将其激活为交换空间,或者将原始卷传递到数据库或存储服务器以用于高级结构。
构建 LVM 存储
创建逻辑卷涉及创建物理设备分区、物理卷和卷组。在创建 LV 后,格式化并挂载该卷,以将它作为存储来进行访问。
准备物理设备
如果分区已存在,则分区是可选的。使用 parted 命令在物理设备上创建新分区。将物理设备设置为 Linux LVM 分区类型。使用 udevadm settle 命令向内核注册新分区
创建物理卷
使用 pvcreate 命令将物理分区标记为物理卷。要同时标记多个设备,可以使用以空格分隔的设备名称作为 pvcreate 命令的参数
本例将 /dev/vdb1 和 /dev/vdb2 设备标记为可用于创建卷组的 PV
pvcreate /dev/vdb1 /dev/vdb2
创建卷组
vgcreate 命令将一个或多个物理卷组建成一个卷组。第一个参数是卷组名,后跟一个或多个要分配给此 VG 的物理卷。
以下示例使用 /dev/vdb1 和 /dev/vdb2 PV 创建 vg01 VG
vgcreate vg01 /dev/vdb1 /dev/vdb2
创建逻辑卷
lvcreate 命令可根据卷组中的可用 PE 创建新的逻辑卷。使用 lvcreate 命令设置 LV 名称和大小,以及包含此逻辑卷的 VG 名称
以下示例在 vg01 VG 中创建大小为300 MiB 的 lv01 LV
lvcreate -n lv01 -L 300M vg01
创建具有重复数据删除和压缩功能的逻辑卷
RHEL 9 使用 LVM VDO 实施来管理 VDO 卷
虚拟数据优化器(VDO)为存储提供内嵌块级重复数据删除、压缩和精简配置
配置 VDO 卷,以使用最多 256 TB 的物理存储。将 VDO作为一种 LVM 逻辑卷(LV)进行管理,类似于 LVM 精简配置的卷
LVM VDO 由两个逻辑卷组成
VDO 池 LV
此 LV 可存储数据、删除重复数据和压缩数据,并设置由物理设备支持的 VDO 卷的大小
对 VDO 进行重复数据删除并单独压缩每个 VDO LV,因为每个 VDO 池 LV 只能容纳一个 VDO LV
VDO LV
在 VDO 池 LV 基础上调配虚拟设备,并设置在发生重复数据删除和压缩之前存储数据的 VDO 卷的逻辑大小
LVM VDO 将已删除重复数据的存储呈现为常规逻辑卷(LV)。VDO 卷可以使用标准文件系统进行格式,作为块设备进行共享,或者用于构建其他存储层,与任何逻辑卷并无差异
要能够使用 VDO 重复数据删除和压缩,请安装 vdo 和 kmod-kvdo 软件包
dnf install vdo kmod-kvdo
验证所选 LVM 卷组是否具有足够的可用存储容量。使用 lvcreate 命令及 --type vdo 参数来创建 VDO LV
lvcreate --type vdo --name vdo-lv01 --size 5G vg01
在逻辑卷上创建文件系统
使用传统名称 /dev/vgname/lvname 或内核设备映射程序名 /dev/mapper/vgname-lvname,指定逻辑卷名称
使用 mkfs 命令在新逻辑卷上创建文件系统
mkfs -t xfs /dev/vg01/lv01
使用 mkdir 命令创建挂载点
mkdir /mnt/data
要使文件系统持久可用,请在 /etc/fstab 文件中添加一个条目
/dev/vg01/lv01 /mnt/data xfs defaults 0 0
使用 mount 命令挂载 LV
mount /mnt/data/
显示 LVM 组件状态
LVM 提供了各种使用程序来显示 PV、VG、LV 的状态信息。使用 pvdisplay、vgdisplay、lvdisplay 命令显示 LVM 组件的状态信息
关联的 pvs、vgs、lvs 命令是常用的命令,可用显示状态信息的一个子集,每个实体占据一行
显示物理卷信息
pvdisplay 命令可显示有关 PV 的信息。不带参数运行此命令可列出系统上存在的所以 PV 的信息。提供 PV 名称作为命令参数,可显示特定于该 PV 的信息
pvdisplay /dev/vdb1
1 PV Name 显示设备名称
2 VG Name 显示将 PV 分配到的卷组
3 PV Size 显示 PV 的物理大小,包含不可用的空间
4 PE Size 显示物理区块大小
5 Free PE 显示 VG 中可用于创建新 LV 或扩展现有 LV 的PE 大小
显示卷组信息
vgdisplay 命令可显示由关卷组的信息。要列出有关所以 VG 的信息,请不带参数运行此命令。提供 VG 的名称作为参数,可以列出特定于该 VG 的信息
vgdisplay
1 VG Name 显示卷组的名称
2 VG Size 显示存储池中可用于 LV 分配的总大小
3 Total PE 显示 PE 单元的总大小
4 Free PE / Size 显示 VG 中可用于创建新 LV 或扩展现有 LV 的空间大小
显示逻辑卷信息
lvdisplay 命令可显示有关逻辑卷的信息。不带参数运行此命令可列出所以的 LV。提供 LV 的名称作为参数,可以显示特定于该 LV 的信息
lvdisplay /dev/vg01/lv01
1 LV Path 显示 LV 的设备名称
2 VG Name 显示用于创建此 LV 的 VG
3 LV Size 显示 LV 的总大小。使用文件系统工具来确定 LV 的可用空间和已用空间
4 Current LE 显示此 LV 使用的逻辑区块数
扩展和缩减 LVM 存储
在创建逻辑卷后,您可用通过扩展这个卷来扩展文件系统。你可能需要扩展 PV 或 VG 以增加 LV 的存储容量
扩展卷组大小
您可能需要添加更多磁盘空间来扩展 VG。你可以向 VG 添加额外的物理卷,以扩展其可用大小
准备物理设备并创建物理卷
parted /dev/vdb mkpart primary 1072MiB 1648MiB
parted /dev/vdb set 3 lvm on
udevadm settle
pvcreate /dev/vdb3
vgextend 命令可将新 PV 添加到 VG。提供 VG 和 PV 名称作为 vgextend 命令的参数
vgextend vg01 /dev/vdb3
此命令会扩展 vg01 VG,幅度为 /dev/vdb3 PV 的大小
扩展逻辑卷大小
逻辑卷的一个优势子在于能够在不停机的前提下增加其大小。向 VG 中的 LV 添加可用的物理区块,以扩大其容量,从而扩展 LV 的文件系统
指导练习:创建和扩展逻辑卷
管理分层存储
存储堆栈
RHEL 中的存储由多个成熟、稳定且充满现代功能的驱动程序、管理器和实用程序组成
管理存储需要熟悉堆栈组件,并认识到存储配置会影响启动过程、应用性能,以及为特定应用用例提供所需存储功能的能力
块设备
块设备位于存储堆栈的底部,提供稳定、一致的设备协议,运行几乎任何块设备透明底包含在 RHEL 存储配置中
多路径
路径是服务器和底层存储之间的连接
分区
块设备可以进一步划分为多个分区。分区可以占用整个块设备大小,或者通过划分块设备来创建多个分区。这些分区可用于创建文件系统、LVM设备,或者可直接用于数据库结构或其他原始存储
RAID
廉价磁盘冗余阵列(RAID)是一种存储虚拟化技术,可从多个物理或虚拟块设备组件创建大型逻辑卷
逻辑卷管理器
上一节中讨论了 LVM 物理卷、卷组和逻辑卷。LVM 几乎能使用任何形式的物理或虚拟块设备,并将存储构建为新的逻辑存储卷,从而有效地对应用和其他存储客户端隐藏物理存储配置
文件系统或其他用途
堆栈的顶层通常是文件系统,但可以用作数据库或自定义应用数据要求的原始空间。RHEL 支持多种文件系统类型,但大多数现代用例中兼容使用 XFS。当实施 LVM 的实用程序是红帽 Ceph 存储或 Stratis 存储工具时,需要采用 XFS
Stratis 存储管理
Stratis 是由红帽和上游 Fedora 社区开发的本地存储管理工具。借助 Stratis,您可以更加轻松地执行初始存储配置,更改存储配置,并使用告警存储功能
Stratis 以管理物理存储设备池的服务形式运行,并透明地为创建的文件系统创建和管理卷
Stratis 利用一种称为精简配置的概念,从磁盘设备共享池构建文件系统
Stratis 管理方法
要使用Stratis 存储管理解决方案来管理文件系统,请安装 stratis-cli 和 stratisd 软件包。
Stratis 管理功能包含在 RHEL Web 控制台中
安装和启用 Stratis
dnf install stratis-cli stratisd
systemctl enable --now stratisd
创建 Stratis 池
stratis pool create pool1 /dev/vdb
创建包含一个或多个块设备的池
stratis pool list
查看可用池的列表
stratis pool add-data pool1 /dev/vdc
向池中添加额外的块设备
stratis blockdev list pool1
验证池的块设备
管理 Stratis 文件系统
stratis filesystem create pool1 fs1
从池中创建文件系统
stratis filesystem list
查看可用文件系统的列表
stratis filesystem snapshot pool1 fs1 snapshot1
创建 Stratis 文件系统快照
持久挂载 Stratis 文件系统
lsble --output=UUID /dev/stratis/pool1/fs1
获取文件系统的UUID
/etc/fstab 文件中持久挂载Stratis 文件系统的条目示例
UUID=c7b57190-8fba-463e-8ec8-29c807d45e /dir1 xfs defaults, x- system.requires=stratisd.service 0 0
指导练习:管理分层存储
开放研究实验:管理存储堆载
总结
你可以通过在多个存储设备上分配空间,使用 LVM 创建灵活的存储
物理卷、卷组和逻辑卷可通过pvcreate、vgreduce 和 lvextend 命令进行管理
逻辑卷可以格式化为文件系统或交换空间,并可以持久挂载
可以为卷组增加存储空间,也可以动态扩展逻辑卷
了解存储堆栈的层和组件,以有效管理存储
虚拟数据优化其(VDO)使用 LVM 进行数据压缩和重复数据删除
您可以使用Stratis 来执行初始化存储配置或启用高级存储功能
7. 访问网络附加存储
通过 NFS 管理网络附加存储
访问导出的 NFS 目录
网络文件系统(NFS)是由 Linux、UNIX 及类似操作系统使用的互联网标准协议,可作为它们的原生网络文件系统
挂载导出的目录
使用 mount 命令手动挂载
通过在 /etc/fstab 文件中配置条目,在启动时持久挂载
通过配置自动挂载器方法按需挂载
安装 nfs-utils 软件包,以获得客户端工具进行手动挂载,或进行自动挂载以获取导出的 NFS 目录
dnf install nfs-utils
RHEL 还支持从 Microsoft Windows 系统挂载共享目录,方法与 NFS 协议相同,使用服务器消息块(SMB)或通用互联网文件系统(CIFS)协议
查询服务器的导出 NFS 目录
NFSv3 使用的是 RPC 协议,这需要支持 NFSv3 连接的文件服务器才能运行 rpcbind 服务。NFSv3 客户端通过服务器上端口 111 连接到 rpcbind 服务,以请求 NFS 服务。服务器使用 NFS 服务的当前端口进行相应。使用 showmount 命令查询基于 RPC 的 NFSv3 服务器上的可用导出
showmount --exports server
NFSv4 协议消除了将传统 RPC 协议用于 NFS 事务的情况。在仅支持 NFSv4 的服务器撒谎给你使用 showmount 命令会超时且收不到响应,因为服务器上没有运行 rpcbind 服务。但是,查询 NFSv4 服务器比查询NFSv3 服务器更简单
NFSv4 引入了包含服务器导出目录的所以路径的导出树。要查看所以导出的目录,请挂载服务器导出树的根目录(/)。故障导出树的根目录可为所有导出的目录提供可浏览的路径,作为树根目录的子级,但不挂载(“绑定”)任何导出的目录
mkdir /mountpoint
mount server:/ /mountpoint
ls /mountpoint
要在浏览挂载的导出树时挂载 NFSv4 导出,请将目录更改为导出的目录路径
手动挂载导出的 NFS 目录
在确定要挂载的 NFS 导出后,请创建本地挂载点。/mnt 目录可用做临时挂载点,但建议的做法是不要将 /mnt 用于长期或持久挂载
与本地卷文件系统一样,挂载 NFS 导出以访问其内容。NFS 共享只能由特权用户临时或永久挂载
mkdir /mountpoint
mount -t nfs -o rw,sync server:/export /mountpoint
-t nfs 选项指定 NFS 文件系统类型。但是,当 mount 命令检测到 server:/export 语法时,该命令默认为 NFS 类型
使用 -o 标志,你可以将逗号分隔选项列表添加到 mount 命令。在示例中,rw 选项指定以读写访问权限挂载导出的文件系统
sync 选项指定与导出的文件系统的同步事务。强烈建议将此方法用于必须完成事务否则返回失败的所有生产网络挂载
使用手动 mount 命令不持久的。当系统重新启动时,该 NFS 导出仍不会挂载。手动挂载可用于提供对导出目录的临时访问,或者在持久挂载之前测试挂载 NFS 导出
持久挂载导出的 NFS 目录
要永久挂载 NFS 导出,请编辑 /etc/fstab 文件,并使用与手动挂载类似的语法添加挂载条目
vim /etc/fstab
然后,您可以仅使用挂载点来挂载 NFS 导出。mount 命令从 /etc/fstab 文件中的匹配条目获取 NFS 服务器和挂载选项
mount /mountpoint
卸载导出的 NFS 目录
以特权用户身份,使用 umount 命令卸载 NFS 导出。卸载共享不会删除其在 /etc/fstab 文件中的条目。/etc/fstab 文件中的条目是持久的,会在启动过程中重新挂载
umount /mountpoint
挂载的目录有时可能无法卸载,并返回一下错误:device is busy。至于设备忙碌的原因,可能是因为应用在文件系统内使文件保存打开,或者某个用户的 shell 在所挂载文件系统的根目录或其下级目录中由工作目录
要解决此错误,请检查您自己的活动 shell 窗口,然后使用 cd 命令退出挂载的文件系统。如果之后尝试卸载文件系统仍然失败,则使用 lsof (列出打开的文件)命令来查询挂载点。lsof 命令返回打开的文件名和使文件保持打开的进程的列表
lsof /mountpoint
使用此消息,正常关闭正在使用此文件系统上文件的所有进程,然后重新尝试卸载。仅在紧急情况下,无法正常关闭应用时可通过终止进程来关闭文件。或者,使用 umount -f 选项强制谢谢,这可能会导致丢失所有打开文件的未写入数据
指导练习:通过 NFS 管理网络附加存储
自动挂载网络附加存储
使用自动挂载器挂载 NFS 导出
自动挂载器时一项服务(autofs),可根据需要自动挂载文件系统和 NFS 导出,并在挂载的资源当前不再使用时自动卸载文件系统和 NFS 导出
自动挂载器功能的诞生时为了解决非特权用户没有足够权限来使用挂载命令的问题。
自动挂载器配置文件中填充了文件系统挂载信息,其方式与 /etc/fstab 条目类似。虽然 /etc/fstab 文件系统在系统启动期间挂载,并在系统关机或其他干预之前保持挂载状态,但自动挂载器文件系统不一定会在系统启动期间进行挂载。相反,当用户或应用尝试今日文件系统挂载点以访问文件时,自动挂载器控制的文件系统会按需进行挂载
自动挂载器优势
自动挂载器文件系统的资源使用等同于在启动时挂载的文件系统,因为文件系统仅在程序读取和写入打开的文件时使用资源。已挂载但空闲的文件系统和未挂载的文件系统使用相同数量的资源:几乎为零
自动挂载器的优势在于,通过在每次不在使用文件系统时将其卸载,可以防止文件系统在打开期间意外损坏。当文件系统再次定向到挂载时,autofs 服务使用最新的挂载配置,这与 /etc/fstab 挂载不同,后者可能仍使用数月前在上次系统启动机器挂载的配置
自动挂载器的 autofs 服务方法
autofs 服务支持与 /etc/fstab 文件中相同的本地和远程文件系统,包括 NFS 和 SMB 文件共享协议,并且支持特定于协议的挂载选项,包含安全参数。默认情况下,通过自动挂载器挂载的文件系统可供所有用户使用,但可以通过访问权限选项进行限制。
由于自动挂载器时使用标准 mount 和 umount 命令管理文件系统的客户端侧配置,因此使用中的自动挂载文件系统表现出的行为与使用 /etc/fstab 挂载的文件系统相同
直接和间接映射用例
自动挂载器支持直接和间接挂载点映射,以处理两种类型的按需挂载
直接挂载是指文件系统挂载到不变的已知挂载点位置。
间接挂载是指直到挂载请求发生时才会指定挂载点位置。
配置自动挂载器服务
配置自动挂载的过程包含许多步骤
首先,您必须安装 autofs 和 nfs-utils 软件包
sudo dnf install autofs nfs-utils
创建主映射
接下来,向 /etc/auto.master.d 添加一个主映射文件。此文件确定用于挂载点的基础目录,并确定用于创建自动挂载的映射文件
sudo vim /etc/auto.master.d/demo.autofs
主映射文件的名称大多数时任意的,为了让子系统能够识别,他必须以 .autofs 作为扩展名。您可以在一个主映射文件中放置多个条目;或者,您可以创建多个主映射文件,且各自包含的条目都进行逻辑分组
在本例中,为间接映射的挂载添加主映射条目
/shares /etc/auto.demo
此条目将使用 /shares 目录作为间接自动挂载的基础目录。/etc/auto.demo 文件中包含挂载详细信息。请使用绝对文件名。在启动 autofs 服务之前,必须先创建 atuo.demo 文件
创建间接映射
现在创建映射文件。每个映射文件确定一组自动挂载的挂载点、挂载选项及挂载的源位置
sudo vim /etc/auto.demo
映射文件的命名规则时 /etc/auto.name,其中 name 反映了映射内容
work -rw,sync serverb:/shares/work
条目的格式为挂载点、挂载选项和源位置。此示例显示基本的间接映射条目
间接映射中的通配符
当 NFS 服务器导出一个目录中的多个子目录时,可将自动挂载程序配置为使用单个映射条目访问这些子目录其中的任何一个
继续签名的示例,如果 serverb:/shares 导出两个或多个子目录,并且能够使用相同的挂载选项访问这些子目录,则 /etc/auto.demo 文件的内容可能如下所示
* -rw,sysc serverb:/shares/&
挂载点(或密码)时星号字符(*),而源位置上的子目录是 & 符合。条目中的所有其他内容都相同
当用户尝试访问 /shares/work时,密码 * (本例中为work)将代替源位置中的 & 符合,并挂载 serverb:/exports/work。对于间接挂载示例,autofs 服务将自动创建和删除 work 目录
创建直接映射
直接映射用于将 NFS 导出映射到绝对路径挂载点。只需要一个直接映射文件,其可以包含任意数量的直接映射
要使用直接映射的挂载点,主映射文件可能如下所示
/- /etc/auto.direct
所有直接映射目录使用 /- 作为基础目录。在此例中,包含挂载详细信息的映射文件是 /etc/auto.direct
/etc/auto.direct 文件的内容可能如下所示
/mnt/docs -rw,sync serverb:/shares/docs
挂载点(或密码)始终为绝对路径。映射文件的其余部分使用相同的结构
在本例中,存在 /mnt 目录,它不是由 autofs 服务管理的。autofs 服务将自动创建和删除整个 /mnt/docs 目录
启动自动挂载器服务
最后,使用 systemctl 命令启动并启动 autofs 服务
sudo systemctl enable --now autofs
其他 systemd.automount 方法
systemd 守护进程可以自动为 /etc/fstab 中包含 x-systemd.automount 选项的条目创建单元文件。在修改条目的挂载选项后,使用 systemctl daemon-reload 命令生成新的单元文件,然后使用 systemctl start unit.automount 命令启用该自动挂载配置
单元的命名基于挂载位置。例如,如果挂载点是 /remote/finance,则单元文件将被命名为 remote-finance.automount。systemd守护进程在 /remote/finance 目录初次被访问是挂载文件系统
此方法比安装和配置 autofs 服务更为简单。但是,systemd.automount 单元仅可支持绝对路径挂载点,类似于 autofs 直接映射
指导练习:自动挂载网络附加存储
开放研究实验:访问网络附加存储
总结
从命令行挂载和卸载 NFS 共享
配置 NFS 共享,使之在系统启动时自动挂载
为自动挂载器配置直接和间接映射,并描述二者的差异
8. 控制启动过程
选择启动目标
描述红帽企业 Linux 9 的启动过程
现在计算机系统是硬件与软件的复杂组合。从未定义的断电状态开始,到拥有登录提示符的运行中系统,这需要许多硬件和软件配合工作。以下列表简要概述了物理 x86_64 系统引导红帽企业 Linux 9 所涉及的任务。x86_64 虚拟机列表大致相同,但虚拟机监控程序会在软件中处理一些特定于硬件的步骤
计算机已接通电源。习惯固件(现代UEFI 或更旧的 BIOS)运行开机自检(POST),并开始初始化硬件。
系统固件会搜索可启动设备,可能是在 UEFI 启动固件中配置的,也可能是安装 BIOS 或 UEFI 中配的顺序搜索所有磁盘上的主启动记录(MBR)
系统固件会从磁盘读取启动加载器,然后将系统控制权交给启动加载器。在红帽企业 Linux 9 系统中,启动加载器未GRand Unified bootloader version 2 (GRUB2)
GRUB2 将从 /boot/grub2/grub.cfg 文件(BIOS)和 /boot/efi/EFI/redhat/grub.cfg 文件(UEFI)加载配置并显示一个菜单,从中可以选择要启动的内核
选择内核或超时到期后,启动加载器会从磁盘中加载内核和 initramfs,并将它们放入内存中。initramfs 是一个存档,其中包含启动时所有必要硬件的内核模块、初始化脚本等等。在红帽企业 Linux 9 中,initramfs 包含可启动根文件系统,它具有正在运行的内核和 systemd 实例。
启动加载器将控制器交给内核,从而传递启动器加载器的内核命令行中指定的任何选项,以及 initramfs 在内存中的位置
对于内核可在 initramfs 中找到驱动程序的所有硬件,内核会初始化这些硬件,然后作为 PID 1 从 initramfs 执行 /sbin/init。在红帽企业 Linux 9 中,/sbin/init 是一个指向 systemd 的链接
initramfs 中的 systemd 实例会执行 initrd.target 目标的所有单元。这包括将磁盘上的根文件系统挂载于 /sysroot 目录
内核将根文件系统从 initramfs 切换(回转)为 /sysroot 目录中的根文件系统。最后,systemd 会使用磁盘中安装的 systemd 副本来自行重新执行。
systemd 会查找从内核命令行传递或系统中配置的默认目标,然后启动(或停止)单元,以符合该目标的配置,从而自动解决单元间的依赖关系。本质上,systemd 目标是一组系统应激活以达到所需状态的单元。这些目标通常启动一个基于文本的登录或图形登录屏幕
重启和关机
要关闭或从命令行重启动正在运行的系统,可以使用 systemctl 命令
systemctl poweroff 命令会停止所有运动的服务,卸载所有文件系统(或者在文件系统无法卸载是以只读形式将其重新挂载),然后关闭系统。
systemctl reboot 命令会停止所有运行的服务,卸载所有文件系统,然后重新启动系统
您也可以使用这些命令的简短版本 poweroff 和 reboot,它们是 systemctl 同等命令的符合连接
选择 Systemd 目标
systemd 目标是一组系统应启动以达到所需状态的 systemd 单元
graphical.target
系统支持多用户、图形和基于文本的登录
multi-user.target
系统仅支持多用户、基于文本的登录
rescue.target
sulogin 提示,表示基本系统初始化已完成
emergency.target
sulogin 提示,表示 initramfs 回转完成,且系统root 以只读形式挂载于 / 上
某个目标可能属于另一个目标。例如,graphical.target 包含 multi-user.target,后者反过来取决于 basic.target 和其他目标。
查看这些依赖项
systemctl list-dependencies graphical.target | grep target
列出可用目标
systemctl list-units --type=target --all
在运行时选择目标
在运行中的系统中,管理员可用使用 systemctl isolate 命令来切换到其他目标
systemctl isolate multi-user.target
隔离某个目标会停止该目标(及其依赖项)不需要的所有服务,并启动任何尚未启动的所需服务
并非所有目标都能隔离。您只能隔离单元文件中设置了 AllowIsolate=yes 的目标。例如,您可用隔离图形目标,但不能隔离 cryptsetup 目标
systemctl cat graphical.target
systemctl cat cryptsetup.target
设置默认目标
系统启动时,systemd 会激活 default.target 目标。
通常,/etc/systemd/system/ 中的默认目标是指向 graphical.target 或 multi-user.target 目标的符合链接
systemctl 命令提供了两个名(get-default 和 set-default)用于管理该符号链接,而不是手动编辑该链接
systemctl get-default
systemctl set-default graphical.target
systemctl get-default
在启动时选择其他目标
要在启动时选择其他目标,请从启动加载器将 systemd.unit=target.target 选项附加到内核命令行
例如,要将系统启动到救援 shell,以便能在几乎没有任何服务运行的情况下更改系统配置,请从启动加载器将以下选项附加到内核命令行
systemd.unit=rescue.target
该配置更改仅影响单个启动,这使其成为对启动过程进行故障排除的有用工具
要使用这种选择其他目标的方法
启动或重新启动系统
按任意键(Enter 除外,它用于执行正常启动)中断启动加载器菜单倒计时
将光标移至要启动的内核条目
按 e 编辑当前条目
将光标移至 Linux 开头的行。此为内核命令行
附加 system.unit=target.target。例如,systemd.unit=emergency.target
按 Ctrl+x 使用这些更改进行启动
指导练习:选择启动目标
重置 root 密码
从启动加载器重置 root 密码
每个系统管理都应该能完成的一项任务是重置丢失的 root 密码。如果管理员仍然处于登录状态,不管是作为拥有完全 sudo 访问权限的非特权用户,还是作为 root 用户,此任务都很简单。如果管理员没有登录,则此任务会变得略微复杂
有几种方法可用用于设置新的 root 密码。例如,系统管理员可用使用 Live CD 启动系统,从此挂载根文件系统,返回编辑 /etc/shadow
在红帽企业 Linux 9 中,可用使从 initramfs 运行的脚本来某些点暂停,提供 root shell,然后在该 shell 存在的情况下继续。这里主要使为进行调试,但也可以使用该方法来重置丢失的 root 密码
从红帽企业 Linux 9 开始,如果您从 DVD 安装系统,则默认的内核在您尝试进入维护模式时会要求输入 root 密码。因此,若要重置丢失的 root 密码,您需要使用救援内核。但时,如果你的系统时从红帽云镜像不是的,那么您的引导菜单中将不会显示救援内核,但您的默认内核将具有类似的行为,允许您在不输入 root 密码的情况下进入维护模式
要访问该 root shell
重新启动系统
按任意键(Enter 除外)中断启动加载器倒计时
将光标移动到要引导的救援内核条目(名称中带有 rescue 一词的条目)
按 e 编辑选定的条目
将光标移到内核命令行(以 Linux 开头的行)
附件 rd.break。利用该选项,就在系统从 initramfs 向实际系统移交控制权前,系统将中断
按 Ctrl+x 使用这些更改来启动
提示时,按 Enter 执行维护
此时,系统会显示 root shell,且磁盘上的实际根文件系统会在 /sysroot 中以只读方式挂载。由于进行故障排除经常要求修改根文件系统,因此您必须将根文件系统更改为读/写。以下步骤说明在对 mount 命令使用 remount,rw 选项的情况下,如何利用所设置的新选项(rw)重新挂载文件系统
从此时重置 root 密码
以读/写形式重新挂载 /sysroot
mount -o remount.rw /sysroot
切换为 chroot 存放位置,其中 /sysroot 被视为文件系统树的根
chroot /sysroot
设置新 root 密码
passwd root
确保所有未标记的文件(包括此时的 /etc/shadow)在启动过程中都会重新获得标记
touch /.autorelabel
键入 exit 两次。第一次命令退出 chroot 存放位置,第二个命令将退出 initramfs 调试 shell
此时,系统将继续进行启动,执行完整的 SELinux 重新标记,然后再次重新启动
检查日志
查看以前启动失败时的日志会很有用。如果系统日志在重启后持久保留,则可以使用 journalctl 工具来检查这些日志
默认情况下,系统日志保存在 /run/log/journal 目录中,这意味这系统重启时这些日志会被清除。要将日志存储在 /var/log/journal 目录中(可在系统重启后持久保留),请在 /etc/systemd/journald.conf 中将 Storage 参数设置为 persistent
vim /etc/systemd/journal.conf
Storage=persistent
systemctl restart systemd-journald.service
要检查上一次启动的日志,请使用 journalctl 命令 -b 选项。如果不使用任何参数, journalctl 命令-b 选项将仅显示从上一次启动以来的消息。如果参数为负数,则显示以前的启动的日志
journalctl -b -1 -p err
显示上一次启动中被评为错误或更严重级别的所有消息
修复 Systemd 启动问题
启动早期调试 Shell
通过在 systemctl enable debug-shell.service 启用 debug-shell 服务,系统会于启动序列早期在 TTY9 (Ctrl+Alt+F9)上生成一个 root shell。该 shell 会自动作为 root 登录,这样管理员可以在操作系统仍在启动时对系统进行调试
或者,若要在引导期间使用 GRUB2 菜单激活调试 shell
重新启动系统
按任意键(Enter 除外)中断启动器加载倒计时
将光标移至要启动的内核条目
按 e 编辑选定的条目
将光标移到内核命令行(以 Linux 开头的行)
附件 systemd.debug-shell。使用此参数时,系统将启动至调试 shell
按 Ctrl+x 使用这些更改来启动
使用紧急和救援目标
通过从启动加载器将 systemd.unit=rescue.target 或 systemd.unit=emergency.target 附件到内核命令行,系统将生成救援或紧急 shell,而不是正常启动。这两个 shell 都需要提供 root 密码
紧急目标使根文件系统以只读方式挂载,而救援目标会等待 sysinit.target 完成,这样系统的更多部分会进行初始化,如日志记录服务或文件系统。此时 root 用户无法更改 /etc/fstab,直至通过 mount -o remount,rw / 命令以读写状态重新挂载驱动器
管理员可以使用这些 Shell 来修复妨碍系统正常启动的任何问题;例如,服务之间的依赖关系循环,或 /etc/fstab 中的错误条目。从这些 shell 退出后,系统会继续进行常规启动过程
识别阻塞作业
在启动过程中,systemd 会生成大量作业。如果启动某些作业无法完成,则它们会妨碍其他作业运行。要检查当前作业列表,管理员可以使用 systemctl list-jobs 命令。所有列为 running 的作业都必须先完成,然后列为 waiting 的作业才可以继续
指导练习:重置 root 密码
修复在启动时出现的文件系统问题
文件系统问题
在启动过程中,systemd 服务挂载 /etc/fstab 文件中定义的持久文件系统
/etc/fstab 文件中的错误或文件系统损坏可能会阻止系统完成启动过程。在一些故障情形中,系统会中断启动过程并打开紧急 shell,需要输入 root 用户密码
以下列表描述了在启动过程中解析 /etc/fstab 时出现的一些常见文件系统挂载问题:
文件系统损坏
systemd 服务会尝试修复文件系统。如果问题无法自动修复,则系统会打开紧急 shell
设备/UUID 不存在
systemd 服务在等待设备变为可用时超时。如果设备不响应,系统将打开紧急 shell
修复在启动时出现的文件系统问题
为了访问因文件系统问而无法完成启动的系统,systemd 架构提供了一个 emergency 启动目标,它将打开一个需要 root 密码才能访问的紧急 shell
system 守护进程挂载 /dev/vda2 设备失败并超时。由于设备不可用,系统会打开一个紧急 shell 以进行维护性访问
要在系统打开紧急 shell 时修复文件系统问题,请先找到出错的文件系统,然后找到并修复错误。现在,重新加载 systemd 配置,以重试自动挂载。
使用 mount 查找 systemd 守护进程当前挂载了哪些文件系统
mount
如果根文件系统时使用 ro (只读)选项挂载的,您无法编辑 /etc/fstab 文件。如有必要,可在打开 /etc/fstab 文件之前使用 rw (读写)选项临时重新挂载根文件系统。重新挂载选项允许使用中的文件系统更改其挂载参数,而无需卸载文件系统
mount -o remount,rw /
使用 mount --all 选项,尝试挂载 /etc/fstab 文件中列出的所有文件系统。此选项在每个条目文件系统条目上挂载进程,但跳过已挂载的进程。命令显示挂载文件系统时发生的任何错误
mount --all
在此情形中,/mnt/mountfolder 挂载目录不存在,因此请先创建 /mnt/mountfolder 目录,然后重新尝试挂载。可能会显示其他错误消息,包括条目中存在拼写错误,或者设备名称或 UUID不正确
更正了 /etc/fstab 文件中的所有问题后,通知 systemd 守护进程使用 systemctl daemon-reload 命令注册新的 /etc/fstab 文件。然后,重新尝试挂载所有条目
systemctl daemon-reload
mount --all
如果 mount --all 命令成功且无其他错误,则最终测试将验证系统启动期间文件系统挂载是否成功。重新启动系统并等待启动正常完成
systemctl reboot
要执行 /etc/fstab 文件中的快速测试,请使用 nofail 挂载条目选项。利用 /etc/fstab 条目呢的 nofail 选项,允许在关卡文件系统挂载不成功的情况下仍然启动系统。此选项不应用于必须始终挂载的生产文件系统。使用 nofail 选项时,应用可用在缺失文件系统的前提下启动,这可能会带来严重后果
指导练习:修复在启动是出现的文件系统问题
开放研究实验:控制启动过程
总结
systemctl reboot 和 systemct poweroff 命令可分别重新启动和关闭系统
systemctl isolate target-name.target 命令运行时切换到新目标
systemctl get-default 和 systemctl set-default 命令可用于查询和设置默认目标
在 initramfs 移交控制权前,您可以在内核命令行中使用 rd.break 选项来中断启动过程。根文件系统以只读形式挂载于 /sysroot 下
紧急目标可用于诊断和修复文件系统问题
9. 管理网络安全
管理服务器防火墙
防火墙架构概念
Linux 内核提供了 netfilter 架构,它是网络流量操作(如数据包过滤、网络地址转换和端口转换)的框架
netfilter 框架包含用于内核模块的 hook,以便在遍历系统的网络堆栈时与网络数据包进行交互。
从根本上说,netfilter hook 时拦截事件(例如,数据包进入接口)并运行其他相关例程(例如,防火墙规则)的内核例程
nftables 架构
nftables 数据包分类框架基于 netfilter 框架而构建,可将防火墙规则应用到网络流量
在红帽企业 Linux 9 中,nftables 是系统防火墙核心,取代了已弃用的 iptables 框架
firewalld 服务
firewalld 服务是一种动态防火墙管理器,也是 nftables 框架的推荐前端
firewalld 服务将所有网络流量分为多个区域,从而简化防火墙管理。网络数据包分配到的区域取决于数据包的源 IP 地址或传入的网络接口等条件。每个区域都有自己的端口和服务列表,它们处于打开或者关闭状态
firewalld 服务会确保进入系统的每个数据包的源地址。如果源地址被分配给特定区域,则应用该区域的规则。如果源地址未分配给某个区域,则 firewalld 会将数据包与传入网络接口的区域相关联,并应用该区域的规则。如果网络接口未与某个区域关联,则 firewalld 会将数据包发送到默认区域
默认区域不是一个单独的区域,而是指代现有的区域。最初,firewalld 服务指定 public 区域未默认区域,并将 lo 回环接口映射至 trusted 区域
大多数区域会允许与特定端口和协议(例如 631/udp)或预定义服务配置(例如 ssh)的列表匹配的流量通过防火墙。通常而言,如果流量不与允许的端口和协议或服务匹配,则流程会被拒绝。trusted 区域默认情况下允许所有流量,它是一个列外。
预定义区域
firewalld 服务使用您可以自定义的预定义区域。默认情况下,如果传入流量属于系统启动的现有会话的一部分,则所有区域都允许这些传入流量和所有传出流量
Firewalld 区域默认配置
trusted
允许所有传入流量
home
除非与传出流量相关,或与 ssh、mdns、ipp-client、samba-client 或 dhcpv6-client 预定义服务匹配,否则拒绝传入流量
internal
除非与传出流量相关,或与 ssh、mdns、ipp-client、samba-client 或 dhcpv6-client 预定义服务匹配,否则拒绝传入流量(一开始与 home 区域相同)
work
除非与传出流量相关,或与 ssh、ipp-client 或 dhcpv6-client 预定义服务匹配,否则拒绝传入流量
public
除非与传出流量相关,或与 ssh 或 dhcpv6-client 预定义服务匹配,否则拒绝传入流量。新添加的网络接口的默认区域
external
除非与传出流量相关,或与 ssh 预定义服务匹配,否则拒绝传入流量。通过此区域转发的 IPv4 传出流量将进行伪装,以使其看起来向使来自传出网络接口的 IPv4 地址
dmz
除非与传出流量相关,或与 ssh 预定义服务匹配,否则拒绝传入流量
block
除非与传出流量相关,否则拒绝所有传入流量
drop
除非与传出流量相关,否则丢弃所有传入流量(甚至不产生包含 ICMP 错误的响应)
预定义服务
firewalld 服务包含多个常见服务的预定义配置,以简化防火墙规则的设置。例如,使用预定义的 nfs 配置为正确的端口和协议创建规则,而不是研究 NFS 服务器的相关端口。
预定义 Firewalld 服务节选
ssh
本地 SSH 服务器。到 22/tcp 的流量
dhcpv6-client
本地 DHCPv6 客户端。到 fe80::/64 IPv6 网络中 546/udp 的流量
ipp-client
本地 IPP 打印。到 631/udp 的流量
samba-client
本地 Windows 文件和打印共享客户端。到 137/udp 和 138/udp 的流量
mdns
多播 DNS (mDNS)本地链路名称解析。到 5353/udp 指向 224.0.0.251(IPv4)或 ff02::fb(IPv6)多播地址的流量
cockpit
红帽企业Linux 基于 Web 的界面,用于管理和监控本地和远程系统。到 9090 端口的流量
firewalld 软件包中包含许多预定义的服务配置。使用 firewll-cmd --get-services 命令列出这些服务
如果预定义的服务配置不适合您的场景,您可以手动指定所需的端口和协议。您可以使用 Web 控制台图形界面来查看预定义服务,以及手动定义更多端口和协议
配置 firewalld 守护进程
其中,系统管理员用于与 firewalld 服务交互的两种常见方式是
Web 控制台图形界面
firewall-cmd 命令工具
使用 Web 控制台配置防火墙服务
要使用 Web 控制台管理防火墙服务,您需要登录并升级特权。
您可以通过点击 Limited access 或 Turn on administrative access 按钮来升级特权。然后,在系统提示时输入您的密码
单据左侧导航菜单中的 Networking 选项,以显示主网络页面中的 Firewall 部分。单击 Edit rules and zones 按钮区域以导航到 Firewall 页面
Firewall 页面显示活动区域及其允许的服务。单据服务名称左侧的箭头(>)按钮可查看其详细信息。要将服务添加到某个区域,可单据适用区域右上角的 Add services 按钮
Add Services 页面显示可用的预定义服务
要选择服务,请滚动列表或在 Filter services 文本框中输入选择内容。在以下示例中,http 字符串将选项过滤为 Web 相关服务。选中服务左侧的复选框,以允许服务通过防火墙。单击 Add services 按钮完成此过程
界面将返回到 Firewall 页面,在这里查看更新后台允许的服务列表
从命令行配置防火墙
firewall-cmd 命令与 firewalld 守护进程交互。它是作为 firewalld 软件包的一部分安装的,可用于倾向于使用命令行的管理员,在没有图形环境的系统上工作,或编写有关防火墙设置的脚本
下表列出常用的 firewall-cmd 命令及其说明。请注意,除非另有指定,否则大部分命令都作用于运行是配置,但指定 --permanent 选项时除外。如果指定了 --permanent 选项,您还必须通过运行 firewall-cmd --reload 命令来激活设置,它将读取当前的永久配置并将其作为新的运行时配置来应用。列出的许多命令都采用 --zone=ZONE 选项来查找所影响的区域。如果需要子网掩码,请使用 CIDR 表示法,如 192.168.1/24
--get-default-zone
查询当前默认区域
--set-default-zone=ZONE
设置默认区域。此命令会同时更改运行时配置和永久配
--get-zones
列出所有可用区域
--get-active-zones
列出当前正在使用的所有区域(具有关联的接口或源)及其接口和源信息
--add-source=CIDR [--ZONE=zone]
将来自 IP 地址或网络/子网掩码的所有流量路由到指定区域。如果未提供 --zone=选项,则使用默认区域
--remove-source=CIDR [--ZONE=zone]
将区域中删除用于路由来自 IP 地址或网络的所有流量的规则。如果未提供 --zone=选项,则使用默认区域
--add-interfae=INTERFACE [--zone=ZONE]
将来自 INTERFACE 的所有流量路由到指定区域。如果未提供 --zone=选项,则使用默认区域
--change-interface=INTERFACE [--zone=ZONE]
将接口与 ZONE 而非其当前区域关联。如果未提供 --zone=选项,则使用默认区域。
--list-all [--zone=ZONE]
列出 ZONE 的所有已配置接口、源、服务和端口。如果未提供 --zone=选项,则使用默认区域
--list-all-zones
检索所有区域的所有信息(接口、源、端口、服务)
--add-service=SERVICE [--zone=ZONE]
允许到 SERVICE 的流量。如果未提供 --zone=选项,则使用默认区域
--add-port=PORT/PROTOCOL [--zone=ZONE]
允许到 PORT/PROTOCOL 端口的流量。如果未提供 --zone=选项,则使用默认区域
--remove-service=SERVICE [--zone=ZONE]
从区域的允许列表中删除 SERVICE。如果未提供 --zone=选项,则使用默认区域
--remove-port=PORT/PROTOCOL [--zone=ZONE]
从区域的允许列表中删除 PORT/PROTOCOL 端口。如果未提供 --zone=选项,则使用默认区域
--reload
丢弃运行时配置并应用持久配置
以下示例会将默认区域设置为 dmz,将来自 192.168.0.0/24 网络的所有流量都分配给 internal 区域,并在 internal 区域上打开用于 mysql 服务的网络端口
firewall-cmd --set-default-zone=dmz
firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
firewall-cmd --permanent --zone=internal --add-service=mysql
firewall-cmd --reload
将来自 172.252.25.11 单一 IPv4 地址的所有传入流量都添加到 public 区域
firewall-cmd --permanent --zone=public --add-source=172.25.25.11/32
firewall-cmd --reload
指导练习:管理服务器防火墙
控制 SELinux 端口标记
SELinux 端口标记
除了文件上下文和进程类型标记外,SELinux 还使用 SELinux 上下文来标记网络端口。SELinux 通过标记网络端口并将规则包含在服务的目标策略中来控制网络访问
例如,SSH 目标策略包括 22/TCP 端口和 ssh_port_t 端口上下文标签。在 HTTP 策略中,默认的 80/TCP 和 443/TCP 端口使用 http_port_t 端口上下文标签
当目标进程尝试打开端口进行侦听时,SELinux 会验证策略是否包含支持该进程与上下文绑定的条目。然后,SELinux 可以阻止恶意服务控制本应由其他合法网络服务使用的端口
管理 SELinux 端口标签
如果服务尝试侦听非标准端口,并且该端口未使用正确的 SELinux 类型进行标记,SELinux 可能会阻止该尝试。您可以通过更改端口上的 SELinux 上下文来更正此问题
通常,targeted 策略已使用正确的类型标记了所有有预期的端口。例如,由于 Web 应用通常使用端口 8008/TCP,因此该端口已标有 http_port_t,这是 Web 服务器默认的端口类型。单个端口只能标记一个端口上下文。
列出端口标签
使用 grep 命令来过滤端口号
grep gopher /etc/services
使用 semanage 命令列出当前的端口标签分配
semanage port -l
使用 grep 命令,通过服务名称过滤 SELinux 端口标签
semanage port -l | grep ftp
一个端口标签可以在列表中针对每个支持的网络协议出现多次
使用 grep 命令,通过端口号过滤 SELinux 端口标签
semanage port -l | grep -w 70
管理端口绑定
使用 semanage 命令,分配新端口标签,删除端口标签,以及修改现有端口标签
您可以使用现有的端口上下文标签(类型)标记新端口。semanage port 命令的 -a 选项可添加新端口标签,-t 选项表示类型,-p 选项则表示协议
semanage port -a -t port_label -p tcp|udp PORTNUMBER
例如,允许 gopher 服务侦听端口 71/TCP
semanage port -a -t gopher_port_t -p tcp 71
要查看对默认策略的本地更改,可使用 semanage port 命令的 -C 选项
semanage port -l -C
目标策略包括许多端口类型
特定于服务的 SELinux man page 使用服务名称加 _selinux 来命名。这些 man page 包括有关 SELinux 类型、布尔值和端口类型的服务特定信息,但默认情况下不安装。要查看所有可用 SELinux 帮助手册的列表,请安装相关软件包,然后运行 man -k 关键字搜索来查找 _selinux
dnf -y install selinux-policy-doc
man -k _selinux
使用 semanage 命令加 -d 选项来删除端口标签。例如,删除端口 71/TCP 与 gopher_port_t 类型的绑定
semanage port -d -t gopher_port_t -p tcp 71
要在需求发生改变时更改端口绑定,请使用 -m 选项。这样与删除就绑定并添加新绑定相比更加高效
例如,要将端口 71/TCP 从 gopher_port_t 修改为 http_port_t
semanage port -m -t http_port_t -p tcp 71
使用 semanage 命令查看修改情况
semanage port -l -c
semanage port -l | grep http
指导练习:控制 SELinux 端口标记
开放研究实验:管理网络安全
总结
netfilter 框架允许内核模块检查遍历系统的每一个数据包,包括所有传入、传出或转发的网络数据包
firewalld 服务将所有网络流量分为多个区域,从而简化防火墙管理。每个区域都有自己的端口和服务列表。public 区域被设置为默认区域
firewalld 服务随附有一些预定义服务。您可用使用 firewall-cmd --get-services 命令列出它们
SELinux 策略通过标记网络端口来严格控制网络流量。例如,端口 22/TCP 具有标签 ssh_port_t 与其相关联。当某个进程希望侦听端口时,SELinux 将检查是否允许与其相关联的标签绑定该端口标签
使用 semanage 命令来添加、删除和修改标签
10. 安装红帽企业 Linux
安装红帽企业 Linux
了解安装介质
含有 Anaconda 的 ISO 9660 格式的二进镜像文件、红帽企业 Linux 安装程序,以及 Base OS 和 AppStream 软件包存储库
一个含有 Anaconda 的较小“引导ISO”镜像文件,它需要配置网络,以便访问通过 HTTP、FTP或 NFS 提供的软件包存储库
一个含有预构建系统磁盘的 QCOW2 镜像,它可以在云或企业虚拟机环境中部署为虚拟机
红帽企业 Linux 的源代码(人类可读的编程语言指令)
红帽企业 Linux 支持下列架构
AMD、Intel 和 ARM 64 位架构
IBM Power System (Little Endian、LC 服务器和 AC 服务器)
IBM Z 64 位
使用镜像构建器构建镜像
红帽镜像构建器工具可以帮助创建红帽企业 Linux 的自定义镜像。
针对特殊用例,镜像构建器允许管理员构建自定义系统镜像,以便在云平台或虚拟机中进行部署
使用 composer-cli 命令或红帽 Web 控制台界面访问镜像构建器
手动安装红帽企业 Linux
借助二进制 DVD 或引导 ISO,管理员可以在裸机服务器或虚拟机上安装新的 RHEL 系统。Anaconda 程序支持手动和自动两种安装方式
手动安装与用户进行交互,查询 Anaconda 如何安装和配置系统
自动安装将使用 Kickstart 文件,它会告诉 Anaconda 如何安装系统
使用图形界面安装 RHEL
当您通过二进制 DVD 或引导 ISO 来启动系统时,Anaconda 将作为图形应用启动
在 WELCOME TO RED HAT ENTERPRISE LINUX 9 屏幕中,选择安装期间需要使用的语言,并单击 Continue 按钮。此按钮也会设置系统安装后的默认语言。每个用户都可以在安装后选择首选语言
Anaconda 显示 INSTALLATION SUMMARY 窗口,这是在开始安装之前自定义参数的中心界面
在此窗口中,通过按任意顺序选择图标来配置安装参数。选择项目进行查看或编辑。在任一项目中,单击 Done 可返回此中心屏幕
Anaconda 使用三角警告符号和消息来标记必填的项目。屏幕底部显示橙色状态栏提醒您必须完成这些必填的信息后才能开始安装
根据需要填写以下项目
Keyboard:添加其他键盘布局
Language Support:选择要安装的其他语言
Time & Date:通过在交互式地图中单击或者从列表中选择,选择系统所在的位置。指定本地时区,即便时使用了网络时间协议(NTP)
Connect to Red Hat:使用您的红帽账户注册系统并选择系统用途。西用途功能允许注册过程自动将最合适的订阅附加到系统。您必须收藏使用 Network & Host Name 图标连接到网络,才能注册系统
Installation Source:提供 Anaconda 安装所需的源软件包位置。使用二进制 DVD 时,安装源字段已指向 DVD
KDUMP:内核崩溃转储功能 kdump 会手机内核崩溃时系统内存状态的相关信息。红帽工程师通过分析 kdump 文件来确定崩溃的原因。使用此 Anaconda 项目可以启动或禁用 kdump
Network & Host Name:检查到的网络连接列在左侧。选择一个连接以显示其详细信息。默认情况下,Anaconda 现在自动激活网络。单击 Configure 按钮,以配置所选的网络连接
Security Profile:通过激活安全策略配置集,Anaconda 可在安装期间应用有所选配置集定义的限制和建议
Root Password:安装程序提示设置 root 密码。只能定义了 root 密码后,才会继续执行安装过程的最终阶段
User Creation:创建一个可选的非 root 账户建议维护一个本地统一账户。建议您创建一个本地通用账户。您也可以等安装完成后再创建账户
完成安装配置并解除所有警告后,单击 Begin Installation 按钮。单击 Quit 按钮将终止安装且不应用对系统的任何更改
安装完成后,单击 Reboot 按钮。安装图形桌面时,Anaconda 会显示 Initial Setup 屏幕。接受许可信息,并可选择向订阅管理器注册系统。您可以跳过系统注册,稍后在执行该操作
对安装进行故障排除
在红帽企业 Linux 9 安装期间,Anaconda 提供两个虚拟控制台。第一个虚拟控制台有五个窗口,它们由 tmux 软件终端多路复用器提供。您可以使用 Ctrl+Alt+F1 访问该控制台。
第二个虚拟控制台(默认会显示此控制台)将显示 Anaconda 图形界面。您可以使用 Ctrl+Alt+F6 来访问它
在第一个虚拟控制台中,tmux 终端在第二个窗中提供 shell 提示符。您可以使用它来输入命令。以在安装过程中检查系统并镜像故障排除。其余窗口中提供了诊断消息、日志及其他信息
下表列出了用于访问虚拟控制台和 tmux 终端窗口的按键组合。在tmux 终端中,键盘快捷键通过两个操作执行:按下和释放 Ctrl+B,然后按下您要访问的窗口所对应的数字键。在 tmux 终端中,您也可以使用 Alt+Tab 在窗口之间轮换当前焦点
Ctrl+Alt+F1
访问 tmux 终端多路复用器
Ctrl+B1
在 tmux 终端中,访问安装过程的主要信息页面
Ctrl+B2
在 tmux 终端中,提供 root shell。Anaconda 会将安装日志文件存储到 /tmp 目录中
Ctrl+B3
在 tmux 终端中时,显示 /tmp/anaconda.log 文件的内容
Ctrl+B4
在 tmux 终端中时,显示 /tmp/storage.log 文件的内容
Ctrl+B5
在 tmux 终端中时,显示 /tmp/program.log 文件的内容
Ctrl+Alt+F6
访问 Anaconda 图形界面
指导练习:安装红帽企业 Linux
使用 Kickstart 自动安装
Kickstart 介绍
红帽企业 Linux 的 Kickstart 功能可以自动执行系统安装。您可以使用 Kickstart 文本文件来配置磁盘分区、网络接口和软件包选择,以及对安装进行自定义。Anaconda 安装程序使用 Kickstart 文件执行完整安装,无需用户交互。Kickstart 功能与类似,它使用 Microsoft Windows 的无人值守设置应答文件
Kickstart 文件以一个命令列表开头,这些命令定义如何安装目标计算机。安装程序将忽略由井号(#)字符表示的注释行。其他部分以指令开头(应以百分号(%)字符表示),并以带由 &end 指令的行结束
%packages 部分指定安装时要包含的软件。通过名称(不带版本)指定各个软件包。@字符表示软件包组(按组或ID),而 @^ 字符表示环境组(软件包组的组)。最后,使用 @module:stream/profile 语法表示模块流
组具有必需、默认和可选组件。通常,Kickstart 将安装必需组件和默认组件。要从安装中排除某个软件包或软件包组,请在其签名加上连字符 -。如排除的软件包或软件包组是其他所请求软件包的强制依赖项,则仍可能会安装这些软件包或软件包组
Kickstart 配置文件通常含有一个或多个 %pre 和 %post 部分,其中包含进一步配置系统的脚本。%pre 脚本在进行任何磁盘分区之前执行。通常,您使用 %pre 脚本来初始化安装的其余部分所需的存储或网络设备。%post 脚本在初始安装完成后执行。%pre 和 %post 部分中的脚本可以使用系统上可用的任何解释器,包括 Bash 或 Python。您应尽可能避免使用 %pre 部分,因为其中发生的任何错误或许难以诊断。
最后,您可以按任何顺序指定任意数量的部分。例如,您可以有两个 %post 部分,它们会按照出现顺序进行解释
安装命令
以下 Kickstart 命令配置安装来源和方法
url:指定指向安装介质的 URL
url --url="http://classroom.example.com/content/rhel9.0/x86_64/dvd/"
repo:指定到哪里查找要安装的其他软件包。此选项必须指定有效的 DNF 存储库
repo --name="appstream" --baseurl=http://classroom.example.com/content/rhel9.0/x86_64/dvd/AppStream
text:强制进行文本模式安装
vnc:启用 VNC 查看器,以便您可以通过 VNC 远程访问图形安装
vnc --password=redhat
设备和分区命令
以下 Kickstart 命令配置设备和分区方案
clearpart:在创建新分区之前从系统中删除分区
clearpart --all --drives=vda,vdb
part:指定分区的大小、格式和名称。这是必需的,除非存在 autopart 或 mount 命令
part /home --fstype=ext4 --label=homes --size=4096 --maxsize=8192 --grow
autopart:自动为架构创建 root 分区、交换分区和适当的引导分区。在足够大(50 GB+)的驱动器上,这还会创建 /home 分区
ignoredisk:防止 Anaconda 修改磁盘,可与 autopart 命令搭配使用
ignoredisk --drives=sdc
bootloader:定义在何处安装启动加载器。必需
bootloader --location=mbr --boot-drive=sda
volgroup、logvol:创建 LVM 卷组和逻辑卷
part pv.01 --size=8192
volgroup myvg pv.01
logvol / --vgname=myvg --fstype=xfs --size=2048 --name=rootvol --grow
logvol /var --vgname=myvg --fstype=xfs --size=4096 --name=varvol
zerombr
对格式未被识别的磁盘执行初始化
网络命令
以下 Kickstart 命令配置网络相关功能
network:配置目标系统的网络信息。激活安装程序环境中的网络设备
network --device=eth0 --bootproto=dhcp
firewall:定义目标系统的防火墙配置
firewall --enabled --service=ssh,http
位置和安全命令
以下 Kickstart 命令配置安全性、语言和地区设置
lang:设置安装时要使用的语言和所安装系统的默认语言。必需
lang en_US
keyboard:设置系统键盘类型。必需
keyboard --vckeymap=us
timezone:定义时区,以及硬件时钟是否使用 UTC。必需
timezone --utc Europe/Amsterdam
timesource:启用或禁用 NTP。如果启用 NTP,您必须指定 NTP 服务器或池
timesource --ntp=server classroom.example.com
autheselect:设置身份验证选项。能被 authselect 识别的选项对此命令有效。请参阅 authselet(8)
rootpw:定义初始 root 密码。必需
rootps --plaintext redhat<br>or<br>rootpw --iscrypted $6$KUnFfrTz08jv.PiH$YlBb0.............
selinux:设置所安装系统的 SELinux 模式
selinux --enforcing
services:修改默认 systemd 目标下运行的默认服务集合
services --disabled=networ,iptables,ip6tables --enabled=NetworkManager,firewalld
group、user:在系统上创建本地组或用户
group --name=admins --gid=10001<br>user --name=jdoe --gecos="John Doe" --groups=admins --password=changeeme --plaintext
其他命令
以下 Kickstart 命令配置在完成时记录主机电源状态
logging:此命令定义安装期间 Anaconda 将如何执行日志记录
logging --host=loghost.example.com
firstboot:如果启用,则在系统首次启动时将启动安装代理。此命令需要 initial-setup 软件包
firstboot --disabled
reboot、poweroff、halt:指定安装完成时要执行的最终操作。默认设置为 halt 选项
示例 Kickstart 文件
Kickstart 安装步骤
创建Kickstart 文件
使用 Kickstart Generator 网站
网站为 https://access.redhat.com/labs/kickstartconfig,会显示用户输入对话框,并按照用户的选择创建 Kickstart 配置文件。每个对话框都对应 Anaconda 安装程序中的可配置项
使用文本编辑器
从头开始创建 Kickstart 文件比较复杂,因此您应该先尝试编辑现有的文件。每个安装都会创建一个 /root/anaconda-ks.cfg 文件,其中包含了该安装中使用的 Kickstart 指令。此文件是创建新 Kickstart 文件的良好起点
ksvalidator 实用程序可检查 Kickstart 文件中的语法错误。它可确保正确实用关键字和选项,但无法验证 URL 路径、软件包个体或组,也无法验证 %post 或 %pre 脚本的任何部分。例如,如果 firewall --disabled 指令拼写错误,ksvalidator 命令可能会生成以下错误之一
ksverdiff 实用程序显示不同操作系统版本之间的语法差异。例如,以下命令显示 RHEL 8 和 RHEL 9 之间的 Kickstart 语法变化
ksverdiff - RHEL8 -t RHEL9
pykickstart 软件包提供 ksvalidator 和 ksverdiff 实用程序
发布 Kickstart 文件,以便 Anaconda 安装程序可以访问它
在使用 FTP、HTTP 或 NFS 进行安装时可用的网络服务器
安装程序必需访问 Kickstart 文件,然后才能开始自动安装
可用的 USB 磁盘或 CD-ROM
在 USB 或 CD-ROM 上提供 Kickstart 文件也很方便
系统上的本地磁盘
可用快速重建系统
启动 Anaconda 安装程序并将其指定向 Kickstart 文件
选择某种 Kickstart 方法后,通过将 inst.ks=LOCATION 参数传递给安装内核,安装程序就会知道在何处查找 Kickstart 文件
对于使用 Virtual Machine Manager 或 virt-manager 的虚拟机安装,可用在 URL Options 下的框中指定 Kickstart URL。安装物理计算机时,使用安装介质启动,然后按 Tab 键中断启动过程。向安装内核添加 inst.ks=LOCATION 参数
指导练习:实验 Kickstart 自动安装
安装和配置虚拟机
KVM 虚拟机介绍
虚拟机时一项允许单个物理计算机分为多个虚拟机(VM)的功能,每个虚拟机可用分别允许独立的操作系统
红帽企业 Linux 支持 KVM (基于内核的虚拟机),这是标准 Linux 内核中内置的一个完整虚拟化解决方案。KVM可用运行多款 Windows 和 Linux 虚拟客户操作系统
在红帽企业 Linux 中,您可以使用 virsh 命令从命令行管理 KVM,或者使用 Web 控制台的虚拟机工具以图形方式管理 KVM
您可以横跨所有红帽产品使用 KVM 虚拟机技术,不仅包含红帽企业 Linux 的单击物理示例,更有红帽 OpenStack 平台
物理硬件系统运行红帽企业 Linux 以提供 KVM 虚拟化。红帽企业 Linux 通常为胖主机,即在支持 VM 的同时,也提供其他本地和网络服务、应用和管理功能
红帽虚拟化(RHV)提供了一个集中式 Web 界面,供管理员用来管理整个虚拟基础架构。其中含有一些高级高级功能,如 KVM 迁移、冗余和高可用性。红帽虚拟化系统管理程序时调优过的红帽企业 Linux 版本,专用于满足置备和支持 VM 的唯一目的
红帽 OpenStack 平台(RHOSP)为创建、部署和扩展公有云或私有云提供了基础
红帽 OpenShift 虚拟化包含 RHV 组件,运行在裸机上部署容器
在启用了 SELinux 的系统上,sVirt 将客户机和虚拟机监控程序隔离开来。没个虚拟机进程都被标记并自动分配一个唯一级别,关联的虚拟磁盘文件也会被赋予匹配的标签
虚拟机类型
有两种主要的虚拟机类型可用于安装客户机操作系统。两者中较旧的一个使用 i440FX 芯片组,并提供 ISA 和 PCI 网桥、IDE 控制器以及 VGA 和以太网适配器
Q35 计算机类型时两者中较新的一种,应在大多数情况下使用。它支持更新的虚拟机硬件接口,如PCIe 和 SATA,并包含 SM 总线控制器
在红帽企业 Linux 8 及更高版本中,对虚拟机的 UEFI 和安全启动的支持有 edk2-ovmf 软件包中的开放虚拟机固件(OVMF)提供
支持的客户机操作系统
红帽支持的客户机操作系统名单根据所用产品而异。RHV、RHOSP 和 OpenShift 虚拟化产品都包含服务器虚拟化验证计划(SVVP)认证的驱动程序,从而支持更多数量的 Windows 客户机操作系统。运行 KVM 的 RHEL 系统仅对特定订阅提供 SVVP支持
没有通用的规则来判断客户机操作系统是否受支持,但请查看以下文档只有
RHEL 与 KVM:使用与带 KVM 的红帽企业 Linux 的认证客户机操作系统[https://access.redhat.com/articies/973133]
RHV、RHOSP 和 OpenShift 虚拟化:红帽 OpenStack 平台、红帽虚拟机和 OpenShift 虚拟化中认证客户机操作系统<br>[https://access.redhat.com/articles/973163]<br>
配置红帽企业 Linux 物理系统作为虚拟化主机
管理员可以配置红帽企业 Linux 系统作为虚拟化主机,供开发、测试或培训使用,或者满足需要同时在多个操作系统中工作的要求
安装虚拟化工具
安装 Virtualization Host DNF 模块,为系统做好变成虚拟化主机的准备
dnf group list | grep -i virt
dnf group info "Virtualization Host"
dnf group install "Virtualization Host"
验证虚拟化系统要求
KVM 需要 Intel 处理器(Intel VT-x 和基于 x86 的系统的 Intel 64 扩展),或者 AMD 处理器(AMD-V 及 AMD64 扩展)。
要验证硬件并检查系统要求,请使用 virt-host-validate 命令
virt-host-validate
系统必须通过所有验证项才能作为 KVM 主机来运行
从命令行安装虚拟机
安装 virt-install 软件包,然后从命令行使用 virt-install 命令来部署虚拟机
许多安装源受到支持,如 ISO、NFS、HTTP 和 FTP。以下示例使用 virt-install 命令的 --cdrom 选项从 ISO 镜像安装客户机
virt-install --name demo --memory 4096 --vcpus 2 --disk size=40 --os-type linux --cdrom /root/rhel.iso
通过 Web 控制台管理虚拟机
libvirt-client 软件包提供了 virsh 命令,用于从命令行管理虚拟机。但是,您可以使用 Web 控制台虚拟机插件以图形方式创建和管理虚拟机
安装 cockpit-machines 软件包,以便为 Web 控制台添加 Virtual Machines 菜单
dnf instal cockpit-machines
如果 Web 控制台尚未运行,请将其启动并启用
systemctl enable --now cockpit.socket
在本地计算机上运行的 Web 浏览器中,导航到 https://localhost/9090 并登录 Web 控制台。如有必要,切换到管理模式并输入密码
要使用 Web 控制台创建新虚拟机,请访问 Virtual Machines 菜单。在那里,单击 Create VM 并在 Create New Virtual Machine 窗口中输入 VM 配置。如果您在安装虚拟机插件后第一次使用 Web 控制台,则必须重新启动系统才能正确启动 libvirt 虚拟化
Name 将设置虚拟机配置的域名。此名称与您的安装期间为虚拟机指定的主机名无关
Installation type 是访问安装介质的方法。选项包括本地文件系统、HTTPS、FTP、NFS URL 或 PXE
Installation source 提供安装源的路径
Operating system 定义虚拟机的操作系统。虚拟化层提供与所选操作系统兼容的硬件仿真
Storage 定义是创建新存储卷还是使用现有存储卷
Size 是创建新卷时的磁盘大小。安装后,可将其它磁盘与VM 进行关联
Memory 是可供新 VM 使用的 RAM 量
Immediately start VM 指示在单击 Create 后是否应立即启动 VM
单击 Create 将创建 VM,而单击 Install 则启动操作系统安装过程。Web 控制台会显示可从中安装系统的 VM 控制台
小测验:安装和配置虚拟机
开放研究实验:安装红帽企业 Linux
总结
RHEL 9 二进制 DVD 中包括 Anaconda 和安装所需的所有存储库
RHEL 9 引导 ISO 中包含 Anaconda 安装程序,它可以在安装过程中通过网络访问存储库
Kickstart 系统可以执行无人值守安装
可使用 Kickstart Generator 网站或通过复制和编辑 /root/anaconda-ks.cfg 来创建 Kickstart 文件
Virtualization Host DNF 软件包组提供了让 RHEL 系统成为虚拟化主机所需的软件包
cockpit-machines 软件包可以为 Cockpit 添加 Virtual Machines 菜单
11. 运行容器
容器概念
容器技术
软件应用通常依赖于运行时环境提供的系统库、配置文件或服务。传统上,软件应用的运行时环境安装在物理主机或虚拟机上运行的操作系统中。然后,管理员在操作系统上安装应用依赖项
在红帽企业 Linux 中,诸如 RPM 等打包系统可协助管理员关联应用依赖项。安装 httpd 软件包时,RPM 系统会确保同时安装该软件包的正确库和其他依赖项
以传统方式部署的软件应用的主要弊端时这些依赖项会手动运行时环境的束缚。应用需要的支持软件的版本可能比操作系统提供的软件更旧或更新。同样,同一系统上的两个应用可能需要同一软件互不兼容的不同版本。
解决这些冲突的方式之一时将应用打包并作为容器进行部署。容器时有一个或多个于系统其余部分隔离的进程组成的集合。软件容器时盗版应用以简化其部署和管理的一种方式
以实体集装箱为例。集装箱时打包和装运货物的标准方式。它作为一个箱子进行标记、转载、卸载,以及从一个位置运输到另一个位置。集装箱的内容与其他集装箱的内容隔离,因此互不影响。这些基本原则也适用于软件容器
红帽企业 Linux 通过运行以下核心技术来支持容器
用于资源管理的控制组
用于进程隔离的命名空间
加强安全边界的 SELinux 和 Seccomp (安全计算模式)
容器和虚拟机之间的差异
容器提供许多与虚拟机相同的益处,如安全、存储和网络隔离等
这两种技术都将其应用库和运行时资源与主机操作系统或虚拟机监控程序隔离开,反之亦然
容器和虚拟机以不同的方式与硬件和底层操作系统交换
虚拟机具有以下特征
使多个操作系统能够同时在一个硬件平台上运行
使用虚拟机监控程序将硬件分为多个虚拟硬件系统
需要一个完整的操作系统环境来支持应用
容器具有以下特征
直接在操作系统上运行,从而跨系统上的所有容器共享资源
共享主机的内核,但它将应用进程与系统其余部分隔离开来
与虚拟机相比,它需要的硬件资源要少的多,因此容器的启动速度也更快
包括所有依赖项,如系统和编程依赖项,以及配置设置
Rootless 和 Rootful 容器
在容器主机上,您可以 root 用户或普通非特权用户身份运行容器。有特权用户运行的容器称为 Rootful 容器。有非特权用户运行的容器称为 Rootless 容器
Rootless 容器不允许使用通常为特权用户保留的系统资源,例如访问受限目录,或在受限端口(1024 以下端口)上发布网络服务。此功能可防止潜在攻击者获取容器主机上的 root 特权
如有必要,您可以 rot 用户直接运行容器,但如果有漏洞运行攻击者破坏容器,这样会消弱系统的安全性
设计基于容器的架构
容器是重复利用托管应用并使其可以移植的有效方式。容器可以轻松地从一个环境迁移到另一个环境,如从开发环境迁移到生成环境。您可以保存一个容器的多个版本,并根据需要快速访问每个版本
容器通常使临时的。您可以将运行中容器所生成的数据永久保存到持久存储中,但容器本身通常会在需要时运行,然后停止并被删除。下次需要该特定容器时,将启动新的容器进程
您可以在单个容器中安装含有多个服务的复杂软件应用。例如,Web 服务器可能需要使用数据库和消息传递系统。不过,将一个容器用于多个服务会难以管理
更好的设计时在单独的容器中运行每个组件、Web 服务器、数据库和消息传递系统。这样,更新和维护单个应用组件不会影响其他组件或应用堆栈
容器管理工具
红帽企业 Linux 提供了一组容器工具,可用于在单一服务器上运行多个容器
podman 管理容器和容器镜像
skopeo 检查、复制、删除和签署镜像
buildah 创建容器镜像
这些工具与开源容器项目(OCI)兼容。借助这些供,您可以管理由兼容 OCI 的容器引擎(如 Podman 或 docker)创建的任何 Linux 容器。这些工具专门设置用于在单节点容器主机上的红帽企业 Linux 下运行容器
容器镜像和注册表
要运行容器,您必须使用容器镜像。容器镜像时包含编码步骤的镜头文件,它充当创建容器的蓝图。容器镜像打包应用及其所有依赖项,如系统库、编程语言运行时和库,以及其他配置设置。
容器镜像根据规范构建,如开发容器项目(OCI)镜像格式规范。这些规范定义容器镜像的格式,以及镜像支持的容器主机操作系统和硬件架构的元数据
容器注册表时用于存储和检索容器镜像的存储库。开发人员将容器镜像推送或上传到容器注册表中。您可以从注册表中将容器镜像拉取或下载到本地系统,以用于运行容器
可以使用包含第三方镜像的公共注册表,也可以使用贵组织控制的私有注册表。容器镜像来源很重要。和任何其他软件一样,您必须指定是否可以信任容器镜像中的代码。对于是否及如何提供、评估和测试提交给它们的容器镜像,不同的注册表具有不同的策略
红帽通过两个主容器注册表分发认证容器镜像,您可以使用红帽登录凭据来访问两个注册表
registry.redhat.io:适用于基于官方红帽产品的容器
registry.connect.redhat.com:适用于基于第三方产品的容器
红帽容器目录(https://access.redhat.com/containers)提供了一个基于 Web 的界面,通过它可以搜索这些注册表中的认证内容
您需要红帽开发任意账户才能从红帽注册表下载镜像。您可以使用 podman login 命令对注册表进行身份验证。如果您不向 podman login 命令提供注册表 URL,它会向默认配置的注册表进行身份验证
podman login registry.lab.example.com
您还可以使用 podman login 命令的 --username 和 --password-stdin 选项,指定用于登录注册表的用户和密码。 --password-stdin 选项从 stdin 读取密码。红帽兼容不要使用 --password 选项直接提供密码,因为此选项会将密码存储在日志文件中
echo $PASSWORDVAR | podman login --usernam RH134 --password-stdin registry.access.redhat.com
要验证您是否已登录到某一注册表,请使用 podman login 命令 --get-login 选项
podman login registry.access.redhat.com --get-login
podman login quay.io --get-login
在前面的输出中,podman 实用程序已使用 RH134 用户凭据向 registry.access.redhat.com 注册表进行身份验证,但 podman 实用程序未向 quay.io 注册表进行身份验证
配置容器注册表
容器注册表的默认配置文件时 /etc/containers/registries.cong 文件
cat /etc/containers/registries.conf
红帽建议使用非特权用户来管理容器,因此您可以在 $HOME/.config/containers 目录中为容器注册表创建 registries.conf 文件。此目录中的配置文件会覆盖 /etc/containers/registries.conf 文件中的设置,并在 Podman 以 rootless 模式运行时使用
如果在使用 podman 命令时不指定容器镜像的完全限定名称,则此文件的 unqualified-search-registries 部分中的注册表列表用于搜索容器镜像
podman pull ubi
如果您从命令行指定容器的完全限定名称,则容器使用程序不会在此部分中搜索。unqualified-search-registries 部分可以留空,以确保您使用容器镜像的完全限定名称
podman pull registry.access.redhat.com/ubi8/ubi:latest
在文件的[[registry]] 部分中,配置容器注册表的设置。使用单独的[[registry]] 部分来配置每个容器注册表的设置
[[registry]]<br>location = "registry.lab.example.com"<br>insecure = true<br>blocked = false
location 设置指定容器注册表的位置
如果 insecure 设置为 true,则您可以使用未加密的 HTTP 和 TLS 连接及不受信任的证书来访问注册表
如果 blocked 设置为 true,则无法从注册表下载镜像
使用容器文件构建容器镜像
容器文件是一种文本文件,内含用于构建容器镜像的指令。容器文件通常具有定义其文件和目录所在路径或 URL 的上下文。生成的容器镜像由只读层组成,每一层代表容器文件中的一条指令
以下输出是一个容器文件示例,它使用 registry.access.redhat.com 注册表中的 UBI 镜像,安装 python3 软件包,并将 hello 字符串打印到控制台
规模化容器管理
新应用越来越多地使用容器来实施功能组件。这些容器提供应用的其他部分使用的服务。组织管理越来越多的容器,可能很快就会不堪重负:
平台必须确保提供必要服务的容器的可用性
环境必须通过增加或减少运行中的容器实例,并对流量进行负载平衡,从而应对应用的使用高峰
平台必须检测容器或主机的故障,并相应地做出反应
开发人员可能需要自动工作流,以便透明、安全地向客户交付新的应用版本
Kubernetes 是一项编排服务,可以使在容器主机集群部署、管理和扩展基于容器的应用变得更加轻而易举。Kubernetes 通过负载平衡器将流量重定向到容器,以便您可以扩展提供服务的容器数量。Kubernetes 还支持用户定义的健康检测,以便监控您的容器,并在容器出现故障时将其重新启动
红帽提供了一个名为红帽 OpenShift 的 Kubernetes 发行版。红帽 OpenShift 是基于 Kubernetes 基础架构构建的一组模块化组件和服务。它为开发人员提供的额外功能包括基于 Web 的远程管理、多租户、监控与审计、高级安全功能、应用生命周期管理和自助服务实例等
小测验:容器概念
部署容器
Podman 使用程序
Podman 是来自 container-tools 元数据包的全功能容器引擎,用于管理开放容器计划(OCI)容器和镜像。podman 实用程序的运作不使用守护进程,因此开发人员无需系统上的特权用户账户来启动或停止容器。Podman 提供多个子命令与容器和镜像交互。
Podman 命令
podman build
使用容器文件构建容器镜像
podman run
在新容器中运行命令
podman images
列出本地存储中的镜像
podman ps
打印有关容器的信息
podman inspect
显示容器、镜像、卷、网络或容器集的配置
podman pull
从注册表下载镜像
podman cp
在容器和本地文件系统之间复制文件或目录
podman exec
在运行中的容器内执行命令
podman rm
删除一个或多个容器
podman rmi
删除一个或多个本地存储的镜像
podman search
在注册表中搜索镜像
有关各个子命令使用帮助手册的更多信息,请将子命令附加到 podman 命令,并用连字符将两者分隔。例如,podman-build 帮助手册介绍了 podman build 子命令的用法
安装容器实用工具
container-tools 元软件包包含与容器镜像交互所需的实用程序。若要在系统上下载、运行和比较容器,请使用 dnf install 命令来安装 container-tools 元软件包。使用 dnf info 命令查看 container-tools 软件包的版本和内容
dnf install container-tools
dnf info container-tools
container-tools 元数据包提供所需的 podman 和 skopeo 实用程序,用于完成分配的任务
从注册表下载容器镜像文件
首先,确保 podman 实用程序已配置为从 registry.redhat.io 注册表搜索和下载容器。podman info 命令显示 podman 实用程序的配置信息,包括其配置的注册表
podman info
podman search 命令实用 registries.conf 文件中指定的注册表列表搜索匹配的名称镜像。默认情况下,Podman 在所有非限定搜索注册表中执行搜索
根据使用注册表实施的 Docker 分发 API,一些注册表可能不支持搜索功能
使用 podman search 命令,显示包含 python-38 软件包的已配置注册表的镜像列表
podman search python-38
您可以使用 skopeo inspect 命令从本地目录或远程注册表检测不同的容器镜像格式,而无需下载镜像。此命令输出显示可用版本标签的列表、容器化应用的公开端口,以及容器镜像的元数据。您可用使用 skopeo inspect 命令验证镜像是否包含所需的 python-38 软件包
skopeo inspect docker://registry.access.redhat.com/ubi8/python-38
registry.access.redhat.com/ubi8/python-38 镜像包含所需的软件包,它基于所需的镜像。使用 podman pull 命令将选定的镜像下载到本地计算机。您可用使用前面输出中镜像的完全限定名称,以避免容器版本或注册表方便的歧义
podman pull registry.access.redhat.com/ubi8/python-38
然后,使用 podman images 命令显示本地镜像
podman images
从容器文件创建容器镜像
您获得了一些容器文件,用于在 python36-app 目录中创建容器镜像
cat Containerfile
以上容器文件使用 registry.access.redhat.com/ubi8/ubi:latest 镜像作为基础镜像。容器文件而后将安装 python36 软件包,并运行 sleep infinity bash 命令来防止容器退出
通常,容器运行一个进程,然后在该进程完成后退出。sleep infinity 命令可防止容器退出,因为该进程永远不会完成。然后,您可用在容器内进行测试、开发和调试
在检测容器文件后,您可用使用 podman build 命令来构建镜像。
podman build 命令的语法如下所示
podman build -t NAME:TAG DIR
NAME
新镜像的名称
标签
新镜像的标签。如果未指定标签,则镜像自动标记未 latest
DIR
工作目录路径。容器文件必须位于工作目录中。如果工作目录是当前目录,则您可以用点(.)来指定它。使用 -f 标志指定与当前目录不同的目录
在下例中,您可以使用 podman build 命令 -t 选项为新镜像提供 python36 名称和 1.0 标签。容器文件位于当前目录中
podman build -t python36:1.0 .
以上输出的最后一行显示了容器镜像 ID。大多数 Podman 命令使用容器镜像 ID 的前 12 个字符来指代容器镜像。您可以将此短 ID 或者容器或容器镜像的名称,作为大多数 Podman 命令的参数
您可以使用 podman images 命令来验证镜像是否是使用定义的名称和标签创建的
podman images
然后,使用 podman inspect 命令来查看容器镜像的低级别信息,并验证其内容是否符合容器要求
podman inspect localhost/python36:1.0
podman inspect 命令的输出显示 registry.access.redhat.com/ubi8/ubi:latest 基础镜像、用于安装 python36 软件包的 dnf 命令,以及在运行时执行防止容器退出的 sleep infinity bash 命令
运行容器
现在,您已拥有所需的容器镜像,可以使用它来运行容器。容器可以处于以下状态之一
Created
已创建号但尚未启动的容器
运行中
与其进程一起运行的容器
已停止
其进程已停止的容器
Paused
其进程已暂停的容器。不支持 Rootless 容器
Deleted
其进程处于已死状态的容器
podman ps 命令列出系统上正在运行的容器。使用 podman ps -a 来命令查看计算机中的所有容器(已创建、已停止、已暂停和正在运行)
您可使用 podman create 命令来创建容器,以便稍后运行。若要创建容器,请使用 localhost/python36 容器镜像的 ID。也可以使用 --name 选项设置名称来标记容器。此命令的输出时容器的长 ID
podman create --name python36 dd6ca291f097
然后,您可使用 podman ps 和 podman ps -a 命令来验证容器是否已创建但尚未启动。您可以查看有关 python36 容器的信息,如容器的短 ID、名称和状态,容器在启动时运行的命令,以及用于创建容器的镜像
podman create --name python36 dd6ca291f097
现在您已验证容器已正确创建,您决定启动容器,所以要运行 podman start 命令。您可以使用名称或容器 ID 来启动容器。此命令的输出时容器的名称
podman start python36
podman ps
从远程存储库运行容器
您可使用 podman run 命令,在一个步骤中创建并运行容器。podman run 命令在容器内运行进程,此进程将启动新容器
您可以使用 podman run 命令 -d 选项以分离模式运行容器,这将在后台运行容器,而不是在会话的前台运行。在 python36 容器的实例中,您不需要提供容器运行所提的命令,原因时为该容器创建镜像的容器文件中提供了 sleep infinity 命令
为了创建 python38 容器,您决定使用 podman run 命令并引用 registry.access.redhat.com/ubi8/python-38 镜像。您还决定使用 sleep infinity 命令来防止容器退出
podman run -d --name python38 registry.access.redhat.com/ubi8/python-38 sleep infinity
podman ps
容器中的环境隔离
容器隔离应用的环境。每个容器都有自己的文件系统、网络和进程。如果您查看 ps 命令的输出,并在主机和运行中容器之间进行比较,就会注意到隔离功能
首先在本地计算机上运行 ps -ax 命令,该命令将返回具有许多进程的预期结果
ps -ax
podman exec 命令可在运行中的容器内执行命令。该命令取容器的名称或 ID 作为第一个参数,并将下列参数作为要在容器内运行的命令。您可以使用 podman exec 命令查看 python36 容器中正在进行的进程。ps aux 命令的输出看起来有所不同,因为它运行与本地计算机不同的进程
podman exec python38 ps -ax
您可以使用 sh -c 命令来封装要在容器中执行的命令。在以下实例中,ps -ax > /tmp/process-data.log 命令被解释为要在容器中执行的命令。如果您不封装命令,则 Podman 可能会将大于号字符(>)解释为 podman 命令的一部分,而不是 podman exec 选项的参数
podman exec python38 sh -c 'ps -ax > /tmp/process-data.log'
您决定将主机系统上安装的 python 版本与容器上安装的python 版本进行比较
python3 --version
podman exec python36 python3 --version
podman exec python38 python3 --version
容器中的文件系统隔离
开发人员可以使用文件系统隔离功能,为不同版本的编程语言编写和测试应用,无需使用多个物理机或虚拟机
您将在终端上的 /tmp 目录中创建一个显示 hello world 的简单 bash 脚本
echo "echo 'hello world'" > /tmp/hello.sh
/tmp/hellos.sh 文件位于主机计算机上,而不存在与容器的文件系统上。如果您尝试使用 podman exec 来执行脚本,则会出现错误,因为容器中不存在 /tmp/hello.sh 脚本
stat /tmp/hello.sh
podman exec python38 stat /tmp/hello.sh
podman cp 命令在主机和容器文件系统之间复制文件和文件夹。您可以使用 podman cp 命令将 /tmp/hello.sh 文件复制到 python38 容器
podman cp /tmp/hello.sh python38:/tmp/hello.sh
podman exec python38 stat /tmp/hello.sh
脚本复制到容器文件系统后,即可从容器内执行
podman exec python38 bash /tmp/hello.sh
删除容器和镜像
您可以分別使用 podman rm 和 podman rmi 命令来删除容器和镜像。在删除容器镜像之前,必须先从该镜像移除任何现有的运行中容器
您决定删除 python38 容器及其相关镜像。如果您在 python38 容器存在时尝试删除 registry.access.redhat.com/ubi8/python-38 镜像,这会出现错误
podman rmi registry.access.redhat.com/ubi8/python-38
您必须先停止容器,然后才能删除它。若要停止容器,请使用 podman stop 命令
podman stop python38
停止容器后,使用 podman rm 命令来删除容器
podman rm python38
当容器不再存在时,可以使用 podman rmi 命令删除 registry.access.redhat.com/ubi8/python-38
podman rmi registry.access.redhat.com/ubi8/python-38
指导练习:部署容器
管理容器存储和网络资源
管理容器资源
您可以使用容器来运行简单的进程,然后退出
还可以配置容器以连续运行某一服务,如数据库服务器。如果您持续运行服务,您最终可能需要向容器添加更多资源,如持久存储或对其他网络的访问权限
您可以使用不同的策略为容器配置持久存储
对于红帽 OpenShift 等企业容器平台上的大型部署,您可以使用复杂的存储解决方案为容器提供存储,而无需了解底层基础架构
对于单个容器主机上且无需扩展的小型部署,您可以通过在运行中的容器上创建要挂载的目录,从容器主机创建持久存储
当 Web 服务器或数据库服务器等容器为容器为容器主机外部的客户端提供内容时,您必须为这些客户端设置通信通道,以访问容器的内容。您可以配置端口映射,以启用于容器的通信。通过端口映射,目的地为容器主机上端口的请求将被转发到容器内的端口
若要理解本讲座中的主题,设想您必须执行以下任务
基于 MariaDB,创建名为 db01 的容器化数据库
配置容器端口映射和主机防火墙,以允许端口 3306/tcp 上的流量
配置 db01 容器,以使用具有适当 SELinux 上下文的持久存储
添加适当的网络配置,以便 client01 容器可以使用 DNS 与 db01 容器通信
容器的环境变量
一些容器镜像允许在创建时传递环境变量以自定义容器。您可以使用环境变量为容器设置参数,以根据您的环境进行定制,无需创建自己的自定义镜像。通常,您不会修改修改容器镜像,因为这会向镜像添加层,或许更加难以维护
您使用 podman run -dregistry.lab.example.com/rhel8/mariadb-105 命令运行容器化数据库,但发现容器无法启动
podman run -d registry.lab.example.com/rhel8/mariadb-105 --name db01
podman ps -a
您将使用 podman container logs 命令调查容器状态的原因
podman container logs db01
从签名输出中确定,容器没有继续运行的原因时所需的环境变量没有传递到容器。因此,您通过检查 mariadb-105 容器镜像来查找有关用于自定义的环境变量的更多信息
skopeo inspect docker://registry.lab.example.com/rhel8/mariadb-105
输出中的 usage 标签提供了如何运行镜像的示例。url 标签指向红帽容器目录中的一个 Web 页面,其中记录了环境变量以及有关如何使用容器镜像的其他信息
此镜像的文档显示容器将 3306 端口用于数据库服务。文档中还显示了以下环境变量可用于配置数据库服务
mariadb 镜像的环境变量
MYSQL_USER
要创建的 MySQL 账户的用户名
MYSQL_PASSWORD
用户账户的密码
MYSQL_DATABASE
数据库名称
MYSQL_ROOT_PASSWORD
root 用户的密码(可选)
在检查了镜像的可用环境变量后,您使用 podman run 命令 -e 选项将环境变量传递给容器,并使用 podman ps 命令来验证它是否正在运行
podman run -d --name db01 -e MYSQL_USER=student -e MYSQL_PASSWORD=student -e MYSQL_DATABASE=dev_data -e MYSQL_ROOT_PASSWORD=redhat registry.lab.example.com/rhel8/mariadb-105
podman ps
容器持久存储
默认情况下,在您运行容器时,其所有内容都使用基于容器的镜像。鉴于容器镜像的寿命短,用户或应用写入的所有新数据在移除容器后都会丢失
若要持久保留数据,您可用将容器中的主机文件系统内容与 --volume (-v)选项搭配使用。在容器中使用此卷类型时,您必须考虑文件系统级别的权限
在 MariaDB 容器镜像中,mysql 用户必须拥有 /var/ib/mysql 目录,就如同 MariaDB 在主机上运行时一样。您打算挂载到容器中的目录必须具有 mysql 作为用户或组的所有者(或 mysql 用户的 UID/GID,如果主机上没有安装 MariaDB。如果以 root 用户身份运行容器,则主机上的 UID 和 GID 与容器内的 UID 和 GID 匹配
UID 和 GID 匹配配置在 Rootless 容器中出现方式不同。在 Rootless 容器中,用户具有容器内 root 访问权限,因为 Podman 在用户命名空间内启动容器
您可用使用 podman unshare 命令在用户命名空间内运行命令。要获取用户命名空间的 UID 映射,请使用 podman unshare cat 命令
podman unshare cat /proc/self/uid_map
podman unshare cat /proc/self/gid_map
以上输出显示,容器中的 root 用户(UID 和 GID 为0)映射到主计算机上的用户(UID 和 GID 为 1000)。容器中的 UID 和 GID 1 映射到主机计算机上的 UID 和 GID 100000。1 后的每一个 UID 和 GID 以 1 增量递增。例如,容器内的 UID 和 GID 30 映射到主机计算机上的 UID 和 GID 100029
您可以使用 podman exec 命令查看使用临时存储运行的容器内的 mysql 用户 UID 和 GID
podman exec -it db01 grep mysql /etc/passwd
您决定将 /home/user/db_data 目录挂载到 db01 容器中,以在容器的 /var/lib/mysql 目录中提供持久存储。然后创建 /home/user/db_data 目录,并使用 podman unshare 命令将 27 的用户命名空间 UID 和 GID 设置为该目录的所有者
mkdir /home/user/db_data
podman unshare chown 27:27 /home/user/db_data
容器中的 UID 和 GID 27 映射到主机计算机上的 UID 和 GID 100026。您可以使用 ls 命令查看 /home/user/db_data 目录的所有权来验证映射
ls -l /home/user
现在已设置了正确的文件系统级权限,您可使用 podman run 命令 -v 选项来挂载目录
podman run -d --name db01 -e MYSQL_USER=student -e MYSQL_PASSWORD=student -e MYSQL_DATABASE=dev_data -e MYSQL_ROOT_PASSWORD=redhat -v /home/user/db_data:var/lib/mysql registry.lab.example.com/rhel8/mariadb-105
您注意到 db01 容器未在运行
podman ps -a
podman container logs 命令显示 /var/lib/mysql/data 目录的权限错误
podman container logs db01
发生此错误的原因时,主机上 /home/user/db_data 目录中设置的 SELinux 上下文不正确
容器存储的 SELinux 上下文
您必须先设置 container_file_t SELinux 上下文类型,然后才能将该目录作为持久存储挂载到容器。如果目录没有 container_file_t SELinux 上下文,则容器无法访问该目录。您可以将 Z 选项附加到 podman run 命令 -v 选项的参数,以自动设置目录的 SELinux 上下文
因此,当您将 /home/user/dbfiles 目录挂载未 /var/lib/mysql 目录的持久存储时,您可以使用 podman run -v /home/user/dbfiles:/var/lib/mysql:Z 命令设置该目录的 SELinux 上下文
podman run -d --name db01 -e MYSQL_USER=student -e MYSQL_PASSWORD=student -e MYSQL_DATABASE=dev_data -e MYSQL_ROOT_PASSWORD=redhat -v /home/user/db_data:var/lib/mysql:Z registry.lab.example.com/rhel8/mariadb-105
然后,您可以使用 ls 命令 -Z 选项验证 /home/user/dbfiles 目录中设置的 SELinux 上下文时否正确
ls -Z /home/user
分配端口映射到容器
要提供对容器的网络访问权限,客户端必须连接到容器主机上的端口,这些端口将网络流量传递到容器中的端口。将容器主机上的网络端口映射到容器中的端口时,容器将接收发送到主机网络端口的网络流量
例如,您可以将容器主机上的 13306 端口映射到容器上的 3306 端口,以便与 MariaDB 容器通信。因此,发送到容器主机端口 13306的流量将有容器中运行的 MariaDB 接收
您可以使用 podman run 命令 -p 选项设置从容器主机上 3306 端口到 db01 容器上 13306 端口的端口映射
podman run -d --name db01 -e MYSQL_USER=student -e MYSQL_PASSWORD=student -e MYSQL_DATABASE=dev_data -e MYSQL_ROOT_PASSWORD=redhat -v /home/user/db_data:var/lib/mysql:Z -p 13306:3306 registry.lab.example.com/rhel8/mariadb-105
使用 podman port 命令 -a 选项可显示正在使用的所有容器端口映射。您还可以使用 podman port db01 命令显示 db01 容器的映射端口
podman port -a
podman port db01
您可以使用 firewall-cmd 命令允许端口 13306 流量传入容器主机,以便它可以重定向到容器
firewall-cmd --add-port=13306/tcp --permanent
firewall-cmd --reload
容器中的 DNS 配置
Podman v4.0 支持两种容器网络后端,即 Netavark 和CNI。自 RHEL 9 起,系统默认使用 Netavark。若要验证所用的网络后端,请运行以下 podman info 命令
podman info --format {{.Host.NetworkBackend}}
主机上使用默认 Podman 网络的现有容器无法解析彼此的主机名,因为默认网络上未启用 DNS
使用 podman network create 命令创建一个支持 DNS 的网络。您可以使用 podman network create 命令创建名未 db_net 的网络,并将子网指定为 10.87.0.0/16,网关指定为 10.87.0.1
podman network create --gateway 10.87.0.1 --subnet 10.87.0.0/16 db_net
如果不指定 --gateway 或 --subnet 选项,则会使用默认值创建它们
podman network inspect 命令 显示关于特定网络的信息。您可以使用 podman network inspect 命令验证网关和子网的设置是否正确,以及新的 db_net 网络是否启用了 DNS
podman network inspect db_net
您可以使用 podman run 命令 --network 选项将启用 DNS 的 db_net 网络添加到新容器。您可以使用 podman run 命令 --network 选项创建连接到 db_net 网络的 db01 和 client01 容器
podman run -d --name db01 -e MYSQL_USER=student -e MYSQL_PASSWORD=student -e MYSQL_DATABASE=dev_data -e MYSQL_ROOT_PASSWORD=redhat -v /home/user/db_data:var/lib/mysql:Z -p 13306:3306 --network db_net registry.lab.example.com/rhel8/mariadb-105
podman run -d --name client01 --network db_net registry.lab.example.com/ubi8/ubi:latest sleep infinity
由于容器设置为仅具有所需的最少软件包,因此容器可能不具有测试通信所需的使用程序,如 ping 和 ip 命令。您可以使用 podman exec 命令在容器中安装这些示例程序
podman exec -it db01 dnf install -y iputils iproute
podman exec -it client01 dnf install -y iputils iproute
容器现在可以通过容器的名称互相 ping。您可以使用 podman exec 命令来测试 DNS 解析。名称解析到为 db_net 网络手动设置的子网内的 IP
podman exec -it db01 ping -c3 client01
podman exec -it client01 ping -c3 db01
您可以使用 podman exec 命令验证每个容器的 IP 地址是否与 DNS 解析匹配
podman exec -it db01 ip a | grep 10.8
podman exec -it client01 ip a | grep 10.8
多个网络连接到单个容器
多个网络可以同时连接到一个容器,以帮助分隔不同类型的流量
您可以使用 podman network create 命令创建 backend 网络
podman network create backend
然后,使用 podman network ls 命令查看所有 Podman 网络
podman network ls
没有通过 podman network create 命令的 --gateway 和 --subnet 选项指定子网和网关
使用 podman network inspect 命令来获取 backend 网络的 IP 信息
podman network inspect backend
在容器运行时,您可以使用 podman network connect 命令将其他网络连接到容器。您可以使用 podman network connect 命令,将 backend 网络连接到 db01 和 client01 容器
podman network connect backend db01
podman network connect backend client01
您可以使用 podman inspect 命令验证两个网络是否都已连接到各个容器并显示 IP 信息
podman inspect db01
podman inspect client01
您可以使用 podman inspect 命令验证两个网络是否都已连接到各个容器并显示 IP 信息
podman inspect db01
client01 容器现在可以与两个网络上的 db01 容器通信。您可以使用 podman exec 命令从 client01 容器 ping db01 容器上的两个网络
podman exec -it client01 ping -c3 10.89.1.4 | grep 'packet less'
podman exec -it client01 ping -c3 10.89.1.3 | grep 'packet less'
指导练习:管理容器存储和网络资源
作为系统服务来管理容器
使用 systemd 单元管理小型容器环境
您可以运行容器来完成系统任务,或获取一系列命令的输出。您可能还希望运行无限期运行服务的容器。如 Web 服务器或数据库。在传统环境中,特权用户通常将这些服务配置为在系统启动时运行,并使用 systemctl 命令进行管理
作为普通用户,您可以创建 systemd 单元来配置您的 Rootless 容器。利用此配置,您可以通过 systemctl 命令将容器作为常规系统服务进行管理
基于 systemd 单元管理容器主要用于不需要扩展的基本和小型部署。对于许多基于容器的应用和服务的更复杂扩展和编排,可以使用基于 Kubernetes 的企业编排平台,如红帽 OpenShift 容器平台
systemd 用户服务要求
作为普通用户,您可以使用 systemctl 命令来启用服务。该服务在您打开会话(图形界面、文本控制台或 SSH)时启动,并在您关闭最后一个会话时停止。此行为与系统服务有所不同,系统服务是在系统启动时启动并在系统关闭时停止
默认情况下,当您使用 useradd 命令创建用户账户时,系统将使用普通用户 ID 范围中的下一个可用 ID。系统还在 /etc/subuid 文件中为用户容器保留范围。因此,无法使用系统账户启动 Rootless 容器
您决定创建一个专门的用户账户来管理容器。使用 useradd 命令创建 appdev-adm 用户,并将 redhat 用作密码
sudo useradd appdev-adm
sudo passwd appdev-dam
然后,使用 su 命令切换到 appdev-adm 用户,并使用 podman 命令来启动
su appdev-adm
podman info
Podman 是一款无状态实用程序,需要完成的登录会话。Podman 必须在 SSH 会话中使用,不能在 sudo 或 su shell 中使用。因此,您将退出 su shell,并通过 SSH 登录计算机
exit
exit
ssh appdev-adm@host
然后,配置容器注册表并使用您的凭据进行身份验证。您可用使用以下命令运行 http 容器
podman run -d --name webserver1 -p 8080:8080 -v ~/app-artifacts:/var/ww/html:Z registry.access.redhat.com/ubi8/httpd-24
podman ps
为容器创建 systemd 用户文件
您可以在 ~/.config/systemd/user/ 目录中手动定义 systemd 服务。用户服务的文件语法与系统服务文件的相同
使用 podman generate systemd 命令为现有容器生成 systemd 服务文件。podman generate systemd 命令使用容器作为模型来创建配置文件
podman generate systemd 命令 --new 选项指示 podman 实用程序对 systemd 服务进行配置,以便在该服务启动时创建容器并在该服务停止时删除容器
您可以使用 podman generate systemd 命令和 --name 选项来显示为 webserver1 容器建模的 systemd 服务文件
podman generate systemd --name webserver1<br>
1. 启动时,systemd 守护进程执行 podman start 命令来启动现有容器
2. 停止时,systemd 守护进程执行 podman stop 命令来停止容器。请注意,systemd 守护进程不会删除该容器
然后,使用上一命令并加上 --new 选项来比较 systemd 配置
podman generate systemd --name webserver1 --new
1. 启动时,systemd 守护进程执行 podman run 命令以创建并启动新容器。此操作使用 podman run 命令 --rm 选项,它将在停止时删除容器
2. 停止时,systemd 执行 podman stop 命令以停止容器
在systemd 停止容器后,systemd 将使用 podman rm -f 命令将其移除
验证 podman generate systemd 命令的输出,并使用 --files 选项运行上一命令,以在当前目录中创建 systemd 用户文件。由于 webserver1 容器使用持久存储,因此您选择使用带有 --new 选项的 podman generate systemd 命令。然后,创建 ~/.config/systemd/user/ 目录并将文件移到此位置上
podman generate systemd --name webserver1 --new --files /home/appdev-dam/container-webserver1.service
mkdir -p ~/.config/systemd/user/
mv container-webserver1.service ~/.config/systemd/user/
为容器管理 systemd 用户文件
现在,您已创建了 systemd 用户文件,可以使用 systemctl 命令 --user 选项来管理 webserver1 容器
首先,重新加载 systemd 守护进程,使 system出台了命令知道新的用户文件。使用 systemctl --user start 命令启动 webserver1 容器。使用为容器生成的 systemd 用户文件的名称
systemctl --user start container-webserver1.service
systemctl --user status container-webserver1.service
podman ps
下表总结了systemd 系统和用户服务之间使用的不同目录和命令
将容器配置为在系统引导时启动
此时,system 服务配置已就绪,可以为给定的用户运行容器。但是,如果用户从系统注销,systemd 服务会在特定时间后停止容器。出现此行为的原因时,systemd 服务单元时使用 --user 选项创建的,它在用户登录时启动服务,并在用户注销时停止服务
不过,您可以通过运行 loginctl enable-linger 命令来更改此默认行为,并强制已启用的服务在服务器启动时启动,并在服务器关闭期间停止
您可以使用 loginctl 命令将 systemd 用户服务配置为在所配置服务的最后一个用户会话关闭后保留。然后,使用 loginctl show-user 命令验证配置是否成功
loginctl show-user appdev-adm
loginctl enable-linger
loginctl show-user appdev-adm
要恢复此操作,可使用 loginctl disable-linger 命令
以 Root 用户身份使用 Systemd 管理容器
您还可以将容器配置为以 root 身份运行,并使用 systemd 服务文件进行管理。这种方法的一个优势是,您可以将这些服务文件配置为像常见 systemd 单元文件那样工作,而不是以特定用户身份来运行。
将服务文件设置为 root 的过程与前面概述的 Rootless 容器过程类似,但以下例外
不要创建专门的用户来管理容器
服务文件必须在 /etc/systemd/system 目录中,而不是在 ~/.config/systemd/user 目录中
使用 systemctl 命令管理容器,但不使用 --user 选项
不要以 root 用户身份运行 loginctl enable-linger 命令
指导练习:作为系统服务来管理容器
开放研究实验:运行容器
总结
容器提供了一种轻巧的方式,用来分发和运行具有依赖项的应用,使其不会与主机安装的软件向冲突
容器从容器镜像运行,您可以从容器注册表下载容器镜像或自行创建
您可以使用含有指令的容器文件来构建自定义容器镜像
红帽企业 Linux 提供的 Podman 可直接在单个主机上运行和管理容器及容器镜像
容器可以作为 root 或非特权 Rootless 容器运行,以提高安全性
您可以映射容器主机上的网络端口,将流量传递到容器中运行的服务
您可以使用环境变量来配置容器中的软件
容器促成你是临时的,但您可以使用容器主机上的目录内容将持久存储附加到容器(举例而言)
您可以配置 systemd 单元文件,在系统启动时自动运行容器
12. 总复习
总复习
复习 红帽系统管理二
第 1 章 提高命令运行效率
通过使用 Bash shell 的高级功能、shell 脚本以及红帽企业 Linux 使用程序,可以更高效地运行命令
通过使用 Bash shell 的高级功能、shell 脚本以及红帽企业 Linux 实用程序,可以更高效地运行命令
使用 for 循环运行重复性的任务,评估命令和脚本的退出代码,使用运算符运行测试,并使用 if 语句来创建条件结构
创建正则表达式以匹配数据,使用 grep 命令将正则表达式应用到文本文件,并使用 grep 从竖线命令总搜索文件和数据
第 2 章 调度未来任务
将任务调度到特定的时间和日期执行
将命令设置为在将来运行一次
利用用户的 crontab 文件,将命令调度为按计划重复运行
利用系统 crontab 文件和目录,将命令调度为按计划重复运行
启用和禁用 systemd 定时器,并配置管理临时文件的定时器
第 3 章 调优系统性能
通过设置调优参数和调整进程的调度优先级来提高系统性能
通过选择由 tuned 守护进程管理的调优配置集来优化系统性能
通过 nice 和 renice 命令,对特定进程进行优先排序或取消优先排序
第 4 章 管理 SELinux 安全性
使用 SELinux 保护和管理服务器安全性
说明 SELinux 如何保护资源,更改系统的当前 SELinux 模式,以及设置系统的默认 SELinux 模式
使用 semanage fcontext 命令管理确定文件和目录默认上下文的 SELinux 策略规则,并使用 restorecon 命令将 SELinux 策略定义的上下文应用到文件和目录
使用 setsebool 命令激活和停用 SELinux 策略规则,使用 semanage boolean -l 命令管理 SELinux 布尔值的持久值,并查阅以 _selinux 结尾的 man 页面以查找有关 SELinux 布尔值的有用信息
使用 SELinux 日志分析工具,以及利用 sealert 命令在 SELinux 故障排除期间显示有用的信息
第 5 章 管理基本存储
使用命令行创建和管理存储设备、分区、文件系统和交换空间
创建存储分区,将其格式化为相应的文件系统,然后进行挂载以供使用
创建和管理交换空间以补充物理内存
第 6 章 管理存储堆栈
使用命令行创建和管理含有文件系统或交换空间的逻辑卷
描述逻辑卷管理组件和概念,并实施 LVM 存储并显示 LVM 组件信息
分析组成存储堆栈层的多个存储组件
第 7 章 访问网络附加存储
使用 NFS 协议访问网络附加存储
识别 NFS 导出信息,创建用作挂载点的目录,使用 mount 命令或通过配置 /etc/fstab 文件夹来挂载 NFS 导出,以及使用 umount 命令卸载 NFS 导出
描述使用自动挂载的好处,以及使用直接和间接映射自动挂载 NFS 导出
第 8 章 控制启动过程
管理启动过程,以控制所提供的服务并对问题进行故障排除和修复
描述红帽企业 Linux 启动过程,设置启动时使用的默认目标,以及将系统启动到非默认目标
在当前 root 密码丢失的情况下,登录系统并更改 root 密码
手动修复让启动过程停止的我文件系统配置或损坏问题
第 9 章 管理网络安全
使用系统防火墙和 SELinux 规则来控制与服务的网络连接
使用 firewalld 规则来接受或拒绝与系统服务的网络连接
验证网络端口是否具有正确的 SELinux 类型,以便服务于之绑定
第 10 章 安装红帽企业 Linux
在服务器和虚拟机上安装红帽企业 Linux
在服务器上安装红帽企业 Linux
解释 Kickstart 概念和架构,使用 Kickstart Generator 网站创建 Kickstart 文件,使用文本编辑器修改现有的 Kickstart 文件并使用 ksvalidator 检查其语法,将 Kickstart 文件发布到安装程序,并在网络上安装 Kickstart
使用 Web 控制台在红帽企业 Linux 服务器上安装虚拟机
第 11 章 运行容器
获取简单的轻量型服务,并在单个红帽企业 Linux 服务器上作为容器运行和管理
解释容器概念,以及用于构建、存储和运行容器的核心技术
讨论使用注册表存储和检索镜像以及部署、查询和访问容器的容器管理工具
通过从容器主机共享存储来为容器数据提供持久存储,并配置容器网络
将容器配置为 systemd 服务,并将容器服务配置为在系统启动时启动
开放研究实验:修复启动问题和维护服务器
开放研究实验:配置和管理文件系统与存储
开放研究实验:配置和管理服务器安全性
开放研究实验:运行容器
Collect
Get Started
Collect
Get Started
Collect
Get Started
Collect
Get Started
评论
0 条评论
下一页