内网环境下搭建Nexus混合源仓库(yum源和apt源)

记录一下搭建Nexus混合源仓库的操作流程。通过Nexus搭建一个混合源仓库(如可配置x86架构和arm64架构的yum源、x86架构和arm64架构的apt源等多种仓库)。在内网环境下,只需要在服务器端配置好混合源仓库,那么客户端需要哪种架构哪种类型的包,将其软件源地址指向Nexus私服即可。

安装部署环境:

角色 系统 环境 IP
服务器端 Centos 7.5 可联网/离线环境 192.168.79.101
客户端1 Centos 7.5 离线环境 192.168.79.103
客户端2 Ubuntu 20.04 离线环境 192.168.79.110


前言

  • Linux系统的软件基本是通过yum/apt两种方式从软件仓库下载安装,如CentOS/RedHat系统使用yum源仓库,Ubuntu系统使用apt源仓库。但是在内网环境或者访问互联网速度受限情况下安装linux软件很不方便,如何在一个离线环境中快速的安装我们所需要的软件包?是否能够快速制作一个包含各种架构的yum源和apt源的 All-in One 仓库?一个解决方案是通过Nexus搭建yum源和apt源的混合仓库。
  • Nexus 是一个全能的仓储管理工具,它能解决有关软件包的一系列问题。Nexus目前提供两个版本,Nexus2和Nexus3。Nexus2主要管理maven,而Nexus3支持maven、docker、npm、yum、apt等多种仓库的配置。
  • 在内网环境中,可以在一台机器上安装Nexus软件作为服务器端,在Nexus上搭建多个yum源仓库,有的仓库放置x86架构的yum源,有的仓库放置amd64的yum源,有的仓库放置arm64架构的yum源等等。可以按需要创建多种多个yum仓库,然后上传完整的软件安装包和依赖包到对应的仓库中,那么客户端机器需要哪种架构哪种类型的包,将其软件源地址指向Nexus中对应的yum源仓库即可。同样的,apt源仓库也能如此配置。通过这样一个Nexus私服,就能够较好的解决内网环境中Linux系统安装软件问题。

一、Nexus部署

1.1 软件包说明

  • 注意这里Nexus安装在Centos7.5系统上,所以服务器端软件都是x86架构的。
  • Nexus安装方式可选择容器化安装或者二进制方式安装。
  • 服务器端最好能够联网,但是如果服务器端是离线环境,对于后面提到的一些必要的软件包,这里提供一些解决方法:
  1. docker安装包:二进制安装包下载地址:
    https://download.docker.com/linux/static/stable/x86_64/
  2. Nexus镜像包:在一台联网环境机器上保存nexus镜像,命令如下:
docker save -o 保存文件命名.tar 要保存的镜像名:版本号
#例:docker save -o nexus.tar nexus:3.38.0
  1. jdk1.8安装包:官网下载jdk的tar.gz压缩包文件,地址是:
    https://www.oracle.com/java/technologies/downloads/
  2. Nexus二进制安装包:可以去博客或者官网下载:地址是:
    https://help.sonatype.com/repomanager3/product-information/download
  3. rng-tools的rpm包:在一台联网环境机器上只下载不安装保存rng-tools的rpm包,命令如下:
yum install --downloadonly --downloaddir=保存在本机的地址 要下载的软件
#例:yum install --downloadonly --downloaddir=/root/test rng-tools

1.2 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

建议也关闭selinux,在 /etc/selinux/config中设置 selinux=disabled,或者执行命令:

sed -i 's/enforcing/disabled/' /etc/selinux/config

1.3 容器化安装Nexus

使用容器化安装Nexus需要docker环境。在需要安装Nexus软件的机器上执行docker version,若无环境则该机器需先安装docker。

1.3.1 docker安装部署

  • 联网安装部署
    在联网环境下直接下载docker,这里版本为docker-ce-18.06.0,命令如下:
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce-18.06.0.ce
  • 离线安装部署

如果是离线环境,提前下载好docker软件包拷贝到机器进行安装,参考:Docker离线安装部署

  1. 创建文件夹/opt/docker,将提前下载的docker安装包(这里版本为18.06.0)拷贝到此目录下。

