如何制作软件仓库
某些情况下在没有外网的环境需要安装一些软件,但是软件依赖比较多,那么可以提前将所有依赖下载到本地,然后将他们制作成一个yum repo,安装的时候就会自动将依赖包都安装好。
centos下是 yum 仓库,Debian、ubuntu下是apt仓库,我们先讲 yum 仓库的制作,Debian apt 仓库类似
收集所有rpm包
创建一个文件夹,比如 Yum,将收集到的所有rpm包放在里面,比如安装ansible和docker需要的依赖文件:
1 | -rwxr-xr-x 1 root root 73K 7月 12 14:22 audit-libs-python-2.8.4-4.el7.x86_64.rpm |
收集方法:
1 | //先安装yum工具 |
创建仓库索引
需要安装工具 yum install createrepo -y:
1 | # createrepo ./public_yum/ |
会在yum文件夹下生成一个索引文件夹 repodata
1 | drwxr-xr-x 2 root root 4.0K 7月 12 14:25 repodata |
生成iso镜像文件
非必要步骤,如果需要带到客户环境可以先生成iso,不过不够灵活。
也可以不用生成iso,直接在drds.repo中指定 createrepo 的目录也可以,记得要先执行 yum clean all和yum update
1 | #mkisofs -r -o docker_ansible.iso ./yum/ |
将 生成的 iso挂载到目标机器上
1 | # mkdir /mnt/iso |
配置本地 yum 源
yum repository不是必须要求iso挂载,直接指向rpm文件夹(必须要有 createrepo 建立索引了)也可以
1 | # cat /etc/yum.repos.d/drds.repo |
到此就可以在没有网络环境的机器上直接:yum install ansible docker -y 了
yum 仓库代理
如果需要代理可以在docker.repo 最后添加:
1 | proxy=socks5://127.0.0.1:12345 //socks代理 或者 proxy=http://ip:port |
如果要给全局配置代理,则在 /etc/yum.conf 最后添加如上行
测试
测试的话可以指定repo 源: yum install ansible –enablerepo=drds (drds 优先级最高)
本地会cache一些rpm的版本信息,可以执行 yum clean all 得到一个干净的测试环境
1 | yum clean all |
yum 源问题处理
Yum commands error “pycurl.so: undefined symbol”
xargs 作用
xargs
命令的作用,是将标准输入转为命令行参数。因为有些命令是不接受标准输入的,比如echo
xargs
的作用在于,大多数命令(比如rm
、mkdir
、ls
)与管道一起使用时,都需要xargs
将标准输入转为命令行参数。
dnf 使用
DNF 是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近,它取代了yum,正式成为 Fedora 22 的包管理器。
DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF 。你可以在这里获得关于 DNF 的更多知识:《 DNF 代替 YUM ,你所不知道的缘由》
DNF 包管理器作为 YUM 包管理器的升级替代品,它能自动完成更多的操作。但在我看来,正因如此,所以 DNF 包管理器不会太受那些经验老道的 Linux 系统管理者的欢迎。举例如下:
- 在 DNF 中没有 –skip-broken 命令,并且没有替代命令供选择。
- 在 DNF 中没有判断哪个包提供了指定依赖的 resolvedep 命令。
- 在 DNF 中没有用来列出某个软件依赖包的 deplist 命令。
- 当你在 DNF 中排除了某个软件库,那么该操作将会影响到你之后所有的操作,不像在 YUM 下那样,你的排除操作只会咋升级和安装软件时才起作用。
安装yum源
安装7.70版本curl yum源
1 | rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-2-1.rhel7.noarch.rpm |
其它技巧
rpm依赖查询
1 | rpm -q --whatprovides file-name //查询一个文件来自哪个rpm包 |
多版本问题
1 | //查看protobuf 的多个版本 |
制作debian 仓库
适合ubuntu、deepin、uos等, 参考:https://lework.github.io/2021/04/03/debian-kubeadm-install/
1 | #添加新仓库 |
apt-mirror
先要安装apt-mirror 工具,安装后会生成配置文件 /etc/apt/mirror.list 然后需要手工修改配置文件:
1 | #cat /etc/apt/mirror.list |
debian仓库介绍
一个Debian仓库包含多个发行版。Debian 的发行版是以 “玩具总动员 “电影中的角色命名的 (wheezy, jessie, stretch, …)。 代号有别名,叫做套件(stable, oldstable, testing, unstable)。一个发行版会被分成几个组件。在 Debian 中,这些组件被命名为 main
, contrib
, 和 non-free
,并表并表示它们所包含的软件的授权条款。一个版本也有各种架构(amd64, i386, mips, powerpc, s390x, …)的软件包,以及源码和架构独立的软件包。
仓库的根目录下有一个dists
目录,而这个目录又有每个发行版和套件的目录,后者通常是前者的符号链接,但浏览器不会向您显示出这个区别。每个发行版子目录都包含一个加密签名的Release
文件和每个组件的目录,里面是不同架构的目录,名为binary
-*<架构>*和sources
。而在这些文件中,Packages
是文本文件,包含了软件包。嗯,那么实际的软件包在哪里?
软件包本身在仓库根目录下的pool
。在pool
下面又有所有组件的目录,其中有0
,…,9
,a
,b
,.., z
, liba
, … , libz
。 而在这些目录中,是以它们所包含的软件包命名的目录,这些目录最后包含实际的软件包,即.deb
文件。这个名字不一定是软件包本身的名字,例如,软件包bsdutils在目录pool/main/u/util-linux
下,它是生成软件包的源码的名称。一个上游源可能会生成多个二进制软件包,而所有这些软件包最终都会在pool
下面的同一个子目录中。额外的单字母目录只是一个技巧,以避免在一个目录中有太多的条目,因为这是很多系统传统上存在性能问题的原因。
在pool
下面的子目录中,通常会有多个版本的软件包,而每个版本的软件包属于什么发行版的信息只存在于索引中。这样一来,同一个版本的包可软件以属于多个发行版,但只使用一次磁盘空间,而且不需要求助于硬链接或符号链接,所以镜像相当简单,甚至可以在没有这些概念的系统中进行。
常用命令
1 | apt install kubeadm=1.20.12-00 //指定版本安装 |
简单仓库
下载所有 deb 包以及他们的依赖
1 | apt download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances kubeadm | grep "^\w" | sort -u) |
到deb 包所在的目录下生成 index
1 | dpkg-scanpackages -m . > Packages |
/etc/apt/source.list 指向这个目录
1 | deb [trusted=yes] file:/polarx/test / |
验证:
1 | apt update //看是否能拉取你刚配置的仓库 |
Kubernetes 仓库
debian 上通过kubeadm 安装 kubernetes 集群
1 | //官方 |
docker 仓库
1 | apt-get install -y apt-transport-https ca-certificates curl gnupg2 lsb-release bash-completion |
锁定已安装版本
1 | //锁定这三个软件的版本,避免意外升级导致版本错误: |