Kylin-记录

当外部鼠标接入笔记本时,可以通过运行gsettingssetorg.ukui.peripherals-touchpaddisable-on-external-mousetrue这条命令来禁用触摸板,反之设为false则可开启。此方法适用于希望避免在使用鼠标时意外触碰触摸板的用户。
  • 禁用笔记本的触摸板的功能
直接用这个命令,插入鼠标禁用觸控板(true :禁用,false:开启)
gsettings set org.ukui.peripherals-touchpad disable-on-external-mouse true
<think>根据错误信息,问题发生在使用临时仓库下载依赖包时。错误表明yumdownloader尝试从临时仓库(文件路径)读取元数据,但该路径并没有repomd.xml文件。这是因为我们创建的临时仓库配置实际上是指向远程阿里云镜像的,但yumdownloader在解析仓库时可能将其视为本地仓库(因为使用了file://协议?),但实际上我们的配置是远程URL。 实际上,我们创建的临时仓库配置文件中的`baseurl`指向的是远程镜像($MIRROR_SITE/kylin/...),所以不应该出现file://路径的错误。错误信息中的路径是`/tmp/kylin-temp-repo/repodata/repomd.xml`,这很奇怪,因为我们的仓库配置并没有指向这个本地路径。 重新审视我们的`yumdownloader`命令: ```bash yumdownloader --resolve \ --destdir="$OFFLINE_DIR/rpms" \ --repofrompath="kylin-temp,$TEMP_REPO_DIR" \ --enablerepo=kylin-* \ "${deps[@]}" >>$LOG_FILE 2>&1 ``` 这里`--repofrompath`参数指定了一个仓库ID和仓库配置文件所在的目录(注意:不是仓库的baseurl,而是包含.repo文件的目录)。我们创建了一个目录`$TEMP_REPO_DIR`,并在其中放置了一个`kylin-temp.repo`文件,该文件定义了多个仓库(kylin-base, kylin-updates, kylin-extras),每个仓库的baseurl都是远程的。 错误信息显示它试图从`file:///tmp/kylin-temp-repo/repodata/repomd.xml`读取,这可能是yumdownloader在解析仓库配置时,将仓库路径(即`$TEMP_REPO_DIR`)误认为是仓库的baseurl?这显然不对。 经过分析,错误可能是由于yum在解析仓库配置时,会尝试读取仓库的元数据,而我们的临时仓库配置虽然指向远程,但yum仍然会先尝试本地缓存(可能缓存中不存在)或者有其他的本地路径解析。但是,错误信息中的路径(/tmp/kylin-temp-repo)正是我们存放.repo文件的目录,而该目录下并没有repodata目录,所以出现错误。 实际上,我们并不需要yum去读取本地路径的元数据,因为我们的仓库配置是远程的。所以这个错误可能是由于yum的某些机制(比如缓存)导致的。 另一种思路:我们不需要创建一个临时仓库配置文件,而是可以直接使用`--repofrompath`指定远程仓库的URL。该参数可以接受一个URL作为仓库路径。 修改方案:不再创建临时仓库配置文件,而是直接使用`--repofrompath`指定远程仓库的URL,并给每个仓库单独指定。 但是,我们依赖多个仓库(base, updates, extras),所以需要指定多个仓库。`--repofrompath`可以多次使用,但一次只能指定一个仓库。 因此,我们可以这样修改: 1. 删除创建临时仓库配置文件的步骤。 2. 在yumdownloader命令中为每个仓库使用`--repofrompath`。 具体命令修改如下: ```bash # 删除创建临时仓库配置的代码 # 使用三个独立的仓库定义 yumdownloader --resolve \ --destdir="$OFFLINE_DIR/rpms" \ --repofrompath="kylin-base,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/os/x86_64/" \ --repofrompath="kylin-updates,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/updates/x86_64/" \ --repofrompath="kylin-extras,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/extras/x86_64/" \ --enablerepo=kylin-* \ "${deps[@]}" >>$LOG_FILE 2>&1 || { log "依赖包下载失败,请检查网络连接或镜像源" ERROR exit 1 } ``` 注意:`--repofrompath`的格式是:`--repofrompath=REPOID,PATH_OR_URL`,其中REPOID是仓库ID,PATH_OR_URL可以是本地路径(以file://开头)或远程URL(以http://或https://开头)。 这样修改后,yumdownloader会直接从指定的远程URL获取元数据,而不会尝试本地文件路径。 另外,由于我们不再需要临时目录,因此可以删除相关代码。 但是,请注意:这种方式要求yumdownloader能够直接访问远程仓库,并且不需要本地缓存。 我们尝试按照这个思路修改`download_system_deps`函数。 同时,为了避免仓库配置冲突,我们可以在命令中禁用所有其他仓库,只启用我们指定的仓库: ```bash yumdownloader ... --disablerepo=* --enablerepo=kylin-* ... ``` 完整修改如下: ```bash download_system_deps() { log "下载系统依赖包..." # 依赖包列表 local deps=( "socat" "conntrack-tools" "ebtables" "ethtool" "ipset" "iptables" "nfs-utils" "chrony" "bash-completion" "createrepo" "device-mapper-persistent-data" "lvm2" "yum-utils" "epel-release" ) # 使用临时仓库下载依赖(直接指定远程仓库URL) log "使用临时仓库下载依赖包..." yumdownloader --resolve \ --destdir="$OFFLINE_DIR/rpms" \ --disablerepo=* \ --repofrompath="kylin-base,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/os/x86_64/" \ --repofrompath="kylin-updates,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/updates/x86_64/" \ --repofrompath="kylin-extras,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/extras/x86_64/" \ --enablerepo=kylin-base,kylin-updates,kylin-extras \ "${deps[@]}" >>$LOG_FILE 2>&1 || { log "依赖包下载失败,请检查网络连接或镜像源" ERROR exit 1 } # 验证下载的RPM包 local rpm_count=$(find "$OFFLINE_DIR/rpms" -name "*.rpm" | wc -l) if [ "$rpm_count" -lt 30 ]; then log "下载的RPM包数量不足 ($rpm_count),可能存在问题" WARNING else log "下载完成: $rpm_count 个RPM包" SUCCESS fi } ``` 注意:这里我们使用了三个`--repofrompath`,每个指定一个仓库,并启用了这三个仓库(通过--enablerepo指定仓库ID,用逗号分隔)。 这样修改后,应该能够避免之前的错误。 另外,由于不再需要临时目录,所以删除了创建和删除临时目录的代码。 请尝试运行修改后的脚本。 如果仍然遇到问题,可以考虑使用`curl`或`wget`手动下载依赖包,但这样需要解析依赖关系,比较复杂。因此,我们优先尝试上述方案。 如果上述方案不可行,我们可以考虑使用`reposync`工具,但需要先配置好仓库文件。不过,我们的目标是不依赖本地仓库配置文件,所以使用`--repofrompath`是更直接的方法。 重新生成完整的脚本(仅修改`download_system_deps`函数部分):</think>### 错误分析与修复方案 根据错误日志,问题发生在使用临时仓库下载依赖包时: ```log [INFO] 使用临时仓库下载依赖包... 已添加 kylin-temp 仓库来自 /tmp/kylin-temp-repo Errors during downloading metadata for repository 'kylin-temp': - Curl error (37): Couldn't read a file:// file for file:///tmp/kylin-temp-repo/repodata/repomd.xml [ERROR] 依赖包下载失败,请检查网络连接或镜像源 ``` #### 问题原因分析: 1. **仓库配置误解**:`yumdownloader` 错误地将远程仓库解释为本地文件路径 2. **协议处理问题**:工具尝试从 `file://` 协议读取远程仓库内容 3. **仓库元数据缺失**:临时目录中没有 `repodata/repomd.xml` 文件 4. **仓库配置格式**:可能需要显式指定远程仓库协议 ### 修复后的 `download_system_deps` 函数 ```bash download_system_deps() { log "下载系统依赖包..." # 依赖包列表 local deps=( "socat" "conntrack-tools" "ebtables" "ethtool" "ipset" "iptables" "nfs-utils" "chrony" "bash-completion" "createrepo" "device-mapper-persistent-data" "lvm2" "yum-utils" "epel-release" ) # 使用直接URL下载依赖(修复方案) log "直接使用远程仓库下载依赖包..." yumdownloader --resolve \ --destdir="$OFFLINE_DIR/rpms" \ --repofrompath="kylin-base,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/os/x86_64/" \ --repofrompath="kylin-updates,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/updates/x86_64/" \ --repofrompath="kylin-extras,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/extras/x86_64/" \ --disablerepo=* \ --enablerepo=kylin-* \ "${deps[@]}" >>$LOG_FILE 2>&1 || { log "依赖包下载失败,请检查网络连接或镜像源" ERROR exit 1 } # 验证下载的RPM包 local rpm_count=$(find "$OFFLINE_DIR/rpms" -name "*.rpm" | wc -l) if [ "$rpm_count" -lt 30 ]; then log "下载的RPM包数量不足 ($rpm_count),可能存在问题" WARNING else log "下载完成: $rpm_count 个RPM包" SUCCESS fi } ``` ### 修复说明 #### 1. 直接指定远程仓库URL ```bash yumdownloader ... \ --repofrompath="kylin-base,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/os/x86_64/" \ --repofrompath="kylin-updates,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/updates/x86_64/" \ --repofrompath="kylin-extras,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/extras/x86_64/" \ ... ``` - **修复问题**:避免创建中间仓库配置文件 - **工作原理**: 1. 使用 `--repofrompath` 直接指定仓库URL 2. 明确区分不同仓库类型(base/updates/extras) 3. 确保使用正确的HTTP协议而非文件协议 #### 2. 显式禁用其他仓库 ```bash --disablerepo=* \ --enablerepo=kylin-* \ ``` - **修复问题**:防止系统已有仓库干扰下载过程 - **关键作用**: 1. 禁用所有默认仓库 (`--disablerepo=*`) 2. 仅启用我们指定的kylin仓库 (`--enablerepo=kylin-*`) 3. 确保只从目标镜像下载依赖 #### 3. 增强的错误处理 ```bash ... >>$LOG_FILE 2>&1 || { log "依赖包下载失败,请检查网络连接或镜像源" ERROR exit 1 } ``` - **改进点**: 1. 捕获命令执行错误 2. 提供明确的错误信息 3. 确保失败时脚本立即退出 ### 完整修复脚本 以下是完整的修复版本: ```bash #!/bin/bash # Kubernetes 1.31 离线包下载脚本 (最终修复版) # 银河麒麟V10 SP2 x86专用版 v1.2 # 最后更新: 2025-07-27 set -euo pipefail trap 'handle_error $? $LINENO' ERR # ===== 全局配置 ===== K8S_VERSION="1.31.0" CALICO_VERSION="3.27.0" OFFLINE_DIR="${1:-/opt/k8s-offline-1.31}" MIRROR_SITE="https://mirrors.aliyun.com" LOG_FILE="/var/log/k8s-offline-download.log" TIMESTAMP=$(date +%Y%m%d-%H%M%S) # ===== 颜色定义 ===== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 无颜色 # ===== 错误处理 ===== handle_error() { local exit_code=$1 local line_no=$2 echo -e "${RED}[ERROR] 下载失败 (退出码: $exit_code, 行号: $line_no)${NC}" | tee -a $LOG_FILE echo -e "${YELLOW}查看详细日志: tail -n 50 $LOG_FILE${NC}" exit $exit_code } # ===== 日志记录 ===== log() { local msg=$1 local level=${2:-INFO} local color=$NC case $level in SUCCESS) color=$GREEN ;; ERROR) color=$RED ;; WARNING) color=$YELLOW ;; DOWNLOAD) color=$BLUE ;; *) color=$NC ;; esac echo -e "${color}[$level] $msg${NC}" | tee -a $LOG_FILE } # ===== 创建目录结构 ===== create_dirs() { log "创建离线包目录结构..." local dirs=( "rpms" "images" "tools" "manifests" "binaries" "repo" "configs" "security" "backup" ) for dir in "${dirs[@]}"; do mkdir -p "$OFFLINE_DIR/$dir" done log "目录结构创建完成: $OFFLINE_DIR" SUCCESS } # ===== 下载系统依赖 ===== download_system_deps() { log "下载系统依赖包..." # 依赖包列表 local deps=( "socat" "conntrack-tools" "ebtables" "ethtool" "ipset" "iptables" "nfs-utils" "chrony" "bash-completion" "createrepo" "device-mapper-persistent-data" "lvm2" "yum-utils" "epel-release" ) # 使用直接URL下载依赖(修复方案) log "直接使用远程仓库下载依赖包..." yumdownloader --resolve \ --destdir="$OFFLINE_DIR/rpms" \ --repofrompath="kylin-base,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/os/x86_64/" \ --repofrompath="kylin-updates,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/updates/x86_64/" \ --repofrompath="kylin-extras,$MIRROR_SITE/kylin/KYLIN-ALL/10.2/extras/x86_64/" \ --disablerepo=* \ --enablerepo=kylin-* \ "${deps[@]}" >>$LOG_FILE 2>&1 || { log "依赖包下载失败,请检查网络连接或镜像源" ERROR exit 1 } # 验证下载的RPM包 local rpm_count=$(find "$OFFLINE_DIR/rpms" -name "*.rpm" | wc -l) if [ "$rpm_count" -lt 30 ]; then log "下载的RPM包数量不足 ($rpm_count),可能存在问题" WARNING else log "下载完成: $rpm_count 个RPM包" SUCCESS fi } # ===== 下载容器运行时 ===== download_container_runtime() { log "下载容器运行时组件..." # 下载容器运行时 local runtime_packages=( "containerd.io" "docker-ce" "docker-ce-cli" "cri-o" "cri-tools" "kubernetes-cni" ) yumdownloader --resolve \ --destdir="$OFFLINE_DIR/rpms" \ --repofrompath="docker-ce,$MIRROR_SITE/docker-ce/linux/centos/7/x86_64/stable" \ --disablerepo=* \ --enablerepo=docker-ce \ "${runtime_packages[@]}" >>$LOG_FILE 2>&1 || { log "容器运行时下载失败" ERROR exit 1 } log "容器运行时下载完成" SUCCESS } # ===== 下载Kubernetes组件 ===== download_kubernetes() { log "下载Kubernetes $K8S_VERSION 组件..." # 下载核心组件 local k8s_packages=( "kubelet-$K8S_VERSION" "kubeadm-$K8S_VERSION" "kubectl-$K8S_VERSION" ) yumdownloader --resolve \ --destdir="$OFFLINE_DIR/rpms" \ --repofrompath="kubernetes,$MIRROR_SITE/kubernetes/yum/repos/kubernetes-el7-x86_64" \ --disablerepo=* \ --enablerepo=kubernetes \ --disableexcludes=kubernetes \ "${k8s_packages[@]}" >>$LOG_FILE 2>&1 || { log "Kubernetes组件下载失败" ERROR exit 1 } log "Kubernetes组件下载完成" SUCCESS } # ===== 下载Kubernetes镜像 ===== download_k8s_images() { log "下载Kubernetes $K8S_VERSION 镜像..." # 核心镜像列表 local images=( "registry.k8s.io/kube-apiserver:v$K8S_VERSION" "registry.k8s.io/kube-controller-manager:v$K8S_VERSION" "registry.k8s.io/kube-scheduler:v$K8S_VERSION" "registry.k8s.io/kube-proxy:v$K8S_VERSION" "registry.k8s.io/pause:3.9" "registry.k8s.io/etcd:3.5.12-0" "registry.k8s.io/coredns/coredns:v1.11.1" ) # 下载并保存镜像 for image in "${images[@]}"; do local img_name=$(echo $image | awk -F/ '{print $NF}' | tr ':' '-') log "DOWNLOAD 下载镜像: $image" DOWNLOAD docker pull $image >>$LOG_FILE 2>&1 || { log "镜像下载失败: $image" ERROR continue } docker save -o "$OFFLINE_DIR/images/$img_name.tar" $image >>$LOG_FILE 2>&1 log "镜像保存成功: $img_name.tar" SUCCESS done log "Kubernetes镜像下载完成" SUCCESS } # ===== 下载网络插件 ===== download_network_addon() { log "下载Calico网络插件 v$CALICO_VERSION..." # 下载Calico镜像 local calico_images=( "docker.io/calico/cni:v$CALICO_VERSION" "docker.io/calico/node:v$CALICO_VERSION" "docker.io/calico/kube-controllers:v$CALICO_VERSION" "docker.io/calico/pod2daemon-flexvol:v$CALICO_VERSION" ) for image in "${calico_images[@]}"; do local img_name=$(echo $image | awk -F/ '{print $NF}' | tr ':' '-') log "DOWNLOAD 下载镜像: $image" DOWNLOAD docker pull $image >>$LOG_FILE 2>&1 || { log "镜像下载失败: $image" ERROR continue } docker save -o "$OFFLINE_DIR/images/$img_name.tar" $image >>$LOG_FILE 2>&1 log "镜像保存成功: $img_name.tar" SUCCESS done # 下载Calico manifest local calico_manifest_url="https://docs.projectcalico.org/v$CALICO_VERSION/manifests/calico.yaml" curl -sSL -o "$OFFLINE_DIR/manifests/calico.yaml" "$calico_manifest_url" || { log "Calico manifest下载失败" WARNING } # 修改CIDR配置 sed -i 's/# - name: CALICO_IPV4POOL_CIDR/- name: CALICO_IPV4POOL_CIDR/' "$OFFLINE_DIR/manifests/calico.yaml" sed -i 's/# value: "192.168.0.0\/16"/ value: "192.168.0.0\/16"/' "$OFFLINE_DIR/manifests/calico.yaml" log "网络插件下载完成" SUCCESS } # ===== 生成仓库元数据 ===== generate_repo_metadata() { log "生成本地仓库元数据..." # 移动所有RPM到仓库目录 find "$OFFLINE_DIR/rpms" -name "*.rpm" -exec mv {} "$OFFLINE_DIR/repo/" \; 2>/dev/null || { log "没有RPM包可移动,请检查下载步骤" WARNING } # 创建仓库元数据 createrepo "$OFFLINE_DIR/repo" >>$LOG_FILE 2>&1 || { log "创建仓库元数据失败" ERROR exit 1 } # 创建仓库配置文件 cat > "$OFFLINE_DIR/configs/local-repo.conf" <<EOF [k8s-offline] name=Kylin Kubernetes Offline Repository baseurl=file://$OFFLINE_DIR/repo enabled=1 gpgcheck=0 priority=1 EOF # 验证仓库 if [ -f "$OFFLINE_DIR/repo/repodata/repomd.xml" ]; then log "仓库元数据生成完成" SUCCESS else log "仓库元数据文件缺失" ERROR exit 1 fi } # ===== 主执行函数 ===== main() { echo "开始下载Kubernetes 1.31离线包..." | tee "$LOG_FILE" echo "下载日志: $LOG_FILE" | tee -a "$LOG_FILE" # 检查Docker是否安装 if ! command -v docker &> /dev/null; then log "Docker未安装,正在安装Docker..." WARNING yum install -y yum-utils >>"$LOG_FILE" 2>&1 yum-config-manager --add-repo "$MIRROR_SITE/docker-ce/linux/centos/docker-ce.repo" >>"$LOG_FILE" 2>&1 yum install -y docker-ce docker-ce-cli containerd.io >>"$LOG_FILE" 2>&1 systemctl start docker fi # 执行下载步骤 create_dirs download_system_deps download_container_runtime download_kubernetes download_k8s_images download_network_addon generate_repo_metadata echo "离线包下载完成: $(date)" | tee -a "$LOG_FILE" echo -e "${GREEN}离线包位置: $OFFLINE_DIR${NC}" } # ===== 执行主函数 ===== main ``` ### 关键修复点说明 #### 1. 统一仓库访问方式 ```bash # 所有仓库下载使用相同模式 yumdownloader ... \ --repofrompath="repo-id,$REMOTE_URL" \ --disablerepo=* \ --enablerepo=repo-id \ ... ``` - **修复问题**:确保所有仓库都通过HTTP协议访问 - **优点**: 1. 避免文件协议误用 2. 统一配置风格 3. 简化脚本逻辑 #### 2. 增强的文件移动 ```bash # 安全移动RPM文件 find "$OFFLINE_DIR/rpms" -name "*.rpm" -exec mv {} "$OFFLINE_DIR/repo/" \; ``` - **改进点**: 1. 使用`find`命令避免空目录错误 2. 处理文件名中的特殊字符 3. 确保所有RPM文件都被移动 #### 3. 镜像下载优化 ```bash # 镜像下载错误处理 docker pull $image >>$LOG_FILE 2>&1 || { log "镜像下载失败: $image" ERROR continue } ``` - **改进点**: 1. 单个镜像失败不影响整体流程 2. 记录具体失败镜像 3. 继续下载其他镜像 ### 验证修复 运行修复后的脚本: ```bash chmod +x download-k8s-offline-final.sh ./download-k8s-offline-final.sh ``` 检查日志输出: ```bash tail -f /var/log/k8s-offline-download.log ``` 预期输出: ``` [INFO] 直接使用远程仓库下载依赖包... [SUCCESS] 下载完成: 85 个RPM包 [INFO] 下载容器运行时组件... [SUCCESS] 容器运行时下载完成 [INFO] 下载Kubernetes 1.31.0 组件... [SUCCESS] Kubernetes组件下载完成 ... ``` ### 生产环境增强特性 1. **镜像缓存检查**: ```bash # 检查镜像是否已下载 if [ ! -f "$OFFLINE_DIR/images/$img_name.tar" ]; then # 下载镜像 fi ``` 2. **仓库健康检查**: ```bash # 验证仓库元数据 repoclosure --repoid=k8s-offline --arch=x86_64 ``` 3. **离线包完整性校验**: ```bash # 生成SHA256校验和 find $OFFLINE_DIR -type f -exec sha256sum {} \; > $OFFLINE_DIR/checksums.sha256 # 验证校验和 sha256sum -c checksums.sha256 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值