环境: RHEL 8.10,要用sudo执行安装DB2 11.5.8
安装依赖包的Shell脚本如下:
#!/usr/bin/env bash
#
# install_db2_deps.sh
# 安装 DB2 11.5 依赖包(基于 yum),带日志与错误处理
#
# Usage:
# sudo ./install_db2_deps.sh
#
# Notes:
# - 假定以 root 用户运行。如果不是 root,会提示并退出。
# - 若使用 RHEL8+/Fedora,请将 yum 替换为 dnf(或在脚本顶部设置 YUM_CMD)。
# - 日志文件: /var/log/db2_preinstall_<YYYYmmdd-HHMMSS>.log
# - 脚本在每个步骤失败时会退出并记录错误信息。
set -o pipefail
# 不使用 set -e 以便我们在 run_cmd 中统一处理错误并记录更友好的信息
########################
# 配置
########################
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
LOGFILE="/var/log/db2_preinstall_${TIMESTAMP}.log"
YUM_CMD="yum" # 如果系统使用 dnf,可替换为 dnf
RETRY_COUNT=1 # 可修改为 >1 以重试 yum 安装(简单实现)
# 包组(便于维护) - 根据你的清单分组
PKG_GROUP_32BIT=(pam.i686 libstdc++.i686)
PKG_GROUP_RDMA=(libibverbs librdmacm rdma ibacm libibmad libmlx4 libmlx5)
PKG_GROUP_DEV=(glibc gcc-c++ gcc perl python2)
PKG_GROUP_KERNEL=(kernel kernel-devel kernel-headers kernel-firmware)
PKG_GROUP_TIME=(chrony)
PKG_GROUP_DISK=(sg3_utils sg3_utils-libs net-tools)
PKG_GROUP_BIN=(binutils binutils-devel)
PKG_GROUP_NET=(NetworkManager NetworkManager-config-server)
ALL_GROUPS=(
"32bit:PKG_GROUP_32BIT"
"rdma:PKG_GROUP_RDMA"
"dev:PKG_GROUP_DEV"
"kernel:PKG_GROUP_KERNEL"
"time:PKG_GROUP_TIME"
"disk:PKG_GROUP_DISK"
"bin:PKG_GROUP_BIN"
"network:PKG_GROUP_NET"
)
########################
# 辅助函数
########################
log() {
local ts
ts=$(date +"%Y-%m-%d %H:%M:%S")
echo "${ts} [INFO] $*" | tee -a "${LOGFILE}"
}
log_warn() {
local ts
ts=$(date +"%Y-%m-%d %H:%M:%S")
echo "${ts} [WARN] $*" | tee -a "${LOGFILE}" >&2
}
log_err() {
local ts
ts=$(date +"%Y-%m-%d %H:%M:%S")
echo "${ts} [ERROR] $*" | tee -a "${LOGFILE}" >&2
}
# 运行命令并检查返回码;失败则记录并退出
run_cmd() {
local desc="$1"
shift
local cmd=( "$@" )
log "开始: ${desc}"
log "运行命令: ${cmd[*]}"
# 执行命令并把 stdout/stderr 都记录到日志
if "${cmd[@]}" 2>&1 | tee -a "${LOGFILE}"; then
log "成功: ${desc}"
return 0
else
local rc=${PIPESTATUS[0]:-${?}}
log_err "失败: ${desc} (exit ${rc})"
log_err "查看日志: ${LOGFILE}"
exit "${rc}"
fi
}
# 将数组名作为字符串传入,返回以空格分隔的包名(便于 yum 调用)
expand_pkg_array() {
local arr_name="$1"
# 使用 indirect expansion
eval "echo \"\${${arr_name}[@]}\""
}
# 确保日志文件可写(以 root 身份创建)
prepare_logfile() {
if [ ! -d "$(dirname "${LOGFILE}")" ]; then
mkdir -p "$(dirname "${LOGFILE}")" || {
echo "无法创建日志目录 $(dirname "${LOGFILE}"),请以 root 运行。" >&2
exit 1
}
fi
touch "${LOGFILE}" || {
echo "无法创建日志文件 ${LOGFILE},请以 root 运行。" >&2
exit 1
}
chmod 640 "${LOGFILE}" || true
}
########################
# 主流程
########################
main() {
# 检查 root
if [ "$(id -u)" -ne 0 ]; then
echo "请以 root 身份运行此脚本(或使用 sudo)。" >&2
exit 1
fi
prepare_logfile
log "===== DB2 依赖安装脚本 启动 ====="
log "日志文件: ${LOGFILE}"
log "使用的包管理命令: ${YUM_CMD}"
log "时间戳: ${TIMESTAMP}"
# 可选:检测 yum 是否存在
if ! command -v "${YUM_CMD}" >/dev/null 2>&1; then
log_err "找不到 ${YUM_CMD} 命令。若使用 dnf,请在脚本顶部把 YUM_CMD 修改为 dnf。"
exit 1
fi
# 可选:打印当前内核版本
local kver
kver=$(uname -r)
log "当前内核: ${kver}"
# 循环安装每个包组
for grp_spec in "${ALL_GROUPS[@]}"; do
# grp_spec 格式 name:ARRAY_NAME
IFS=':' read -r grp_name arr_name <<< "${grp_spec}"
pkgs=$(expand_pkg_array "${arr_name}")
if [ -z "${pkgs// /}" ]; then
log_warn "组 ${grp_name} 包列表为空,跳过。"
continue
fi
# 显示步骤信息
log "步骤: 安装包组 '${grp_name}'"
log "包: ${pkgs}"
# 运行安装命令(带 -y 非交互)
# 支持简单重试逻辑
attempt=1
success=0
while [ "${attempt}" -le "${RETRY_COUNT}" ]; do
run_cmd "yum install (${grp_name}) attempt ${attempt}" "${YUM_CMD}" install -y ${pkgs}
# 如果 run_cmd 没有退出,说明成功
success=1
break
attempt=$((attempt + 1))
done
if [ "${success}" -ne 1 ]; then
log_err "在尝试 ${RETRY_COUNT} 次后,包组 ${grp_name} 安装失败。退出。"
exit 1
fi
done
# 安装完成后的服务启用示例(NetworkManager)
# 仅当 NetworkManager 在包组中安装成功后启用与启动
if rpm -q NetworkManager >/dev/null 2>&1; then
run_cmd "启用 NetworkManager 服务" systemctl enable NetworkManager
run_cmd "启动 NetworkManager 服务" systemctl start NetworkManager
run_cmd "检查 NetworkManager 状态" systemctl status --no-pager NetworkManager
else
log_warn "NetworkManager 未安装或 rpm 查询失败,跳过启用/启动步骤。"
fi
log "===== 所有包安装完成 ====="
log "若需要,请检查 ${LOGFILE} 以获取详细信息。"
log "建议重启主机以确保 kernel/kernel-devel 升级正确生效(若安装了新内核)。"
exit 0
}
# 调用主函数
main "$@"
执行结果:

依赖包检查:
sudo /opt/server_dec/db2prereqcheck -V 11.5.8.0
可以看到其他的依赖包都已经安装完成,
sudo setenforce 0
可以临时将SELinux改成permissive,重启后恢复Enabled
- 如果你在配置 DB2 pureScale / GPFS / 集群环境,TSA 是必需的。
- 如果你在单机或非 purescale 环境,安装时不选 purescale
