Практические советы по восстановлению системы в боевых условиях Крис Касперски Листинг 1. Установка «Доктора Ватсона» отладчиком по умолчанию [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] "Auto"="1" "Debugger"="drwtsn32 -p %ld -e %ld -g" "UserDebuggerHotKey"=dword:00000000 Листинг 2. Образец отчета «Доктора Ватсона» Исключение в приложении: Прил.: (pid=612) ; pid процесса, в котором произошло исключение. Время: 14.11.2003 @ 22:51:40.674 ; Время, когда произошло исключение. Номер: c0000005 (нарушение прав доступа) ; Код категории исключения. ; Расшифровку кодов исключений можно найти в WINNT.H ; входящим в состав SDK, прилагаемом к любому ; Windows-компилятору. Подробное описание всех исключений ; содержится в документации по процессорам Intel и AMD, ; бесплатно распространяемой их производителями (внимание: ; для перевода кода исключения операционной системы в ; вектор прерывания ЦП, вы должны обнулить старшее слово), ; в данном случае это 0x5 – попытка доступа к памяти ; по запрещенному адресу. *----> Сведения о системе <----* Имя компьютера: KPNC Имя пользователя: Kris Kaspersky Число процессоров: 1 Тип процессора: x86 Family 6 Model 8 Stepping 6 Версия Windows 2000: 5.0 Текущая сборка: 2195 Пакет обновления: None Текущий тип: Uniprocessor Free Зарегистрированная организация: Зарегистрированный пользователь: Kris Kaspersky ; Краткие сведения о системе. *----> Список задач <----* 0 Idle.exe 8 System.exe 232 smss.exe … 1244 os2srv.exe 1164 os2ss.exe 1284 windbg.exe 1180 MSDEV.exe 1312 cmd.exe 612 test.exe 1404 drwtsn32.exe 0 _Total.exe (00400000 - 00406000) (77F80000 - 77FFA000) (77E80000 - 77F37000) ; Перечень загруженных DLL. ; Согласно документации, справа от адресов должны быть ; перечислены имена соответствующих модулей, однако ; практически все они так хорошо «замаскировались», что стали ; совершенно не видны. Вытащить их имена из файла протокола ; все-таки можно, но придется немного «пошаманить» (см. ниже ; «таблицу символов»). Копия памяти для потока 0x188 ; Ниже идет копия памяти потока, вызывавшего исключение. eax=00000064 ebx=7ffdf000 ecx=00000000 edx=00000064 esi=00000000 edi=00000000 eip=00401014 esp=0012ff70 ebp=0012ffc0 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000202 ; Содержимое регистров и флагов. функция: ; Распечатка окрестной точки cбоя. 00400ffc 0000 add [eax],al ds:00000064=?? ; Записываем в ячейку, на которую ссылает EAX, значение AL. ; Значение адреса ячейки, вычисленной Доктором Ватсоном, ; равно 64h, что, очевидно, не соответствует ; действительности. «Доктор Ватсон» подставляет в выражение ; значение регистра EAX на момент возникновения сбоя, ; и это совсем не то значение, которое было в момент ; исполнения! К сожалению, чему был равен EAX в момент ; исполнения ни нам, ни «Доктору Ватсону» не известен. 00400ffe 0000 add [eax],al ds:00000064=?? ; Записываем в ячейку, на которую ссылает EAX, значение AL. ; Как? Опять? Вообще-то так кодируется последовательность ; 00 00 00 00, по всей видимости являющаяся осколком ; некоторой машинной команды, неправильно ; интерпретированной дизассемблерным движком ; «Доктора Ватсона». 00401000 8b542408 mov edx,[esp+0x8] ss:00f8d547=???????? ; Загружаем в EDX аргумент функции. ; Какой именно аргумент – сказать невозможно, т.к. мы не ; знаем адрес стекового фрейма. 00401004 33c9 xor ecx,ecx ; Обнуляем ECX 00401006 85d2 test edx,edx 00401008 7e18 jle 00409b22 ; Если EDX == 0, прыгаем на адрес 409B22h. 0040100a 8b442408 mov eax,[esp+0x8] ss:00f8d547=???????? ; Загружаем уже упомянутый аргумент в регистр EAX. 0040100e 56 push esi ; Сохраняем ESI в стеке, перемещая тем самым указатель ; вершины стека на 4 байта вверх (в область младших ; адресов). 0040100f 8b742408 mov esi, [esp+0x8] ss:00f8d547=???????? ; Загружаем в ESI очередной аргумент. ; Поскольку ESP был только что изменен, это совсем не тот ; аргумент, с которым мы имели дело ранее. 00401013 57 push edi ; Сохраняем регистр EDI в стеке. СБОЙ -> 00401014 0fbe3c31 movsx edi,byte ptr [ecx+esi] ds:00000000=?? ; Вот мы и добрались до инструкции, возбудившей исключение ; доступа. Она обращается к ячейке памяти, на которую ; указывает сумма регистров ECX и ESI, а чему равно их ; значение? Прокручиваем экран немного вверх и находим, что ; ECX и ESI равны 0, о чем «Доктор Ватсон» нам и сообщает: ; «ds:000000» отметим, что этой информации можно верить, ; поскольку подстановка эффективного адреса осуществлялась ; непосредственно в момент исполнения, теперь вспомним, ; что ESI содержит копию переданного функции аргумента ; и что ECX был обнулен явно, следовательно, в выражении ; [ECX+ESI] регистр ESI – указатель, а ECX – индекс. Раз ESI ; равен нулю, то нашей функции передали указатель ; на невыделенную область памяти. Обычно это происходит ; либо вследствие алгоритмической ошибки в программе, ; либо вследствие исчерпания виртуальной памяти, ; к сожалению, «Доктор Ватсон» не осуществляет ; дизассемблирование материнской функции, и какой из двух ; предполагаемых вариантов правильный – нам остается лишь ; гадать… Правда, можно дизассемблировать дамп памяти ; процесса (если, конечно, он был сохранен), но это уже ; не то… 00401018 03c7 add eax, edi ; Сложить содержимое регистра EAX с регистром EDI ; и записать результат в EAX. 0040101a 41 inc ecx ; Увеличить ECX на единицу. 0040101b 3bca cmp ecx,edx 0040101d 7cf5 jl 00407014 ; До тех пор пока ECX < EDX, переходить на адрес 407014 ; (очевидно, мы имеем дело с циклом, управляемым счетчиком ; ECX). При интерактивной отладке мы могли бы принудительно ; выйти из функции, возвратив флаг ошибки, чтобы материнская ; функция (а с ней и вся программа целиком) могла продолжить ; свое выполнение, и в этом случае потерянной окажется лишь ; последняя операция, но все остальные данные окажутся ; неискаженными. 0040101f 5f pop edi 00401020 5e pop esi 00401021 c3 ret ; Выходим из функции. *----> Обратная трассировка стека <----* ; Содержимое стека на момент возникновения сбоя. ; Распечатывает адреса и параметры предыдущих выполняемых функций, ; при интерактивной отладке мы могли бы просто передать управление ; на одну из вышележащих функций, что эквивалентно возвращению ; в прошлое, это только в реальной жизни разбитую чашку ; восстановить нельзя, в компьютерной вселенной возможно все! FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name ; FramePtr: Указывает на значение фрейма стека, ; выше (т.е. в более младших адресах) ; содержатся аргументы функции, ниже – ее ; локальные переменные. ; ; ReturnAd: Бережно хранит адрес возврата в материнскую ; функцию. Если здесь содержится мусор и ; обратная трассировка стека начинает ; характерно шуметь, с высокой степенью ; вероятности можно предположить, что мы ; имеем дело с ошибкой «срыва стека», а ; возможно, и с попыткой атаки вашего ; компьютера. ; ; Param#: Четыре первых параметра функции – именно ; столько параметров «Доктор Ватсон» отображает ; на экране. Это достаточно жесткое ограничение – ; многие функции имеют десятки параметров и ; четыре параметра еще ни о чем не говорят; ; однако недостающие параметры легко вытащить ; из копии необработанного стека вручную – ; достаточно лишь перейти по указанному в поле ; FramePtr адресу. ; ; Func Name: Имя функции (если только его возможно ; легко вытащить и определить); ; реально отображает лишь имена функций, ; импортируемые из других DLL, поскольку ; встретить коммерческую программу, ; откомпилированную вместе с отладочной ; информацией практически нереально. ; 0012FFC0 77E87903 00000000 00000000 7FFDF000 C0000005 ! 0012FFF0 00000000 00401040 00000000 000000C8 00000100 kernel32!SetUnhandledExceptionFilter ; Функции перечисляются в порядке их исполнения; самой последней ; исполнялась kernel32!SetUnhandledExceptionFilter функция, ; обрабатывающая данное исключение. *----> Копия необработанного стека <----* ; Копия необработанного стека содержит стек таким, какой он есть. ; Очень помогает при обнаружении buffer overfull атак – ; весь shell-код, переданный злоумышленником, будет распечатан ; «Доктором Ватсоном», и вам останется всего лишь опознать его ; (подробнее об этом рассказывается в моей книге "Техника ; сетевых атак") 0012ff70 00 00 00 00 00 00 00 00 - 39 10 40 00 00 00 00 00 ........9.@..... 0012ff80 64 00 00 00 f4 10 40 00 - 01 00 00 00 d0 0e 30 00 d.....@.......0. … 00130090 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 001300a0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ *----> Таблица символов <----* ; Таблица символов содержит имена всех загруженных DLL вместе ; с именами импортируемых функций. Используя эти адреса в ; качестве отправной точки, мы без труда сможем восстановить ; «перечень загруженных DLL». ntdll.dll 77F81106 00000000 ZwAccessCheckByType … 77FCEFB0 00000000 fltused kernel32.dll 77E81765 0000003d IsDebuggerPresent … 77EDBF7A 00000000 VerSetConditionMask ; ; Итак, возвращаемся к таблице загруженных DLL. ; (00400000 - 00406000)  - это, очевидно, область памяти, ; занятая самой программой ; (77F80000 - 77FFA000)  – это KERNEL32.DLL ; (77E80000 - 77F37000)  - это NTDDL.DLL Листинг 3. Установка Microsoft Visual Studio Debugger основным отладчиком критических ошибок [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] "Auto"="1" "Debugger"="\"C:\\Prg Files\\MS VS\\Common\\MSDev98\\Bin\\msdev.exe\" -p %ld -e %ld" "UserDebuggerHotKey"=dword:00000000 Листинг 4. Демонстрационная программа, вызывающая сообщение о критической ошибке // Функция возвращает сумму n символов типа char. Если ей // передать null-pointer, она «упадет», хотя источник ошибки // не в ней, а в аргументах, переданных материнской функцией. test(char *buf, int n) { int a, sum; // Здесь возбуждается исключение. for (a = 0; a < n; a++) sum += buf[a]; return sum; } main() { #define N 100 // Инициализируем указатель на буфер. char *buf = 0; // «Забываем» выделить память, здесь ошибка. /* buf = malloc(100); */ // Передаем null-pointer некоторой функции. test(buf, N); } Листинг 5. Отладчик Microsoft Visual Studio Debugger дизассемблировал функцию, возбудившую исключение 0040135C push esi 0040135D mov esi,dword ptr [esp+8] 00401361 push edi 00401362 movsx edi,byte ptr [ecx+esi] 00401366 add eax,edi 00401368 inc ecx 00401369 cmp ecx,edx 0040136B jl 00401362 0040136D pop edi 0040136E pop esi 0040136F ret 8 Листинг 6. Поиск адреса возврата из текущей функции (выделен красным шрифтом) 0012F488 0012FA64 0012FA64 004012FF 0012F494 00000000 00000064 00403458 0012F4A0 FFFFFFFF 0012F4C4 6C291CEA 0012F4AC 00000019 00000000 6C32FAF0 0012F4B8 0012F4C0 0012FA64 01100059 0012F4C4 006403C2 002F5788 00000000 0012F4D0 00640301 77E16383 004C1E20 Листинг 7. Дизассемблерный листинг материнской функции 004012FA call 00401350 004012FF cmp eax,0FFh 00401302 je 0040132D 00401304 push eax 00401305 lea eax, [esp+8] 00401309 push 405054h 0040130E push eax 0040130F call dword ptr ds:[4033B4h] 00401315 add esp, 0Ch 00401318 lea ecx, [esp+4] 0040131C push 0 0040131E push 0 00401320 push ecx 00401321 mov ecx, esi 00401323 call 00401BC4 00401328 pop esi 00401329 add esp,64h 0040132C ret 0040132C 0040132D push 0 0040132D ; эта ветка получает управление, если Функция 01350h вернет FFh 0040132F push 0 00401331 push 405048h 00401336 mov ecx,esi 00401338 call 00401BC4 0040133D pop esi 0040133E add esp,64h 00401341 ret Листинг 8. Содержимое окна Call Stacks отладчика Microsoft Visual Studio Debugger TESTCEDIT! 00401362() MFC42! 6c2922ae() MFC42! 6c298fc5() MFC42! 6c292976() MFC42! 6c291dcc() MFC42! 6c291cea() MFC42! 6c291c73() MFC42! 6c291bfb() MFC42! 6c291bba() Листинг 9. Содержимое стека после раскрутки 0012F488 0012FA64 0012FA64 004012FF <-- 0040136F:ret 8 первый адрес возврата 0012F494 00000000 00000064 00403458 <-- 00401328:pop esi 0012F4A0 FFFFFFFF 0012F4C4 6C291CEA 0012F4AC 00000019 00000000 6C32FAF0 0012F4B8 0012F4C0 0012FA64 01100059 0012F4C4 00320774 002F5788 00000000 0012F4D0 00320701 77E16383 004C1E20 0012F4DC 00320774 002F5788 00000000 0012F4E8 000003E8 0012FA64 004F8CD8 0012F4F4 0012F4DC 002F5788 0012F560 0012F500 77E61D49 6C2923D8 00403458 <-- 0040132C:ret; 0012F50C 00000111 0012F540 6C2922AE <--6C29237E:pop ebx/pop ebp/ret 1Ch 0012F518 0012FA64 000003E8 00000000 0012F518 0012FA64 000003E8 00000000 0012F524 004012F0 00000000 0000000C 0012F530 00000000 00000000 0012FA64 0012F53C 000003E8 0012F564 6C298FC5 0012F548 000003E8 00000000 00000000 0012F554 00000000 000003E8 0012FA64 Листинг 10. Дизассемблерный листинг праматеринской функции («бабушки») 004012FA call 00401350 004012FF cmp eax,0FFh 00401302 je 0040132D 00401304 push eax 00401305 lea eax,[esp+8] 00401309 push 405054h 0040130E push eax 0040130F call dword ptr ds:[4033B4h] 00401315 add esp,0Ch 00401318 lea ecx,[esp+4] 0040131C push 0 0040131E push 0 00401320 push ecx 00401321 mov ecx,esi 00401323 call 00401BC4 00401328 pop esi 00401329 add esp,64h 0040132C ret ; SS:[ESP] = 6C2923D8 Листинг 11. Адрес возврата из праматеринской функции 0012F500 77E61D49 6C2923D8 00403458 <-- 00401328:POP ESI/ret; Листинг 12. Дизассемблерный листинг прапраматеринской функции 6C2923D8 jmp 6C29237B … 6C29237B mov eax,ebx 6C29237D pop esi 6C29237E pop ebx 6C29237F pop ebp 6C292380 ret 1Ch Листинг 13. Содержимое регистров, ранее сохраненных в стеке вместе с адресом возврата 0012F500 77E61D49 6C2923D8 00403458 <-- 6C29237D:pop esi 0012F50C 00000111 0012F540 6C2922AE <-- 6C29237E:pop ebx /pop ebp/ret 1Ch Листинг 14. Классический цикл обработки сообщений while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } Листинг 15. Поиск функций TranslateMessage/DispatchMessage в таблице импорта .idata:004040E0 ; BOOL __stdcall TranslateMessage(const MSG *lpMsg) .idata:004040E0 extrn TranslateMessage:dword ; DATA XREF: _WinMain@16+71?r .idata:004040E0 ; _WinMain@16+8D?r .idata:004040E4 ; LONG __stdcall DispatchMessageA(const MSG *lpMsg) .idata:004040E4 extrn DispatchMessageA:dword ; DATA XREF: _WinMain@16+94?r .idata:004040E8 Листинг 16. Дизассемблерный листинг функции обработки сообщений .text:00401050 mov edi, ds:GetMessageA .text:00401050 ; первый вызов GetMessageA (это еще не цикл, это только его преддверье) .text:00401050 .text:00401056 push 0 ; wMsgFilterMax .text:00401058 push 0 ; wMsgFilterMin .text:0040105A lea ecx, [esp+2Ch+Msg] .text:0040105A ; ECX указывает на область памяти, через .text:0040105A ; которую GetMessageA станет возвращать .text:0040105A ; сообщение. Текущее значение ESP может быть .text:0040105A ; любым, главное, чтобы оно указывало на .text:0040105A ; действительную область памяти (см. карту памяти, если значение ESP оказалось искажено настолько, что вывело его в «космос») .text:0040105A .text:0040105E push 0 ; hWnd .text:00401060 push ecx ; lpMsg .text:00401061 mov esi, eax .text:00401063 call edi ; GetMessageA .text:0040106 ; вызываем GetMessageA .text:00401063 .text:00401065 test eax, eax .text:00401067 jz short loc_4010AD .text:00401067 ; проверка на наличие необработанных ; сообщений в очереди .text:00401067 … .text:00401077 loc_401077: ;CODE XREF: _WinMain@16+A9?j .text:00401077 ; начало цикла обработки сообщений .text:00401077 .text:00401077 mov eax, [esp+2Ch+Msg.hwnd] .text:0040107B lea edx, [esp+2Ch+Msg] .text:0040107B ; EDX указывает на область памяти, ; используемую для передачи сообщений .text:0040107B .text:0040107F push edx ; lpMsg .text:00401080 push esi ; hAccTable .text:00401081 push eax ; hWnd .text:00401082 call ebx ; TranslateAcceleratorA .text:00401082 ; вызываем функцию TranslateAcceleratorA .text:00401082 .text:00401084 test eax, eax .text:00401086 jnz short loc_40109A .text:00401086 ; проверка на наличие в очереди ; необработанных сообщений .text:00401086 .text:00401088 lea ecx, [esp+2Ch+Msg] .text:0040108C push ecx ; lpMsg .text:0040108D call ebp ; TranslateMessage .text:0040108D ; вызываем функцию TranslateMessage, если есть что транслировать .text:0040108D .text:0040108F lea edx, [esp+2Ch+Msg] .text:00401093 push edx ; lpMsg .text:00401094 call ds:DispatchMessageA .text:00401094 ; диспетчеризуем сообщение .text:0040109A .text:0040109A loc_40109A: ; CODE XREF: _WinMain@16+86?j .text:0040109A push 0 ; wMsgFilterMax .text:0040109C push 0 ; wMsgFilterMin .text:0040109E lea eax, [esp+34h+Msg] .text:004010A2 push 0 ; hWnd .text:004010A4 push eax ; lpMsg .text:004010A5 call edi ; GetMessageA .text:004010A5 ; читаем очередное сообщение из очереди .text:004010A5 .text:004010A7 test eax, eax .text:004010A9 jnz short loc_401077 .text:004010A9 ; вращаем цикл обработки сообщений .text:004010A9 .text:004010AB pop ebp .text:004010AC pop ebx .text:004010AD .text:004010AD loc_4010AD: ; CODE XREF: _WinMain@16+67?j .text:004010AD mov eax, [esp+24h+Msg.wParam] .text:004010B1 pop edi .text:004010B2 pop esi .text:004010B3 add esp, 1Ch .text:004010B6 retn 10h .text:004010B6 _WinMain@16 endp Листинг 17. Дизассемблерный листинг функции Run (фрагмент) .text:6C29919D n2k_Trasnlate_main: ; CODE XREF: MFC42_5715+1F?j .text:6C29919D ; MFC42_5715+67?j ... .text:6C29919D mov eax, [esi] .text:6C29919F mov ecx, esi .text:6C2991A1 call dword ptr [eax+64h] ; CWinThread::PumpMessage(void) .text:6C2991A4 test eax, eax .text:6C2991A6 jz short loc_6C2991DA .text:6C2991A8 mov eax, [esi] .text:6C2991AA lea ebp, [esi+34h] .text:6C2991AD push ebp .text:6C2991AE mov ecx, esi .text:6C2991B0 call dword ptr [eax+6Ch] ; CWinThread::IsIdleMessage(MSG*) .text:6C2991B3 test eax, eax .text:6C2991B5 jz short loc_6C2991BE .text:6C2991B7 push 1 .text:6C2991B9 mov [esp+14h], ebx .text:6C2991BD pop edi .text:6C2991BE .text:6C2991BE loc_6C2991BE: ; CODE XREF: MFC42_5715+51?j .text:6C2991BE push ebx ; wRemoveMsg .text:6C2991BF push ebx ; wMsgFilterMax .text:6C2991C0 push ebx ; wMsgFilterMin .text:6C2991C1 push ebx ; hWnd .text:6C2991C2 push ebp ; lpMsg .text:6C2991C3 call ds:PeekMessageA .text:6C2991C9 test eax, eax .text:6C2991CB jnz short n2k_Trasnlate_main .text:6C2991CD Листинг 18. Адреса функций IsIdleMessage/PumpMessage, найденные в секции данных ; IsIdleMessage/PumpMessage 00403044 6C2911D4 6C292583 6C291194 00403050 6C2913D0 6C299144 6C297129 0040305C 6C297129 6C297129 6C291A47 Листинг 19. Переходники к функциям IsIdleMessage/PumpMessage, найденные там же 00401A20 jmp dword ptr ds:[403044h] ; IsIdleMessage 00401A26 jmp dword ptr ds:[403048h] ; 00401A2C jmp dword ptr ds:[40304Ch] ; PumpMessage Листинг 20. Виртуальная таблица класса CWinThread 00403490 00401A9E 00401040 004015F0 <-- 0x0, 0x1, 0x2 элементы 0040349C 00401390 004015F0 00401A98 <-- 0x3, 0x4, 0x5 элементы 004034A8 00401A92 00401A8C 00401A86 <-- 0x6, 0x7, 0x8 элементы 004034B4 00401A80 00401A7A 00401A74 <-- 0x9, 0xA, 0xB элементы 004034C0 00401010 00401A6E 00401A68 <-- 0xC, 0xD, 0xE элементы 004034CC 00401A62 00401A5C 00401A56 <-- 0xF, 0x10, 0x11 элементы 004034D8 00401A50 00401A4A 00401A44 <-- 0x12, 0x13, 0x14 элементы 004034E4 00401A3E 004010B0 00401A38 <-- 0x15, 0x16, 0x17 элементы 004034F0 00401A32 00401A2C 00401A26 <-- 0x18, 0x19, 0x1A элементы (PumpMessage) 004034FC 00401A20 00401A1A 00401A14 <-- 0x1B, 0x1C, 0x1D элементы (IsIdleMessage) Листинг 21. Экземпляр класса CWinThread, вручную найденный нами в памяти 004050B8 00403490 00000001 00000000 004050C4 00000000 00000000 00000001 Листинг 22. Результат дизассемблирования подключенного дампа памяти с текущего адреса 8045249c 6a01 push 0x1 kd>u _PspUnhandledExceptionInSystemThread@4: 80452484 8B442404 mov eax, dword ptr [esp+4] 80452488 8B00 mov eax, dword ptr [eax] 8045248A FF7018 push dword ptr [eax+18h] 8045248D FF7014 push dword ptr [eax+14h] 80452490 FF700C push dword ptr [eax+0Ch] 80452493 FF30 push dword ptr [eax] 80452495 6A1E push 1Eh 80452497 E8789AFDFF call _KeBugCheckEx@20 8045249C 6A01 push 1 8045249E 58 pop eax 8045249F C20400 ret 4 Листинг 23. Содержимое стека не дает никаких намеков на природу истинного виновника kd> kb ChildEBP RetAddr Args to Child f403f71c 8045251c f403f744 8045cc77 f403f74c ntoskrnl!PspUnhandledExceptionInSystemThread+0x18 f403fddc 80465b62 80418ada 00000001 00000000 ntoskrnl!PspSystemThreadStartup+0x5e 00000000 00000000 00000000 00000000 00000000 ntoskrnl!KiThreadStartup+0x16 Листинг 24. Копия голубого экрана смерти, сохраненная в системном журнале Компьютер был перезагружен после критической ошибки: 0x0000001e (0xc0000005, 0xbe80b000, 0x00000000, 0x00000000). Microsoft Windows 2000 [v15.2195] Копия памяти сохранена: C:\WINNT\MEMORY.DMP. Листинг 25. Результат дизассемблирования дампа памяти по адресу, сообщенному голубым экраном смерти kd>u 0xBE80B000 be80b000 a100000000 mov eax,[00000000] be80b005 c20800 ret 0x8 be80b008 90 nop be80b009 90 nop be80b00a 90 nop be80b00b 90 nop be80b00c 90 nop be80b00d 90 nop Листинг 27. Bug Check параметры, отображаемые в удобочитаемом виде kd> dd KiBugCheckData dd KiBugCheckData 8047e6c0 0000001e c0000005 be80b000 00000000 8047e6d0 00000000 00000000 00000001 00000000 8047e6e0 00000000 00000000 00000000 00000000 8047e6f0 00000000 00000000 00000000 00000000 8047e700 00000000 00000000 00000000 00000000 8047e710 00000000 00000000 00000000 00000000 8047e720 00000000 00000000 00000000 00000000 8047e730 00000000 e0ffffff edffffff 00020000 Решение задач инвентаризации в сети Иван Коробко Шаблон 1. Получение доступа к WMI-объектам Вариант1 strComputer=”” strNameSpace=”” strClass=”” Set objElements = GetObject( "winmgmts:{ImpersonationLevel= Impersonate}!//" & strComputer & ”/ ” & strNameSpace & ”: ” & strClass) For each Element in objElements Temp=Element.Value Next Вариант2 strComputer=”” strNameSpace=”” strClass=”” Set objWMIService = GetObject( "winmgmts:{ImpersonationLevel= Impersonate}!//" & strComputer & ”/ ” & strNameSpace) Set colItems = objWMIService.InstancesOf(strClass ) For Each objItem in colItems Temp=Element.Value Next Вариант3 strComputer=”” strNameSpace=”” strClass=”” Set objWMIService = GetObject("winmgmts:{ImpersonationLevel= Impersonate }!// " & strComputer & ”/ ” & strNameSpace) Set colItems = objWMIService.ExecQuery(“SELECT поле_1, поле_2, …, поле_n FROM” & strClass ) For Each objItem in colItems Temp=Element.Value Next SELECT поле_1, поле_2, …, поле_n FROM strClass SELECT * FROM strClass Шаблон 1. Обобщенный вариант 3 strComputer=”” strNameSpace=” Root\Cimv2” strClass=”Win32_Value” Set objWMIService = GetObject( " winmgmts: // " & strComputer & ”/ ” & strNameSpace) Set colItems = objWMIService.ExecQuery(“SELECT поле_1, поле_2, …, поле_n FROM” & strClass ) For Each objItem in colItems Temp=Element.Value Next Пример 1. Получение информации о материнской плате рабочей станции strComputer="." strNameSpace="Root\Cimv2" strClass="Win32_BIOS" Set objWMIService = GetObject("winmgmts://"&strComputer&"/"& strNameSpace) Set colItems = objWMIService.ExecQuery("SELECT SMBIOSBIOSVersion FROM " & strClass ) For Each objItem in colItems MsgBox objItem.SMBIOSBIOSVersion Next temp = temp + ”” + Date() + ”; ” + Time() + ”” Пример 2. Формирование файла отчета Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(FileName, 2, True) f.Write "temp" f.Close Шаблон 2. Обеспечение универсального доступа к нескольким классам WMI dim strClass strClass=Array(”Win32_Value1”, ”Win32_Value2”,… ”Win32_Value?”) Set objWMIService = GetObject( " winmgmts: //./Root\Cimv2 ") for a=0 to ? Set colItems = objWMIService.ExecQuery(“SELECT * FROM” & strClass(a) ) For Each objItem in colItems Select case a Case 0 b=b+1 temp=temp+"" temp=temp+"" temp=temp+"" …………………………………………………… temp=temp+"" temp=temp+"" Case1 c=c+1 temp=temp+"" temp=temp+"" temp=temp+"" …………………………………………………… temp=temp+"" temp=temp+"" ……………………………………………………………………… Case ? y=y+1 temp=temp+"" temp=temp+"" temp=temp+"" …………………………………………………… temp=temp+"" temp=temp+"" End Select Next Next Set FileName=”\\server\folder” Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(FileName, 2, True) f.Write temp f.Close Set colItems = objWMIService.ExecQuery(“SELECT * FROM” & strClass(a)) Set colItems = objWMIService.InstancesOf(strClass(a)) Пример 3 Создание XML-файла dim strClass strClass=Array("Win32_ComputerSystem", "Win32_BIOS", "Win32_CDROMDrive") Set objWMIService = GetObject("winmgmts://./Root\Cimv2") for a=0 to 2 Set colItems = objWMIService.InstancesOf(strClass(a)) For Each objItem in colItems select case a case 0 FileName="\\server\folder\" & cstr(objItem.Name) & ".xml" temp=temp + "" + objItem.Name + "" + chr(10) temp=temp + " " + objItem.Domain + " " + chr(10) temp=temp + " " + objItem.Username + " " + chr(10) temp = temp + "" + cstr(Date()) + "; " + cstr(Time()) + " " + chr(10) case 1 temp=temp + " " + objItem.Version + " " + chr(10) temp=temp + " " + objItem.SMBIOSBIOSVersion + " " + chr(10) case 2 b=b+1 temp=temp + " " + objItem.Caption + " " + chr(10) temp=temp + "" + objItem.Description + " " + chr(10) temp=temp + "" + objItem.Drive + " " + chr(10) end select Next Next Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(FileName, 2, True) f.Write "" & temp & "" f.Close Пример 4. Чтение названий файлов, содержащихся в каталоге Path="\\Server\Folder" Set a=Wscript.CreateObject("Wscript.Shell") Set fso=CreateObject("Scripting.FileSystemObject") Set oFolder=fso.GetFolder(a.ExpandEnvironmentStrings(Path)) Set oFiles=oFolder.Files For each oFile in oFiles temp=temp+oFile.Name & chr(10) next MsgBox temp Пример 5. Сквозное чтение ячейки XML-файла <%@ Language=VBScript%> <% path="xml\10000PC.xml" set xmlVisitor=server.CreateObject("Microsoft.XMLDOM") XMLFile=xmlVisitor.load(server.MapPath(path)) With xmlVisitor.documentElement response.write .childNodes(3).text End With set xmlVisitor=Nothing %> Пример 6. Формирование массивов из названий рабочих станций и учетных записей пользователей <%@ Language=VBScript%> <% path="\\server\folder" Set a=CreateObject("Wscript.Shell") Set fso=CreateObject("Scripting.FileSystemObject") Set oFolder=fso.GetFolder(a.ExpandEnvironmentStrings(path)) Set oFiles=oFolder.Files set xmlVisitor=server.CreateObject("Microsoft.XMLDOM") dim array_pcname() dim array_username() redim preserve array_pcname(oFiles.count) redim preserve array_username(oFiles.count) i=0 For each oFile in oFiles XMLFile=xmlVisitor.load(server.MapPath(path & oFile.Name)) With xmlVisitor.documentElement UN=.childNodes(0).childNodes(2).text array_filename(i)=oFile.Name array_pcname(i)=.childNodes(0). childNodes(0).text array_username(i)=right(UN, len(UN)-instr(UN,"\")) i=i+1 End With Next set xmlVisitor=Nothing %> Пример 7. Упорядочивание взаимосвязанных массивов <%@ Language=VBScript%> <% path="\\server\folder" ………………………………… 'Верхняя граница массивов определяется с помощью функции 'Ubound(). Условие сортировки массива осуществляется с 'помощью StrComp(). dim array_sort () redim preserve array_sort(oFiles.count) size_array=ubound(array_sort) ………………………………… on error resume next for j=0 to size_array for i=0 to size_array if strcomp(array_sort(i),array_sort(i+1),0)=1 then temp=array_sort(i) array_sort(i)=array_sort(i+1) array_sort(i+1)=temp temp=array_pcname(i) array_pcname(i)=array_pcname(i+1) array_pcname(i+1)=temp temp=array_pcname(i) array_pcname(i)=array_pcname(i+1) array_pcname(i+1)=temp end if next next %> Пример 8. Прямой метод формирования запросов
http://имя_страница.asp(htm)?П1=З1&П2=З2&...Пn=Зn http://printer_adsi.asp?Search_Text=value1 Set search_value= Request.QueryString(«Search_Text») Пример 9. Косвенный метод формирования запросов <% %> Пример 10. Формирование запросов в зависимости от значения параметра sort <%@ Language=VBScript%> <% path="\\server\folder" ………………………………… set sort_var = Request.QueryString("sort") select case sort_var case 1 for i=0 to size_array array_sort(i) = array_pcname(i) next case 2 for i=0 to size_array array_sort(i) = array_username(i) next end select ………………………………… for i=0 to size_array-1 select case sort_var case 1 response.write "" & array_pcname(i) &"
" case 2 response.write "" & array_username(i) &"
" end select next …………………………………%> Пример 11. Процедура поиска в XML-файлах <%@ Language=VBScript%> <%………………………………… XMLFile=xmlVisitor.load(server.MapPath(fname & oFile.Name)) For each oFile in oFiles With xmlVisitor.documentElement For i=0 to .childNodes.length-1 if instr(Lcase(.childNodes(i).text),LCase(search_var)) then Response.Write "
" & left(oFile.Name,len(oFile.Name)-4)& "
" & .childNodes(i).text & "
" end if Next End With Next Response.Write "" …………………………………%> Пример 12. Установка кодировки и чтение таблицы стилей Sysinfo.VBS dim strClass strClass=Array("Win32_ComputerSystem", "Win32_BIOS", "Win32_Processor", "Win32_PhysicalMemory", "Win32_SoundDevice", "Win32_VideoConfiguration", "Win32_NetworkAdapter", "Win32_USBController", "Win32_CDROMDrive", "Win32_DiskDrive", "Win32_LogicalDisk", "Win32_DiskPartition") Set objWMIService = GetObject("winmgmts://./Root\Cimv2") for a=0 to 11 Set colItems = objWMIService.InstancesOf(strClass(a)) For Each objItem in colItems select case a case 0 FileName=objItem.Name & "_Приложение1.xml" temp=temp + "" + objItem.Name + "" + chr(10) temp=temp + " " + objItem.Domain + " " + chr(10) temp=temp + " " + objItem.Username + " " + chr(10) temp = temp + "" + cstr(Date()) + "; " + cstr(Time()) + " " + chr(10) case 1 temp=temp + " " + objItem.Version + " " + chr(10) temp=temp + " " + objItem.SMBIOSBIOSVersion + " " + chr(10) + case 2 temp=temp + " " + objItem.name + " " + chr(10) ' CPU name temp=temp + " " + objItem.Description + " " + chr(10) ' Description temp=temp + " " + objItem.SocketDesignation + " " + chr(10) ' Socket type case 3 if b=0 then temp=temp +"" end if b=b+1 temp=temp+"" temp=temp+" " + objItem.DeviceLocator + " " temp=temp+" " + objItem.Capacity + " " temp=temp+"" case 4 if c=0 then temp=temp +"" & chr(10) &"" & chr(10) &"" & chr(10) &"" end if e=e+1 if objItem.MacAddress<>"" then q=q+1 temp=temp+" "+objItem.Manufacturer+"" temp=temp+""+objItem.Name+"" temp=temp+""+objItem.MacAddress+" " end if case 7 if g=0 then temp=temp +"" & chr(10) & "" end if if objItem.Name<>"" then g=g+1 temp=temp + "" + objItem.Name + " " + chr(10) ' USB Controller end if case 8 if h=0 then temp=temp +"" & chr(10) & "" end if if objItem.Caption<>"" then h=h+1 temp=temp + " " + objItem.Caption + " " + chr(10) ' Model temp=temp + "" + objItem.Description + " " + chr(10) ' Description temp=temp + "" + objItem.Drive + " " + chr(10) ' Letter end if case 9 if i=0 then temp=temp + "" & chr(10) & " " end if i=i+1 temp=temp + " " + objItem.Caption + " " + chr(10) ' Model temp=temp + "" + objItem.Description + " " + chr(10) ' Description temp=temp + "" + cstr(objItem.Size) + " " + chr(10) ' Size of HDD temp=temp + "" + cstr(objItem.Index) + " " + chr(10) ' Number of HDD temp=temp + "" + cstr(objItem.Partitions) + " " + chr(10) ' Number of partitions case 10 if k=0 then temp=temp + "" & chr(10) & " " end if k=k+1 temp=temp +" " + objItem.Name + " " + chr(10) ' Letter temp=temp + "" + cstr(objItem.Description) + " " + chr(10) ' Description if objItem.FileSystem<>"" then temp=temp + "" + objItem.Size + " " + chr(10) ' File System temp=temp + "" + objItem.FreeSpace + " " + chr(10) ' File System end if temp=temp +" " case 11 if l=0 then temp=temp + " " & chr(10) & "" end if l=l+1 temp=temp + " " + objItem.Name + " " + chr(10) ' Model temp=temp + "" + cstr(objItem.Size) + " " + chr(10) ' Number of partitions end select Next Next temp=temp + "" Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(FileName, 2, True) f.Write "" & temp & "" f.Close msgbox "end" Script.BAT @ECHO OFF if c:\%os%==c:\ goto win9x if not c:\%os%==c:\ goto winnt :winnt @echo Подождите! Выполняется настойка Вашего компьютера. start /wait sysinfo.vbs goto end :win9x @echo windows 9x %0\..\Script. sysinfo.vbs goto end :end @echo End Of Batch File AutoScript.VBS Set objNameSpace = GetObject("WinNT:") For Each Domain in objNameSpace strDomain Domain.Name Next Set Users_Domain = getobject("WinNT://" & strDomain) Users_Domain.Filter = Array("user") strGroup="Skip" strGroup = InputBox("Group:", "Skip users", "Skip") strScript="Script.bat" strScript=InputBox("Script:","Script Name", " Script.bat ") For each user in users_domain i=0 a=user.name Set user_group = GetObject("WinNT://" & strDomain & "/" & strGroup) For each user_group in user_group.Members b=user_group.name if b=a then i=1 end if next if i=0 then User.LoginScript=strScript User.setinfo End if Next Default.HTM Список доступных сетевых принтеров Stylet.CSS H4 {font-size:11; font-family:Arial;} H5 {font-size:10; font-family:Arial;} H6 {font-size:9; font-family:Arial;} Xml_List.ASP <%@ Language=VBScript CODEPAGE=1251%>

