Все записи автора KulMaks

Загрузка cisco 4000 в ROMMON.

В процессе различных экспериментов с версиями прошивок cisco ISR 4000 может возникнуть ситуация, когда девайс перестает реагировать на ваши действия (в т.ч. в консоли). Т.е. он вполне себе отображает процесс загрузки, на него можно даже по ssh зайти… Правда, после входа по ssh не появляется стандартного приглашения командной строки. Что делать и как жить дальше?

Все довольно просто. Надо подключиться консольным кабелем к циске, выключить ее секунд на 30, открыть com-порт, например, в PuTTY, включить девайс. После появления первых строк текста в консоли — надо нажать Break и дождаться прерывания процесса загрузки с появлением приглашения ROMMON. Выглядит это примерно так:

Initializing Hardware ...

System integrity status: 00000610
Rom image verified correctly


System Bootstrap, Version 15.4(3r)S5, RELEASE SOFTWARE
Copyright (c) 1994-2015 by cisco Systems, Inc.

Current image running: Boot ROM0

Last reset cause: PowerOn
Cisco ISR4331/K9 platform with 4194304 Kbytes of main memory


no valid BOOT image found
Final autoboot attempt from default boot device...
Warning: filesystem is not clean
Warning: filesystem is not clean
File size is 0x1bcc9bfc


monitor: command "boot" aborted due to user interrupt


rommon 1 >

Если нажатие кнопки Break не помогает, можете воспользоваться соответствующей командой из меню PuTTY (Special command -> Break)

После появления приглашения можно выполнить команду dir bootflash: для просмотра файлов прошивок на флэшке и загрузить нужный образ (тот, с которым все было хорошо) командами:

BOOT=bootflash:isr4300-universalk9_npe.03.16.02.S.155-3.S2-ext.SPA.bin

sync

confreg 0x2102

reset

В этом случае, isr4300-universalk9_npe.03.16.02.S.155-3.S2-ext.SPA.bin — это файл образа в памяти устройства.

Если при попытке просмотра файлов командой dir bootflash: у вас появляется сообщение «Please reset before continuing», то простой reset вам не поможет. Необходимо выполнить следующее:

confreg 0x0

reset

После этих двух команд, циска перезагрузится в ROMMON без дополнительных плясок. Ну а дальше выполняем те же пункты, которые указаны сверху, загружаемся и не забываем указать нужный образ для загрузки с последующим сохранением конфигурации :)

Файлы cab_xxxx в директории windows\temp

В последнее время начали появляться проблемы со свободным местом на системных дисках на нескольких компьютерах. Свободные 100 Гб медленно но верно исчезали пока пользователи не начинали получать предупреждения о недостатке места на диске. Выяснялось, что все место исчезало благодаря файлам cab_xxxx, где xxxx — 4 цифры. Эти файлы лежали в директории C:\Windows\Temp. Простое удаление файлов освободит место, но не исправит проблему. Единственно верное решение — удалить эти файла,  а также удалить логи из директории C:\Windows\Logs\CBS. Только в таком случае временные файлы перестанут появляться и съедать весь диск.

Проблема возникает из-за того, что система не может заархивировать один или несколько логов из этой директории. В итоге остается временный файл cab_xxxx и каждые 30-60 минут появляется новый, что и приводит к переполнению диска.

Powershell script cannot be loaded because the execution of scripts is disabled on this system

Те, кто работает с ОС Windows, рано или поздно, будут вынуждены столкнуться с написанием скриптов на powershell. Microsoft очень старается, чтобы это произошло как можно раньше и пихает его чуть менее чем везде. Но радость от powershell была бы не полной, без ограничений по запуску скриптов. При попытке запуска написанного скрипта, 99% новичков получают следующую ошибку:

File C:\scripts\psscript.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
At line:1 char:23
+ C:\scripts\psscript.ps1 <<<<
 + CategoryInfo : NotSpecified: (:) [], PSSecurityException
 + FullyQualifiedErrorId : RuntimeException

