linux学习笔记 · 2022年2月10日 0

2. Rocky Linux 高级安装选项

第一章中,我们讨论了如何在物理硬件上和虚拟机中安装 Rocky Linux,并最终完成了安装。在本章中,我们将继续讨论安装操作系统的相关话题。本章内容主要包括:使用 Anaconda 实现自动化安装操作系统、在公有云平台上安装操作系统 (本文以阿里云平台为例,其他云平台的操作几乎相同)、Rocky Linux 系统安装的最佳实践介绍。

通过本章,你不仅能学习如何在云上安装操作系统,还可以了解到最佳部署,并能够以自动化的方式执行安装。

之所以要介绍最佳部署,是因为操作系统处于最底层。越是底层,就越要牢固可靠,因为底层的东西通常被深度依赖,不仅影响上层应用的状态,修改起来也是牵一发而动全身。在运行一段时间后,你如果觉得某个系统安装的有些瑕疵,想重装系统,那么就得先迁移其上运行的应用和存储的数据。这种复杂程度,往往不像表面上看起来的简单。即使要重启某个操作系统,也要考虑在重启过程中,其上的应用中断服务会不会对用户产生影响,重启后的数据一致性能不能保持。所以,遵循最佳实践,安装一步到位的操作系统,能够让我们从一开始,就避免掉很多长期问题。

首先,我们讨论 Anaconda 的自动安装过程。这需要用到我们第一章中安装完成的 Rocky Linux。

2.1 使用 Anaconda 自动部署 Rocky Linux

在安装完成 Rocky Linux 后,我们可以使用 root 用户登录主机,并列出 root 用户家目录中的文件:

[root@rocky8-host ~]# ls /root/
anaconda-ks.cfg

你会看到 “anaconda-ks.cfg” 文件,该文件被称为 Kickstart 文件,里面的内容很重要,包含了在安装过程中为安装程序 Anaconda 提供的配置信息。在云镜像中,没有 anaconda-ks.cfg 文件的。我们使用 cat 命令查看 anaconda-ks.cfg 文件的内容:

[root@rocky8-host ~]# cat anaconda-ks.cfg

可以重复使用 anaconda-ks.cfg 文件来安装其他系统,这些系统的选项与我们在本次安装中使用的选项相同。让我们通过 anaconda-ks.cfg 文件回顾一下在之前的安装中添加、设置的选项。

以 # 开头的行是注释,对安装过程没有影响。

指定正在使用的版本的注释如下:

#version=RHEL8

接着指定了安装的类型,安装类型有两种:graphical 和 text。该文件中,指定的是 graphical。text 类型通常用于 headless system 的安装:

# Use graphical install
graphical

Repo 用来指定安装程序包的软件源,我们使用的是 ISO 镜像,被挂载到了指定的位置:

repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream

使用 % 定义一个块的开始,在 “packages” 块中定义了要安装的软件包列表,使用 %end 定义块的结束。有两种指定软件的方式:一个是由 @ 开头的软件包组 (示例中的 minimal-environment),另一个是不需要任何前缀的软件包名称 (该示例中是 kexec-tools,是实现 Kdump 的工具):

%packages
@^minimal-environment
kexec-tools

%end

“Keyboard layouts” 指定了键盘布局,这正是我们在安装过程中选择和添加的键盘布局。

# Keyboard layouts
keyboard --xlayouts='us','cn'

对于操作系统语言,我们添加了美式英语 (en_US) 和中文 (zh_CN)。在操作系统中,有多种方法管理、存储和表示文字。最常用的是 “UTF-8″,它在单一标准下能够展示多种字符集 (包括中文),这也是为什么系统语言中附加了 .UTF-8 的原因:

# System language
lang en_US.UTF-8 --addsupport=zh_CN.UTF-8

更多 UTF-8 内容请查看百科

接下来是网络接口的定义。我们的示例中只有一个网络接口:eth0。配置使用 IPv4 与”动态主机配置协议 (DHCP)“和 IPv6,两者都是在启动时激活的。主机名配置为 ”rocky8-host.aiops.red“:

# Network information
network  --bootproto=dhcp --device=eth0 --ipv6=auto --activate
network  --hostname=rocky8-host.aiops.red

