简单介绍
使用系统版本:
[root@localhost ~]# uname -a Linux localhost 5.14.0-427.13.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Wed May 1 19:11:28 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux [root@localhost ~]# cat /etc/os-release NAME="Rocky Linux" VERSION="9.4 (Blue Onyx)" ID="rocky" ID_LIKE="rhel centos fedora" VERSION_ID="9.4" PLATFORM_ID="platform:el9" PRETTY_NAME="Rocky Linux 9.4 (Blue Onyx)" ANSI_COLOR="0;32" LOGO="fedora-logo-icon" CPE_NAME="cpe:/o:rocky:rocky:9::baseos" HOME_URL="https://rockylinux.org/" BUG_REPORT_URL="https://bugs.rockylinux.org/" SUPPORT_END="2032-05-31" ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9" ROCKY_SUPPORT_PRODUCT_VERSION="9.4" REDHAT_SUPPORT_PRODUCT="Rocky Linux" REDHAT_SUPPORT_PRODUCT_VERSION="9.4"
复制
在rocky中,包缓存目录和元数据目录都在 /var/cache/dnf/ 这个目录中。
元数据:
- 元数据文件(如
.solvx
和.solv
文件)包含有关软件包的信息,例如包名、版本、描述、依赖关系等。这些文件用于dnf
在安装或更新软件包时解析和处理仓库中的信息。
软件包:
- 软件包的缓存通常存储在以仓库 ID 命名的目录下,这些目录中的文件是实际下载的软件包文件。这些缓存可以在安装或更新时重复使用,以避免重新从网络下载。
进入到某个软件包目录中,会看到这样两个目录
packages
目录是用于存储实际的.rpm
软件包文件。如果该目录为空,可能是因为没有缓存的包。repodata
目录包含仓库的元数据文件,帮助dnf
处理和解析仓库中的软件包信息。
开启缓存参数
检查和配置 /etc/yum.conf
文件
打开 /etc/yum.conf
文件,检查并配置以下参数:
keepcache
-
功能:
keepcache
控制是否保留缓存文件。 -
配置文件:设置在
/etc/yum.conf
或/etc/dnf/dnf.conf
中。 -
取值:
keepcache=1
:保留缓存,即使软件包安装或更新后缓存不会被删除。这样可以在以后重新安装或更新时使用缓存文件,减少网络流量和下载时间。keepcache=0
:不保留缓存,安装或更新完成后缓存文件会被删除。
[main] keepcache=1
复制
注意:这个文件有系统默认的参数,加缓存配置时,直接在最后加入即可,其他参数不用修改删除。
自定义缓存包
假如遇到这样的工作场景,需要下载的包多,依赖包关系复杂,如何将下载的这些包和依赖都指定到我定义的一个目录中,方便迁移在网络不好的环境使用?
使用yum download --destdir <保存目录> --resolve <包名>
--resolve
选项使 dnf
解析并下载所有依赖项。
示例代码:
yum download --destdir /data --resolve httpd
复制
但是对于一些复杂的关键包,依赖复杂的并不一定完全都缓存下来,可能仍需手动缓存个别包
#!/bin/bash # 提示用户输入保存的目录 read -p "请输入保存的目录(例如 /data): " DEST_DIR # 创建保存目录(如果不存在) mkdir -p "$DEST_DIR" # 提示用户输入要下载的包 read -p "请输入要下载的包(用空格分隔): " -a PACKAGES # 遍历用户输入的包 for pkg in "${PACKAGES[@]}"; do echo "获取 $pkg 的依赖包..." # 使用 repoquery 获取依赖 DEPS=$(repoquery --requires --resolve --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}' "$pkg") # 包含自身的包名 DEPS="$pkg $DEPS" # 遍历依赖包并下载 for dep in $DEPS; do echo "下载包及其依赖: $dep" yumdownloader --destdir="$DEST_DIR" --resolve "$dep" done done echo "所有包及其依赖已下载到目录 $DEST_DIR"
复制