Как видим, Microsoft озаботилась безопасностью и отключила возможность запуска ps-скриптов. Совсем. Естественно, можно почитать мануал по команде

get-help about_signing

но кто это будет делать? Текста там много и он неинтересный. А результат будет все равно одним — необходимо разрешить запуск всех скриптов. Запускаем powershell с правами администратора и выполняем следующую команду:

Set-ExecutionPolicy Unrestricted

После этого powershell запросит подтверждение и отключит защиту. Если же ошибка не пропадает и после этого — значит у вас 64-разрядная ОС. В таком случае эту команду надо выполнить и в powershell x86 и в x64 — у них свои собственные настройки.

Мониторинг логов в Zabbix и возврат триггера в OK

Zabbix может многое. Главное — суметь это настроить :) Одна из полезных возможностей — мониторинг лог-файлов на наличие определенных записей. Если вы хотите держать руку на пульсе событий при мониторинге серверов, то без мониторинга логов никак не обойтись: почти все серьезные ошибки пишутся в логи и во многих случаях гораздо эффективнее мониторить один-два лога, чем настраивать отслеживания статуса 50 сервисов, работоспособность которых не всегда легко проверить.

Мониторинг логов возможен только при установке агента на хост

Собственно, в самой настройке мониторинга логов нет ничего сложного: добавляем соответствующий Item, пишем регулярное выражение для триггера и начинаем получать уведомления! Например, мы хотим отслеживать все ошибки из System лога на серверах под управлением OS Windows. Для этого, создаем следующий Item:

eventlog[System,,"Error",,@eventlog,,skip]

Параметры следующие: System — лог, который отслеживаем; второй параметр — регулярное выражение, которое ищем (пропущен, берем все записи); третий — «Error» — важность, согласно классификации ОС; четвертый — любой источник; пятый — @eventlog — макрос, который исключает события с идентификаторами ^(1111|36888|36887|36874)$;  шестой — максимальное кол-во строк, которое мы отправляем серверу в секунду (неограниченное);  последний параметр — skip — заставляет сервер читать только новые записи лога, а не перечитывать его весь.

В качестве триггера мы используем следующую строку:

{host:eventlog[System,,"Error",,@eventlog,,skip].regexp(^.*$)}<>0

Т.е. мы берем любую строку, которая попала в Item и высылаем уведомление.

После такой настройки мы получим первую ошибку из лога и триггер будет висеть в состоянии PROBLEM до скончания веков, т.к. нет события, которое его переводит в состояние OK. Для решения этой проблемы необходимо добавить к триггеру еще одно условие: наличие новых данных в течение промежутка времени, меньшего, чем время опроса Item. Т.е. если мы проверяем лог на ошибки раз в минуту, то нам надо поставить любой промежуток времени, меньший, чем минута. Итоговый триггер будет выглядеть как-то так:

{host:eventlog[System,,"Error",,@eventlog,,skip].regexp(^.*$)}<>0 and {host:eventlog[System,,"Error",,@eventlog,,skip].nodata(10)}<>1

Выглядеть это будет как «нашли что-то в Item» И «за последние 10 секунд были получены новые данные». При следующей проверке триггер перейдет в состояние OK, т.к. за последние 10 секунд новых данных получено не было. Других способов возврата триггера для лога в нормальное состояние в заббиксе версии 2 не предусмотрено.

Блокирование процесса MySQL-сервера в оперативной памяти. Memlock на FreeBSD.

Бывают случаи, когда надо запретить операционной системе сервера переносить данные определенного сервиса/приложения в swap. Т.е. все остальное можно, хоть и нежелательно, а вот какое-нибудь одно ну совсем нельзя. Для этого во всех (ну или почти во всех) современных unix системах существует системный вызов memlockall — он отвечает как раз за «блокировку» данных в оперативной памяти. Можно, конечно, долго рассуждать о том, что если swap на сервере становится нужен — пора апгрейдить сервер/снижать нагрузку на него. Так и обстоят дела в идеальном мире.

