RHCSA 第六天学习笔记

RHCSA 第六天学习笔记

内容简介:逻辑卷(LVM:PV、VG、LV、PE),VDO 虚拟数据优化器,容器(podman 镜像管理、容器运行、网络、systemd 自启)。


本人个人博客地址:Egg-blog

一、磁盘管理前置准备

先做两个分区,大小自定义。添加两个新的分区,不要做格式化也不要做挂载——留给后面逻辑卷实验使用。


二、逻辑卷(LVM)

逻辑卷的 2 个特点

  1. 整合多个分区/磁盘:可以将多个分区或磁盘整合成一个更大的逻辑磁盘,然后从逻辑磁盘上划分出分区(逻辑磁盘的大小 = 整合的物理磁盘大小之和)。
  2. 在线扩容:当分区的存储空间不够时,不需要移动数据,可以直接添加硬盘或分区,在原有分区的基础上直接扩容。

LVM 核心概念

流程:PV(分区或磁盘)→ VG(由 PV 整合,含 PE)→ LV(由 VG 转化)→ 格式化 → 挂载

组件说明
PV(物理卷)由分区或磁盘转化而来,分区必须先转化成物理卷,才能整合成更大的逻辑磁盘
VG(卷组)由物理卷整合而成,VG 大小约等于整合的物理卷大小之和(误差大致在一个 PE 内)
PE(物理块)卷组上的最小存储单位,默认 4MiB。VG 大小 = 单个 PE 大小 × PE 的数量
LV(逻辑卷)从卷组上划分出来的,类似前面讲的分区。有了逻辑卷之后就可以对它格式化、挂载。LV 大小由 VG 分配的 PE 数量决定

实操

(1)将未格式化的分区转化成物理卷(PV)
pvcreate 分区路径1 分区路径2

查看物理卷信息:

pvs pvscan pvdisplay

(2)将 PV 整合成卷组(VG)
vgcreate 卷组名(自定义) 物理卷路径1 物理卷路径2

指定 PE 大小(通过-s选项):

vgcreate-sPE大小 卷组名 物理卷路径1 物理卷路径2

注意

  • 无需加单位,默认 MiB
  • PE 的大小必须是2 的倍数
  • 如果 VG 已创建好,想重新修改 PE 大小,只能使用vgremove 卷组名(数据会删除)后重新创建并指定 PE 大小

查看卷组信息:

vgs vgscan vgdisplay
(3)从卷组上划分逻辑卷(LV)

两种指定 LV 大小的方式:

# 方式一:直接指定逻辑卷的大小(大写的 -L)lvcreate-L逻辑卷的大小-n逻辑卷名字 卷组名# 方式二:通过 PE 的数量来决定逻辑卷大小(小写的 -l)lvcreate-lPE的数量-n逻辑卷名字 卷组名

查看逻辑卷的信息:

lvs lvscan lvdisplay

逻辑卷路径的两种写法:

# 第一种写法 /dev/卷组名/逻辑卷名 # 例:/dev/vg123/lv123 # 第二种写法 /dev/mapper/卷组名-逻辑卷名 # 例:/dev/mapper/vg123-lv123

移除逻辑卷:

lvremove 逻辑卷的路径# 如 /dev/vg31/lv31

lvscanlvdisplay都可以显示逻辑卷的路径。

(4)格式化与挂载

格式化步骤和之前分区步骤一样:

# 两种方式mkfs.文件系统类型 逻辑卷路径mkfs-t文件系统类型 逻辑卷路径

挂载:创建挂载点/mnt/lv1,然后将逻辑卷lv10永久挂载到/mnt/lv1上(文件系统为 xfs 类型,没有则自行创建)。

格式化挂载后——不要删除,后续实验还要继续使用

(5)综合练习

创建两个分区,设置卷组名为vgredhat,PE 大小为 16MiB,逻辑卷大小为 56 个扩展块,逻辑卷名为lvredhat,然后进行格式化(xfs)并挂载到/mnt/redhat