现在,我们需要定义安装介质。在本例中,我们使用一个模拟的 CDROM/DVD,装载了我们下载的ISO镜像文件:

# Use CDROM installation media
cdrom

“firstboot” 选项默认是开启的。在这个示例中,安装不包括图形界面,所以它并没有运行,但是被添加到 kickstart 文件中。我们可以安全的删除该选项:

# Run the Setup Agent on first boot
firstboot --enable

接着是配置磁盘的选项,为了安全起见,我们指定了安装器忽略所有的磁盘,除了目标磁盘 “nvme0n1”。“nvme0n1” 是我们在本次示例中选定的磁盘:

ignoredisk --only-use=nvme0n1

磁盘的名称可能不同,取决你所运行的平台。通常有 vda、xda 或 sda 以及示例中的 nvme0n1。

指定了磁盘之后,开始对磁盘进行分区,本示例是自动分区:

autopart

操作系统使用的空间必须声明,在本例中,我们将初始化整个磁盘:

# Partition clearing information
clearpart --none --initlabel

操作系统时区我们选择的是亚洲、上海:

# System timezone
timezone Asia/Shanghai --isUtc

设置 root 用户的密码,及创建 aiops 用户。为了安全起见,密码已经被加密了:

# Root password
rootpw --iscrypted $6$vwZvZE.8H369vrn2$iKH7IsB/1CQ9U7pfzQO1sTsAVQddzrgumSTyVxtp2olZD3bK5S7qMBef6WSxxMRFQUYNMlccRc0Kf60efwylZ.
user --groups=wheel --name=aiops --password=$6$cbjTnwc/nMPmhZHT$yujXS5D0WxpzVg0SBYqLUnjA2PwMg2kGVTe/DasL1XaoIzHiQN6Yu9TCF.X.r/B/TtrwbJy6mk2OkCvYZui3M0 --iscrypted --gecos
="aiops"

配置 kdump 的预留内存:

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

指定将用于安装的密码策略:

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

有了这些,一个可重复使用安装操作系统的 Kickstart 文件就准备好了。

要想使用 Kickstart 文件,需要我们将其放到一个可以被安装器访问的位置,这个位置可以是网络的,也可以是本地的,如 FTP、U盘、HTTP 等。在本示例中,我们使用 HTTP 的方式提供 anaconda-ks.cfg 文件。在安装好的系统上执行以下命令,这些命令在以后的章节都会有详细介绍,在本章如果你对这些命令还不太熟悉,没有关系,按照文档操作就可以。

2.1.1 修改 DNF 源

DNF 是 Rocky Linux 的包管理器,也是 Centos 8、RHEL 8 的包管理,用来在操作系统中安装软件。默认的 DNF 源是官方源,服务器在国外,如果我们直接使用官方源,网络质量较差,安装软件的速度和成功率会低很多。所以我们先把 DNF 源修改成国内的。目前国内比较优质的 DNF 源,是南京大学提供的。执行以下命令把 Rocky Linux 官方镜像源替换为南京大学的镜像源:

[root@rocky08-host ~]# sed -e 's|^mirrorlist=|#mirrorlist=|g' 
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.nju.edu.cn/rocky|g' 
    -i.bak 
    /etc/yum.repos.d/Rocky-*.repo

在 Rocky 官网上列出的 DNF 源列表中,国内的有南京大学 (mirrors.nju.edu.cn) 和山东大学 (mirrors.sdu.edu.cn)。

2.1.2 关闭防火墙和 SELinux

防火墙和 SELinux 都是为了增强系统安全的,但在学习初期,我们先关闭这两个服务。关闭防火墙和 SELinux 在生产系统中是不推荐的,我们会在后续章节介绍它们的用法。现在,为了方便,我们先关闭它们。

关闭防火墙:

[root@rocky08-host ~]# systemctl stop firewalld

关闭 SELinux:

[root@rocky08-host ~]# setenforce 0

2.1.3 安装并配置 Nginx

Nginx 是一个高性能的、主流的 Web 服务器,我们使用 Nginx 提供 “anaconda-ks.cfg” 文件的下载。使用 DNF 命令安装 Nginx 只需要一条命令:

[root@rocky08-host ~]# dnf -y install nginx