Но наш мир далек от совершенства и в ПО, в том числе системном, тоже бывают ошибки. Я столкнулся с одной пренеприятнейшей ситуацией на сервере под управлением FreeBSD 9.2, с корнем на ZFS. Ситуация состояла в том, что система никак не хотела освобождать память из-под ARC-кэша, когда она была необходима приложениям и предпочитала сбрасывать данные других приложений в swap. Все бы ничего, но самым «жрущим» процессом всегда оказывался MySQL, половину которого она и умудрялась выдавить в swap.

А потом начиналось самое интересное: в те лохматые времена, когда устанавливался этот сервер, про размещение swap на zfs никто ничего плохого не говорил. А потом выяснили, что внезапно при активном чтении/записи из свапа (например, при внезапно возросшей нагрузке с истребованием данных mysql, которые упали в свап и вытеснением других приложение туда же) может возникнуть deadlock. Выглядит это очень весело, но не в том случае, если сервер не имеет удаленного управления и стоит в далеком дата-центре, в который надо ехать, да еще и согласовав свой приезд с сотрудниками заранее. С виду сервер остается живым — отвечает на пинги, принимает пакеты на открытые порты, но не отдает никаких данных. При подключении клавиатуры бодро выкидывает в консоль сообщение о подключении девайса, но не реагирует на нее и, более того, не пишет никакие логи. Помогает только reset.

Если у вас действительно не хватает памяти на сервере, то установка «—memlock» не поможет и будет даже вредной. При исчерпании свободной памяти и отсутствии возможности «вынести» кого-нибудь в swap, система с большой долей вероятности просто убьет самый объемный процесс, которым окажется как раз mysql

Впрочем, я отвлекся. Целью этого повествования является как раз способ принуждения системы «убрать руки» от памяти, выделенной для MySQL. Для этого существует параметр запуска —memlock. Первое решение, которое приходит в голову — прописать в /etc/rc.conf строчку:

mysql_args="--memlock"

Прописываем, перезапускаем mysql и видим (с помощью запроса show variables like ‘%lock%’), что переменная locked_in_memory выставлена в OFF.

Начинаем думать и читать мануалы… Оказывается, для успешного выполнения вызова memlockall (который и выполняется при указании параметра —memlock), необходимы root-привилегии. Но мы же не хотим, чтобы сервер работал от имени root? В случае с FreeBSD без редактирования стартового скрипта mysql, к сожалению, не обойтись — пользователь ‘mysql’ туда «захардкожен» и его придется сменить ручками. Открываем /usr/local/etc/rc.d/mysql-server и вместо mysql_user=»mysql» вписываем mysql_user=»root». Далее обязательно удаляем из строки:

command_args="-c -f /usr/local/bin/mysqld_safe --defaults-extra-file=${mysql_optfile} --user=${mysql_user} --datadir=${mysql_dbdir} --pid-file=${pidfile} ${mysql_args}"

кусочек «—user=${mysql_user}». Не забываем, что в rc.conf у нас остался mysql_args=»—memlock». И, наконец, для того, чтобы пользователь после запуска сменился на mysql, указываем в файле /etc/my.cnf (по умолчанию его нет в системе) следующее:

[mysqld]
user=mysql

Важно указать это именно в /etc/my.cnf — этот файл читается первым, а mysql в целях безопасности применяет только первую указанную опцию user. После проделанных манипуляций перезапускаем mysql-server командой:

/usr/local/etc/rc.d/mysql-server restart

и проверяем переменную «locked_in_memory» — она должна быть ON. Также, вы сразу заметите увеличение количества wired memory в выводе top на объем, занятый mysql.

В моем случае это проблему решило и, как ни странно, система перестала уходить в swap — память при необходимости отбиралась у ARC, хотя других изменений не производилось.

P.S. Главное не забыть об этих изменениях после обновления mysql — скрипт может быть перезаписан в процессе обновления.