歡迎您光臨本站 註冊首頁

Linux下一些故障現象以及解決的相關資源

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

故障現象:




獲得中軟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++;



}



}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服務崩潰故障。

[火星人 ] Linux下一些故障現象以及解決的相關資源已經有870次圍觀

http://coctec.com/docs/linux/show-post-134274.html