Nginx 安装完成后,我们把 “anaconda-ks.cfg” 文件复制到 Nginx 的 ROOT 目录中:

[root@rocky08-host ~]# cp anaconda-ks.cfg /usr/share/nginx/html/

Nginx 默认是以 nginx 用户启动的,我们把 Nginx ROOT 目录的权限设置为 nginx:

[root@rocky08-host ~]# chown nginx.nginx -R /usr/share/nginx/html/

接着启动 Nginx,Nginx 默认监听在 80 端口,对外提供 HTTP 服务:

[root@rocky08-host ~]# systemctl start nginx

现在,我们就可以通过 http://hostip/anaconda-ks.cfg 的方式访问 “anaconda-ks.cfg” 文件了。

“hostip” 需要替换为你主机的真实 IP,可以通过以下命令获取:

[root@rocky08-host ~]# nmcli
图2-1 获取主机的 IP 地址

我本机的 IP 地址为 192.168.226.128,这样我就可以从外部访问 Nginx Web 服务了。我们的 Nginx 地址就是本机的 IP 地址,端口号就是 Web 默认的 80 端口。现在可以通过 http://192.168.226.128/anaconda-ks.cfg (你的 IP 地址不一定是这个,填写正确的 IP 地址) 访问 Kickstart 文件了。

2.1.4 指定 Kickstart 文件

有了提供 Kickstart 文件的 HTTP 服务,我们就可以将它传递给安装器了。方法很简单:在安装前编辑内核参数,方式和修改网卡名称为 eth0 类似。

在引导过程中,我们选择 “Install Rocky Linux 8” ,并按下 Tab 键。从 vmlinuz 开始的引导行将出现在屏幕底部。输入 “Tab” 键后,删除 quiet 字符串,然后添加以下内容:

inst.ks=http://192.168.226.128/anaconda-ks.cfg  net.ifnames=0 biosdevname=0
图2-2 指定 Kickstart 文件的位置

它的三部分内容如下:

http:Kickstart 文件是通过 http 的形式提供的192.168.226.128:http web 服务器的 IP 地址/anaconda-ks.cfg:anaconda-ks.cfg 在 web 服务器上的路径

net.ifnames=0 biosdevname=0:把网卡名称修改为 eth0,这个参数和指定 Kickstart 文件没有关系

有了这个,我们就可以重复之前完成的完整安装了。正如你所看到的,创建一个 Kickstart 文件并自动化 Rocky Linux 的安装是非常容易的。

接下来,我们讨论如何在云平台安装 Rocky Linux。

2.2 在云上安装 Rocky Linux

随着 Rocky Linux 8.5 的发布 (8.5 是生产可用版),主流云厂商开始提供 Rocky Linux 的镜像,这也简化了我们在云平台上安装 Rocky Linux 的难度。但在云上安装 Rocky Linux 与我们之前所做的安装有一些不同。主要区别如下:

不再使用 ISO 镜像或 Anaconda 来执行安装,而是使用预先配置的镜像,这些镜像通常由云厂商提供。我们也可以自定义镜像以满足特殊需求。我会在“OpenStack 最佳实践” 系列篇章中介绍如何为云平台提供自定义的镜像。在安装期间,不能选择系统的配置细节(例如时区),但可以在安装后配置。提供 Cloud-init,能够对新创建主机信息进行自定义设置,例如配置网络、创建用户和证书。

我们通常使用 SSH 协议和生成的 SSH 秘钥远程访问操作系统,我会在 “远程管理操作系统” 一章对此详细介绍。

在不同云平台上通过控制台创建云主机的方式差别不大,本章示例是在阿里云上完成的。通过云厂商提供的控制台创建主机资源的方式低效且不可重复,不适合在大规模部署中使用。我会在 “IaC” 系列篇章中介绍 Terraform 和 Pulumi,它们是基础设施即代码的主流工具,可以用它们声明式的、可重复使用的代码段,在云平台上自动创建资源。这能很好地提高我们的工作效率和工作稳定性。

要完成本章的操作,你需要执行以下步骤:

1.在 https://www.aliyun.com/ 页面登录阿里云平台。如果还没有账号,可以通过页面上的 “立即注册” 按钮注册新账号。

2.登录后,点击顶栏的 “产品”,找到 “弹性计算”,“云服务器”,点击“云服务器 ECS”。