"Информация о рабочих станциях"


<%set search_var = Request.QueryString("Search_Text") set sort_var = Request.QueryString("sort") path="\\server\folder" Set a=CreateObject("Wscript.Shell") Set fso=CreateObject("Scripting.FileSystemObject") Set oFolder=fso.GetFolder(a.ExpandEnvironmentStrings(path)) Set oFiles=oFolder.Files set xmlVisitor=server.CreateObject("Microsoft.XMLDOM") dim array_pcname() dim array_username() dim array_sort() dim array_filename() redim preserve array_pcname(oFiles.count) redim preserve array_username(oFiles.count) redim preserve array_sort(oFiles.count) redim preserve array_filename(oFiles.count) size_array=ubound(array_sort) i=0 For each oFile in oFiles XMLFile=xmlVisitor.load(server.MapPath(path & oFile.Name)) With xmlVisitor.documentElement UN=.childNodes(0).childNodes(2).text array_filename(i)=oFile.Name array_pcname(i)=.childNodes(0).childNodes(0).text array_username(i)=right(UN, len(UN)-instr(UN,"\")) i=i+1 End With next if search_var="" then select case sort_var case 1 for i=0 to size_array array_sort(i) = array_pcname(i) next case 2 for i=0 to size_array array_sort(i) = array_username(i) next end select on error resume next for j=0 to size_array for i=0 to size_array if strcomp(array_sort(i),array_sort(i+1),0)=1 then temp=array_sort(i) array_sort(i)=array_sort(i+1) array_sort(i+1)=temp temp=array_pcname(i) array_pcname(i)=array_pcname(i+1) array_pcname(i+1)=temp temp=array_pcname(i) array_pcname(i)=array_pcname(i+1) array_pcname(i+1)=temp temp=array_filename(i) array_filename(i)=array_filename(i+1) array_filename(i+1)=temp end if next next for i=0 to size_array-1 select case sort_var case 1 response.write "" & array_pcname(i) &"
" case 2 response.write "" & array_username(i) &"
" end select next else Response.Write "" Response.Write "" Response.Write "

Результаты поиска по

" & search_var & "
" For each oFile in oFiles XMLFile=xmlVisitor.load(server.MapPath(path & oFile.Name)) With xmlVisitor.documentElement for i=0 to .childNodes.length-1 if instr(Lcase(.childNodes(i).text),LCase(search_var)) then Response.Write "
" end if next End With next Response.Write "
" & left(oFile.Name,len(oFile.Name)-4)& "
" & .childNodes(i).text & "
" end if set xmlVisitor=Nothing %> Analyse.ASP <%@ Language=VBScript CODEPAGE=1251%> <%set path=Request.QueryString("fn") set xmlVisitor=server.CreateObject("Microsoft.XMLDOM") XMLFile=xmlVisitor.load(server.MapPath(path)) With xmlVisitor.documentElement Response.Write "

Рабочая станция

" Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
Рабочая станция
" & .childNodes(0).childNodes(0).text & "
Пользователь
" & .childNodes(0).childNodes(2).text & "
Домен
" & .childNodes(0).childNodes(1).text & "
Дата регистрации в сети
" & .childNodes(0).childNodes(3).text & "
" Response.Write "

Материнская плата, процессор, память

" Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
Материнская плата
" & .childNodes(1).childNodes(1).text & "
Модель BIOS
" & .childNodes(1).childNodes(0).text & "
Процессор
" & .childNodes(2).childNodes(0).text & "
Поколение
" & .childNodes(2).childNodes(1).text & "
Разъем процессора
" & .childNodes(2).childNodes(2).text & "
Слот и тип RAM
" & .childNodes(3).childNodes(0).childNodes(0).text & "
Размер, Мб
" & .childNodes(3).childNodes(0).childNodes(1).text/(1000*1000) & "
" Response.Write "

Жесткие диски

" q=9 for i=0 to .childNodes(q).childNodes.length-1 Response.Write "
" Response.Write "
" Response.Write "
" next Response.Write "
" & .childNodes(q).childNodes(i).childNodes(1).text & i+1 & "
" & .childNodes(q).childNodes(i).childNodes(0).text & "
Размер, Гб
" & round(.childNodes(q).childNodes(i).childNodes(2). text/(1000*1000*1000),1) & "
Логических разделов
" & .childNodes(q).childNodes(i).childNodes(4).text & "
" Response.Write "

CD-ROM

" q=8 for i=0 to .childNodes(q).childNodes.length-1 Response.Write "
" next Response.Write "
" & .childNodes(q).childNodes(i).childNodes(1).text & i+1 & "
" & .childNodes(q).childNodes(i).childNodes(0).text & "
" Response.Write "

Звуковая плата

" q=4 for i=0 to .childNodes(q).childNodes.length-1 Response.Write "
" Response.Write "
" Response.Write "
" next Response.Write "
Адаптер" & i+1 & "
Производитель
" & .childNodes(q).childNodes(i).childNodes(0).text & "
Модель
" & .childNodes(q).childNodes(i).childNodes(1).text & "
" Response.Write "

Графический адаптер

" q=5 for i=0 to .childNodes(q).childNodes.length-1 Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
" next Response.Write "
Адаптер " & i+1 & "
Модель
" & .childNodes(q).childNodes(i).childNodes(0).text & "
Память, Мб
" & .childNodes(q).childNodes(i).childNodes(1). text/(1000*1000) & "
Характеристики экрана
" & .childNodes(q).childNodes(i).childNodes(2).text & "
" Response.Write "

Сетевой адаптер

" q=6 for i=0 to .childNodes(q).childNodes.length-1 Response.Write "
" Response.Write "
" Response.Write "
" Response.Write "
" next Response.Write "
Адаптер " & i+1 & "
Производитель
" & .childNodes(q).childNodes(i).childNodes(0).text & "
Модель
" & .childNodes(q).childNodes(i).childNodes(1).text & "
МАС-адрес
" & .childNodes(q).childNodes(i).childNodes(2).text & "
" Response.Write "

USB

" q=7 for i=0 to .childNodes(q).childNodes.length-1 Response.Write "
" next Response.Write "
Порт " & i+1 & "
" & .childNodes(q).childNodes(i).childNodes(0).text & "
" End With set xmlVisitor=Nothing%> Крепость для пингвина Сергей Яремчук # /usr/sbin/bastille Could not determine operating system version! Bastille does not work on this OS: unknown Currently, Bastille works on the following: DB2.2 DB3.0 RH6.0 RH6.1 RH6.2 RH7.0 RH7.1 RH7.2 RH7.3 RH8.0 RH9 MN6.0 MN6.1 MN7.0 MN7.1 MN7.2 MN8.0 MN8.1 HP-UX11.00 HP-UX11.11 HP-UX11.22 HP-UX11.23 SE7.2 SE7.3 SE8.0 TB7.0 OSX10.2.0 OSX10.2.1 OSX10.2.2 OSX10.2.3 OSX10.2.4 # /usr/sbin/bastille –os RH8.0 # /usr/sbin/bastille -b # tail -f /var/log/Bastille/action-log # tail -f /var/log/Bastille/error-log # /usr/sbin/bastille -r Учет работы dialup-пользователей в системе FreeBSD Сергей Супрунов lastreader.pl: #!/usr/bin/perl –w # открываем last на чтение open(LAST, ‘last -s|’) || die ‘Error’; while() { chomp; if($_) { # выделяем имя пользователя и устройство ($user, $tty) = split(/\s/); # Далее обрабатываем только модемные соединения ttydX if($tty =~ /ttyd/) { # выделяем значение в скобках – продолжительность # соединения в секундах $_ =~ s/\(\s*(\d+)\)/$1/g; if(($user)&&($1) { # суммируем продолжительности по пользователям $totals{$user} += $1; } } } } close(LAST); # сортируем по алфавиту пользователей @res = sort keys %totals; foreach $item (@res) { # выводим результат на экран print “$item - $totals{$item}\n”; } exit(1); ip-up interface-name tty-device speed local-IP remote-IP ipparam auth-up interface-name peer-name user-name tty-device speed who | grep “ttydX” | awk ‘{print $1;}’ ipfw add 10000 count ip from any to 100.100.100.5 out Осваиваем Nagios Андрей Бешков # tar zxvf nagios-1.1.tar.gz # tar zxvf nagios_rus_1_1.tar.gz # cp –R /tmp/nagios_rus_1_1/* /tmp/nagios-1.1/ # cd nagios-1.1 # ./configure --prefix=/usr/local/nagios --with-cgi-url=/nagios/cgi-bin --with-html-url=/nagios/ --with-nagios-user=nagios --with-nagios-grp=nagios --with-gd-lib=/usr/local/lib --with-gd-inc=/usr/local/include/gd /usr/local/etc/nagios.sh stop # make install # make all # make clean # ./configure --prefix=/usr/local/nagios --with-cgi-url=/nagios/cgi-bin --with-html-url=/nagios/ --with-nagios-user=nagios --with-nagios-grp=nagios --with-gd-lib=/usr/local/lib --with-gd-inc=/usr/local/include/gd > make.log checking for gdImagePng in -lgd (order 1)... no checking for gdImagePng in -lgd (order 2)... no checking for gdImagePng in -lgd (order 3)... no *** GD, PNG, and/or JPEG libraries could not be located... **** Boutell's GD library is required to compile the statusmap, trends and histogram CGIs. Get it from http://www.boutell.com/gd/, compile it, and use the --with-gd-lib and --with-gd-inc arguments to specify the locations of the GD library and include files. NOTE: In addition to the gd-devel library, you'll also need to make sure you have the png-devel and jpeg-devel libraries installed on your system. NOTE: After you install the necessary libraries on your system: 1. Make sure /etc/ld.so.conf has an entry for the directory in which the GD, PNG, and JPEG libraries are installed. 2. Run 'ldconfig' to update the run-time linker options. 3. Run 'make clean' in the Nagios distribution to clean out any old references to your previous compile. 4. Rerun the configure script. NOTE: If you can't get the configure script to recognize the GD libs on your system, get over it and move on to other things. The CGIs that use the GD libs are just a small part of the entire Nagios package. Get everything else working first and then revisit the problem. Make sure to check the nagios-users mailing list archives for possible solutions to GD library problems when you resume your troubleshooting. ******************************************************************** checking for gdImagePng in -lgd (order 1)... yes GD library was found! # pkg_info | grep gd gd-1.8.4_6 A graphics library for fast image creation # pkg_-L gd-1.8.4_6 Information for gd-1.8.4_6: Files: /usr/local/bin/bdftogd /usr/local/bin/gd2copypal /usr/local/bin/gd2topng /usr/local/bin/gdparttopng /usr/local/bin/gdtopng /usr/local/bin/pngtogd /usr/local/bin/pngtogd2 /usr/local/bin/webpng /usr/local/include/gd/gd.h /usr/local/include/gd/gd_io.h /usr/local/include/gd/gdcache.h /usr/local/include/gd/gdfontg.h /usr/local/include/gd/gdfontl.h /usr/local/include/gd/gdfontmb.h /usr/local/include/gd/gdfonts.h /usr/local/include/gd/gdfontt.h /usr/local/lib/libgd.a /usr/local/lib/libgd.so /usr/local/lib/libgd.so.2 /usr/local/share/doc/gd/index.html --with-gd-lib=/usr/local/lib ї--with-gd-inc=/usr/local/include/gd # rpm -qa | grep gd libgd2-devel-2.0.4-alt2 gdm-2.4.4.5-alt1 gdk-pixbuf-loaders-0.22.0-alt2 gdk-pixbuf-0.22.0-alt2 libgd2-2.0.4-alt2 libgda2-1.0.0-alt1 gnome2-utils-gdict-applet-2.4.0-alt2 libgda2-devel-1.0.0-alt1 # rpm -ql libgd2 /usr/lib/libgd.so.2 /usr/lib/libgd.so.2.0.4 # rpm -ql libgd2-devel /usr/include/gd.h /usr/include/gd_io.h /usr/include/gdcache.h /usr/include/gdfontg.h /usr/include/gdfontl.h /usr/include/gdfontmb.h /usr/include/gdfonts.h /usr/include/gdfontt.h /usr/lib/libgd.so /usr/share/doc/gd-2.0.4 /usr/share/doc/gd-2.0.4/index.html #find / -name libgd.* /usr/lib/libgd.so.1.2 /usr/lib/libgd.so.1 /usr/lib/libgd.so #find / -name gd.h /usr/include/gd.h define host{ name generic-host notifications_enabled 1 event_handler_enabled 1 flap_detection_enabled 1 process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 register 0 } define host{ use generic-host host_name Win_2000 alias Standard Windows Server address bianca parents 3com_Lan check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } define host{ use generic-host host_name Linux alias Linux Server address lira parents 3com_Lan check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } define host{ use generic-host host_name 3com_Lan alias 3COM inner Lan switch address 3com-lan check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } define host{ use generic-host host_name Inner_Firewall alias Firewall PC parents 3com_Lan address inner-firewall check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } define host{ use generic-host host_name 3com_Dmz alias 3COM dmz switch address 3com-dmz parents Inner_Firewall check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } define host{ use generic-host host_name Mail alias Mail Server address mailer parents 3com_Dmz check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } define host{ use generic-host host_name WWW alias WWW Server address web parents 3com_Dmz check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } define host{ use generic-host host_name Outer_Firewall alias Hardware Firewall address outer-firewall parents 3com_Dmz check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } Running configuration check... Nagios 1.1 Copyright (c) 1999-2003 Ethan Galstad (nagios@nagios.org) Last Modified: 06-02-2003 License: GPL Reading configuration data... Error: Could not add object property in file '/usr/local/nagios/etc/hosts.cfg' on line 74. ***> One or more problems was encountered while processing the config files... Check your configuration file(s) to ensure that they contain valid directives and data defintions. If you are upgrading from a previous version of Nagios, you should be aware that some variables/definitions may have been removed or modified in this version. Make sure to read the HTML documentation on the main and host config files, as well as the 'Whats New' section to find out what has changed. failed - aborting reload. define hostextinfo{ # Тег, с которого должно начинаться описание хоста host_name 3com_Lan # Имя хоста, к которому относится описание icon_image 3Com.png # Имя файла иконки, которая будет отображаться рядом с именем # хоста. Иконка может быть в формате GIF, PNG или JPG. Может # содержать внутри себя прозрачные области. Желательно, # чтобы иконки были размером 40x40 пикселей. Располагаться # они должны в директории logos. Обычно эта директория # находится в /usr/local/nagios/share/images/logos icon_image_alt 3Com LAN Switch # Надпись, отображаемая, если веб-серверу не удается # загрузить иконку vrml_image 3Com.png # Имя файла, который будет использоваться как текстура для куба, # изображающего хост на трехмерной карте. Может быть в формате # PNG, JPG, GIF. Картинка не должна содержать прозрачных # областей, иначе это будет выглядеть очень странно. Должна # храниться в той же директории, что и иконка, описанная # тегом icon_image statusmap_image 3Com.gd2 # Имя файла, где хранится изображение, которое будет # использоваться как иконка хоста на плоской сетевой карте. # Может быть в формате PNG, JPG, GIF, но все-таки лучше, # если для этого файла будет использоваться формат GD2, потому # что для каждого цикла рисования карты иконка будет снова # и снова приводиться к виду, удобному для библиотеки GD. # А это значит, что мы будем зря выполнять одни и те же # бесполезные вычисления. Может содержать внутри себя # прозрачные области. Желательно чтобы иконки были размером # 40x40 пикселей. Располагаться они должны в директории logos. # Обычно эта директория находится в /usr/local/nagios/share/ # images/logos 2d_coords 160,99 # Двумерные координаты точки, в которой будет находиться центр # иконки хоста на плоской карте. Могут быть только # положительными числами. Рисование карты начинается из точки # 0,0 которая является верхним левым углом карты. Координаты # перечисляются в следующем порядке x, y 3d_coords 20.0,32.0,6.0 # Координаты центра куба, символизирующего хост в пространстве # трехмерной карты. Могут быть как положительными, так и # отрицательными числами. Размер одной стороны куба 0.5 единиц. # Отрисовка карты начинается центра трехмерной карты, который # находится в точке с координатами 0.0, 0.0, 0.0. # Координаты перечисляются в следующем порядке x, y, z notes_url http://192.168.80.2/nagios/notes/3com_lan.txt # Ссылка на адрес, по которому лежит файл c дополнительными # сведениями о хосте. При щелчке на специальный значок # в браузере будет открыт этот файл. Это полезно для записи # различных сведений, которые не вошли в стандартный шаблон # описания хоста Nagios. Например, там можно написать данные, # отвечающие на вопрос, кто из администраторов отвечает # за управление этим сервером, к кому обращаться в случае проблем. # Обратите внимание на URL, используемый для указания путь # к файлу. Для того чтобы файлы с записками можно было хранить # на том же хосте, что и Nagios, я создал директорию # /usr/local/nagios/share/notes, и поэтому мы теперь можем # получить к ней доступ именно по такому URL. } define hostextinfo{ host_name Win_2000 notes_url http://listios.lan.domain.ru/Win_2000.html # Кстати, стоит отметить, что добавочные записки о хостах могут # хранить не только на том же хосте, где работает Nagios, но и на # любом другом. Главное, чтобы там работал веб-сервер и URL # был правильно прописан icon_image win40.png icon_image_alt Windows workstation vrml_image win40.png statusmap_image win40.gd2 2d_coords 163,195 3d_coords 15.0,38.0,6.0 } define hostextinfo{ host_name Linux notes_url http://10.10.5.7/hostinfo.pl?host=Linux1 # В качестве URL для хранения добавочных записок можно использовать # даже CGI. В зависимости от данных, переданных в запросе, вы будете # получать сведения о том или ином хосте. icon_image_alt Linux Workstation vrml_image mandrake.gd2 statusmap_image mandrake.gd2 2d_coords 60,198 3d_coords 30.0,38.0,6.0 } define hostextinfo{ host_name Mail notes_url http://192.168.80.2/nagios/notes/mail.html icon_image MailServer.png icon_image_alt Mail Server vrml_image MailServer.png statusmap_image MailServer.gd2 2d_coords 520,183 3d_coords 20.0,44.0,6.0 } define hostextinfo{ host_name WWW notes_url http://192.168.80.2/nagios/notes/www_notes.html icon_image openbsd.png icon_image_alt WWW Server vrml_image openbsd.gd2 statusmap_image openbsd.gd2 2d_coords 439,186 3d_coords 20.0,54.0,6.0 } define hostextinfo{ host_name Inner_Firewall notes_url http://192.168.80.2/nagios/notes/inner_fw_notes.html icon_image freebsd40.png icon_image_alt Inner Firewall vrml_image freebsd40.png statusmap_image freebsd40.gd2 2d_coords 326,96 3d_coords 17.0,55.0,6.0 } define hostextinfo{ host_name Outer_Firewall notes_url http://192.168.80.2/nagios/notes/outer_fw_notes.html icon_image firebox_small.png icon_image_alt Outer Firewall vrml_image firebox_small.png statusmap_image firebox_small.gd2 2d_coords 620,80 3d_coords 16.0,42.0,6.0 } define hostextinfo{ host_name 3com_Dmz notes_url http://192.168.80.2/nagios/notes/3com_dmz.html icon_image 3Com.png icon_image_alt 3Com DMZ LAN Switch vrml_image 3Com.png statusmap_image 3Com.gd2 2d_coords 480,73 3d_coords 14.0,56.0,6.0 } define serviceextinfo{ host_name WWW # Имя хоста, на котором работает сервис service_description HTTP # Имя сервиса из файла services.cfg notes_url http://192.168.80.2/nagios/notes/service_www.html # Уже многократно виденный нами URL для дополнительных записок icon_image apache.png # Имя файла иконки, которая будет отображаться рядом с именем # сервиса. Иконка может быть в формате GIF, PNG или JPG. Может # содержать внутри себя прозрачные области. Желательно, чтобы # иконки были размером 40x40 пикселей. Располагаться они должны # в директории logos. Обычно эта директория находится в # /usr/local/nagios/share/images/logos icon_image_alt Web Service # Надпись, отображаемая, если веб-серверу не удается загрузить # иконку, привязанную к сервису } define serviceextinfo{ host_name WWW service_description SMTP notes_url http://192.168.80.2/nagios/notes/service_www.html icon_image apache.png icon_image_alt Web Service } define serviceextinfo{ host_name Mail service_description SMTP notes_url http://192.168.80.2/nagios/notes/service_smtp.html icon_image smtp.png icon_image_alt Web Service } define serviceextinfo{ host_name Mail service_description POP3 notes_url http://192.168.80.2/nagios/notes/service_pop3.html icon_image pop3_imap.png icon_image_alt Web Service } define serviceextinfo{ host_name Mail service_description IMAP notes_url http://192.168.80.2/nagios/notes/service_imap.html icon_image pop3_imap.png icon_image_alt Web Service } xedtemplate_config_file=/usr/local/nagios/etc/hostextinfo.cfg xedtemplate_config_file=/usr/local/nagios/etc/serviceextinfo.cfg $ /usr/local/bin/png2gd2 www.png www.gd2 4000 1 default_statusmap_layout=0 default_statuswrl_layout=0 You have not supplied any host drawing coordinates, so you cannot use this layout method. Read the FAQs for more information on specifying drawing coordinates or select a different layout method. глобальный заголовок локальный заголовок первоначальный текст глобальная вставка локальная вставка Файл common-footer.ssi

По вопросам техподдержки обращаться на tigrisha@sysadmins.ru или http://onix.opennet.ru

Файл common-header.ssi

Nagios

Файл status-footer.ssi

Разделитель страницы status.cgi

Файл status-header.ssi

Тестовый заголовок status.cgi

host_unreachable_sound=hostunreachable.wav host_down_sound=host down.wav service_critical_sound=servicecritical.wav service_warning_sound=servicewarning.wav service_unknown_sound=service unknown.wav normal_sound=noproblem.wav Вторая жизнь модемов Павел Закляков /dev/ttys0 (COM1), port 0x3f8, irq 4 /dev/ttys1 (COM2), port 0x2f8, irq 3 /dev/ttys2 (COM3), port 0x3e8, irq 4 /dev/ttys3 (COM4), port 0x2e8, irq 3 IRQ 3: COM2 IRQ 4: COM1 IRQ 5: LPT2 IRQ 7: LPT1 COM1 - Port: 0x03f8, IRQ: 4 (/dev/ttyS0) COM2 - Port: 0x02f8, IRQ: 3 (/dev/ttyS1) COM3 - Port: 0x03e8, IRQ: 5 (/dev/ttyS2) /dev/ttyS0 uart 16550A port 0x03f8 irq 4 baud_base 115200 spd_normal skip_test /dev/ttyS1 uart 16550A port 0x02f8 irq 3 baud_base 115200 spd_normal skip_test /dev/ttyS2 uart 16550A port 0x03e8 irq 5 baud_base 115200 spd_normal skip_test # chkconfig --add serial # setserial /dev/ttyS2 irq 5 # setserial /dev/ttyS0 # setserial /dev/ttyS1 # setserial /dev/ttyS2 # /etc/rc.d/init.d/serial stop COM1 /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 COM2 /dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3 COM3 /dev/ttyS2, UART: 16550A, Port: 0x03e8, IRQ: 5 # chkconfig --del kudzu # chkconfig --add kudzu # minicom -s Конвертирование из Excel в HTML: корректно, качественно, просто Алексей Мичурин 1: Sub table2table() 2: ' 3: ' макрос, сохраняющий выделенный фрагмент таблицы 4: ' в текстовом формате с отметками о форматировании 5: ' 6: With ActiveWindow.RangeSelection 7: c1 = .Columns.Column 8: c2 = .Columns.Count - 1 + c1 9: r1 = .Rows.Row 10: r2 = .Rows.Count - 1 + r1 11: End With 12: If (r1 - r2 = 0 And c1 - c2 = 0) Then 13: MsgBox _ 14: "что-то мало выделено (для сохранения) ,-)", _ 15: vbCritical, "сообщение макроса" 16: End If 17: fileSaveName = Application.GetSaveAsFilename( _ 18: InitialFileName:="file", _ 19: fileFilter:="Text Files (*.txt), *.txt", _ 20: Title:="сохранение страницы в нашем формате") 21: If fileSaveName = False Then 22: MsgBox _ 23: "файл-то не выбран. никаких действий не предпринято.", _ 24: vbCritical, "сообщение макроса" 25: Else 26: sep = Chr(9) ' разделитель 27: subsep = Chr(8) ' под-разделитель 28: Open fileSaveName For Output As #1 29: For r = r1 To r2 30: l = CStr(Rows(r).RowHeight) 31: For c = c1 To c2 32: With Cells(r, c) 33: l = l + sep + CStr(.Text) + _ 34: subsep + CStr(.MergeCells) + _ 35: subsep + CStr(.Font.Bold) + _ 36: subsep + CStr(.Font.Strikethrough) 37: End With 38: Next 39: Print #1, l 40: Next 41: Close #1 42: End If 43: End Sub 1: Function safeCStr(p As Variant) As String 2: If IsNull(p) Then safeCStr = "" Else safeCStr = CStr(p) 3: End Function 1: #!/usr/bin/perl -w 2: 3: #use strict; 4: 5: # my ($TRUE, $FALSE)=('Истина', 'Ложь'); 6: my ($TRUE, $FALSE)=('True', 'False'); 7: 8: sub qtnum { 9: my $t=shift; 10: $t=~s|,(\d+)|,$1|; 11: return $t; 12: } 13: 14: sub qtstring { 15: my $t=shift; 16: $t=~s/\&/\&/g; 17: $t=~s/\"/\"/g; 18: $t=~s/\>/\>/g; 19: $t=~s/\ 25: 26: прайс некой фирмы 27: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: TEXT 51: 52: while (<>) { 53: s/[\x0A\x0D]+$//; 54: my @f=split /\x09/; 55: my $lh=shift @f; 56: my ($name, $usd, $rub)=map {[split /\x08/]} @f; 57: if ($lh) { 58: if ($name->[1] eq $TRUE) { # обработка заголовка раздела 59: print '\n"; 62: } else { # обработка обычной строки 63: print <<'TEXT' . 64: \n\n\n"; 80: } 81: print <<'TEXT'; 82: 83: 84: TEXT 85: } else { 86: warn 'hidden line: '.$name->[0]."\n"; 87: } 88: } 89: 90: print <<'TEXT'; 91:
прайс некой фирмы
наименование товарацена
у.е.руб.
' . 60: $name->[0] . 61: "
67: TEXT 68: ($name->[3] eq $TRUE?'':'') . 69: qtstring($name->[0]) . 70: ($name->[3] eq $TRUE?'':'') . 71: qq|| . 72: ($usd->[2] eq $TRUE?'':'') . 73: qtnum($usd->[0]) . 74: ($usd->[2] eq $TRUE?'':'') . 75: qq|| . 76: ($rub->[2] eq $TRUE?'':'') . 77: qtnum($rub->[0]) . 78: ($rub->[2] eq $TRUE?'':'') . 79: "
92: 93: 94: TEXT perl file2html.pl file.txt >file.html cat file.txt | perl file2html.pl >file.html Вторая жизнь старых компьютеров Сергей Яремчук #cat your_image.lzdsk > /dev/fd0 #dd if=/path/to/rom-image of=/dev/fd0 bs=1024 # rpm -ivh ltsp_core-3.0.9-0.i386.rpm Good! We have found RedHat version 7.3 About to install LTSP, using the following settings: # каталог, в который устанавливаются пакеты LTSP_DIR = /opt/ltsp SWAP_DIR = /var/opt/ltsp/swapfiles # каталог для загружаемого ядра TFTP_DIR = /tftpboot # адрес сети IP_NETWORK = 192.168.0.0 # адрес сервера IP_SERVER = 192.168.0.1 # маска сети IP_NETMASK = 255.255.255.0 # широковещательный адрес сети IP_BROADCAST = 192.168.0.255 #touch /etc/dhcpd.conf subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.2 192.168.0.100; option subnet-mask 255.255.255.0; option broadcast-address 192.168.0.255; option routers 192.168.0.1; option domain-name-servers 192.168.0.1; option domain-name "server.org"; option log-servers 192.168.0.1; host term1 { hardware ethernet 00-02-44-07-FC-C4; fixed-address 192.168.0.100; option host-name "term1"; option root-path "192.168.0.1:/opt/ltsp/i386"; filename "lts/vmlinuz-2.4.21-ltsp-1"; } # Options to syslogd # -m 0 disables 'MARK' messages. # -r enables logging from remote machines # -x disables DNS lookups on messages recieved with -r # See syslogd(8) for more details SYSLOGD_OPTIONS="-m 0 -r " /opt/ltsp/i386 192.168.0.0/255.255.255.0 (ro, no_root_squash) /var/opt/ltsp/swapfiles (rw, no_root_squash) option option-128 e4:45:74:68:00:00; option option-129 "NIC=ne IO=0x300"; /home 192.168.0.0/255.255.255.0 (rw) ltsp-server:/home/ /home nfs defaults,rsize=8192,wsize=8192 0 0 /etc/hosts 127.0.0.1 localhost.localdomain localhost … 192.168.0.1 server.org 192.168.0.100 term1 [root@grinder etc]# /etc/init.d/dhcpd restart Останавливается dhcpd: [ СБОЙ ] Запускается dhcpd: [ ОК ] [root@grinder etc]# /etc/init.d/dhcpd status dhcpd (pid 979) выполняется... service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no per_source = 11 cps = 100 2 } [root@grinder root]# tftp grinder tftp> get lts/vmlinuz-2.4.21-ltsp-1 Received 1062469 bytes in 0.9 seconds tftp> quit FontPath "unix/:-1" FontPath "tcp/localhost:7100" daemon --check xfs xfs -port -1 -daemon -droppriv -user xfs daemon --check xfs xfs -port 7100 -daemon -droppriv -user xfs daemon --check xfs su xfs -c \"xfs -port -1\" -s /bin/sh daemon --check xfs su xfs -c \"xfs -port 7100\" -s /bin/sh ! SECURITY: do not listen for XDMCP or Chooser requests ! Comment out this line if you want to manage X terminals with xdm # этот пункт обязательно закомментировать ! DisplayManager.requestPort: 0 # Эту строчку добавить, правда необязательно. Остальные # можно не трогать. DisplayManager.*.setup:/etc/X11/xdm/Xsetup_workstation Скрипт Xsetup_workstation имеет такой вид: #! /bin/sh /usr/X11R6/bin/xsetroot -solid "#356390" if [- x /usr/bin/xsri]; then /usr/bin/xsri -geometry +5 +5 -avoid 300x250 -keepaspect /etc/X11/xdm/ltsp.gif fi [Default] SERVER = 192.168.0.1 # компьютер, выступающий в роли сервера графических приложений XSERVER = auto # указывает на то, что система сама определяет тип загружаемого # XFree86-сервера X_MOUSE_PROTOCOL = "IMPS/2" # название протокола манипулятора мыши # в данном случае используется мышь со скроллингом, если # обыкновенная мышь подключаемая к порту PS/2, то попробуйте # просто PS/2 X_MOUSE_DEVICE = "/dev/psaux" # указывает на порт PS/2 X_MOUSE_RESOLUTION = 50 X_MOUSE_BUTTONS = 3 LOCAL_APPS = N USE_XFS = Y # используется сетевой сервер шрифтов RUNLEVEL = 5 SOUND = Y VOLUME = 75 [term1] XSERVER = XF86_SVGA # Тип X-сервера, который будет выполняться на клиентской # станции. Для четвертой версии указывается видеомодуль, # например nv. Для XFree86 3.3.6 указывается имя сервера # XF86_SVGA, XF86_S3 и т.д. X_MODE_0 = 800x600 40 800 840 968 1056 600 601 605 628 ї+hsync +vsync # установка параметров вывода на экран, их может быть # несколько от X_MODE_0 до X_MODE_10 X_VIDEORAM = 4096 # количество видеопамяти X_MOUSE_PROTOCOL = "Microsoft" # мышь с последовательным интерфейсом X_MOUSE_DEVICE = "/dev/ttyS0" # мышь, подключаемая к параллельному порту X_MOUSE_RESOLUTION = 50 X_MOUSE_BUTTONS = 2 # количество кнопок мыши # включение эмуляции третьей кнопки мыши # (нажатием двух имеющихся одновременно) X_MOUSE_EMULATE3BTN = Y X_MOUSE_BAUD = 1200 RUNLEVEL = 3 # wget -c http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.22.tar.bz2 # wget -c http://tab.tuxfamily.org/download/openmosix/patch-2.4.22-om-20030811.bz2 # tar -xjvf - linux-2.4.22.tar.bz2 # cd linux-2.4.22 # bzcat ../patch-2.4.22-om-20030825.bz2|patch -p1 # ln -sf /path/to/linux-2.4.22 /usr/src/linux # cd /usr/src/linux # make xconfig {menuconfig, gconfig} openMosix --- openMosix process migration support openMosix File-System Networking options --- Packet Socket Socket Filtering TCP/IP networking IP: multicasting File systems --- /proc file system support Network File Systems --- NFS file system support NFS server support Provide NFSv3 server support # make dep # make bzImage && make modules && make modules_install # mv arch/i386/boot/bzImage /boot/vmlinuz-openmosix # rpm -ivh openmosix-kernel-2.4.22-openmosix1.i686.rpm # cp /usr/src/linux/.config /usr/src/linux/.config_master openMosix --- openMosix process migration support openMosix File-System Networking options --- TCP/IP networking IP: kernel level auto-configuration IP: DHCP support IP: BOOTP support File systems --- /proc file system support Network File Systems --- NFS file system support Provide NFSv3 client support Root file system on NFS # cp /usr/src/linux/arch/i386/boot/bzImage/tftpboot/lts/vmlinuz-openmosix-slave # ./configure –with-kerneldir=/usr/src/linux # make && make install # rpmbuild -ta openmosix-tools-0.3.4.tar.gz 1 192.168.0.1 1 2 192.168.0.100 10 # cp /etc/openmosix.map /opt/ltsp/i386/etc/ # cp /sbin/setpe /opt/ltsp/i386/sbin/ # cp /bin/mosrun /opt/ltsp/i386/bin/ # cp /bin/mosmon /opt/ltsp/i386/bin/ # cp /bin/mosctl /opt/ltsp/i386/bin/ # cp /bin/migrate /opt/ltsp/i386/bin/ # cp /etc/rc.d/init.d/openmosix /opt/ltsp/i386/etc/rc.openmosix # /etc/init.d/openmosix start # mosctl status 2 si::sysinit:/etc/rc.d/rc.sysinit si::sysinit:/bin/mosrun -h /etc/rc.d/rc.sysinit test -f /proc/$$/lock && echo 0 > /proc/$$/lock