风险告知

  • 本人及本篇博文不为任何人及任何行为的任何风险承担责任,图解仅供参考,请悉知!
  • 相关配置操作是在一个全新的演示环境下进行的,演示环境中没有任何有价值的数据,但这并不代表摆在你面前的环境也是如此。
  • 生产环境全新安装后(业务上线前)或者自行测试都可放心参考该图解内容,该教程是完全站在生产业务角度去做的建议配置(业务厂商有特殊要求的除外)。
  • 图解内容可能存在一些自动执行的shell脚本,所以,一定要全面评估并且备份有价值数据后再进行。因为任何操作都是有丢失数据风险的可能,比如说误操作覆盖或移动有价值数据进而影响到生产业务都无异于删库,无论是你是否即将跑路!
  • 删除跑路的方式千万条,不仅仅有你最熟悉的rm rf /*,有时候一个空格都能要了你的小(老)命,小心是的万年船,最好的归宿是阖家欢乐,是团团圆圆,是你好我好大家好,是博主真好!

废话翩翩

解释下为什么要码这么多文字说明,包括后续的内容中也是如此,注释说明真的多。因为我觉得我们在学习过程过应该有点儿逼数,那就是学习一定不仅仅为了学会某一条命令,某一个技巧……更重要的是尽可能的理解这件事儿的来龙去脉、因果关系,最好能形成自己的思路。图解内容完全手打,所以难免有所纰漏,欢迎评论区指正,同时内容处于一个不断(随时)更新的状态,以最新的内容为准!

开拓视野

众所周知,各种GNU/Linux发行版都默认提供了在线repo源,只不过有的repo源需要订阅,不给钱不让用,有的更新源服务器在国外,访问速度相对较慢,甚至无法访问,当然还有的服务器终端自身处于生产内网,内外网完全物理隔离或者是安全设备阻塞相关服务通过,无法在线获取repo源。所以我们需要根据实际环境,考虑更换repo源使用,比如说为了加速使用国内大厂、高校等搭建的repo源(华为、阿里云、网易、清华大学……随上游更新自动更新)。我们也可以自行搭建本地repo源(实时同步上游更新)供生产内网所有服务器使用。还可以使用ISO发布包搭建本地单机repo源(仅供本机使用,生产环境中这种情况使用较多,可能是因为生产环境业务部署完成之后就不考虑更新的原因吧,可以理解为是一次性使用)。另外,repo源的搭建支持使用http协议、ftp协议和file协议。

食用范围

目前测试结果来讲适用于所有使用yum开源包管理器的GNU/Linux发行版,包括但不限于openEuler、OpenAnolis、Fedora、RedHat、CentOS Stream、CentOS、RockyLinux、AlmaLinux等等,简单的来讲就是可以使用yum update,yum install,yum repolist,yum search,yum provides等命令的GNU/Linux发行版。

避坑指南

1、本人的所有博文中的内容,尤其是命令和脚本,没看懂理解之前严谨直接复制使用,即便是你看懂之后,也是严谨直接应用于实际的生产环境中,先找个测试环境测试OK后,再应用于实际生产业务中,否则后果自负。

2、演示环境中的命令都是在root根用户下操作下,如果在你的环境中类似权限问题执行失败时,注意检查用户权限问题,一般在命令前加sudo提权即可。

3、在创建本地local.repo仓库源文件时,相关GNU/Linux发行版在指定baseurl字段属性值的时候,需要注意repodata目录的具体位置,当你遇到找不到repodata目录下的元数据文件的提示时,就说明你指定的路径有问题。当前文章的是采用CentOS8.5为演示环境,具体到每一个镜像文件所包含的repodata目录的具体位置,可以直接查看或者搜索该镜像文件。一般来讲大版本8(含)之后的发行版有两个目录(镜像文件根目录下的BaseOS和AppStream)下包含repodata目录,每个repodata目录下都包含一个repomd.xml元数据文件,编辑local.repo仓库源文件时都需要指定。大版本7(含)之前的发行版,则直接在镜像文件的根目录。

[root@centos85 centos85]# yum listlocal 0.0B/s | 0B 00:00Errors during downloading metadata for repository 'local':- Curl error (37): Couldn't read a file:// file for file:///mnt/centos85/repodata/repomd.xml [Couldn't open file /mnt/centos85/repodata/repomd.xml]错误:为仓库 'local' 下载元数据失败 : Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried

言归正传

本地repo源(单机环境)的搭建常规都使用官方发布的ISO发布包作为源,也就是安装操作系统时使用的ISO镜像文件。可以以光驱的形式插入到服务器,也可以上传ISO镜像文件到服务器上,两种情况的仅仅是挂载到操作系统时的操作略微有所区别,使用起来完全一样。

第一种情况:假设ISO镜像文件是以光驱的形式插入到服务器上,需要挂载光驱设备。

第二种情况:假设ISO镜像文件是以文件的形式上传到服务器上,需要挂载镜像文件。

思路:1、挂载光驱设备或者镜像文件到指定目录 2、备份初始repo源文件,创建本地local.repo源文件3、(可选)如果要永久挂载,修改/etc/fatab文件实现开机自动挂载

挂载本地源(挂载光驱设备)

如果物理机有光驱设备(现在很少了),或者说虚拟化平台上使用虚拟光驱加载镜像文件的话参照以下步骤

# 首先创建一个用于挂载光驱设备的目录,一般我们都习惯把外设设备挂载到/mnt目录下临时使用,现场具体路径需要根据实际情况做相应修改[root@centos85 ~]# mkdir /mnt/centos85# 查看一下光盘插入光驱前块设备状态,如果只有一个光驱设备,名称就是sr0,且默认大小显示1024M,多个的话自行测试判断[root@centos85 ~]# lsblkNAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINTsr011:01 1024M0 rom# 如果有光驱设备,但是没有插入光盘,挂载时会提示找不到媒体文件[root@centos85 ~]# mount /dev/sr0 /mnt/centos85/mount: /mnt/centos85: 在 /dev/sr0 上找不到媒体.# 查看一下光盘插入光驱后块设备状态,此时块设备大小显示为光盘文件的实际大小[root@centos85 ~]# lsblkNAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINTsr011:01 10.1G0 rom# 如果有光驱设备,且已经插入光盘,成功挂载后会提示设备为只读挂载[root@centos85 ~]# mount /dev/sr0 /mnt/centos85/mount: /mnt/centos85: WARNING: device write-protected, mounted read-only.

挂载本地源(挂载镜像文件)

如果是直接将镜像文件通过SCP文件传输协议上传到服务器上指定目录使用的话就参照以下步骤

# 首先创建一个用于挂载镜像文件的目录,一般我们都习惯把外设设备挂载到/mnt目录下临时使用,现场具体路径需要根据实际情况做相应修改[root@centos85 ~]# mkdir /mnt/centos85# 上传原版ISO镜像文件,个人习惯一般都会上传到/media目录下[root@centos85 ~]# ls /media/CentOS-8.5.2111-x86_64-dvd1.iso# 挂载镜像文件到对应目录,-t指定被挂载文件的类型,-o参数中ro指定被挂载文件为只读属性,loop指定把被挂载文件当成设备挂载至系统目录,细心的同学会发现,在挂载光驱设备时我们,并没有使用-t -o 参数,在这里也是可以省略的,原因在于新版的操作系统已经能够做到自动识别设备类型了[root@centos85 ~]# mount -t iso9660 -o ro,loop /media/CentOS-8.5.2111-x86_64-dvd1.iso /mnt/centos85/# 成功挂载后控制台无任何输出提示,使用ls命令能够查看到镜像文件所包含的内容即可[root@centos85 ~]# ls /mnt/centos85/AppStreamBaseOSEFIimagesisolinuxLICENSEmedia.repoTRANS.TBL

创建本地local.repo源文件

备份备份一定要备份当前所有的repo仓库源文件后,再在/etc/yum.repos.d/目录下创建一个新的repo仓库源文件local.repo,之后就可以正常使用了。

# 查看当前本地repo仓库所有源[root@centos85 ~]# ls /etc/yum.repos.d/ -l总用量 48-rw-r--r--. 1 root root719 9月15 2021 CentOS-Linux-AppStream.repo-rw-r--r--. 1 root root704 9月15 2021 CentOS-Linux-BaseOS.repo-rw-r--r--. 1 root root 1130 9月15 2021 CentOS-Linux-ContinuousRelease.repo-rw-r--r--. 1 root root318 9月15 2021 CentOS-Linux-Debuginfo.repo-rw-r--r--. 1 root root732 9月15 2021 CentOS-Linux-Devel.repo-rw-r--r--. 1 root root704 9月15 2021 CentOS-Linux-Extras.repo-rw-r--r--. 1 root root719 9月15 2021 CentOS-Linux-FastTrack.repo-rw-r--r--. 1 root root740 9月15 2021 CentOS-Linux-HighAvailability.repo-rw-r--r--. 1 root root693 9月15 2021 CentOS-Linux-Media.repo-rw-r--r--. 1 root root706 9月15 2021 CentOS-Linux-Plus.repo-rw-r--r--. 1 root root724 9月15 2021 CentOS-Linux-PowerTools.repo-rw-r--r--. 1 root root 1124 9月15 2021 CentOS-Linux-Sources.repo# 使用mkdir命令创建一个本地repo仓库源的备份目录,我这里习惯直接使用源目录名称加.bak作为新建目录的名称[root@centos85 ~]# mkdir /etc/yum.repos.d.bak# 使用mv命令将repo仓库源目录的所有源文件移动(剪切)到新创建的备份目录[root@centos85 ~]# mv /etc/yum.repos.d/* /etc/yum.repos.d.bak/# 查看repo仓库源目录已经为空目录[root@centos85 ~]# ls /etc/yum.repos.d/ -l总用量 0----------------------------------分割线以下内容需要特别注意,具体原因参见避坑指南章节---------------------------------# 1、如果使用的时大版本8(含)及以后的发行版则使用以下脚本创建本地repo仓库源文件# 直接使用下面的脚本创建一个本地repo源文件,其中baseurl指向挂载光驱设备或者镜像文件的目录,如果gpgcheck=1,则需要使用相同的文件协议增加指定gpgkey签名公钥的文件路径,其他不用更改。[root@centos85 ~]# cat</etc/yum.repos.d/local.repo[BaseOS]name=BaseOSbaseurl=file:///mnt/centos85/BaseOSenabled=1gpgcheck=0[AppStream]name=AppStreambaseurl=file:///mnt/centos85/AppStreamenabled=1gpgcheck=0EOF# 查看新创建的本地repo仓库源文件[root@centos85 ~]# ls /etc/yum.repos.d/ -l总用量 4-rw-r--r--. 1 root root 71 1月24 14:50 local.repo# 使用cat命令查看新创建的repo仓库源文件内容,至此,已经可以开始使用yum相关的命令使用本地源了[root@centos85 ~]# cat /etc/yum.repos.d/local.repo[BaseOS]name=BaseOSbaseurl=file:///mnt/centos85/BaseOSenabled=1gpgcheck=0[AppStream]name=AppStreambaseurl=file:///mnt/centos85/AppStreamenabled=1gpgcheck=0EOF[root@centos85 ~]#[root@centos85 ~]#[root@centos85 ~]#[root@centos85 ~]## 2、如果使用的时大版本7(含)及之前的发行版则使用以下脚本创建本地repo仓库源文件# 直接使用下面的脚本创建一个本地repo源文件,其中baseurl指向挂载光驱设备或者镜像文件的目录,如果gpgcheck=1,则需要使用相同的文件协议增加指定gpgkey签名公钥的文件路径,其他不用更改。[root@centos79 ~]# cat</etc/yum.repos.d/local.repo[lcoal]name=localbaseurl=file:///mnt/centos79enabled=1gpgcheck=0EOF# 查看新创建的本地repo仓库源文件[root@centos79 ~]# ls /etc/yum.repos.d/ -l总用量 4-rw-r--r--. 1 root root 71 1月24 14:50 local.repo# 使用cat命令查看新创建的repo仓库源文件内容,至此,已经可以开始使用yum相关的命令使用本地源了[root@centos79 ~]# cat /etc/yum.repos.d/local.repo[local]name=localbaseurl=file:///mnt/centos79enabled=1gpgcheck=0EOF[root@centos79 ~]#

实现开机自动挂载(可选)

之前的所有操作,创建的目录,新建从repo仓库源文件,包括备份的文件都不会有变化,但是有一点要特别注意,就是mount挂载操作重启后会失效,也就是说下次开机需要手动重新挂载才可以继续使用repo本地源。如果我们仅仅是业务部署阶段使用一次repo本地源,这一步可以跳过,如果要长期使用的话,最好是配置/etc/fstab文件实现开机自动挂载。

# 使用echo命令向/etc/fstab文件内容中追加一行内容,实现开机自动挂载镜像文件# 如果使用插入到服务器上的光驱设备挂载的方式,则使用以下脚本[root@centos85 ~]# echo "/dev/sr0 /mnt/centos85 iso9660 auto,ro 0 0" >> /etc/fstab# 检查并确认[root@centos85 ~]# cat /etc/fstab## /etc/fstab# Created by anaconda on Fri Jan 19 11:05:34 2024## Accessible filesystems, by reference, are maintained under '/dev/disk/'.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.## After editing this file, run 'systemctl daemon-reload' to update systemd# units generated from this file.#/dev/mapper/cl-root / xfs defaults0 0UUID=bad13599-75bd-432a-858f-70d1d934b4a0 /boot xfs defaults0 0UUID=779D-39C8/boot/efi vfatumask=0077,shortname=winnt 0 2/dev/mapper/cl-home /home xfs defaults0 0/dev/mapper/cl-swap noneswapdefaults0 0/dev/sr0 /mnt/centos85 iso9660 auto,ro 0 0# 如果使用上传到服务器上的镜像文件挂载的方式,则使用以下脚本[root@centos85 ~]# echo "/media/CentOS-8.5.2111-x86_64-dvd1.iso /mnt/centos85 iso9660 auto,ro 0 0" >> /etc/fstab# 检查并确认[root@centos85 ~]# cat /etc/fstab## /etc/fstab# Created by anaconda on Fri Jan 19 11:05:34 2024## Accessible filesystems, by reference, are maintained under '/dev/disk/'.# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.## After editing this file, run 'systemctl daemon-reload' to update systemd# units generated from this file.#/dev/mapper/cl-root / xfs defaults0 0UUID=bad13599-75bd-432a-858f-70d1d934b4a0 /boot xfs defaults0 0UUID=779D-39C8/boot/efi vfatumask=0077,shortname=winnt 0 2/dev/mapper/cl-home /home xfs defaults0 0/dev/mapper/cl-swap noneswapdefaults0 0/media/CentOS-8.5.2111-x86_64-dvd1.iso /mnt/centos85 iso9660 auto,ro 0 0[root@centos85 ~]#