• 冒险村物语
  • 英雄无敌3塔防
  • 驾考家园手游

Linux下一些故障现象以及解决的相关资源

2012-09-08

获得中软Linux3.1服务版以及随后获得升级补丁光盘在联想万全服务器进行安装,在安装至分区界面发生“设备无法找到”的错误提示,安装程序异常退出安装进程。 
  
  

在安装过程中击键[Ctrl]+[Alt]+F3查看安装进程日志以及[Ctrl]+[Alt]+[F4]查看系统相关消息,获得信息为无法寻找正确设备ID号。 
  
  

分析: 
  
  

中软3.1版本自带的AIC-78xx并不能很好的支持的SCSI硬盘的驱动。安装程序在引导时无法在initrd所解压的程序模块寻找到正确的驱动与设备ID相对应,因此需要修改升级安装光盘驱动程序,采用磁盘方式预先加载SCSI AIC78XX驱动。 
  
  

解决办法: 
  
  

从官方站点获取Adaptec AIC-78xx的SCSI驱动,并在RH7.2系统环境制作与中软3.1内核(2.4.18)一致的SCSI驱动。 
  
  

从官方站点(ftp://updates.redhat.com/7.2/en/os/i386)下载新版本的BOOT内核程序,使用NEW_BOOT_KERNEL_RPM和NEW_BOOT_KERNEL_VERSION环境变量定义驱动盘所采用的内核版本。 
  
  

export NEW_BOOT_KERNEL_RPM=”Kernel-BOOT-2.4.18-24.7.x.i386.rpm” 
  
  

export NEW_BOOT_KERNEL_VERSION=”2.4.8-24.7.xBOOT” 
  
临时性安装BOOT内核程序,由于只需要修改BOOT内核模块,因此在驱动盘制作完毕,需要删除此程序 
  
  

rpm –ivh $NEW_BOOT_KERNEL_RPM 
  

创建制作驱动模块目录 
  
  

mkdir /tmp/bootdisk 
  
  

cd /tmp/bootdisk 
  

拷贝RH7.2光盘bootnet.img文件至/tmp/bootdisk目录,并挂载img文件于对应目录 
  
  

mkdir /tmp/bootdisk/bootnet_image 
  
  

mkdir /tmp/bootdisk/initrd_image 
  
  
mount –o loop /tmp/bootdisk/bootnet.img /tmp/bootdisk/bootnet_image 

cp /tmp/bootdisk/bootnet_image/initrd.img /tmp/bootdisk/initrd.gz 
  
  

gunzip /tmp/bootdisk/initrd.gz 
  
  

mv /tmp/bootdisk/initrd /tmp/bootdisk/initrd.img 
  
  

mount –o loop /tmp/bootdisk/initrd.img /tmp/bootdisk/initrd_image 

创建临时initrd映像文件用于升级和增加驱动模块。最后一个命令用于创建一个BOOT目录,其包含了initrd内部所有模块的列表。 
  
  

mkdir /tmp/bootdisk/initrd_tmp 
  
  

cp –a /tmp/bootdisk/initrd_image/* /tmp/bootdisk/initrd_tmp/ 
  
  

cd /tmp/bootdisk/initrd_tmp 
  
  

zcat modules/modules.cgz | cpio -ivd 

由于BOOT内核需要升级,所以驱动模块也需要升级。假如版本不一致,驱动模块将不能被装载。下面多个语句将在initrd_tmp目录创建包含升级模块的新BOOT目录。首先创建一个模块文件列表,使用文件列表找出新版本驱动模块,并把其添加到initrd_tmp的BOOT目录中。 
  
  

mkdir /tmp/bootdisk/initrd_mtp/$NEW_BOOT_KERNEL_VERSION 
  
  

cd /tmp/bootdisk/initrd_tmp 
  
  

OldBootVersion=`zcat modules/modules.cgz | cpio –t | head –l | awk –F / ‘{print $1}’` 
  
  

ModuleList=`ls $OldBootVersion` 
  
  

cd /lib/modules/$NEW_BOOT_KERNEL_VERSION/kernel 
  
  

for ModuleName in $ModuleList do NewModuleName=`find . -name $ModuleName` 
  
  

cp $NewModuleName /tmp/bootdisk/initrd_tmp/$NEW_BOOT_KERNEL_VERSION/ 
  
  

$ModuleName 

done 

增加新SCSI驱动模块 
  
  

cp /lib/modules/$NEW_BOOT_KERNEL_VERSION/kernel/drivers/scsi/aic7xxx/aic78xx.o 
  
  

/tmp/bootdisk/initrd_tmp/$NEW_BOOT_KERNEL_VERSION 
  
创建新module.cgz以包含所有升级和增加的模块 
  
  

cd /tmp/bootdisk/initrd_tmp/ 
  
  

find $NEW_BOOT_KERNEL_VERSION | cpio -ov -H crc | gzip -c9 >  
  
  

/tmp/bootdisk/initrd_tmp/modules/modules.cgz 
  
  

cd /tmp/bootdisk 
  
  

rm -rf /tmp/bootdisk/initrd_tmp/*BOOT 
  
为新增加的SCSI驱动模块定义依赖关系 

echo "aic78xx: scsi_aic78xx" >> /tmp/bootdisk/initrd_tmp/modules/modules.dep 
  

为新增驱动模块定义模块信息 

/tmp/bootdisk/initrd_tmp/modules/module-info : 

aic78xx 

{tab}   sisc 

“”””   "Adaptec SCSI aic-78xx" 
  
在/odules/pcitable为增加的设备驱动制作记录,可使内核根据设备号寻找正确的驱动。可使用stage2文件的记录进行增加。(使用TAB键代替空格) 

cp /tmp/bootdisk/initrd_image/modules/pcitable /tmp/bootdisk/pcitable 
  
grep ""aic78xx"" /tmp/bootdisk/stage2_image/modules/pcitable >> 

/tmp/bootdisk/pcitable 
  
排序pcitable文件并写入initrd映像文件 

sort /tmp/bootdisk/pcitable > /tmp/bootdisk/initrd_tmp/modules/pcitable 

创建新版initrd映像文件。必须为initrd映像文件预留足够空间以便在运行期间能成功装载驱动。这是initrd在引导期间解压所需要的文件系统空间。 

INITRD_SIZE=`du -k -s /tmp/bootdisk/initrd_tmp | awk '{print $1}'` 

let "NEW_INITRD_SIZE=$INITRD_SIZE + 1000" 

mkdir /tmp/bootdisk/initrd_new_image 

dd if=/dev/zero bs=1k count=$NEW_INITRD_SIZE of=/tmp/bootdisk/initrd_new.img 
  
echo "y" | mke2fs /tmp/bootdisk/initrd_new.img > /dev/null 
  
mount -o loop /tmp/bootdisk/initrd_new.img /tmp/bootdisk/initrd_new_image 
  
cp -a /tmp/bootdisk/initrd_tmp/* /tmp/bootdisk/initrd_new_image/ 

sync 

umount /tmp/bootdisk/initrd_new_image 

umount /tmp/bootdisk/initrd_image 

压缩initrd映像文件和新版本内核至bootnet映像文件中。 

gzip -9 /tmp/bootdisk/initrd_new.img 
cp /tmp/bootdisk/initrd_new.img.gz /tmp/bootdisk/bootnet_image/initrd.img 

cp /boot/vmlinuz-$NEW_BOOT_KERNEL_VERSION /tmp/bootdisk/bootnet_image/ 

vmlinuz 
  
拷贝映像至磁盘 

dd if=/tmp/bootdisk/bootnet.img of=/dev/fd0 

删除引导文件 
  
  

rpm –e 
  
  
通过安装新驱动模块,解决安装故障。 
  
遗留问题: 

系统只能安装于一块硬盘,当加载多块硬盘,仍旧提示“设备无法找到”错误信息,原因不明,有待进一步查明。 

小结: 
  

通过研究Linux引导过程机制,对Linux引导装载驱动有深入了解,并掌握如何定制驱动程序,并在引导时装载,实现相关设备的驱动。通过制作initrd映像文件掌握驱动加载所必须的模块依赖文件modelue.dep和模块设备文件pcitable。 
  
在定制bootnet.img文件,需要考虑给initrd解压时所必须预留的文件系统空间,而不是磁盘本身的空间。如果bootnet.img本身容量已经超过磁盘容量限制,则必须考虑删除不必要的驱动模块以减小映像文件的大小。 
  
此外,对制作的bootnet.img必须采用D9高压缩比率,可增加可用资源。 
LVS组件安装 
故障现象: 
  
安装ipvsadm套件遇到需要Glibc2.3版才可支持组件安装,否则无法顺利安装。中软3.1自带Glibc版本为2.2.3,下载新版glibc-2.3 RPM包进行强行安装,结果系统出现不稳定,使用RPM进行软件安装,系统出现故障性提示:“Cannot handle file ‘libc.so.6’ with TLS data”,软件无法正常安装。 
  
分析: 
  
使用GLIBC的RPM软件强制进行软件升级,导致RPM本身依赖关系遭到破坏。这是著名的Catch-22问题,即Glibc与RPM软件包是彼此相互依赖。因此必须对RPM本身进行升级。然而升级Glibc造成系统无法正常运行RPM,因此使用RPM包无法进行升级。经过查阅红帽官房站点,得知与RPM一同安装的工具rpm2cpio可以析取rpm包中内容。使用ldconfig配置链接路径,并重新建构rpm数据库就可升级RPM包,解决Glibc升级问题。 
  
解决: 
  
获得RPM升级相关软件包 
  
rpm-4.2-0.68.i386.rpm 
  
rpm-build-4.2-0.68.i386.rpm 
  
rpm-devel-4.2-0.68.i386.rpm 
  
rpm-python-4.2-0.68.i386.rpm 
  
elfutils-0.76-2.i386.rpm 
  
elfutils-devel-0.76-2.i386.rpm 
  
elfutils-libelf-0.76-2.i386.rpm 
  
popt-1.8-0.68.i386.rpm 
  
redhat-rpm-config-8.0.20-1.noarch.rpm 
  
  
使用rpm2cpio工具析取rpm包内容,使用ldconfig配置链接时动态库路径,并重新编译rpm数据库 
  
cd / 
  
sudo rpm2cpio ~/rpmdir/rpm-* ~/rpmdir/elfutils-* | sudo cpio -ivd 
  
sudo rm -f /var/lib/rpm/__db.00* 
  
sudo ldconfig 
  
cd ~/rpmdir 
  
sudo rpm -Uvh *.rpm 
  
sudo rpm -rebuilddb 
  
  
遗留问题: 
  
升级RPM包本身会影响操作系统某些软件的正常运行,其遭到破坏的依赖关系可以使用软件升级的办法进行解决。然而某些软件本身只支持Glibc2.2,因此升级Glibc2.3版本会导致依赖于Glibc2.2的软件无法运行,系统将遗留垃圾软件。解决办法有待进一步研究。 
  
小结: 
  
通过对系统关键性组件包,诸如Glibc和RPM的升级,了解系统对软件安装和维护的基础结构。关于RPM升级时必须考虑elf文件包的升级,因为elf格式为所有unix的文件基准格式、软件包安装/升级和维护的文件都必须遵守ELF规范。 
  
此外,使用rpm2cpio对rpm文件内容进行提取后,必须使用ldconfig命令指定编译链接时的动态库路径,才能成功实现RPM安装。 

入侵监测系统配置 
故障现象: 
  
单点snort入侵监测系统,接入百兆交换机后大约每间隔2小时,传感器就发生系统崩溃。检查系统日志,发现报警日志数量巨大,日志迅速占据硬盘大量空间。 
  
分析: 
  
整个网络只提供WEB访问服务和FTP访问服务,snort入侵检测系统默认配置较多无关入侵规则,导致日志中出现大量误报信息,诸如远程认证登录,数据库远程访问等数据导致日志数量增长迅速;此外,入侵监测系统采用华为SB2026交换机,采用端口镜像方式使交换机所有数据流均复制到监听端口,导致交换机达到负载承受临界点,镜像端口数据交换过量,整个网络资源无法正常使用。 
  
解决: 
  
根据网络使使用的具体服务,使用Webmin管理界面定义所监测的入侵规则只包含HTTP和FTP的相关规则,关闭其他入侵规则,提高入侵监测系统判别能力,降低误报信息。 
  
减少交换机镜像方式所监测的端口数,只对重要服务器进行端口数据镜像拷贝,缓解交换机数据交换所承载的负荷,提高网络资源利用率。 
  
遗留问题: 
  
暂无 
  
小结: 
  
通过研究Linux下snort的运行机理与入侵监测规则过滤结构,掌握开源snort下特定入侵规则编写和动态防御,了解真实网络环境中入侵监测系统所存在的缺陷和特定的补修方法。 
安全策略配置 
故障现象: 
  
Linux服务器正常访问一段时间后系统运行速度逐渐下降,某些主机使用安全工具进行安全扫描后无法正常访问服务器。服务器重新启动后使用安全扫描的主机仍然无法正常访问。 
  
分析: 
  
查看iptables防火墙列表规则,发现被拒绝访问主机列表庞大,被拒绝主机永久存在列表规则之中,不会自动删除,导致系统运行效率降低,并使安全监测主机在发生安全检测扫描行为之后无法正常访问系统。 
  
自动防御进程portsentry监测异常数据访问行为,并与防火墙连动,对发送异常数据流进行隔离,因此iptables列表隔离主机数目随时间呈线形增长,系统运行效率将逐步降低。 
  
解决: 
  
修改portsentry配置文件KILL_ROUTE参数 
  
KILL_ROUTE="/usr/local/bin/iptables -I INPUT -s $TARGET$ -j DROP" 
  
为: 
  
KILL_ROUTE="/usr/local/bin/ip_chk $TARGET$" 
  
  
  
ip_chk程序如下: 
  
// ip_chk.c 
  
#include 
  
#include 
  
#include 
  
#include 
  
#include 
  
#include 
  
#include 
  
#define IP_LIST_FILE "/tmp/.iplist" 
  
#define IP_DROP_TIMEOUT 2000 
  
#define SEM_ID 250 
  
int line_count(FILE *file){ 
  
int line_count = 0; 
  
char ch; 
  
fseek(file, SEEK_SET, 0); 
  
do{ 
  
  ch = fgetc(file); 
  
  if(ch = 'n'){ 
  
    line_count =+1; 
  
  } 
  
}while(ch = !EOF) 
  
return line_count; 
  

  
boolean is_repeat(char *ip_addr, long fpos_offset, long lpos_offset, File* file){ 
  
char buf[15]; 
  
char ch; 
  
fseek(file, SEEK_SET, 0); 
  
do{ 
  
  ch = fgetc(file); 
  
}while(ftell(file < fpos_offset)) 
  
for(int i = 0; i <= (lpos_offset-fpos_offset); i++){ 
  
  if((buf = fgetc(file)) == " ") 
  
    break; 
  

  
if(strcmp(buf, ip_addr) 
  
  return true 
  
else 
  
  return false; 
  

  
void update(boolean need_update, File* file, char* ip_addr){ 
  
int i = 0; 
  
int count; 
  
int flg; 
  
char buf[4]; 
  
string new_content; 
  
char new_buf[50]; 
  
time_t t; 
  
if(need_update){ 
  
  do{ 
  
    fgetc(file); 
  
  }while(ch != " "); 
  
  flg = (int)ftell(file) + 1; 
  
  do{ 
  
    buf = fgetc(file); 
  
    i++; 
  
  }while(ch != "n"); 
  
  buf[++i] = 'P'; 
  
  count = (int)buf + 1; 
  
  buf = (string)count; 
  
  i = 0; 
  
  fseek(file, 0, flg); 
  
  while(buf != 'P'){ 
  
    fputc(buf, file); 
  
    i++; 
  
  } [!--empirenews.page--]分页标题[/!--empirenews.page--]
  
}else{ 
  
  fseek(file, 0, SEEK_END); 
  
  t = time(NULL); 
  
  new_content = ip_addr + " " + (string)t + " " + "1" + "n"; 
  
  new_buf = new_content; 
  
  i = 0; 
  
  do{ 
  
    fputc(new_buf, file); 
  
    i++; 
  
  }while(new_buf != 'n'); 
  

  

  
void iptables(char *ip_drop){ 
  
  string cmdstr = "iptables -I INPUT -s "+ip_drop+" -j DROP"; 
  
  system(cmdstr); 
  

  
void ip_chk(int sem_set_id, char *ip_target, char *file_name){ 
  
FILE* file; 
  
struct sembuf sem_op; 
  
char buf[50]; 
  
int i = 0; 
  
int count; 
  
char ch; 
  
long f_offset, l_offset; 
  
int action = false; 
  
sem_op.sem_num = 0; 
  
sem_op.sem_op = -1; 
  
sem_op.sem_flg = 0; 
  
semop(sem_set_id, &semop, 1); 
  
file = fopen(file_name, "awr"); 
  
if(!file){ 
  
  fprintf(stderr, "fail to open this file!n"); 
  
  return 1; 
  

  
count = line_count(file); 
  
l_offset = fseek(file, SEEK_SET, 0); 
  
for(int i = 1; i <= count; i++){ 
  
  do{ 
  
    ch = fgetc(file); 
  
    if(ch = 'n'){ 
  
    if(i == 1){ 
  
      f_offset = l_offset; 
  
    } 
  
    else{ 
  
      f_offset = l_offset + 1; 
  
    } 
  
    l_offset = ftell(file); 
  
    break; 
  
    } 
  
  }while(ch = !EOF) 
  
  if(is_repeat(ip_target, f_offset, l_offset, file)){ 
  
    update(action, file); 
  
    action = true; 
  
    break;   
  
  }   
  

  
if(!action){ 
  
  update(action, file); 
  
  iptables(ip_target); 
  
  action = true; 
  

  
fclose(file); 
  
sem_op.sem_num = 0; 
  
sem_op.sem_op = 1; 
  
sem_op.sem_flg = 0; 
  
semop(sem_set_id, &sem_op, 1); 
  

  
int main(int argc, char **argv){ 
  
int sem_set_id; 
  
union semun sem_val; 
  
char *ip_arg; 
  
if(argc < 2){ 
  
  perror("Usage: ip_chk "); 
  
  exit(1); 
  

  
ip_arg = argv[1]; 
  
sem_set_id = semget(SEM_ID, 1, IPC_CREAT | 0600); 
  
if(sem_set_id == -1){ 
  
  perror("main: semget"); 
  
  exit(1); 
  

  
sem_val.val = 1; 
  
rc = semctl(sem_set_id, 0, SETVAL, sem_val); 
  
if(rc == -1){ 
  
  perror("main: semctl"); 
  
  exit(1); 
  

  
ip_chk(sem_set_id, ip_arg, IP_LIST_FILE); 
  
return 0; 
  


遗留问题: 
  
脚本程序还存在诸如如何判断恶意计算机IP的永久性封锁、如何维护拒绝表,如何与tcp wrapper实现连动等功能,善待完善。 
  
小结: 
  
掌握hostsentry主机入侵防御软件的配置及管理方法,并使用c编程开发适合自身网络情况的主机入侵防御程序。 
  
远程监管配置 
故障现象: 
  
利用XDMCP协议配置NC远程服务监管多台Linux服务器,NC连接X服务器总提示连接失败。使用Linux操作系统进行加密隧道的XDMCP连接,系统提示无法连接。 
  
查看日志记录,相关错误信息如下:“Fwd X11 connection from LinuxN refused by tcp_wrappers”。通过修改tcp_wrappers的host.deny以及host.allow文件内容,NC主机仍然无法连接X服务器。 
  
使用Linux主机进行连接,屏幕显示错误信息如下: 
  
xlib: Connection refused (error 111): unable to connect to X server 
  
xlib: No such process (error 3): Server error 
  
分析: 
  
经对整个远程监管体系的网络数据包跟踪和分析,发现SSH安全加密协商会话正常,加密的安全隧道确实已经在NC主机和Linux服务器之间建立连接。但NC主机和Linux服务器所使用的XDMCP协商会话由于加密隧道而无法观察。 
  
检查NC主机及Linux服务器的ssh2_config配置文件,NC主机已经启用“ForwardX11”参数项,使X客户端请求程序能实现转发;Linux服务器启用“AllowX11Forwarding”参数项,允许服务器的X应用程序请求转发。查阅ssh2参考手册,发现2.3版本以上的OpenSSH软件集成X服务安全性扩展。这将导致ssh2协议通知X服务器客户端程序默认情况是不受信任的,所以NC主机的X客户端程序运行失败。 
  
解决: 
  
针对X11的加密转发故障的解决策略是启用ssh2_config文件的TrustX11Applications参数项,指定X服务器承认X11客户端程序的可信度;在NC主机X启动脚本加入“+X”启动参数,以信任方式启动X11连接转发,成功实现NC与Linux服务器基于SSH加密隧道的XDMCP的远程监管。 
  
遗留问题: 
  
暂无 
  
小结: 
  
研究加密方式下XDMCP协议转发X请求,使NC以SSH方式通过网络对分散多点的Linux主机进行管理,实现集中式Linux服务管理。 
  
Signal 11”现象 
故障现象: 
  
Linux服务器使用“xhost +”与“export DISPLAY=(your local host IP):0.0”命令分别开放X服务主机的访问,并设置DISPLAY环境变量,使客户端通过无须加密的XDMCP进行连接,可以出现远程Linux服务登录认证图形截面。但是远程监管的Linux服务器在一段时候自动断开与之连接的客户端。服务器日志文件出现:“Signal 11”错误信息记录。 
  
分析: 
  
“Signal 11”错误意味着程序访问一个为经分配的内存区域。一般情况是由于某些软件缺陷和硬件故障造成的。由于所安装的X服务软件包无任何程序缺陷,因此X服务器出现“Signal 11”错误而导致崩溃的起因很可能是Linux服务器硬件故障所引起。使用硬件诊断程序检测服务器,测试结果显示正常。 
  
经过反复检测,发现快速鼠标移动将引发X服务器“Signal 11”错误,由于X服务需要采集诸如鼠标移动各种硬件输入操作事件,当发生鼠标滚轮迅速移动诸类事件,网络重复发送大量移动操作导致X服务器对各种X客户端程序的繁重处理无法负担,导致X服务器崩溃。 
解决: 
针对“Signal 11”的解决策略是在NC主机系统使用mouseconfig配置鼠标特性,关闭滚轮特性,并降低鼠标灵敏度,彻底解决X服务崩溃故障。 
(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)

人气推荐

知识阅读

精彩推荐

  • 游戏
  • 软件
查看更多>>