【 使用环境 】 测试环境
【 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 下无法满足需求。