跳到主要内容

环境: 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

留下回复