一种紧急探查系统信息的方法及模块 技术领域 本发明涉及系统故障检测技术, 特别是涉及一种在 Linux 操作系统故障时的紧急 探查系统信息的方法及模块。
背景技术 随着 Linux 企业应用的成熟, Linux 已被广泛应用于服务器领域, 并且随着 Linux 上业务应用的不断增加, 需要 Linux 提供更加稳定、 可靠及高效的系统服务以保证业务的 连续运行。即使是在 Linux 出现故障 ( 特别是系统挂起、 用户输入无响应, 但内核还在正常 运行 ) 时, 也应保证其上运行业务的不间断运行。因此需要提供一种技术来在线对 Linux 出现此类故障时进行实时的在线分析、 定位及修复, 以保证在不停止其上运行业务的情况 下实时的在线修复此类故障。
目前的解决方法一般有以下几种 :
(1) 一种是通过在 Linux 的本地终端登陆, 然后进行实时在线的故障处理。 但是这 种方法的缺点是在 Linux 出现故障且本地终端不可用时, 将无法完成故障的处理。
(2) 另一种是使用远程工具登陆发生故障的 Linux, 然后通过登录终端进行实时 的在线故障处理。但这种方法的缺点是当 Linux 出现故障且网络可用, 而提供远程登陆的 服务因无法获得系统调度时, 将导致远程工具无法正常登陆来完成故障的处理。
(3) 另外就是利用 SysRq(System Request) 键来排除和诊断系统故障, 通过它提 供的一些指令能够在系统挂起的情况下获取系统当前的信息, 如 CPU、 内存及进程等, 即通 过 SysRq 键提供的指令直接请求内核的响应, 并将结果以日志的方式记录在相关日志文件 里, 从而在 Linux 用户态无法提供正常功能的情况下获取系统的当前信息。但这种方法的 缺点是在执行完 SysRq 键提供的指令后, 需要重新启动出现故障的 Linux 才能查看诊断的 日志结果, 从而导致 Linux 其上运行的业务中断而不能对外提供正常的业务。
发明内容 本发明要解决的技术问题是提供一种紧急探查系统信息的方法及装置, 以实现在 故障发生时, 不关机重启 Linux, 即保证运行其上的业务的正常运行, 就能完成在线收集系 统当前运行信息、 分析故障原因、 实施在线修复措施的紧急探查方法。
为了解决上述技术问题, 本发明提供了一种紧急探查系统信息的方法, 应用于 Linux 操作系统, 包括 :
在 Linux 操作系统初始化时, 将紧急故障探查程序加载到内核, 创建紧急故障探 查线程 ;
接收到预定功能键的按键消息后, 触发所述紧急故障探查线程监听远程客户端的 连接请求 ;
所述紧急故障探查线程监听到远程客户端的连接请求后, 与所述远程客户端建立 连接, 根据所述远程客户端的命令请求探查系统信息, 并将探查到的系统信息发送给所述
远程客户端。
进一步地, 上述方法还具有下面特点 : 所述紧急故障探查线程监听远程客户端的 连接请求的步骤包括 :
所述紧急故障探查线程创建网络监听套接字 (Socket), 绑定监听地址和端口, 然 后开始监听所述远程客户端的连接请求。
进一步地, 上述方法还具有下面特点 : 所述紧急故障探查线程监听远程客户端的 连接请求的步骤还包括 :
所述紧急故障探查线程若在预定时间内未监听到所述远程客户端的连接请求, 则 返回到休眠状态。
进一步地, 上述方法还具有下面特点 : 所述紧急故障探查线程与所述远程客户端 建立连接的步骤之后, 所述方法还包括 :
所述紧急故障探查线程对所述远程客户端进行验证。
进一步地, 上述方法还具有下面特点 : 所述探查系统信息包括 :
从 proc 文件系统中读取系统信息, 或从内核中读取系统信息, 所述系统信息包 括: 进程信息、 内存信息和虚拟内存信息 ; 或
获取 Linux 操作系统上的文件内容信息。
进一步地, 上述方法还具有下面特点 : 所述预定功能键为系统请求 (SysRq) 组合 键。
为了解决上述问题, 本发明还提供了一种紧急探查系统信息模块, 应用于 Linux 操作系统, 其特征在于, 包括 : 主控子模块和命令子模块, 其中,
所述主控子模块包括 :
初始化单元, 用于在 Linux 操作系统初始化时, 将紧急故障探查程序加载到内核, 创建紧急故障探查线程 ;
触发单元, 基于紧急故障探查线程实现, 用于接收到预定功能键的按键消息后, 触 发监听单元 ;
所述监听单元, 基于紧急故障探查线程实现, 用于通过所述紧急故障探查线程监 听远程客户端的连接请求 ;
连接单元, 基于紧急故障探查线程实现, 用于在所述紧急故障探查线程监听到远 程客户端的连接请求后, 建立所述紧急故障探查线程与所述远程客户端之间的连接, 将所 述远程客户端的命令请求发送给所述命令模块 ;
所述命令子模块, 基于紧急故障探查线程实现, 用于根据所述远程客户端的命令 请求探查系统信息, 并将探查到的系统信息发送给所述远程客户端。
进一步地, 上述模块还具有下面特点 :
所述监听单元通过所述紧急故障探查线程监听远程客户端的连接请求时, 是通过 所述紧急故障探查线程创建网络监听套接字 (Socket), 绑定监听地址和端口, 然后开始监 听所述远程客户端的连接请求。
进一步地, 上述模块还具有下面特点 :
所述监听单元, 还用于若判断所述紧急故障探查线程在预定时间内未监听到所述 远程客户端的连接请求, 则将所述紧急故障探查线程返回到休眠状态。进一步地, 上述模块还具有下面特点 :
所述连接单元在建立所述紧急故障探查线程与所述远程客户端之间的连接之后 还用于, 对所述远程客户端进行验证。
进一步地, 上述模块还具有下面特点 :
所述命令子模块根据所述远程客户端的命令请求探查系统信息时, 是从 proc 文 件系统中读取系统信息, 或从内核中读取系统信息, 所述系统信息包括 : 进程信息、 内存信 息和虚拟内存信息 ; 或者, 获取 Linux 操作系统上的文件内容信息。
综上, 本发明提供一种紧急探查系统信息的方法及模块, 通过扩展 SysRq 键功能, 将实现直接植入内核, 以在 Linux 系统出现故障 ( 特别是系统挂起、 用户输入无响应, 但内 核还在正常运行 ) 时提供不关机重启的状态下, 提供故障 Linux 系统的信息, 例如, 进程信 息、 内存信息、 虚拟内存信息及文件内容查看功能等, 以进行故障分析、 定位及修复。 附图说明
图 1 为本发明实施例的紧急探查系统信息模块的示意图 ; 图 2 是本发明实施例的主控子模块的示意图 ; 图 3 为本发明实施例的紧急探查系统信息的方法的流程图 ; 图 4 为本发明实施例的实现 esh 线程状态机的示意图 ; 图 5 为本发明实施例的直接从内核获取进程信息的示意图 ; 图 6 为本发明实施例的直接从内核获取内存信息的示意图 ; 图 7 为本发明实施例的直接从内核获取虚拟内存信息的示意图 ; 图 8 为本发明实施例的直接从 proc 文件系统获取进程信息的示意图 ; 图 9 为本发明实施例的直接从 proc 文件系统获取内存信息的示意图 ; 图 10 为本发明实施例的直接从 proc 文件系统获取虚拟内存信息的示意图。具体实施方式
本发明的主要是设计一个扩展 SysRq 键功能, 运行于内核, 基于优先级应用于 Linux 系统的用于紧急探查系统信息的内核支持模块, 简称 esh(Emergency Shell, 紧急 Shell, 本发明中也称为紧急探查系统信息模块 )。
下面结合附图及实施例对本发明的技术方案进行更详细的说明。
图 1 为本发明实施例的紧急探查系统信息模块的示意图, 如图 1 所示, 本实施例的 紧急探查系统信息模块主要包含三个子模块 :
主控子模块, 主要用于实现 esh 的线程状态机、 对模块启动、 连接建立、 密码验证、 命令执行等过程进行控制 ;
命令子模块, 主要用于实现 esh 所支持的全部用户命令, 根据主控子模块的分发 的用户命令执行相应的命令, 并将命令结果返回给客户端 ;
网络子模块, 主要用于向主控子模块和命令子模块提供网络服务支持, 对所需的 Linux 内核网络服务进行统一的接口封装。
具体地, 如图 2 所示, 本实施例中的主控子模块可以包括 : 初始化单元、 触发单元、 监听单元和连接单元, 其中,初始化单元, 用于在 Linux 操作系统初始化时, 将紧急故障探查程序加载到内核, 创建紧急故障探查线程, 然后将该紧急故障探查线程置为休眠状态 ;
触发单元, 基于紧急故障探查线程实现, 用于接收到预定功能键的按键消息后, 触 发监听单元 ;
所述监听单元, 基于紧急故障探查线程实现, 用于通过所述紧急故障探查线程监 听远程客户端的连接请求 ;
连接单元, 基于紧急故障探查线程实现, 用于在所述紧急故障探查线程监听到远 程客户端的连接请求后, 建立所述紧急故障探查线程与所述远程客户端之间的连接, 将所 述远程客户端的命令请求发送给所述命令模块 ;
所述命令子模块, 基于紧急故障探查线程实现, 用于根据所述远程客户端的命令 请求探查系统信息, 并将探查到的系统信息发送给所述远程客户端。
这样, 本发明实施例的紧急探查系统信息模块能够在故障发生时, 不关机重启 Linux, 即保证运行其上的业务的正常运行, 就能完成在线收集系统当前运行信息、 分析故 障原因、 实施在线修复措施。
具体地, 所述监听单元通过所述紧急故障探查线程监听远程客户端的连接请求 时, 是通过所述紧急故障探查线程创建网络监听套接字 (Socket), 绑定监听地址和端口, 然 后开始监听所述远程客户端的连接请求。 所述监听单元还可用于若判断所述紧急故障探查线程在预定时间内未监听到所 述远程客户端的连接请求, 则将所述紧急故障探查线程返回到休眠状态。
进一步地, 所述连接单元在建立所述紧急故障探查线程与所述远程客户端之间的 连接之后还用于, 对所述远程客户端进行验证, 以保证在远程客户端在获得 esh 的合法授 权后, 再接受远程客户端的命令, 以保证操作的安全性。
进一步地, 所述命令子模块根据所述远程客户端的命令请求探查系统信息时, 是 从 proc 文件系统中读取系统信息, 或从内核中读取系统信息, 所述系统信息包括 : 进程信 息、 内存信息和虚拟内存信息 ; 或者, 获取 Linux 操作系统上的文件内容信息。
本发明实施例中, 命令子模块既可以直接读取内核中的数据 ( 如图 5、 图 6、 图 7), 也可以直接读取 /proc 文件系统中的数据 ( 如图 8、 图 9、 图 10)。执行命令时优先选择从 /proc 文件系统中读取数据, 但考虑到 /proc 文件系统存在无法使用的可能, 一旦出现这种 情况, 命令将自动切换到直接从内核读取数据。
具体地, 在 Linux 出现故障 ( 特别是系统挂起、 用户输入无响应, 但内核还在正常 运行 ) 时, 本发明实施例能够提供故障 Linux 的以下信息 :
(1) 进程信息 : 进程所属的用户、 进程 ID、 进程占用的 CPU 使用率、 进程占用的内存 使用率、 进程占用的虚拟内存大小、 进程占用的内存大小、 进程的当前运行状态、 创建该进 程的命令字符串等 ;
(2) 内存信息 : 物理内存总量、 已分配内存大小、 未被分配的内存大小、 共享内存 大小、 系统分配但未被使用的缓存区大小、 系统分配但未被使用的高速缓存大小等 ;
(3) 虚拟内存 : 运行和等待 CPU 时间片的进程数、 在等待资源的进程数、 切换到内 存交换区的内存数量、 当前空闲页面列表中内存数量、 作为缓存区高速缓存的内存数量、 作 为页面高速缓存的内存数量、 由内存进入内存交换区数量、 由内存交换区进入内存数量、 从
块设备读入数据的总量、 块设备写入数据的总量、 某一时间间隔中观测到的每秒设备中断 数、 每秒产生的上下文切换次数、 用户模式下所花费 CPU 时间的百分比、 内核进程所花费的 CPU 时间的百分比、 IO 等待所占用的 CPU 时间的百分比、 CPU 处在空闲状态的时间百分比、 运行虚拟机的时间内执行其他任务的时间百分比等。
(4) 文件内容查看 : 通过本发明实施例中的文件查看命令可以直接查看故障 Linux 上的文件内容, 以查看更详细的日志信息, 如运行过程产生的日志。
图 3 为本发明实施例的紧急探查系统信息的方法的流程图, 如图 3 所示, 本实施例 的方法应用于 Linux 操作系统, 可以包括下面步骤 :
S10、 在 Linux 操作系统初始化时, 将紧急故障探查程序加载到内核, 创建紧急故 障探查线程, 然后将该紧急故障探查线程置为休眠状态 ;
具体地, 在操作系统初始化时, 首先将 esh 加载到内核, 以内核模块的方式运行于 操作系统内, 并完成 esh 线程的创建。当创建 esh 线程时, 先将 esh 线程置为休眠状态, 并 在系统正常运行期间一直保持休眠状态。
S20、 接收到预定功能键的按键消息后, 触发所述紧急故障探查线程监听远程客户 端的连接请求 ; 具体地, 在操作系统运行的过程中需要启用 esh 线程时, 通过使用 SysRq 组合键唤 醒 esh 线程, 使之开始监听指定的网络端口 ( 例如, 网络端口 9132), 并等待客户端程序的连 接请求。
具体地, esh 线程创建网络监听套接字 (Socket), 绑定监听地址和端口, 然后开始 监听所述远程客户端的连接请求。
进一步地, esh 线程若在预定时间内未监听到所述远程客户端的连接请求, 则返回 到休眠状态。
S30、 所述紧急故障探查线程监听到远程客户端的连接请求后, 与所述远程客户端 建立连接, 根据所述远程客户端的命令请求探查系统信息, 并将探查到的系统信息发送给 所述远程客户端。
具体地, 管理员可以使用 telnet 客户端远程连接到 esh, 以建立远程客户端与 esh 的通信链路, 然后输入 esh 的授权用户名及密码。远程客户端在获得 esh 的合法授权后, 可 以向 esh 发送指定的命令请求, 以获得系统的当前运行状态、 故障的在线定位及修复等。
本发明实施例的紧急探查系统信息的方法通过扩展 SysRq 键功能, 将实现直接植 入内核, 以在 Linux 出现故障 ( 特别是系统挂起、 用户输入无响应, 但内核还在正常运行 ) 时提供不关机重启 Linux 状态下提供故障 Linux 的进程信息、 内存信息、 虚拟内存信息及文 件内容查看功能等, 以进行故障分析、 定位及修复。
图 4 为本发明实施例的实现 esh 线程状态机的示意图, 如图 4 所示, 本实施例的主 控子模块实现的 esh 线程状态机可以分为四种状态 :
一是休眠 (SLEEP) 状态 : esh 线程被创建并进行相应的初始化设置之后处于该 SLEEP 状态 ;
二是连接 (CONNECT) 状态 : 处于 SLEEP 状态的 esh 线程被 SysRq 组合键唤醒之后 即处于该 CONNECT 状态, esh 线程将在该 CONNECT 状态中等待客户端的连接请求。 如果连接 失败或者在 10 分钟之内没有收到客户端的连接请求, esh 线程将重新返回到 SLEEP 状态 ;
三是验证 (PASSWD) 状态 : esh 线程和客户端之间的连接成功建立后即处于该 PASSWD 状态, esh 线程将在该 PASSWD 状态中等待用户输入密码并加以验证, 若用户在预定 次数 ( 例如 3 次 ) 之内未能输入正确的密码, 或者用户在这个过程中超过 30 分钟没有任何 操作, esh 线程将重新返回到 SLEEP 状态 ;
四是命令 (COMMAND) 状态 : 指用户通过验证后 esh 线程所处的状态, esh 线程将在 该 COMMAND 状态中以无限循环的方式等待用户输入命令, 随后执行用户的命令并将结果返 回给用户, 然后等待用户输入下一条命令。但是用户一旦输入 exit 命令或用户在预定时间 ( 例如 30 分钟 ) 内没有任何操作, esh 线程将重新返回到 SLEEP 状态。
如图 4 所示, esh 线程一旦进入 CONNECT 状态就开始启动建立网络连接的过程 : 首 先创建网络监听套接字 (socket), 绑定监听地址和端口 ; 完成地址和端口的绑定后, 就开 始监听来自客户端的连接请求。
同时本发明实施例在监听过程中引入了超时机制, 例如, 如果监听 socket 在 10 分钟内没有任何输入数据, esh 线程将离开 CONNECT 状态, 重新返回到 SLEEP 状态 ; 如果 在 10 分钟内收到了来自客户端的连接请求, esh 线程将执行建立连接的操作, 得到已连 接的 socket, 以供后续数据交互使用, 从而完成整个连接的建立过程, 而 esh 线程也将从 CONNECT 状态迁移到 PASSWD 状态。
图 5 为本发明实施例的直接从内核获取进程信息的示意图, 如图 5 所示, 本实施例 的命令子模块直接从内核中获取进程信息的步骤如下 :
(1) 遍历内核中的任务链表 ;
(2) 获取每个任务的 task_struct 结构体 ;
(3) 从每个任务的 task_struct 结构体中获取与进程相关的信息 ;
(4) 对获取的与进程相关的信息进行处理, 并返回给用户。
获取与进程相关的信息可以包括 : 例 如, 进 程 的 当 前 运 行 状 态 (STAT)、 进程 ID(PID)、 进程占用的 CPU 使用率 (% CPU)、 进程占用的内存使用率 (% MEN)、 进程占用的虚 拟内存大小 (VSZ)、 进程占用的内存大小 (RSS)、 进程所属的用户 (UESR)、 创建该进程的命 令字符串 (COMMAND)。
图 6 为本发明实施例的直接从内核获取内存信息的示意图, 如图 6 所示, 本实施例 的命令子模块直接从内核中获取内存信息的步骤如下 :
(1) 初始化 sysinfo 结构体 ;
(2) 填充 sysinfo 结构体 ;
(3) 从 sysinfo 结构体获取与内存相关的信息 ;
(4) 对获取的与内存相关的信息进行处理, 并返回给用户。
获取与内存相关的信息可以包括 : 物 理 内 存 总 量 (total)、 已分配内存大小 (used)、 未被分配的内存大小 (free)、 共享内存大小 (shared)、 系统分配但未被使用的缓 存区大小 (buffers)、 系统分配但未被使用的高速缓存大小 (cached) 等 ;
图 7 为本发明实施例的直接从内核获取虚拟内存信息的示意图, 如图 7 所示, 本实 施例的命令子模块直接从内核中获取虚拟内存信息的步骤如下 :
(1) 从 CPU 的运行队列中获取与虚拟内存信息相关的结构体信息 ;
(2) 从获取的结构体信息中获取与虚拟内存相关的原始数据 ;(3) 对获取的与虚拟内存相关的信息进行处理, 并返回给用户。
本实施例中获取与虚拟内存相关的原始数据可以包括 : 运行和等待 CPU 时间片的 进程数 (r)、 在等待资源的进程数 (b)、 切换到内存交换区的内存数量 (swpd)、 当前空闲页 面列表中内存数量 (free)、 作为缓存区高速缓存的内存数量 (buff)、 作为页面高速缓存的 内存数量 (cache)、 由内存进入内存交换区数量 (si)、 由内存交换区进入内存数量 (so)、 从 块设备读入数据的总量 (bi)、 块设备写入数据的总量 (bo)、 某一时间间隔中观测到的每秒 设备中断数 (in)、 每秒产生的上下文切换次数 (cs)、 用户模式下所花费 CPU 时间的百分比 (us)、 内核进程所花费的 CPU 时间的百分比 (sy)、 IO 等待所占用的 CPU 时间的百分比 (id)、 CPU 处在空闲状态的时间百分比 (wa)、 运行虚拟机的时间内执行其他任务的时间百分比 (st) 等。
图 8 为本发明实施例的直接从 proc 文件系统获取进程信息的示意图, 如图 8 所 示, USER 及 PID 的值是从 /proc/pid/status 文件中获取 ; % CPU 及 STAT 的值是从 /proc/ pid/stat 文件中获取 ; % MEM、 VSZ 及 RSS 的值是从 /proc/pid/statm 文件获取 ; COMMAD 的 值是从 /proc/pid/cmdline 中获取。
图 9 为本发明实施例的直接从 proc 文件系统获取内存信息的示意图, 如图 9 所 示, total、 free、 buffers、 cached 的值均从 /proc/meminfo 中获取, 并且 used 的值等于 total 的值减去 free 的值。 图 10 为本发明实施例的直接从 proc 文件系统获取虚拟内存信息的示意图, 如图 10 所示, 给出了命令子模块中直接从 proc 中获取虚拟内存信息的关系图 : r 及 b 的值是从 /proc/pid/stat 文件中获取 ; si、 so、 bi、 bo、 in、 cs、 us、 sy、 id、 wa 及 st 的值是从 /proc/ stat 文件中获取 ; swpd、 free、 buff 及 cache 的值是从 /proc/meminfo 文件中获取。
本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令 相关硬件完成, 所述程序可以存储于计算机可读存储介质中, 如只读存储器、 磁盘或光盘 等。可选地, 上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应 地, 上述实施例中的各模块 / 单元可以采用硬件的形式实现, 也可以采用软件功能模块的 形式实现。本发明不限制于任何特定形式的硬件和软件的结合。
以上仅为本发明的优选实施例, 当然, 本发明还可有其他多种实施例, 在不背离本 发明精神及其实质的情况下, 熟悉本领域的技术人员当可根据本发明作出各种相应的改变 和变形, 但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。