手把手教你用Shell脚本自动安装华为Hi1822 FC光纤卡驱动
华为Hi1822 FC光纤卡自动化部署实战指南在数据中心运维和服务器批量部署场景中FCFibre Channel光纤存储卡的驱动安装往往是基础架构搭建的关键环节。华为Hi1822作为高性能16G FC光纤卡其稳定性和低延迟特性使其成为企业级存储网络的理想选择。本文将深入解析如何通过Shell脚本实现Hi1822驱动的全自动安装涵盖从环境准备到验证的完整闭环流程特别适合需要管理数十甚至上百台服务器的系统管理员团队。1. 环境预检与依赖准备在开始自动化安装前必须确保操作系统环境满足基本要求。经实测华为Hi1822 FC光纤卡驱动对CentOS/RHEL 7.x系列兼容性最佳建议使用CentOS 7.6及以上版本。不同Linux发行版的核心依赖可能略有差异但以下组件是必须的# 基础依赖包清单 yum install -y perl pciutils python3 gcc-gfortran libxml2-python \ tcsh libnl expat glib2 tcl libstdc bc tk gtk2 \ atk cairo numactl pkgconfig ethtool lsof unzip注意若在最小化安装的系统环境中还需额外安装开发工具链yum groupinstall -y Development Tools依赖验证可通过以下命令检查关键组件是否就位for pkg in gcc perl python3 unzip; do rpm -q $pkg || echo [ERROR] $pkg not installed! done建议将上述检查过程封装为函数放入脚本在后续自动化流程中作为前置校验环节。对于生产环境还需要特别注意SELinux和防火墙的配置# 临时关闭SELinux重启后失效 setenforce 0 # 永久关闭需修改/etc/selinux/config sed -i s/SELINUXenforcing/SELINUXpermissive/g /etc/selinux/config # 防火墙放行FC通信端口 firewall-cmd --permanent --add-port3260/tcp firewall-cmd --reload2. 驱动包智能获取与处理华为官方驱动包通常以ISO或ZIP格式分发我们需要在脚本中实现多种获取方式以适应不同场景#!/bin/bash DRIVER_VERV116 DL_URLhttp://mirror.example.com/drivers/FusionServer_iDriver-CentOS7.6-Driver-${DRIVER_VER}.zip LOCAL_DIR/opt/huawei/drivers ISO_MOUNT/mnt/hi1822_iso # 创建工作目录 mkdir -p ${LOCAL_DIR} ${ISO_MOUNT} # 驱动包下载支持断点续传 if [ ! -f ${LOCAL_DIR}/driver.zip ]; then wget --tries3 --timeout120 -O ${LOCAL_DIR}/driver.zip ${DL_URL} || { echo Download failed, please check network connection! exit 1 } fi # 解压驱动包自动识别格式 file ${LOCAL_DIR}/driver.zip | grep -q Zip archive { unzip -o ${LOCAL_DIR}/driver.zip -d ${LOCAL_DIR}/ } # 挂载ISO镜像 find ${LOCAL_DIR} -name *.iso -exec mount -o loop {} ${ISO_MOUNT} \;实际部署时建议将驱动包提前存放在内网文件服务器通过脚本自动校验MD5确保文件完整性# 校验文件完整性 EXPECTED_MD5a1b2c3d4e5f6g7h8i9j0 ACTUAL_MD5$(md5sum ${LOCAL_DIR}/driver.zip | awk {print $1}) [ ${EXPECTED_MD5} ! ${ACTUAL_MD5} ] { echo Driver package corrupted, please redownload! exit 1 }对于批量部署场景可采用PXE配合Kickstart在系统安装阶段就完成驱动预置大幅提升效率。下表对比了不同获取方式的适用场景获取方式适用场景优点缺点直接下载单机测试环境简单直接依赖外网稳定性内网镜像生产环境批量部署速度快、可靠性高需要维护镜像服务器PXE集成新服务器初始化安装完全自动化配置复杂度高物理介质拷贝隔离网络环境安全性高人工操作成本高3. 智能安装脚本开发华为Hi1822驱动安装过程涉及多个交互步骤我们可以通过expect工具实现全自动化#!/usr/bin/expect -f set timeout 300 spawn ./install.sh expect { Please choose operation { send 1\r; exp_continue } Do you want to reboot { send no\r } eof }将expect脚本与主安装流程结合形成完整的自动化解决方案#!/bin/bash # 检查是否已安装驱动 lsmod | grep -q hns3 { echo Driver already installed, version: $(modinfo hns3 | grep version) exit 0 } # 执行自动安装 pushd ${ISO_MOUNT} /dev/null if [ -f install.sh ]; then chmod x install.sh ./auto_install.exp # 调用expect自动化脚本 INSTALL_RESULT$? [ ${INSTALL_RESULT} -eq 0 ] { depmod -a modprobe hns3 echo Driver installed successfully } || { echo Installation failed with code ${INSTALL_RESULT} exit ${INSTALL_RESULT} } else echo Install script not found in ${ISO_MOUNT} exit 1 fi popd /dev/null针对不同业务场景安装脚本应支持参数化配置# 示例带参数的安装调用 ./install_driver.sh --versionV116 --skip-reboot --log-leveldebug实现参数解析的逻辑片段# 参数解析 while [[ $# -gt 0 ]]; do case $1 in -v|--version) DRIVER_VER$2 shift 2 ;; -s|--skip-reboot) SKIP_REBOOTtrue shift ;; --log-level) LOG_LEVEL$2 shift 2 ;; *) echo Unknown option: $1 exit 1 ;; esac done4. 安装后验证与故障排查驱动安装完成后必须进行多维度验证以确保FC卡正常工作# 基础检查命令集 echo 1. 内核模块检查: lsmod | grep hns3 dmesg | grep hns3 echo 2. PCI设备识别: lspci -nn | grep -i Fibre Channel echo 3. 链路状态检测: cat /sys/class/fc_host/host*/port_state echo 4. 固件版本确认: cat /sys/class/scsi_host/host*/fw_version常见问题及解决方案可封装为诊断函数diagnose_fc_issue() { # 检查物理连接 local LINK_STATE$(cat /sys/class/fc_host/host*/port_state) if [[ ${LINK_STATE} ! *Online* ]]; then echo [ERROR] FC port not online, check physical connection return 1 fi # 检查驱动加载 if ! lsmod | grep -q hns3; then echo [ERROR] Driver module not loaded dmesg | grep -i hns3 | tail -n 20 return 2 fi # 检查HBA卡识别 if ! lspci -nn | grep -qi Fibre Channel; then echo [ERROR] FC HBA not detected return 3 fi echo [OK] All basic checks passed return 0 }对于复杂问题可收集系统信息生成诊断报告generate_debug_report() { local REPORT_FILE/tmp/hi1822_diagnose_$(date %Y%m%d_%H%M%S).log echo System Info ${REPORT_FILE} uname -a ${REPORT_FILE} cat /etc/os-release ${REPORT_FILE} echo \n Hardware Info ${REPORT_FILE} lspci -vvv ${REPORT_FILE} dmidecode ${REPORT_FILE} echo \n Driver Status ${REPORT_FILE} lsmod ${REPORT_FILE} dmesg | grep -i hns3 ${REPORT_FILE} echo \n FC Port Status ${REPORT_FILE} for host in /sys/class/fc_host/host*; do echo Host ${host}: ${REPORT_FILE} cat ${host}/port_state ${REPORT_FILE} cat ${host}/symbolic_name ${REPORT_FILE} done echo Diagnostic report saved to ${REPORT_FILE} }5. 生产环境优化实践在真实的企业级部署中还需要考虑以下高级配置多路径配置示例适用于存储网络# 安装多路径软件 yum install -y device-mapper-multipath # 基础配置 cat /etc/multipath.conf EOF defaults { user_friendly_names yes find_multipaths yes } devices { device { vendor HUAWEI product XSG1 path_grouping_policy group_by_prio path_checker tur features 0 hardware_handler 1 alua prio alua failback immediate } } EOF # 启用服务 systemctl enable --now multipathd性能调优参数建议# 调整队列深度 echo 256 /sys/block/sd*/queue/nr_requests # 优化HBA卡参数 for host in /sys/class/fc_host/host*; do echo 16 ${host}/max_luns echo 1024 ${host}/max_npiv_vports done # 内核参数优化 cat /etc/sysctl.conf EOF # FC performance tuning vm.swappiness 10 vm.dirty_ratio 20 vm.dirty_background_ratio 10 EOF sysctl -p自动化监控集成方案# Prometheus监控exporter示例 #!/bin/bash while true; do # 采集FC端口指标 PORT_STATE$(cat /sys/class/fc_host/host*/port_state) TX_SPEED$(cat /sys/class/fc_host/host*/speed) RX_FRAMES$(cat /sys/class/fc_host/host*/statistics/rx_frames) # 输出Prometheus格式指标 cat EOF # HELP fc_port_state FC port state (0LinkDown, 1Online) # TYPE fc_port_state gauge fc_port_state{hosthost0} $( [ $PORT_STATE Online ] echo 1 || echo 0 ) # HELP fc_tx_speed FC transmit speed in Gbps # TYPE fc_tx_speed gauge fc_tx_speed{hosthost0} ${TX_SPEED} # HELP fc_rx_frames FC received frames count # TYPE fc_rx_frames counter fc_rx_frames{hosthost0} ${RX_FRAMES} EOF sleep 30 done6. 版本管理与回滚策略在企业环境中完善的版本控制机制至关重要# 驱动版本管理目录结构 /opt/huawei/fc_drivers/ ├── versions │ ├── V115 │ │ ├── install.sh │ │ └── release_notes.md │ └── V116 │ ├── install.sh │ └── release_notes.md ├── current - versions/V116 └── backups └── 20230801_pre_update # 版本切换脚本 switch_driver_version() { local TARGET_VER$1 local DRIVER_DIR/opt/huawei/fc_drivers [ ! -d ${DRIVER_DIR}/versions/${TARGET_VER} ] { echo Version ${TARGET_VER} not available return 1 } # 创建回滚点 local BACKUP_NAME$(date %Y%m%d)_pre_${TARGET_VER} mkdir -p ${DRIVER_DIR}/backups/${BACKUP_NAME} cp -a /lib/modules/$(uname -r)/extra/hns3* ${DRIVER_DIR}/backups/${BACKUP_NAME}/ # 切换版本 rm -f ${DRIVER_DIR}/current ln -s ${DRIVER_DIR}/versions/${TARGET_VER} ${DRIVER_DIR}/current # 重新加载驱动 rmmod hns3 insmod ${DRIVER_DIR}/current/hns3.ko echo Switched to version ${TARGET_VER}, backup saved as ${BACKUP_NAME} }回滚流程自动化rollback_driver() { local BACKUP_DIR/opt/huawei/fc_drivers/backups/$1 [ ! -d ${BACKUP_DIR} ] { echo Backup $1 not found return 1 } echo Starting rollback process... cp -f ${BACKUP_DIR}/hns3.ko /lib/modules/$(uname -r)/extra/ depmod -a rmmod hns3 modprobe hns3 # 验证回滚结果 local CURRENT_VER$(modinfo hns3 | grep version | awk {print $2}) echo Rollback completed. Current driver version: ${CURRENT_VER} }