# 参考流程pvcreate /dev/nvme0n2p1 /dev/nvme0n2p2 vgcreate-s16vgredhat /dev/nvme0n2p1 /dev/nvme0n2p2 lvcreate-l56-nlvredhat vgredhat mkfs.xfs /dev/vgredhat/lvredhatmkdir-p/mnt/redhatmount/dev/vgredhat/lvredhat /mnt/redhat

逻辑卷扩容

因为逻辑卷是从卷组上划分出来的,所以在给逻辑卷扩容时,要首先考虑卷组空间够不够

(1)给卷组扩容

步骤:创建新的物理卷 → 添加到卷组内

# 1. 创建分区,并把分区转化成物理卷pvcreate 分区路径# 2. 给卷组扩容vgextend 卷组名 物理卷路径1
(2)给逻辑卷存储空间扩容
# lvextend:指定扩容后的总大小lvextend-L扩容后逻辑卷的大小 要扩容的逻辑卷路径# lvresize:在原来的基础上加指定大小lvresize-L+100M 逻辑卷路径
写法含义
-L +100M在原来的基础上加 100M
-L 1G直接扩容到 1G
(3)给文件系统进行扩容
文件系统类型扩容命令
ext 系列resize2fs 逻辑卷的路径
xfs 系列xfs_growfs 逻辑卷的路径
重点:在扩容逻辑卷存储空间时,同时扩容文件系统

使用-r选项可以一步完成逻辑卷和文件系统的扩容:

# 在原来的基础上加 10Glvextend-r-L+10G 要扩容的逻辑卷路径# 直接扩容到 10Glvextend-r-L10G 要扩容的逻辑卷路径

-r:给逻辑卷扩容的同时也给文件系统扩容。

练习:将lvredhat逻辑卷格式化为 ext4,永久挂载到/mnt/lv2(自行创建挂载点),然后对lvredhat进行扩容,扩容至 5G。

mkfs.ext4 /dev/vgredhat/lvredhatmkdir-p/mnt/lv2# 编辑 /etc/fstab 实现永久挂载lvextend-r-L5G /dev/vgredhat/lvredhat

三、VDO(虚拟数据优化器)—了解内容

VDO(Virtual Data Optimizer)是一种提供内嵌块级别的重复数据删除、压缩等功能的技术,非常适合作为一个可能存在大量重复数据的使用场景(例如虚拟机磁盘、用户上传的数据等)。

LVM VDO 的组成

LVM VDO通过两个逻辑卷构成:

组件说明
VDO POOL LV用于 LV 存储、重复数据删除和压缩的后端物理设备。设置 VDO 卷的物理大小,即可保存到磁盘中的数据量(实际对应消耗的卷组空间)。每个 VDO POOL LV 只能有一个 VDO LV
VDO LVVDO POOL LV 上的虚拟置备设备。设定 VDO 卷的置备和逻辑大小,即应用在重复数据删除和压缩发生前可写入卷的数据量

操作命令

# 安装 vdo 相关软件dnfinstallvdo kmod-kvdo# 流程:未格式化的分区 → 物理卷 → 卷组 → VDO 卷 → 格式化 → 挂载# 创建 VDO 卷lvcreate--typevdo--namevdo卷名称--size5G 卷组名称

# 格式化mkfs.格式化类型 vdo路径mkfs-t格式化类型 vdo路径# 挂载(同普通逻辑卷)

三种磁盘管理方式对比

方式流程
磁盘管理新加磁盘 → 分区 → 格式化(文件系统)→ 挂载(提供入口)
逻辑卷未格式化分区 → PV → VG → LV → 格式化 → 挂载
VDO 卷未格式化分区 → PV → VG → VDO 卷 → 格式化 → 挂载

四、容器(podman,兼容 docker)

容器简介