3.点击”立即购买“按钮,当然,我们并不需要真正购买,只是体验一下安装过程。

4.在弹出的“自定义购买”页面,可以根据网站的介绍了解各选项,我们在这里需要关注的是“镜像”部分,选择“公共镜像”,从公共镜像中选择我们需要的 “Rocky Linux”,然后选择版本。目前版本只有一个,就是 “8.5”。以后版本更新,会有更多的版本选择,我们选择最新的版本即可。

5.“基础配置”完成后,进入“系统配置”,设置 root 账号的秘钥对,然后设置实例名 (这个名称可以理解为我们第一章安装 Rocky 时设置的在 VM 上显示名称) 和主机名 (操作系统名称)。

6.安装过程基本就完成了。

我们之前已经拥有了一台可以在本书中使用的主机,所以不需要继续“订单确认”了。

现在我们知道了如何使用 Anaconda 自动重新安装 vm,以及如何在云中安装实例,接下来我们讨论在执行安装时需要考虑的一些最佳实践。

2.3 最佳安装实践

Rocky Linux 安装有许多可供选择的选项,你应该根据具体的场景进行定制。然而,我还是有一些适用任何场景的用例分享给大家。

2.3.1 镜像

标准化核心安装,并为其创建镜像。镜像应最小化,可作为基础安装或者其他镜像的基础。需要时为常见案例构建镜像尽量使用自动化平台扩展系统 (常用的自动化工具我会在“配置管理工具”系列篇章介绍)。镜像应适用于应用场景。

2.3.2 软件

软件安装地越少,受攻击面就越小。尽量选择 “Minimal Install” 软件包集,使系统能够运行和操作即可 (也就是说,尽量不要给服务器添加图形用户界面)。标准化安装的应用程序,以便在紧急情况下能够快速处理。使用包管理器,对第三方应用程序的生命周期进行管理 (无论是用 RPM 还是用容器)。建立补丁计划。

2.3.3 网络

在虚拟机中,尽量不要过度添加网络接口。在物理机中,尽量对网络接口使用 bonding。使用 VLAN 对网络进行分割。

2.3.4 存储

对于服务器,尽可能使用逻辑卷管理 (LVM,除了 /boot)。使用默认的 xfs 文件系统。对磁盘进行分区:保持 boot 分区的默认大小。如果要修改它,也仅能调的更大,不能减小,因为在升级过程中可能需要这些空间。对 swap 分区没有要求的话 (会有一些软件要求运行的操作系统关闭 swap 分区),保留默认的 swap 分区是比较安全的选择。对于长期使用的系统,至少要为 /、/var、/usr、/tmp、/home 划分单独的分区。

2.3.5 安全性

不要关闭 SELinux,新版 SELinux 已经有了很大改进,不会干扰你的系统。你可以把它设置为 permissive,而不是 disable。不要关闭防火墙。用服务部署自动打开端口。尽可能将日志重定向到一个中央位置。将安装的安全工具和配置标准化,以检查系统的完整性和审计。检查软件安装 (RPM) 的GPG 秘钥,以及 ISO 镜像,确保完整性。尽量避免使用密码 (尤其是 root 用户),一定要使用密码时,请使用强密码。用 OpenSCAP 检查你的系统的安全性。

2.3.6 其他

保持系统的时间同步。检查 logrotate 策略,避免因日志写入导致的磁盘被写满的错误。

遵循这些最佳实践可帮助你避免一些问题,并使安装的系统更易于管理。这样,你就可以以一种结构化的、可重复的方式安装 Rocky Linux 操作系统,同时可以快速的、可定制的方式向其他团队提供服务。

2.4 小结

第一章中,我们提到了如何准备一台我们可以在本书中使用的机器。另一种选择是使用云实例,我们可以通过云实例从共有云平台购买虚拟机实例。

当你以专业人员的身份使用 Linux 时,理解标准化环境的必要性和这样做的影响也很重要。从一开始就遵循最佳实践 (自动化安装、管理已安装软件的生命周期、减少攻击面,等等) 是非常重要的。

在下一章中,我会介绍 Rocky Linux 系统的基础知识,以增强我们在使用该系统时的自信心。

本篇文章来源于微信公众号: 魏文第