在这里插入图片描述

  1. 在/opt/docker目录下创建系统配置文件docker.service,内容如下:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
  1. 在/opt/docker目录下创建安装脚本install.sh,内容如下:
#!/bin/sh
echo '解压tar包...'
tar -xvf $1
echo '将docker目录移到/usr/bin目录下...'
cp docker/* /usr/bin/
echo '将docker.service 移到/etc/systemd/system/ 目录...'
cp docker.service /etc/systemd/system/
echo '添加文件权限...'
chmod +x /etc/systemd/system/docker.service
echo '重新加载配置文件...'
systemctl daemon-reload
echo '启动docker...'
systemctl start docker
echo '设置开机自启...'
systemctl enable docker.service
echo 'docker安装成功...'
docker -v
  1. 在/opt/docker目录下创建卸载脚本uninstall.sh,内容如下:
#!/bin/sh
echo '删除docker.service...'
rm -f /etc/systemd/system/docker.service
echo '删除docker文件...'
rm -rf /usr/bin/docker*
echo '重新加载配置文件'
systemctl daemon-reload
echo '卸载成功...'
  1. 安装docker软件
  • 安装目录结构如下:

在这里插入图片描述

  • 使用脚本安装docker:
sh install.sh docker-18.06.0-ce.tgz

在这里插入图片描述

1.3.2 导入Nexus镜像

  • 联网环境下直接拉取Nexus镜像
docker pull sonatype/nexus3:3.38.0
#查看是否导入Nexus3.38.0镜像
docker images
  • 离线环境下提前下载好nexus镜像包
  1. 创建文件夹/opt/nexus-data,将nexus镜像包(这里版本为3.38.0)拷贝到此目录下并赋权。
mkdir /opt/nexus-data
chown -R 200 /opt/nexus-data
  1. 加载nexus镜像到本地:
cd /opt/nexus-data/
#解压nexus镜像包:
docker load -i nexus.tar
docker images

在这里插入图片描述

1.3.3 启动Nexus容器

以后台启动方式启动容器,容器命名为nexus,端口号为8081,挂卷目录为:/opt/nexus-data,启动后查看容器运行情况和运行日志。

#启动nexus容器:
docker run -d --name nexus --restart=always -p 192.168.79.101:8081:8081 -v /opt/nexus-data:/nexus-data sonatype/nexus3:3.38.0

#查看nexus是否运行:
docker ps 
#查看nexus运行日志: 
docker logs -f nexus
#查看端口开放情况:
ss -tan

在这里插入图片描述

1.4 二进制方式安装Nexus

二进制方式安装nexus需要jdk1.8支持,因此要求安装的机器中必须要有jdk1.8,若无,则执行以下操作。由于联网安装的方式网上博客众多,下面就不再赘述了,以下是离线环境下的安装操作。

1.4.1 离线安装jdk1.8

  1. 创建文件夹/usr/java,将jdk1.8的软件包(jdk-8u211-linux-x64.tar.gz)拷贝到/usr/java目录下。

在这里插入图片描述

  1. 编写一个jdk安装脚本jdkinstall.sh,文件内容如下:
#!/bin/bash
#卸载环境中存在的jdk版本
for i in $(rpm -qa | grep jdk | grep -v grep)
do
  echo "Deleting rpm -> "$i
  rpm -e --nodeps $i
done

if [[ ! -z $(rpm -qa | grep jdk | grep -v grep) ]];
then
  echo "-->Failed to remove the defult Jdk."
else
  tar -zxvf /usr/java/jdk-8u211-linux-x64.tar.gz -C /usr/java
  #配置环境变量
  if ! grep "JAVA_HOME=/usr/java/jdk1.8.0_211" /etc/profile
  then
      echo "export JAVA_HOME=/usr/java/jdk1.8.0_211" >>/etc/profile
      echo -e 'export PATH=$JAVA_HOME/bin:$PATH'>>/etc/profile
      echo -e 'export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar'>>/etc/profile
      source /etc/profile
  fi
fi
echo "java version:"
java -version  

脚本详细说明:
在这里插入图片描述

  1. 执行jdkinstall脚本安装jdk1.8:
sh jdkinstall.sh

在这里插入图片描述

1.4.2 安装Nexus软件

  1. 创建文件夹/opt/nexus,将nexus的二进制安装包(这里的nexus版本为3.38.0-01)拷贝到机器中并解压到/opt/nexus目录下。
mkdir /opt/nexus
tar xvf nexus-3.38.0-01-unix.tar.gz -C /opt/nexus

在这里插入图片描述

  1. 修改Nexus的启动文件,否则在root用户下启动Nexus会报错。
cd /opt/nexus/nexus-3.38.0-01/bin
vi /opt/nexus/nexus-3.38.0-01/bin/nexus

在这里插入图片描述
修改其中一条配置 run_as_root=false (修改前是true)
在这里插入图片描述

  1. 配置Nexus的环境变量
#编辑环境变量文件:
vi /etc/profile

#在环境变量文件profile最后面加入两条命令:
export NEXUS_HOME=/opt/nexus/nexus-3.38.0-01
export PATH=$PATH:$NEXUS_HOME/bin  

#保存文件后执行以下命令使之生效
source /etc/profile

profile文件末尾应有jdk1.8和nexus的export命令共5条:
在这里插入图片描述

  1. 安装后启动Nexus,其中第一次启动花费时间约2-3分钟,启动命令:
nexus run

成功启动Nexus的运行结果如下:
在这里插入图片描述

  1. 其他常用相关命令:
#在后台启动Nexus服务:
nexus start
#停止后台的Nexus服务 :
nexus stop
#查看后台Nexus服务状态 :
nexus status
#重新启动后台的Nexus服务 :
nexus restart

1.5 浏览器登录Nexus

Nexus默认端口号为8081,在浏览器访问【http://ip:端口号】,例如http://192.168.79.101:8081。点击右上角的 Sign in 登录Nexus。
在这里插入图片描述

  1. 输入用户名和密码。首次登录Nexus的用户名为admin,密码是自动生成,在登录页面会提示密码所在地址(通常容器化安装的密码生成在挂卷目录下,二进制方式安装的密码生成在安装目录下的sonatype-work/nexus3目录下)。在所提示的目录下查看admin.password 文件,以该密码登录即可。注意更改密码后admin.password文件将自动删除。

在这里插入图片描述

  1. 以初始密码登陆Nexus后还需要4个步骤完善配置。首先更改初始密码,如这里是amdin123。
    在这里插入图片描述

  2. 配置匿名访问。启用匿名访问意味着在默认情况下,用户可以在没有凭证的情况下搜索、浏览和下载资源库的组件。此处我们允许匿名访问。

在这里插入图片描述

  1. 完成Nexus初始化配置。可以查看Nexus的查询页面和仓库配置页面。

在这里插入图片描述
在这里插入图片描述

二、Nexus简介

2.1 Nexus工作目录介绍

容器化部署Nexus,存储nexus数据的目录在自定义目录/opt/nexus-data。使用二进制方式部署Nexus,软件包解压后得到 nexus-3.38.0-01 文件夹和 sonatype-work 文件夹。nexus-3.38.0-01文件夹(安装目录)放的是Nexus服务器相关的文件,sonatype-work文件夹(数据目录)放的是Nexus工作的数据文件。Nexus工作目录如下:
在这里插入图片描述

  • 根据官方文档,各目录的作用如下:
  1. blobs:创建blob的默认路径,每个blob拥有一块单独的存储空间。
  2. cache:此目录包含当前缓存的karaf软件包的信息。
  3. db:OrientDB数据库的数据,用于存储Nexus的元数据的数据库。
  4. elasticsearch:此目录包含elasticsearch的当前配置状态。
  5. etc:运行时配置状态和关于资源库的自定义的相关的东西。
  6. keystores:用于识别repository manager自动生成的秘钥。
  7. log:运行实例生成的日志文件,也有日志文件的压缩包。
  8. tmp:用于存储临时文件的目录。

2.2 Nexus页面简介

2.2.1 查询页面

左侧边栏的查询页面包括3个部分,分别是Search、Browse、Upload。
在这里插入图片描述

  1. Search:点击search选项,会发现下面还存在二级菜单。其实就用来查询某个包是否存在某个仓库。

在这里插入图片描述

  1. Browse:在这里能够看到所有的仓库,其中包含Nexus默认创建的和自己创建的仓库。Browse则提供了一种Nexus私服的全局视图,点击仓库进入可查看仓库里的包,也可以上传对应类型的包。

在这里插入图片描述

  1. Upload:顾名思义就是上传包到仓库中,可以选择其中一个比如aptHosted仓库,然后上传文件,但是在浏览器页面只能上传单个本地文件。

在这里插入图片描述

2.2.2 仓库配置页面

在这里能够对各种资源库进行配置管理。主要介绍一些常用的功能。

  1. Repository。点击Respository查看下级选项:

(1)Blob Stores:文件存储的地方,创建一个blob对应文件系统的一个目录,相当于一个分区。
(2)Repositories:创建仓库的地方,仓库分为三种:proxy、hosted、group。

在这里插入图片描述

  1. 其他部分:

在这里插入图片描述

更多关于Nexus的介绍可查看官方文档:https://my.sonatype.com/

2.3 Nexus资源库类型

Nexus的资源库类型有三种:代理资源库proxy、托管资源库hosted、组资源库group。

2.3.1 代理资源库proxy

  • proxy就是配置了官网的远程仓库地址的资源库,本地找不到,就会通过代理资源库中的地址,找到远程仓库,从远程仓库中下载所需要的包。其优势是只要其中一个人从远程仓库下载了,就会缓存到Nexus私服,其他人只需要从Nexus私服上进行下载,可以提高下载速度,节约资源。
  • 创建 Nexus 代理仓库时,除了设置远程仓库的地址和认证信息外,还可以设置以下选项:
  1. Download Remote Indexes:设置下载远程仓库的索引。(下载远程仓库的索引后,即使没有缓存远程仓库的构件,用户依然能搜索或浏览构件的基本信息)。
  2. Checksum Policy:设置校验,出错时是忽略、记录警告信息还是拒绝下载。
  3. Artifact Max Age:设置多久更新一次Artifact(对于策略为 release 的仓库,可以设置为 -1,也就是永不更新)。
  4. Metadata Max Age:设置多久更新一次 metadata 。

2.3.2 托管资源库hosted

  • hosted就是放在本地的资源库的包,可以自己制作包上传到托管资源库,也可以在网上找到所需要的包下载下来,放在托管资源库中,交给Nexus统一管理。hosted有三种方式,Releases(一般是已经发布的)、Snapshot(未发布的版本)、Mixed(混合的)。
  • 创建 Nexus 托管仓库时,默认存放在 sonatype-work/nexus/storage/[repository-id]/ 下,也可以自定义仓库的存储路径。同时可以设置以下选项:
  1. Deployment Policy:只读(禁止部署)、关闭多次部署(同一构件只能部署一次)或允许多次部署。
  2. Allow File Browser:设置是否允许在 Repository 的 Browse Storage 选项卡中浏览仓库。
  3. Include in Search:设置是否对该仓库进行索引并暴露给搜索。
  4. Publish URL:设置是否通过 URL 提供服务,如为 false ,访问该仓库的地址时会得到 404。
  5. Not Found Cache TTL:缓存未找到文件信息的时间。

2.3.3 组资源库group

  • group能把多个仓库合成一个仓库来使用,其实组资源库中并没有包,而是把代理资源库和托管资源库统一配置到组资源库中,然后组资源库作为一个唯一的public提供给所有人使用。
  • 仓库策略分为 release与snapshot,一般用在proxy仓库和 hosted仓库,分别表示发布版和快照版。而仓库组没有 Release 和 Snapshot 的区别,创建时会让用户选择由哪些宿主仓库或代理仓库构成。仓库组所包含的仓库的顺序决定了仓库组遍历它们的次序,所以最好将常用的仓库放在前面。

2.4 其他介绍

以常用的yum源仓库举例,Nexus3支持三种类型yum源仓库:hosted类型的yum仓库、proxy类型的yum仓库、group类型的yum仓库。
在这里插入图片描述
再查看仓库创建页面,Nexus3还支持两种类型的apt源仓库,支持三种类型的docker仓库、三种类型的maven仓库等等…
在这里插入图片描述

三、搭建yum源仓库

这里主要考虑在内网环境中,所以搭建hosted类型的yum源仓库,需要上传rpm包到yum源仓库,客户端通过yum方式安装软件。可以搭建多个hosted类型的yum源仓库,分门别类存放不同架构的rpm包,然后不同系统的客户端的软件源指向相对应架构的yum源仓库即可。

3.1 创建blob存储

在这里插入图片描述

  1. blob类型为file,自定义命名,如这里是yum,命名后Nexus自动生成路径Path,这里用默认存储路径即可。Soft Quota意为blob存储超过约束条件时,会发出警报,这里不勾选。

在这里插入图片描述

  1. 创建成功后此页面可以看到有两个存储空间,一个是系统默认生成的(default),一个是我们创建的(yum)。

在这里插入图片描述

3.2 创建yum源仓库

选择Repositories–Create repository。
在这里插入图片描述

3.2.1 选择yum(hosted)

选择最下面的仓库类型:
在这里插入图片描述

3.2.2 配置yumHosted仓库

在这里插入图片描述

  • 仓库配置填写说明:
  1. Name:自定义一个名称,创建后无法重命名,注意命名。这里是yumHosted。
  2. online:存储库接是否受传入的请求。默认勾选,允许向此仓库推入rpm包。
  3. Repodata Depth:指定创建repodata文件夹的存储库深度,这里建议选择0。
  4. Layout Policy:验证所有路径都是rpm或yum元数据,这里默认strict。
  5. Blob store:我们下拉选择前面创建好的专用blob:yum。
  6. Strict Content Type Validation:默认勾选,验证所有路径都是rpm或yum元数据。
  7. Deployment policy:控制是否允许对工件进行部署和更新。默认是Disable redeploy,这里选择Allow redeploy。
  8. 点击最下面Creat repository 完成仓库创建。

在这里插入图片描述

3.2.3 完成yumHosted仓库的搭建

在仓库配置页面可以看到刚刚创建的yumHosted仓库。点击该仓库,查看该仓库的详细配置。重点需要关注的是该仓库的地址url(后续上传包的脚本、客户端软件源的配置中都需要使用到这个地址)。
在这里插入图片描述
这里yumHosted的地址是:http://192.168.79.101:8081/repository/yumHosted/。
在这里插入图片描述
到这里一个Hosted类型的yum源仓库已经配置完成,客户端只需要把获取软件软件源的地址指向这个仓库即可。

3.3 客户端配置

客户端机器在内网环境中,将其yum源地址指向Nexus的yumHosted仓库。

#备份原来的配置文件到repoBackup文件夹中
cd /etc/yum.repos.d
mkdir repoBackup
mv *.repo repoBackup/

#创建新配置文件nexus.repo并进行编辑
vi /etc/yum.repos.d/nexus.repo

3.3.1 修改配置文件

nexus.repo文件内容如下:

[nexus]
name=Nexus Yum Repository
baseurl=http://192.168.79.101:8081/repository/yumHosted/
enabled=1
gpgcheck=0
  • 配置文件说明:
  1. [nexus]:容器名称,一定要放在[]中
  2. name:自定义仓库名称
  3. baseurl:挂载的Nexus仓库地址
  4. enabled:是否启用yum源:0为不启用,1为启用
  5. gpgcheck:是否检查GPG-KEY:0为不检查,1为检查

3.3.2 重新加载yum源

#清理yum缓存:
yum clean all
#建立元数据缓存:
yum makecache
#查看资源库文件:
yum list

如图所示:
在这里插入图片描述

3.3.3 离线安装软件

通过yum list可以查看到资源库中的所有文件,分别为软件名\版本号\信息。其中第三列信息中带@是已经安装的,base是linux自带的软件包,而nexus则是在Nexus上配置的yum源仓库中可安装的软件包。上传软件全部的安装包和依赖包到Nexus的hosted类型的yum仓库中,此时可以通过yum install 安装yum源仓库中的软件,客户端配置完成。
在这里插入图片描述

四、搭建apt源仓库

这里主要考虑在内网环境下,所以搭建hosted类型的apt源仓库,需要上传deb包到apt源仓库,客户端通过apt-get方式安装软件。可以搭建多个hosted类型的apt源仓库,分门别类存放不同架构的deb包,然后不同系统的客户端的软件源指向相对应架构的apt源仓库即可。

4.1 创建blob存储

自定义命名,如这里是创建一个名为apt的blob存储区:
在这里插入图片描述

4.2 生成pgp密钥对

根据官方文档,创建apt的hosted类型仓库时需要生成 PGP 签名密钥对或使用现有密钥对。即在Nexus上创建apt(hosted)仓库需要添加私钥,在配置客户端apt源地址时需要添加公钥。所以需要提前在服务器端(安装Nexus的机器)生成公钥和私钥。

4.2.1 生成密钥对

通常linux系统自带有pgp软件,若无法生成密钥对,离线环境下需要提前下载好软件包和依赖包进行安装。

gpg --gen-key
  • 注意选择如下:
  1. 密钥种类选择RSA:1
  2. 密钥长度:2048
  3. 密钥永不过期:0
  4. 用户标识:(姓名、电子邮件、注释)方便识别即可
  5. 密钥保护:该密码是私钥的保护密码,需牢记
  6. 密钥生成成功

在这里插入图片描述
完成以上步骤后,系统要求设定一个私钥的密码。这是为了防止误操作,或者系统被侵入时有人擅自动用私钥。这个密码是我们需要记住的。
在这里插入图片描述

通常在一分钟内就能够生成密钥对,但是在有些系统中生成密钥对可能会出现以下问题卡住,原因是是生成密钥时依赖系统的/dev/urandom随机数,而此文件中的随机数的生成依赖于系统的中断(根据中断频率产生随机数),随机数不足,所以无法正常生成密钥。
在这里插入图片描述
若出现该问题,解决方法有两种,一种是按提示所说,随机敲打键盘输入足够多的随机数,需要等待较长一段时间。第二种则需要提前安装rng-tools软件:
(1)不中断操作,另开一个终端窗口。
(2)将提前准备好rng-tools安装包(rng-tools-6.3.1-5.el7.x86_64.rpm)上传到Nexus的一个仓库中,即这台机器既是服务器端又是客户端,配置好软件源指向Nexus仓库即可安装rng-tools::

yum -y install rng-tools

(3)执行:

rngd -r /dev/urandom

(4)将随机文件random删除掉,建立一个random的软链接,源地址为urandom:

mv /dev/random /dev/random.bak
ln -s /dev/urandom /dev/random

如图所示:
在这里插入图片描述
(5)返回原来的终端,查看发现已成功生成gpg密钥对。
在这里插入图片描述

4.2.2 打印密钥信息

这一步主要是为了验证机器已经生成了gpg密钥对。执行以下命令:

gpg --list-keys

在这里插入图片描述

4.2.3 导出并查看公钥

#公钥文件nexus_pub.asc在当前目录下生成
gpg -a -o nexus_pub.asc --export nexus         

在这里插入图片描述

4.2.4 导出并查看私钥

#私钥文件nexus_pri.asc在当前目录下生成
gpg -a -o nexus_pri.asc --export-secret-key nexus            

在这里插入图片描述

拓展

  1. Centos系统机器公钥存放地址:/etc/pki/rpm-gpg/
cd /etc/pki/rpm-gpg/
ls
#指定一个公钥:
rpm --import +公钥所在目录地址
  1. Ubuntu系统机器的公钥的存放位置默认在 /home/ubuntu/.ssh

4.3 创建apt源仓库

4.3.1 选择apt(hosted)

在这里插入图片描述

4.3.2 配置aptHosted仓库

在这里插入图片描述

  • 仓库配置填写说明:
  1. Name:自定义一个名称,创建后无法重命名,注意命名。这里是aptHosted。
  2. online:存储库是否接受传入的请求。默认勾选,允许向此仓库推入deb包。
  3. Distribution:系统版本标识。这里系统为Ubuntu 20.04,版本代号为focal。
  4. Signing Key:添加之前服务器端生成的pgp私钥。
  5. Passphrase:填写pgp私钥的保护密码。
  6. Blob store:我们下拉选择前面创建好的专用存储区apt。
  7. Strict Content Type Validation:默认勾选,验证所有路径都是deb或apt元数据。
  8. Deployment policy:部署策略,控制对是否允许工件进行部署和更新,下拉选择Allow redeploy(允许重新部署)。
  9. 点击Create repository创建仓库

在这里插入图片描述
在这里插入图片描述
注意:不同版本的Ubuntu对应不同的版本代号,这里主要关注ubuntu长期支持版代号如:focal、bionic、xenial。
在这里插入图片描述

4.3.3 完成aptHosted仓库的搭建

在这里插入图片描述
在仓库配置页面可以看到刚刚创建的aptHosted仓库。点击该仓库,查看仓库的详细配置。重点需要关注的是该仓库的地址url(后续上传包的脚本、客户端软件源的配置中都需要使用到这个地址)。这里aptHosted的仓库地址是:http://192.168.79.101:8081/repository/aptHosted/。
在这里插入图片描述
此时一个Hosted类型的apt源仓库已经配置完成,只需在客户端把获取软件软件源的地址指向这个仓库即可。

4.4 客户端配置

客户端机器在内网环境中,将其apt源地址指向Nexus的aptHosted仓库。

4.4.1 拷贝公钥到客户端机器

将前面服务器端(安装Nexus的机器)生成的公钥文件(nexus_pub.asc)拷贝到此客户端机器的某个目录下。这里是放在/etc/apt/trusted.gpg.d 文件夹下,绝对路径为:/etc/apt/trusted.gpg.d/nexus_pub.asc。
在这里插入图片描述

4.4.2 修改配置文件

将客户端机器的apt源地址指向Nexus的aptHosted仓库地址,编辑apt源配置文件/etc/apt/sources.list,内容如下:

deb	[arch=amd64	signed-by=/etc/apt/trusted.gpg.d/nexus_pub.asc] http://192.168.79.101:8081/repository/aptHosted focal main         
  • 配置文件说明:
  1. arch=架构类型(可不加,但是会提示不支持 ‘i386’ 体系结构)
  2. signed-by=公钥在此机器的绝对路径
  3. 将apt源地址指向Nexus的aptHosted仓库地址
  4. focal为Ubuntu版本代号

在这里插入图片描述

4.4.3 更新存储索引

安装软件时通过metadata/dists/focal/main 索引找到软件安装包进行安装。
在这里插入图片描述

#清理原缓存
apt-get clean
#更新apt源
apt-get update        

在这里插入图片描述

4.4.3 离线安装软件

此时客户端在离线环境下可以对aptHosted仓库中的软件包进行安装,客户端配置完成。

apt-get -y install xxx        

五、文件上传到仓库

5.1 单个文件上传

在浏览器页面上传文件到仓库有两种方式:

  1. Browse–选择仓库–上传文件
  2. Upload–选择仓库–上传文件
  1. 在查询页面点击Browse,选择要上传的仓库,进入仓库后此时仓库内没有任何文件,通过Upload component 即可上传本地文件。

在这里插入图片描述
在这里插入图片描述

  1. 在查询页面点击Upload,选择要上传的仓库上传本地文件。

在这里插入图片描述

  1. 上传界面如下:

在这里插入图片描述

  1. 注意如果上传相同名字的文件,后者会覆盖前者。另外根据官方文档,在浏览器界面只能上传单个文件,yum的hosted类型仓库只能上传.rpm和.drpm 类型的文件,apt的hosted类型仓库只能上传.deb和.udeb类型的文件。

在这里插入图片描述

5.2 多文件上传

因为在浏览器界面只能上传单个文件,因此如果要上传多个rpm或者deb类型的文件,应提前把所有需要上传的所有包放到服务器端的某个目录下。

5.2.1 创建上传脚本

  1. 进入待上传文件所在目录,创建一个upload.sh 脚本并赋权:
#创建脚本:
touch upload.sh
#赋权:
chmod 777 upload.sh
#编辑文件:
vi upload.sh       
  1. upload.sh脚本内容如下:
#!/bin/bash
type=$1
url=$2

if [ $type == "rpm" ]
then
  echo $(date) "正在上传rpm包..."
  find . -name "*.rpm" -exec curl -v -u "admin:admin123" --upload-file {
    
    } $url/Packages/{
    
    } \;
  echo $(date) "rpm包上传完成"

elif [ $type == "deb" ]
then
  echo $(date) "正在上传deb包..."
  find . -name "*.deb" -exec curl -v -u "admin:admin123" -X POST -H "Content-Type: multipart/form-data" --data-binary "@{}" $url/ \;
  echo $(date) "deb包上传完成"
fi
  • 注意脚本支持上传rpm和deb两种类型文件。其中参数 -v 是显示详细的上传过程信息(可省略),参数 -u 后是Nexus的用户名和密码。
  • 脚本执行命令为:./upload.sh + 文件类型 + 上传仓库地址。

5.2.2 上传多个rpm文件

  1. 如图所示 /root/test/rpm 文件夹下有6个rpm文件,将rpm包上传到yum_uploadtest仓库中。执行upload.sh脚本:
./upload.sh rpm http://192.168.79.103:8081/repository/yum_uploadtest/

在这里插入图片描述

  1. 回到浏览器查看,本地的6个rpm包已经上传到yum_uploadtest仓库的Packages目录下了。

在这里插入图片描述

  1. 如果文件数量较多,上传时间比较久。上传成功后通常一分钟内能够自动生成索引,刷新Nexus界面后repodata文件夹自动生成。

在这里插入图片描述

5.2.3 上传多个deb文件

  1. 如图所示 /root/test/deb 目录下有8个deb文件,将deb包上传到apt_uploadtest仓库中。执行upload.sh脚本:
./upload.sh deb http://192.168.79.103:8081/repository/apt_uploadtest/

  1. 回到浏览器查看,本地的8个deb包已经上传到apt_uploadtest仓库的packages目录下了。

在这里插入图片描述

  1. deb文件上传到Nexus仓库后会自动按文件首字母排列好仓库内的文件。

在这里插入图片描述

六、拓展:x86、x64、arm64架构安装包的区别

6.1 x86架构

X86追求性能最优,缺点是功耗大,不节能(和arm架构对比)

  1. x86和x64
    x86、x64基于intel处理的编译指令集,x86是指32位处理器、x64是指64位处理器,因为x64指令是在x86指令集上扩展出来的,所以x86编译出来的程序可以在64位处理器上运行,反过来就不行。

  2. x64和amd64
    这个有点历史渊源,一开始interl和amd都是x86架构,后来intel和amd都开始研发各自的64位处理器指令集,intel选择开辟新的指令集,amd则选择在x86上扩展。后来证明intel方案失败了,最终intel也采用amd64指令标准,做了稍微的修改,所以有了x64和amd64。

6.2 arm架构

arm架构追求低功耗(节能),缺点是采用精简指令集,导致编译器处理复杂,因此性能相对X86架构的差。

和x86架构不同,arm架构是另一种处理器指令即RISC指令集处理器架构,一般IOS系统在用。

  1. 32位处理器需要armv7,或者armv7s架构
  2. 64位处理器需要arm64架构

七、参考资料

内网自建yum源和apt源(含各信创系统)
CentOS7.x上用nexus搭建yum私有仓库
centos GPG简单使用
官方创建apt仓库说明文档

猜你喜欢

转载自blog.csdn.net/qq_44214446/article/details/128272077