简介
本文档介绍如何处理Cisco IOS接入点(AP)上报告的闪存损坏问题。
先决条件
要求
Cisco建议您具备以下方面的基础知识:
- AireOS无线局域网控制器(WLC)
- 轻量AP
- Python 2.7(无更高版本)
使用的组件
本文档中的信息基于以下软件和硬件版本:
- Cisco Aironet 1040、1140、1250、1260、1600、1700、2600、2700、3500、3600、3700、700、AP801和AP802系列室内接入点
- Cisco Aironet 1520 (1522、1524)、1530、1550 (1552)、1570和工业无线3700系列户外和工业无线接入点
注意:由于闪存硬件类型的原因,Wave1 AP型号(如1700/2700/3700和2600/3600)在此问题上的普遍性高于其他AP类型。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
根据FN70330 - Cisco IOS AP由于闪存损坏问题而搁置,由于许多软件Bug和AP在正常操作中,某些Cisco IOS AP上的闪存文件系统可能会随着时间的推移而损坏。这种情况在对WLC执行升级后尤为明显,但不一定仅限于此情况。
AP在这种不易检测的问题状态下工作并为客户端提供服务。
解决方案
在WLC升级之前修复
为了确定网络中受影响的AP并在升级前修复它们。 您需要运行WLAN轮询器。
注意:升级前,请阅读整篇文档。
WLAN轮询逻辑
每次运行脚本时,它都会验证AP闪存是否可以访问。
如果可以访问,它会运行命令fsck flash:
如果一切正常,则转到下一个AP。
- 否则,请重复该命令最多4次。如果出现故障,脚本可以在最终报告中报告此问题,并且此AP符合恢复条件。
如果它不可访问
- 脚本在其最终报告中标记AP,并且此AP符合恢复条件。
如果可以访问,AP可以检查关键文件的MD5值。
如果所有值都正常,则转到下一个AP。
- 否则,脚本将在最终报告中报告此问题,并且此AP有资格恢复。
该脚本需要运行三次。
- 运行
- 该脚本根据AP上每个文件的MD5校验和值构建MD5数据库。特定文件的最终MD5值是WLC上同一AP系列的命中率较高的值。
- 运行
- 该脚本将MD5校验和值与其数据库进行比较。如果值匹配,则文件正常,如果不匹配,则标记AP以在第三次运行时恢复。
- 运行
- 脚本会触发命令test capwap image capwap,该命令仅针对之前两个步骤中标记的AP。
注意:下载并安装映像后,此恢复方法会导致AP重新加载。确保您在维护窗口中运行它。
安装/准备WLAN轮询器
1. 下载WLAN轮询器工具。
注意:如果从上一个链接下载最新版本的WLAN轮询器工具,则可以跳过步骤2和步骤3。此版本可以自动安装WLAN轮询器工具的所有必需组件。如果您有旧版本的WLAN轮询器(.rar),请执行下一步2和3。
2. 将文件移到要存储WLAN轮询器文件的特定文件夹。
3. 有关如何安装脚本的说明,请参阅下一链接:
有关Windows 10计算机上的分步指南,请单击此处。
有关MAC OS的分步指南,请点击此处。
4. 准备config.ini文件。
完成安装并生成文件后。您需要编辑文件config.ini。
指定WLC/AP连接模式:
; config global mode for WLC and AP connection: "ssh" or "telnet"
mode: ssh
ap_mode: ssh
指定WLC/AP凭证:
; set global WLC credentials
wlc_user: <wlc_user>
wlc_pasw: <wlc_pasw>
; set global AP credentials
ap_user: <ap_user>
ap_pasw: <ap_pasw>
ap_enable: <ap_enable>
对于闪存检查/恢复,有以下选项。
要识别受影响的AP,请使用:
; ap file system checks (WARNING: recover can force Cisco IOS image download and AP reload)
ap_fs_check: True
ap_fs_recover: False
要恢复AP,请使用:
; ap file system checks (WARNING: recover can force Cisco IOS image download and AP reload)
ap_fs_check: True
ap_fs_recover: True
指定WLC信息
在本示例中,WLC名称是2504-WLC。您可以在WLC Monitor页面找到此信息。
; WLC sections must be named as [WLC-<wlcname>]
[WLC-2504-Rafis]
active: True
ipaddr: <wlc-ip-addr>
您可以添加多个WLC。为此,请使用新的WLC信息复制/粘贴以前的语法。
注意:无需指定任何AP列表。该脚本从WLC获取AP。
运行WLAN轮询器
从创建配置文件的目录中(上一节,步骤3)。使用以下命令:wlanpoller --cli-logging。
完成脚本后,它将提供以下摘要:
============================================================
Summary
============================================================
Total APs : 1
Processed APs : 1
Failed APs : 0
============================================================
Errors
============================================================
AP MD5 checksum mismatch : 2
AP FSCK recover : 1
============================================================
注意:请记住,脚本需要运行2次才能获得有关受影响无线接入点数量的准确信息。
WLAN轮询器输出
在运行脚本的路径上。它创建这些文件。
- ap_md5_db.json:MD5数据库
- 文件夹日志
- 文件夹数据
- 它将报告划分为以下路径:<year> / <month> / <day>
文件: <timestamp>_ap_fs.csv - AP上执行的检查及其结果的摘要。
列说明
- ap_name:AP的名称。
- ap_type:AP型号。
- ap_uptime:AP的正常运行时间(天)。
- ap_ios_ver:Cisco IOS版本。
- fs_free_bytes:闪存文件系统中的可用字节数。
- flash_issue:如果发现任何闪存损坏,则为True。
- fs_zero_size:检测到闪存挂起时为True,文件系统显示“-”-(show file system -命令)。
- fsck_fail:如果文件系统检查失败,则为True。- (fsck flash: -命令)。
- fsck_busy:当闪存fsck时,设备或资源正忙。
- fsck_recovered:在fsck上发生错误时为True,但在下一个fsck中修复了该错误。
- fsck_attempts:fsck恢复AP的尝试次数(最多4次)。
- md5_fail:如果md5至少有一个文件与存储在数据库中的文件不同,则为True。
- rcv_trigger:当检测到问题且已启用恢复时,AP尝试从WLC下载映像时为True。
文件: <timestamp>_ap_md5.csv所有文件(在所有AP上)的MD5校验和值的详细信息。
列说明
- ap_name:AP的名称。
- ap_type:AP型号。
- ap_uptime:AP的正常运行时间(天)。
- filename:Cisco IOS映像文件名。
- md5_hash:文件名的md5值。
- is_good:真正的md5值与存储在数据库中的值匹配。发现此文件的md5不匹配。
- is_zero_bytes:如果基于md5checksum文件名包含0个字节,则为True,因此文件不正确。
- md5_error:如果无法获取md5作为文件名,则返回错误消息“检索md5值”。
注意:在某些情况下,WLAN轮询器恢复脚本可能无法恢复某些AP,并且这些AP在报告中仍标记为发生故障。在这些情况下,建议通过telnet/SSH/控制台手动将AP恢复到AP CLI。如果您需要有关此流程的帮助,请打开TAC SR。将WLAN轮询器生成的所有输出附加到案例。
已中断AP
如果SSH/Telnet连接
您可以执行以下步骤尝试恢复AP:
AP# debug capwap console cli
AP# debug capwap client no-reload
- 如果成功则格式化flash,然后您可以继续执行下一步else quit。
AP# format flash:
archive download-sw /overwrite tftp://<IP address>/<file name>
AP# verify /md5 flash:/<image directory>/<image file>
您可以将CLI值与思科网页上的值进行比较。
AP#show boot
AP(config)#boot system flash:/RCV/RCV-image
如果AP Rommon状态
您可以尝试与之前相同的方式,但使用boot命令。以下是您可以使用的命令:
ap: tftp_init
ap: ether_init
ap: flash_init
ap: format flash:
ap: set IP_ADDR <IP Address>
ap: set NETMASK <mask>
ap: set DEFAULT_ROUTER < default router >
ap: tar -xtract tftp://<IP address>/<file name> flash:
ap: set BOOT flash:/<file name>
ap: boot
无法使用SSH/Telnet
退回交换机端口,多次验证是否有效。
在Windows 10上安装WLAN轮询器的分步指南
注意:如果下载最新版本的WLAN轮询器工具,则可跳过此部分。
- 从此链接下载并安装Python 2.7.14。
- 从此链接下载并安装适用于Windows客户端的C++编译器。
- 安装完成后,转至控制面板上的“系统设置”,然后选择“高级系统设置”(Advanced System Settings)(确保关闭所有Windows终端):
- 在弹出窗口中,选择Environment Variables。
- 在该视图中,从系统变量中选择Path变量并单击Edit。
- 在该窗口中,将路径添加到安装Python 2.7.14.0的基本目录和C:\<Base directory>\Scripts,以便笔记本电脑的命令行可识别python命令。单击New并手动添加路径。
关闭所有设置窗口,如果有的话,打开终端(命令提示符)。
- 验证是否已安装pip,打开一个新终端并输入pip —version:
另一个选项是检查文件夹中是否存在名为pip、pip2或pip2.7的文件:C:\Python27\Scripts :
- 如果一切正常,请转至upgrade pip部分,步骤8。
- 如果出现错误,或者找不到文件夹/文件,请继续阅读。
安装pip
- 关闭终端并从下一链接安装pip。
- 下载并保存文件get-pip.py。 在网站上寻找:
- 将get-pip-py文件复制到文件夹C:\Python27中。
注意:如果从网站复制并粘贴内容,请确保其不具有py.txt扩展名,然后将此项与文件夹C:\Python27上的dir一起检查,如果发生这种情况,请从终端重命名该文件。
使用下一命令重命名该文件:
- 在同一文件夹C:\Python27上,执行python get-pip.py。
- 使用下一个命令将PIP升级到最新版本:pip install —upgrade pip。
- 上述步骤可以安装所需的所有数据包。现在打开用于Windows的命令行并转到存储.tar.gz WLAN轮询器文件的目录(使用:cd <Path to directory>)。
- 使用命令pip install wlanpoller-0.7.1.dev90_md5rcv.tar.gz安装脚本。
- 创建一个要存储所有WLAN轮询器信息的新目录。
- 在命令行中,转到该目录并运行命令wlanpoller —generate-configs,以创建运行脚本所需的设置变量和配置文件:
点击此处继续使用config.ini文件。
在MacBook上安装WLAN轮询器的分步指南
注意:如果下载最新版本的WLAN轮询器工具,则可跳过此部分。
MAC OS已安装python。要安装其余数据包,请执行以下步骤:
- 移到使用WLAN Poller file: cd <path>的文件夹。
- 运行以下命令之后:sudo pip install wlanpoller-<version>.tar.gz。为此,您需要输入sudo密码(MACBook Admin密码)。
- 创建新目录以组织脚本可以创建的所有文件。
- mkdir <directory name>
- cd <directory name>
- 执行下一个命令,以便脚本准备运行脚本所需的所有目录/文件:wlanpoller —generate-configs。
点击此处继续使用config.ini文件。
WLAN轮询器限制
- WLAN轮询器仅经过测试,可支持Windows 10 64位系统和Apple MacBook 10.11版或更高版本。
- 如果未使用较新版本的WLANPoller工具,则较旧版本仅支持Python 2.7版本。
- 如果AP名称包含特殊字符(例如),则会在脚本执行期间看到下一个错误。
相关信息