debian 11-12 系统中 ocp_agent 安装失败

【 使用环境 】 测试环境
【 OB or 其他组件 】
【OS 版本】 debian 11 和 12 amd64
【 使用版本 】 ob all in one 4.5.0
【问题描述】debian 11-12 系统中 ocp_agent 安装失败

异常信息
错误码
CMP10102
错误信息
执行 SSH 命令失败,错误信息:cp: cannot create regular file '/home/dba/ocp_agent/pkg_store/': No such file or directory
错误原因
在主机 *.**.**.*** 上执行命令 sudo cp -r '/tmp//ocp-agent-ce-4.4.0-20251114143405.el7.x86_64.rpm' '/home/dba/ocp_agent/pkg_store/' 失败,退出码:1,错误信息:cp: cannot create regular file '/home/dba/ocp_agent/pkg_store/': No such file or directory
解决方案
请联系技术支持

通过日志来看,是 install.sh 执行安装到自定义目录(/home/dba) 时,出现安装失败的问题,通过对 install.sh 的分析来看,应该是对 debian 系统无法指定 安装到自定义目录,导致安装失败

使用 ai 对 install.sh 分析结果如下

#!/bin/bash
get_os_type() {
    command -v dpkg > /dev/null
    if [[ $? -eq 0 && ! -f "/tmp/not-debian" ]]
    then
        local dpkg_count=`dpkg -l 2>/dev/null | head -n 100 | wc -l`
        local rpm_count=`rpm -qa 2>/dev/null | head -n 100 | wc -l`
        if [[ "$dpkg_count" -gt "$rpm_count" ]]
        then
            echo "debian"
            return 0
        fi
    fi
    local suse_count=`cat /etc/*-release | grep -i suse | wc -l`
    if [[ $suse_count -ne 0 ]]
    then
        echo "suse"
        return 0
    fi
    local redhat_count=`cat /etc/*-release | grep -iE "alibaba|redhat|red hat|centos" | wc -l`
    if [[ $redhat_count -ne 0 ]]
    then
        echo "redhat"
        return 0
    fi

    echo "other"
    return 0
}

extract_install_package() {
    local package_name=$1
    local tmp_dir_name="/tmp/$(cat /proc/sys/kernel/random/uuid)"
    mkdir -p $tmp_dir_name
    pushd $tmp_dir_name; rpm2cpio "$package_name" | cpio -id --quiet
    ret=$?
    if [[ $ret -ne 0 ]]
    then
        return $ret
    fi
    for file_path in `find $tmp_dir_name -type f`
    do
        local relative_path=${file_path#${tmp_dir_name}*}
        if [[ -L $file_path ]]
        then
            local real_path=$(realpath file_path)
            if [[ ! -e $real_path ]]
            then
                echo "ERROR link: $file_path pointed to an invalid destination: $real_path"
                continue
            fi
        fi
        sudo install -D $tmp_dir_name/$relative_path $relative_path
    done
    popd
    return 0
}

install_package() {
    local package_name=$1
    local prefix=$2
    if [[ -z "$package_name" ]] && [[ -z "$prefix" ]]; then
        echo "ERROR invalid package_name or prefix"
        return 0
    fi

    if [[ "$package_name" == *"tar.gz" ]]
    then
        sudo tar -xzvf "$package_name"
        if [[ -z "$prefix" ]]; then
            sudo ocp_agent/scripts/install.sh || exit 1
        else
            sudo ocp_agent/scripts/install.sh -d "$prefix" || exit 1
        fi
        return 0
    fi

    if [[ $(get_os_type) == "debian" ]]
    then
        export PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

        extract_install_package "$package_name" 1> /dev/null
        ret=$?
        if [[ $ret -ne 0 ]]
        then
            return $ret
        fi
        SCRIPT_FILE=$(readlink -f $0)
        SCRIPT_DIR=$(dirname $SCRIPT_FILE)
        if [[ $(uname -m) == "aarch64" ]]
        then
            sudo real_cpio_command=`command -v cpio` PATH="$SCRIPT_DIR:$PATH" alien -k -i "$package_name" --target=arm64
        else
            sudo real_cpio_command=`command -v cpio` PATH="$SCRIPT_DIR:$PATH" alien -k -i "$package_name"
        fi
    else
        if [[ $# -eq 2 ]]
        then
            sudo rpm -Uvh --prefix="$prefix" "$package_name"
        else
            sudo rpm -Uvh "$package_name"
        fi
    fi
}

install_package $1 $2
如果在 Debian (或 Ubuntu) 系统下运行,脚本的处理逻辑会完全不同,且会忽略传入的安装路径 /home/dba。

具体流程如下:

无法指定安装目录 (忽略 /home/dba) 脚本的 update 逻辑在 debian 分支下完全没有引用变量 $2 (即 prefix 参数)。 这意味着:程序会被安装到 RPM 包内部定义的默认路径(通常是 /opt、/usr 等系统目录),而不是你指定的 /home/dba。

执行“暴力”解压安装 (extract_install_package) 脚本会先尝试手动解压 RPM 包并将文件直接复制到系统目录:

创建一个临时目录。
使用 rpm2cpio 将 RPM 解压。
使用 sudo install -D 将所有解压出来的文件,按照 RPM 包内的目录结构,直接拷贝到系统的对应位置(例如根目录 / 下)。
使用 alien 转换并注册包 为了让系统包管理器 (dpkg) 知道这个软件已安装,脚本会使用 alien 工具:

命令:sudo ... alien -k -i "ocp-agent-ce...rpm"
作用:
将 .rpm 包动态转换为 Debian 的 .deb 包。
-k:保持版本号不变。
-i:转换后立即调用 dpkg 进行安装。
总结
在 Debian 系统下输入这两个参数:

结果:软件会成功安装,但不会安装在 /home/dba,而是安装在系统默认位置;系统会把该 RPM 转为 DEB 包进行管理。
副作用:如果你必须安装在 /home/dba,这个脚本在 Debian 下无法满足需求。