执行K8s-Offline-Setup.sh脚本报错usage: dnf download [-c [config file]] [-q] [-v] [--version] [--installroot [path]] [--nodocs] [--noplugins] [--enableplugin [plugin]] [--disableplugin [plugin]] [--releasever RELEASEVER] [--setopt SETOPTS] [--skip-broken] [-h] [--allowerasing] [-b | --nobest] [-C] [-R [minutes]] [-d [debug level]] [--debugsolver] [--showduplicates] [-e ERRORLEVEL] [--obsoletes] [--rpmverbosity [debug level name]] [-y] [--assumeno] [--enablerepo [repo]] [--disablerepo [repo] | --repo [repo]] [--enable | --disable] [-x [package]] [--disableexcludes [repo]] [--repofrompath [repo,path]] [--noautoremove] [--nogpgcheck] [--color COLOR] [--refresh] [-4] [-6] [--destdir DESTDIR] [--downloadonly] [--comment COMMENT] [--bugfix] [--enhancement] [--newpackage] [--security] [--advisory ADVISORY] [--bz BUGZILLA] [--cve CVES] [--sec-severity {Critical,Important,Moderate,Low}] [--forcearch ARCH] [--source] [--debuginfo] [--debugsource] [--arch [arch]] [--resolve] [--alldeps] [--url] [--urlprotocols {http,https,rsync,ftp}] packages [packages ...] dnf download: error: unrecognized arguments: --download_path=rpms/ 上次元数据过期检查:2:20:18 前,执行于 2025年07月24日 星期四 06时20分39秒。 (1/8): ebtables-2.0.11-2.ky10.x86_64.rpm 131 kB/s | 79 kB 00:00 (2/8): socat-1.7.3.2-9.ky10.x86_64.rpm 211 kB/s | 154 kB 00:00 (3/8): conntrack-tools-1.4.6-2.ky10.x86_64.rpm 222 kB/s | 165 kB 00:00 (4/8): iptables-1.8.5-2.ky10.x86_64.rpm 433 kB/s | 73 kB 00:00 (5/8): ethtool-5.4-2.ky10.x86_64.rpm 428 kB/s | 130 kB 00:00 (6/8): ipset-7.6-0.p01.ky10.x86_64.rpm 314 kB/s | 68 kB 00:00 (7/8): chrony-3.5-3.p01.ky10.x86_64.rpm 957 kB/s | 166 kB 00:00 (8/8): nfs-utils-2.5.1-3.p05.ky10.x86_64.rpm 1.3 MB/s | 319 kB 00:00 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 curl: (35) OpenSSL SSL_connect: 连接被对方重设 in connection to download.docker.com:443 mv: 无法获取'docker-ce-*.rpm' 的文件状态(stat): 没有那个文件或目录
时间: 2025-07-24 16:25:17 浏览: 4
<think>问题分析:
1. 第一个错误:`dnf download`命令使用了`--download_path`参数,但实际参数应为`--destdir`。
2. 第二个错误:下载docker-ce时出现连接重置,可能是网络问题,但因为是离线安装,所以应该提前下载好所有依赖。这里需要确保在联网机器上下载docker-ce包,并放入rpms目录。
3. 第三个错误:由于curl下载失败,导致没有docker-ce的rpm文件,因此mv命令失败。
解决方案:
1. 将`repotrack`命令替换为使用`dnf download`,并修正参数为`--destdir`。
2. 对于docker-ce的下载,使用更稳定的下载源,或者提供多个镜像源。同时,在下载失败时应该给出错误提示并退出脚本,避免后续mv失败。
3. 增加错误处理机制,确保每一步的失败都能被捕获。
修改后的依赖下载步骤:
注意:以下步骤在联网机器上执行,用于准备离线安装包。</think>### 解决银河麒麟离线安装Kubernetes脚本报错问题
#### 问题分析:
1. `dnf download` 命令在银河麒麟系统中不支持 `--download_path` 参数(这是 `repotrack` 的参数)
2. Docker CE RPM 下载失败(网络问题)
3. 缺少错误处理机制导致后续命令失败
#### 修复方案:
##### 1. 修复 RPM 下载命令(使用兼容银河麒麟的下载方式)
```bash
#!/bin/bash
# 修复后的依赖下载脚本:download-deps.sh
OFFLINE_DIR="/opt/k8s-offline"
mkdir -p ${OFFLINE_DIR}/{rpms,images,tools}
# 下载Kubernetes核心组件
for pkg in kubelet kubeadm kubectl cri-o cri-tools containerd.io kubernetes-cni; do
dnf download --destdir=${OFFLINE_DIR}/rpms/ --resolve --alldeps ${pkg}-1.31.0
done
# 下载系统依赖
DEPS=(
socat conntrack-tools ebtables ethtool
ipset iptables nfs-utils chrony
)
for dep in "${DEPS[@]}"; do
dnf download --destdir=${OFFLINE_DIR}/rpms/ --resolve ${dep}
done
# 使用国内镜像下载Docker CE
DOCKER_URL="https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages"
DOCKER_RPM="docker-ce-24.0.7-1.el7.x86_64.rpm"
if ! wget -P ${OFFLINE_DIR}/rpms/ ${DOCKER_URL}/${DOCKER_RPM}; then
echo "[ERROR] Docker CE下载失败,请手动下载并放入 ${OFFLINE_DIR}/rpms/"
echo "备用下载源:"
echo "1. https://download.docker.com/linux/centos/7/x86_64/stable/Packages/${DOCKER_RPM}"
echo "2. https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/${DOCKER_RPM}"
exit 1
fi
```
##### 2. 增强本地仓库创建脚本(增加错误处理)
```bash
#!/bin/bash
# 修复后的仓库创建脚本:create_repo.sh
REPO_DIR="/opt/k8s-offline/repo"
RPM_DIR="/opt/k8s-offline/rpms"
# 检查RPM目录是否存在
if [ ! -d "$RPM_DIR" ]; then
echo "[ERROR] RPM目录不存在: $RPM_DIR"
exit 1
fi
# 创建仓库目录
mkdir -p $REPO_DIR || {
echo "[ERROR] 无法创建仓库目录: $REPO_DIR"
exit 1
}
# 复制RPM文件
if ! cp ${RPM_DIR}/*.rpm $REPO_DIR/; then
echo "[ERROR] 复制RPM文件失败"
exit 1
fi
# 检查是否安装了createrepo
if ! command -v createrepo &> /dev/null; then
echo "[INFO] 安装createrepo工具..."
dnf install -y createrepo || {
echo "[ERROR] 无法安装createrepo"
exit 1
}
fi
# 生成仓库元数据
createrepo $REPO_DIR || {
echo "[ERROR] 创建仓库元数据失败"
exit 1
}
# 创建仓库配置文件
cat > /etc/yum.repos.d/k8s-offline.repo <<EOF
[k8s-offline]
name=Kylin Kubernetes Offline Repository
baseurl=file://$REPO_DIR
enabled=1
gpgcheck=0
priority=1
EOF
echo "[SUCCESS] 本地仓库创建完成"
```
##### 3. 主安装脚本增强(增加预检和错误处理)
```bash
#!/bin/bash
# 修复后的主安装脚本:k8s-offline-setup.sh
# ... [头部不变] ...
# === 新增预检函数 ===
preflight_check() {
# 1. 检查关键目录
local required_dirs=("$OFFLINE_DIR/rpms" "$OFFLINE_DIR/images" "$OFFLINE_DIR/tools")
for dir in "${required_dirs[@]}"; do
if [ ! -d "$dir" ]; then
echo "[PREFLIGHT] 缺失目录: $dir"
return 1
fi
done
# 2. 检查核心RPM包
local required_rpms=(
"kubelet-1.31*" "kubeadm-1.31*" "kubectl-1.31*"
"containerd*" "cri-o*" "docker-ce*"
)
for rpm in "${required_rpms[@]}"; do
if [ -z "$(ls $OFFLINE_DIR/rpms/$rpm 2>/dev/null)" ]; then
echo "[PREFLIGHT] 缺失RPM包: $rpm"
return 1
fi
done
# 3. 检查核心镜像
local required_images=(
"kube-apiserver-v1.31*" "kube-controller-manager-v1.31*"
"kube-scheduler-v1.31*" "kube-proxy-v1.31*"
)
for img in "${required_images[@]}"; do
if [ -z "$(ls $OFFLINE_DIR/images/$img 2>/dev/null)" ]; then
echo "[PREFLIGHT] 缺失镜像: $img"
return 1
fi
done
echo "[PREFLIGHT] 所有检查通过"
return 0
}
# === 执行预检 ===
echo "===== 执行预检 ====="
if ! preflight_check; then
echo "[ERROR] 预检失败,请确保离线包完整"
exit 1
fi
# ... [后续安装步骤不变,但每个命令增加错误检查] ...
# 示例:安装基础依赖(增加错误检查)
echo "===== 安装系统依赖 ====="
if ! yum install -y \
socat \
conntrack-tools \
ebtables \
ethtool \
ipset \
iptables \
nfs-utils \
chrony \
bash-completion; then
echo "[ERROR] 依赖安装失败"
exit 1
fi
# ... [其他安装步骤类似增加错误检查] ...
```
##### 4. 镜像下载脚本增强(使用国内镜像源)
```bash
#!/bin/bash
# 修复后的镜像下载脚本:download-images.sh
# 使用国内镜像源
REGISTRY_MIRROR="registry.aliyuncs.com/google_containers"
for image in \
kube-apiserver:v1.31.0 \
kube-controller-manager:v1.31.0 \
kube-scheduler:v1.31.0 \
kube-proxy:v1.31.0 \
pause:3.9 \
etcd:3.5.12-0 \
coredns/coredns:v1.11.1
do
docker pull ${REGISTRY_MIRROR}/${image}
docker tag ${REGISTRY_MIRROR}/${image} k8s.gcr.io/${image}
docker save -o images/$(echo ${image} | sed 's|/|-|g').tar k8s.gcr.io/${image}
done
# 下载Calico(使用国内源)
docker pull docker.io/calico/node:v3.27.0
docker save -o images/calico-node-v3.27.0.tar calico/node:v3.27.0
```
#### 完整修复流程:
1. **在联网机器上**:
```bash
# 1. 下载依赖
./download-deps.sh
# 2. 下载镜像
./download-images.sh
# 3. 打包离线安装包
tar czvf k8s-offline-v1.31-kylinv10.tar.gz /opt/k8s-offline
```
2. **在离线机器上**:
```bash
# 1. 解压离线包
tar xzvf k8s-offline-v1.31-kylinv10.tar.gz -C /
# 2. 创建本地仓库
/opt/k8s-offline/tools/create_repo.sh
# 3. 执行安装
/opt/k8s-offline/k8s-offline-setup.sh
```
#### 关键修复点说明:
1. **dnf download 参数**:
- 使用 `--destdir` 替代不存在的 `--download_path`
- 添加 `--resolve` 和 `--alldeps` 确保下载所有依赖
2. **Docker CE 下载**:
- 使用阿里云镜像源替代官方源
- 添加备用源提示和错误处理
3. **预检机制**:
- 安装前检查所有必需文件是否存在
- 避免部分文件缺失导致后续失败
4. **镜像下载**:
- 使用 `registry.aliyuncs.com` 国内镜像源
- 自动重命名为官方镜像名称
5. **错误处理**:
- 所有关键操作添加错误检查
- 使用 `set -euo pipefail` 严格模式
- 重要步骤添加状态回显
> **生产环境建议**:在执行前使用 `ls /opt/k8s-offline/rpms` 和 `ls /opt/k8s-offline/images` 手动验证文件完整性,确保所有必需文件存在。
阅读全文
相关推荐