容器是一个虚拟化技术,可以将软件运行所需的环境一起打包运行,从而减少运维由于环境不兼容等带来的麻烦。

容器和传统虚拟化的区别:

  1. 容器是针对内核级别的虚拟化,传统虚拟化是针对操作系统级别的虚拟化,所以容器的响应速度更快
  2. 容器所处的系统环境是专门定制的,所以容器可以更加小巧

注意:不要把容器想的太复杂——把容器类比成一个软件,本节主要讲的就是:如何下载软件、安装软件、运行软件、软件的开机自启。

核心流程

镜像仓库→ 拉取镜像 → 创建容器 → 运行

实操:准备工作

请确保相关的一些文件传输到 RHEL 环境中,存放在redhat用户的~/images目录下。

1. 搭建容器仓库

(1)安装容器工具

首先需要确保系统环境中安装了podman程序。可以直接安装podman软件,也可以安装container-tools软件包来提供完整的容器管理相关的所有工具。

注意:需要确保redhat用户是正常通过 SSH 登录的,整个操作过程中不允许出现su -切换

(2)导入容器镜像

可以使用podman load命令导入别人准备好的容器镜像文件。

(3)登录镜像仓库

对容器镜像注册站点进行特定身份的登录,使用红帽订阅账号登录红帽官方的镜像仓库。

(4)通过网络下载容器镜像

podmanpull registry.redhat.io/ubi9/ubi:9.0.0-1703

容器镜像命名规则

每个容器镜像有着标准的命名规则:

容器注册站点/站点用户/容器镜像名:标签

部分说明是否必须
容器注册站点容器镜像所在的注册站点域名可省略
站点用户容器镜像属于注册站点上的哪一个用户可省略
容器镜像名具体描述容器镜像,通常和镜像作用有关必须
标签描述容器镜像版本(可通过skopeo inspectRepoTags查看),默认为latest可省略

红帽推荐任何时候都使用完整的容器镜像名称,确保每次操作指定的容器镜像唯一。

构建自定义容器镜像

可以通过ContainerfileDockerfile文件,使用podman build命令构建一个自定义的容器镜像。

[redhat@workstation ~]$mkdirmyimage# 准备专门的一个目录[redhat@workstation ~]$cdmyimage/# 切换工作目录[redhat@workstation myimage]$vimContainerfile# 创建 Containerfile(也可以是 Dockerfile)

基于红帽官方 UBI9 基础镜像,制作一个预装 vim 编辑器、启动后永久后台运行的容器镜像:

[redhat@workstation myimage]$ cat Containerfile FROM registry.redhat.io/ubi9/ubi:9.0.0-1703 RUN dnf install -y vim CMD ["/bin/bash", "-c", "sleep infinity"]

各行含义:

说明
FROM指定构建的基础镜像:红帽官方 UBI9 标准版,固定版本 9.0.0-1703
RUN构建时执行的操作:dnf install -y vimdnf是 RHEL9/UBI9 的包管理器(替代 yum),-y自动确认安装
CMD容器启动后执行的默认命令:启动 bash 并执行sleep infinity永久休眠,让容器持续运行

sleep infinity会启动一个「永久休眠的进程」作为 PID=1,不占用 CPU 资源、不输出日志、不会异常退出。大多数容器镜像都可以依照类似文件来创建,通常由开发人员编写。

构建镜像:

[redhat@workstation myimage]$podmanbuild-tmyimage.# 在当前目录下搜索 Containerfile 或 Dockerfile,读取内容构建镜像,并命名为 myimage

查看已有的容器镜像:

podmanimagespodmanimagerm镜像名# 删除镜像

2. 运行容器

有了容器镜像之后,就可以使用podman run命令来基于一个容器镜像启动一个容器。

podman run常用参数:

参数说明
-d让容器在后台运行
--name给容器指定一个名称
-p将容器的某个端口和宿主机上的某个端口建立连接,通过宿主机端口访问容器服务。格式:-p 本地端口:容器端口
-v将宿主机上的某个目录挂载到容器内的某个目录,让容器和宿主机共享文件。格式:-v 本地路径:容器内路径:zz保证 SELinux 上下文一致)
-e向容器内传递环境变量,通常和容器启动脚本或方式有直接关联

-p-v-e三个选项可以重复调用多次

示例:

podmanrun--nameweb-d-p8888:80 httpd# 通过本地 IP:8888 即可访问容器 IP:80 的内容

# 使用 httpd 镜像创建容器 web01,通过访问主机的 8080 端口访问容器内的 8080 端口

挂载目录-v详解:

# 容器内的存储路径只是作为一个入口,真正的数据保存在本地主机的存储路径上# z 的作用:保证 SELinux 上下文一致[redhat@localhost ~]$mkdir-pwww[redhat@localhost ~]$echo"hello">./www/index.html[redhat@localhost ~]$podmanrun-d--nameweb03-p8081:8080\-v/home/redhat/www/:/var/www/html/:z\registry.redhat.io/ubi9/httpd-24:1-262

3. 容器管理命令

查看容器:

podmanps-a# 查看所有的容器

在容器内执行命令:

# 执行简单命令(非交互式操作的命令)podmanexecweb01ls-l/root# 执行复杂命令(包含管道符、重定向等),使用 sh -c 或 bash -c 封装podmanexecpycontainer1sh-c'ls -l /root'

此命令模式只支持非交互式的命令(vim等不可使用)。

容器的启动、停止、重启、删除:

podmanstart 容器名称# 启动容器(可使用容器名称或 ID)podmanstop 容器名称# 停止容器podmanrestart 容器名称# 重启容器podmanrm容器名称# 删除容器

注意

  • 如果没有在容器运行时添加-v选项,删除容器时容器内的数据将全部丢失
  • 容器创建只有一次机会,若想修改podman run中定义的内容,需要先删除错误创建的容器,再重新创建

4. 容器网络

创建容器网络:

podmannetwork create--gateway10.99.0.1--subnet10.99.0.0/16 test_net# 创建一个网关为 10.99.0.1,子网为 10.99.0.0/16 的容器网络

查看网络详细信息:

podmannetwork inspect test_net

指定容器运行在某个网络中:

在同一个容器网络中的容器相互之间可以直接使用容器名作为互相访问的地址。

podmanrun-d--nametest1--networktest_net localhost/myimage:latestpodmanrun-d--nametest2--networktest_net localhost/myimage:latest

# 给容器 test1 和 test2 安装 ping 命令所需的基础软件包podmanexectest1pingtest2podmanexectest2pingtest1

5. 基于 systemd 的自启动容器

对于 podman 创建的容器,若想实现开机自启,需要通过 systemd 进行管理(主要针对 rootless 级别的容器——容器不推荐使用 root 用户去执行,存在严重的安全问题)。

(1)允许用户进程驻留在系统中:

[redhat@localhost ~]$ loginctl enable-linger

(2)创建容器服务所需目录(记住对应路径):

[redhat@localhost ~]$mkdir-p~/.config/systemd/user[redhat@localhost ~]$cd~/.config/systemd/user[redhat@localhost user]$pwd/home/redhat/.config/systemd/user

(3)将容器注册成用户级别的服务:

[redhat@localhost user]$podmangenerate systemd--nameweb01--files/home/redhat/.config/systemd/user/container-web01.service

(4)刷新用户级别的 systemd 单元文件:

[redhat@localhost user]$ systemctl--userdaemon-reload

(5)停止基于 podman 直接对容器的启动,改用 systemd 接管:

[redhat@localhost user]$podmanstop web01[redhat@localhost user]$ systemctl--userstart container-web01.service[redhat@localhost user]$ systemctl--userenablecontainer-web01.service