Linux 硬件管理与运维脚本实践

Linux 硬件管理与运维脚本实践

概述

在日常 Linux 服务器运维工作中,硬件存储管理、服务可用性监控是两项核心任务。本文基于实际生产环境经验,整理了三个典型运维场景的操作方法:CentOS 7 环境下挂载 iSCSI 存储目标、编写域名拨测监控脚本、以及浪潮 PM8204 RAID 控制器缓存状态管理。三个主题涵盖了存储配置、自动化监控和硬件调优三个运维维度,适合运维工程师在日常工作中参考。


第1章:CentOS 7 挂载 iSCSI 存储

iSCSI(Internet Small Computer System Interface)是一种基于 IP 网络的存储协议,能够将远程存储设备映射为本地块设备。在生产环境中,NAS(如群晖 Synology)或 SAN 存储设备常常通过 iSCSI 协议向服务器提供存储空间。本章介绍在 CentOS 7 上从零配置 iSCSI 客户端并挂载远程存储的完整流程。

1.1 安装必要软件包

首先安装 iSCSI 启动器及 XFS 文件系统相关组件:

yum install -y binutils iscsi-initiator-utils kmod-xfs xfsprogs

各组件说明如下:

包名用途
iscsi-initiator-utilsiSCSI 客户端(启动器)核心工具集
binutils二进制工具集,部分依赖所需
kmod-xfsXFS 文件系统内核模块
xfsprogsXFS 文件系统管理工具(mkfs.xfs 等)

1.2 启动 iSCSI 服务并设置开机自启

service iscsi start
chkconfig iscsi on

验证服务运行状态:

service iscsi status

1.3 发现 iSCSI 目标

使用 iscsiadm 的 discovery 模式扫描存储服务器上发布的 iSCSI Target:

iscsiadm -m discovery --type sendtargets --portal 10.76.43.177

命令执行后,会返回类似如下的目标 IQN(iSCSI Qualified Name)列表:

10.76.43.177:3260,1 iqn.2000-01.com.synology:NAS.Target-21.9898a6c61d

其中 iqn.2000-01.com.synology:NAS.Target-21.9898a6c61d 即为远程存储的唯一标识符。

1.4 配置开机自动登录

为避免每次重启后手动登录,将目标节点的启动策略设为 automatic:

iscsiadm -m node \
  -T iqn.2000-01.com.synology:NAS.Target-21.9898a6c61d \
  -p 10.76.43.177:3260 \
  --op update -n node.startup -v automatic

参数说明:

  • -m node:操作模式为节点管理
  • -T:指定目标 IQN
  • -p:指定目标 IP 和端口(默认端口 3260)
  • --op update -n node.startup -v automatic:将启动策略更新为自动

1.5 登录 iSCSI 目标

执行登录命令建立连接:

iscsiadm -m node \
  -T iqn.2000-01.com.synology:NAS.Target-21.9898a6c61d \
  -p 10.76.43.177:3260 \
  --login

登录成功后,远程存储将以本地磁盘设备形式出现,一般为 /dev/sdb/dev/sdc 等。

1.6 验证连接状态

iscsiadm -m session

输出当前所有活跃的 iSCSI 会话信息,确认连接建立正常。

1.7 磁盘分区、格式化与挂载

确认系统已识别新磁盘后,按照标准流程进行分区、格式化和挂载:

# 查看新磁盘设备名
lsblk

# 假设新磁盘为 /dev/sdb,使用 fdisk 分区
fdisk /dev/sdb

# 格式化为 XFS 文件系统
mkfs.xfs /dev/sdb1

# 创建挂载点并挂载
mkdir -p /data
mount /dev/sdb1 /data

# 写入 /etc/fstab 实现开机自动挂载
echo "/dev/sdb1 /data xfs defaults,_netdev 0 0" >> /etc/fstab
注意:挂载 iSCSI 磁盘时,/etc/fstab 中务必添加 _netdev 挂载选项,确保系统在网络服务启动后再挂载该文件系统,避免启动时因网络未就绪而挂载失败。

第2章:域名拨测监控脚本

生产环境中,对外服务的域名可用性至关重要。本章展示一个 Bash 拨测脚本,定时检测域名 HTTP 状态码并记录成功率,适合配合 cron 或 systemd timer 实现自动化监控。

2.1 脚本整体设计

脚本核心思路如下:

  1. 从文本文件中读取待检测的域名列表
  2. 对每个域名发起 HTTP HEAD 请求,获取状态码
  3. 根据状态码判断服务是否正常
  4. 将检测结果和累计成功/失败次数写入日志

2.2 完整脚本

#!/bin/bash
#
# 域名拨测监控脚本 (domain_check.sh)
# 功能:定时检测域名 HTTP 状态码,记录可用性日志
#

LOG_FILE="/root/dns_check.log"
DOMAIN_LIST="/root/web.txt"

# 初始化计数器
success=0
fail=0

# 清空旧日志
> "$LOG_FILE"

# 拨测函数
dns_check() {
    # 从文件读取域名列表
    local domains
    mapfile -t domains < "$DOMAIN_LIST"

    for domain in "${domains[@]}"; do
        # 跳过空行和注释行
        [[ -z "$domain" || "$domain" =~ ^# ]] && continue

        local now_date
        now_date=$(date '+%Y-%m-%d %H:%M:%S')

        local http_code
        http_code=$(curl -I -m 5 -o /dev/null -s -w '%{http_code}' "$domain" 2>/dev/null)

        if [[ "$http_code" == "000" ]]; then
            # 连接超时或 DNS 解析失败
            echo "$now_date [FAIL] $domain - 连接失败(超时/DNS 错误)" >> "$LOG_FILE"
            fail=$((fail + 1))
        elif [[ "$http_code" -ge 200 && "$http_code" -lt 400 ]]; then
            # 2xx/3xx 视为正常
            echo "$now_date [OK] $domain - HTTP $http_code" >> "$LOG_FILE"
            success=$((success + 1))
        else
            # 4xx/5xx 视为异常
            echo "$now_date [FAIL] $domain - HTTP $http_code" >> "$LOG_FILE"
            fail=$((fail + 1))
        fi
    done

    # 输出累计统计
    {
        echo "---"
        echo "$now_date 累计成功: ${success} 次"
        echo "$now_date 累计失败: ${fail} 次"
        echo "---"
    } >> "$LOG_FILE"
}

# 主循环:每 60 秒执行一次
while true; do
    dns_check
    sleep 60
done

2.3 域名列表文件格式

/root/web.txt 每行一个域名,支持 # 开头的注释行:

https://www.example.com
https://api.example.com
# 以下为内网服务
https://internal.example.com

2.4 脚本关键设计点

状态码判断策略

脚本将 2xx 和 3xx 状态码均视为正常响应,覆盖了重定向场景。对于连接超时(curl 返回 000),单独标记为连接失败并附原因说明。实际使用时可根据服务特点调整判断阈值。

超时控制

curl -m 5 设置单次请求的超时时间为 5 秒,防止因某个域名无响应导致整个检测循环阻塞。

累计统计

每次检测周期完成后输出累计成功与失败次数,便于运维人员快速判断服务长期稳定性趋势,而不仅仅是单次快照。

2.5 部署方式

方式一:nohup 后台运行

nohup bash /root/domain_check.sh &

方式二:使用 systemd 管理(推荐)

创建服务单元文件 /etc/systemd/system/domain-check.service

[Unit]
Description=Domain Health Check Monitor
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash /root/domain_check.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now domain-check.service

第3章:浪潮 PM8204 RAID 控制器缓存状态管理

浪潮英信服务器搭载的 PM8204 RAID 卡在默认配置下,部分阵列的缓存(Cache)可能处于关闭状态,直接影响磁盘读写性能。本章介绍如何使用 Microsemi(原 Adaptec)官方工具 Arcconf 检查并开启缓存。

3.1 背景说明

PM8204 是基于 Microsemi 芯片的 12Gb/s SAS RAID 控制器。其阵列缓存有三种常见状态:

状态含义性能影响
Controller Cache控制器缓存已开启读写性能最优
SSD I/O BypassSSD I/O 直通,绕过缓存适用于 SSD,但关闭了缓存加速
None缓存完全关闭读写性能最低,不推荐

对于 HDD 阵列,缓存必须开启才能保证合理的读写性能。对于 SSD 阵列,厂商默认建议使用 SSD I/O Bypass 模式以确保数据一致性,但若业务场景允许,也可开启缓存进一步提升性能。

3.2 安装 Arcconf 工具

将适配当前系统版本的 Arcconf RPM 包上传至服务器后安装:

rpm -ivh Arcconf-3.03-23668.x86_64.rpm

安装后工具位于 /usr/Arcconf 目录下。

3.3 查看阵列缓存状态

cd /usr/Arcconf
./arcconf getconfig 1 ld | grep LD

输出示例:

Logical Device number 0
   Logical Device name                      : RAID5-Array
   SSD I/O Bypass                           : Enabled
Logical Device number 1
   Logical Device name                      : RAID1-Array
   Controller Cache                         : Enabled

从输出中可根据 SSD I/O BypassController Cache 字段判断各逻辑驱动器(LD)的缓存状态。

3.4 开启所有阵列缓存

./arcconf setcache 1 logicaldrive all con

参数说明:

  • 1:控制器编号(controller ID)
  • logicaldrive all:作用于所有逻辑驱动器
  • con:指定缓存模式为 Controller Cache(即启用控制器缓存)

3.5 处理 SSD I/O Bypass 冲突

如果执行上述命令后阵列缓存状态仍未改变,仍显示为 SSD I/O Bypass,需要先关闭 SSD I/O Bypass 功能:

./arcconf setarrayparam 1 1 ssdiobypass disable

其中 1 1 依次为控制器编号和逻辑驱动器编号。关闭后再执行第 3.4 节的开启缓存命令即可生效。

操作建议:修改 RAID 缓存设置前建议暂停该阵列上的 IO 密集型业务,虽通常可在线操作,但为确保数据安全,优先在维护窗口执行。

结语

本文覆盖了 Linux 运维中三个常见但重要的实践场景:

  1. iSCSI 存储挂载:从软件安装、目标发现到自动登录和持久化挂载的完整链路,关键是 _netdev 选项避免重启挂载失败。
  2. 域名拨测脚本:简洁的 Bash 监控方案,通过状态码判断和累计统计,满足中小规模服务的可用性监控需求。
  3. RAID 缓存管理:PM8204 控制器的缓存状态检查与切换方法,尤其注意 SSD 场景下 SSD I/O BypassController Cache 的权衡。

这些脚本和操作方法均来自实际生产环境验证,读者可根据自身环境调整参数后直接使用。

暂无评论