Установка старой CentOS

Иногда сверху падает задача (или даже сам придумываешь решение) в стиле «А поставька старую CentOS». Не в смысле «поставь нам 6 версию», а в стиле «поставь на 6.5» (при текущей на данный момент 7.3 актуальной и 6.9 «oldstable» если можно так сказать).

Я прям обязан сделать ремарку: если это решение пришло вам в голову, то скорей всего что-то в ваших рассуждениях пошло не так. Нужно немного откатиться назад по цепочке «как я додумался до такого решения», понять «в какой именно момент вы свернули в эту сторону» и «пойди другим путем». Нет, я верю что бывают ситуации когда нужно поставить «более старую ОС чем текущая», но на 100% уверен что такое можно либо использовать в глубоком интранете (и никогда никому об этом не рассказывать), либо использовать для тестирование\проверки и тп. То есть в режиме «поставил, посмотрел, удалил» и никак иначе.
Если вы покупаете какое-то ПО с «настолько странным» требованием к версии ОС, то вы либо криво смотрите (ага, тут недавно был запрос на «CentOS 6,7 + ispmanager», допрос с пристрастием показал что клиент увидел в требованиях «OS: CentOS 6, 7» не придал значения проблему и подумал что имеется ввиду «Centos 6.7», а не «Centos 6 или CentOS 7»), либо кто-то забыл обновить инфу на сайте (стоит спросить разработчиков или тупо попробовать), либо работаете с государством (или крупными сильно бюрократизированными компаниями), где маразм и священная сертификация значит больше, чем здравый смысл (ага, как-то почти 2 недели пытался отбиться от задачи, которую ставил IT директор крупной, но сторонней компании «поставить ПО внутренней разработки для мониторинга использования лицензий оракла», при том что ПО заточено под Centos, ходит по серым адресам на внутренние сервера компании и периодически выкачивает какие-то скрипты и запускает их от рута. При этом я ответственен только за российский сайт, доступа во внутреннюю сеть с моих серверов нет от слова «совсем», на серверах по просьбе разработчиков стоит дебиан, а оракл даже рядом не валялся. При этом не помогало ни то, что ответственность за работу серверов полностью на нас, а что нам там прилетит в запускаемых скриптах неизвестно, ни то, что оракла нет и ничего другого. Единственный вариант как я смог решить это: устроил итальянскую забастовку и на втором пункте (первый был «скачать пакет с 10.10.X.Y, но мне его прислали почтой) инструкции по установке «Check os version: cat /etc/redhat-release» спросил «а какой результат должен быть? мне кажется что-то пошло не так, у меня «No such file or directory» мне быстро «дали спеца, который сейчас тебе поможет и все объяснит», спец подумал пару часов и спросил «А кто ОС сетапил?» получив ответ «я лично своими руками, а что?» ответил «видимо она как-то не так встала, ее бы ресетапнуть по хорошему», я соответственно «не друг, она в проде, сервер под нагрузкой, вывести его из под нагрузки можно конечно, но на время ресетапа мы останемся без резерва, к тому же ввод обратно в строй это часов 12 на синхронизацию данных, да и к тому же у меня все работает и вопросов к ОС нет, может у нас инструкция неправильная? а то согласовывать долго такие действия будем, а результат непонятен», он спросил «а что за ОС?», «дебиан, я ж вон выше писал», «Аааа, так тогда тебе это не надо, это только на редхад-базед ставиться, а что-ты там писал я не видел, меня только сейчас в копию добавили, у тебя все остальное тоже на дебиане?», «ага», «ну тогда все, ничего ставить не нужно, вопрос закрыт»).

Ну да ладно, это я что-то отвлекся, ближе к сути. Задача: поставить для примера CentOS6.2 i386 для теста <хрен знает что вы там собрались тестировать> (если обновление, то лучше снять образ с боевого сервера, который будете обновлять). Большинство почему-то идут следующим путем: ищут где-нить CD\DVD образ этой самой CentOS 6.2 i386, находят торрет на варезнике с одним сидом, качают его 6 часов на скорости 5кб/с, на отметке 99% единственный сид уходит с раздачи, поиски повторяются, находится физический CD с нужной версией в офисе, но последние 5 лет на этот CD Вася ежедневно ставил чашку с кофе. Диск отмывается, пихается в найденный непонятно-где привод, диск не читается, у бухгалтера под угрозой физической расправы отнимается последний на весь офис «более скоростной DVD привод», сетап начинается, но в середине начинается ругань на нечитающийся диск, после этого с диска снимается побитовая копия (dd с пропуском ошибок), сверяется с образом, скаченным на 99.5% с варезника, при помощи hex-редактора происходят попытки восстановить поврежденные файлы. Тут мимопроходящий Петя спрашивает «чем это ты занят» услышав что ты пытаешься реанимировать установочный диск старой версии CentOS интересуется какая версия тебе нужна и припоминает что кажется у него была точно нужная тебе, и сейчас он посмотрит. Вы вдвоем идете к его компу, он подключается к домашней файлопомойке и начинает через mc перебирать все 10Тб файликов, попутно показывая тебе фотки своих детей и записи встречи нового, 2003 года. Через полчаса нужный образ находится, еще через час вы оба понимаете что качаться он будет еще минимум трое суток, а жена Пети на отрез отказывается «перестать качать новый сезон своего сериала» и заявляет что не нужно использовать домашний интернет сидя на работе. Петя обещает завтра принести этот образ на флешке, но забывает и приносит его только через неделю, образ оказывается с правильной версией, но с неправильной битностью. Идет откат к варианту «скрестить образ с торрента и образ с диска Васи через hex-редактор», но через трое суток борьбы с hex-редактором начинает появляться мысль о суициде и тут приходит Петя и приносит флешку с правильным образом. Установка успешно завершается, ура, победа. DVD-привод возвращается бухгалтеру, CD-диск Васе, наш герой горд собой. Как итог — убито полторы недели времени, куча нервов, и сзади ворчит Вася и требует вернуть ему его диск (ведь отдавал он совершенно точно не белый), бух обещает лишить премии весь отдел, а кто и зачем просил «поставить эту древность» уже вспомнить просто нереально, но герой всерьез раздумывает над домашним хранилищем всех версий всех дистрибутивов (ну так, на случай если в будущем возникнет еще похожая задача).

А вот как правильно делать: идем по адресу http://vault.centos.org/ находим директорию с нужной версией образа и качаем (в случае 5/6 ветками качать полный образ не обязательно, вполне пойдет netinstall, в обозначенном выше случая качаем http://vault.centos.org/6.2/isos/i386/CentOS-6.2-i386-netinstall.iso или даже только ядро http://vault.centos.org/6.2/os/i386/images/pxeboot/vmlinuz и initrd http://vault.centos.org/6.2/os/i386/images/pxeboot/initrd.img если как и предпочитаете pxe), после этого начинаем сетап стандартным образом (либо с netinstall-образа, либо в моем случае кладем указанные файлы на tftp-сервер и просто отдаем ссылки на них в нужных параметрах загрузки), а потом в строку «Url setup» сбиваем «http://vault.centos.org/6.2/os/i386/» (или ссылку на аналогичный каталог для вашей версии, если изначально качали 64-битную версию, то ссылку соответственно будет «http://vault.centos.org/6.X/os/x86_64/»):

После этого сетап продолжаем «как обычно».

Зы если хотите доставить что-то после сетапа из «не актуального репа», то нужно поправить файлики в /etc/yum.repos.d (убрать mirrorlist, в baseurl вписать нужную ссылку) и запускать yum c параметрами «—disableplugin=fastestmirror».
Если же вы так извращаетесь не с 6 Centos, а с какой-то еще более древней, то вероятно сами знаете что и для чего делать.

Зыы если нужно «обновиться» с условной 6.2 до скажем 6.4, то вписываем 6.4 в файлы в /etc/yum.repos.d (в baseurl) и делаем «yum —disableplugin=fastestmirror update».

sysctl v2

Прежде всего хотел бы извиниться перед теми, кто прочитал это и последовал тому, что там написано. В свое оправдание могу сказать «читайте офф. документация, а не всяких мудаков в интернетах».

Правильный способ (который как ни странно описан в man sysctl.d):
1) Правило для udev (да, правильно применять настройки при загрузке модуля, а единственно-верный вариант отловить момент загрузки модуля — это udev. Найти «чем грузиться модуль» и вставить в следующую строчку вызов sysctl можно, но это идеологически неверно). KERNEL указывает на конкретный модуль, а prefix в команде определяет «Only apply rules with the specified prefix», то есть что бы случайно не изменить настройки какого-нить ранее загруженного видео-модуля или типа того (ведь мы не указываем какой файл грузить, хотя если сильно хочеться, то никто это сделать не запрещает).

# cat /etc/udev/rules.d/99-nf_conntrack.rules 
ACTION=="add", SUBSYSTEM=="module", KERNEL=="nf_conntrack", RUN+="/usr/lib/systemd/systemd-sysctl --prefix=/net/netfilter"

2) Стандартный файл со со стандартным синтаксимом по стандартному пути

# cat /etc/sysctl.d/99-nf_conntrack.conf 
net.nf_conntrack_max = 131072

Зы это верно как минимум для centos7, debian8, да и думаю всего остального с systemd по умолчанию.

drbd split brain on Centos6

Я поймал split brain в drbd на Centos6 в результате того, что у меня он настроен между двумя виртуалками на разных гипервизорах, и вот в результате штатных работ по модернизации сети GW был недоступен некоторое время, а соответственно связь между виртуалками была временно нарушена.

Обе виртуалки решили что «вторая выключилась», heartbeat отработал штатно и обе виртуалки смонтировали себе drbd-раздел и обе повесили на себя «общий» адрес.

Когда GW вернулся виртуалки друг друга увидели, поняли что были неправы и обе сделали «ой», то есть в /proc/drbd получилось примерно так:

[root@host1 ~]# cat /proc/drbd
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37

 1: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r-----
    ns:21603172 nr:0 dw:1202172 dr:20972858 al:67 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:198540

И так:

[root@host2 ~]# cat /proc/drbd 
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37

 1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown B r-----
    ns:0 nr:0 dw:76 dr:821 al:4 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:64

(хотя конечно могло и получиться «ro:Secondary/Unknown» на обоих виртуалках).

Как это чинить:
1) В моем случае первый хост (потому что он Primary) назначаем «более правильным» и host2 будем синкать с ним, если бы обе машины стали бы «ro:Secondary/Unknown», то «более правильную» машину выбирает админ исходя из своих соображений (целостность фс, время изменения файлов, куда шли запросы от клиентов и тп).
2) На обоих машинах на всякий случай делаем «drbdadm disconnect r0» (на всякий случай принудительно выключаем связь между инстасами)
3) На «более правильной» делаем «drbdadm invalidate-remote r0»
4) На «менее правильной» делаем «drbdadm invalidate r0»
5) Проверяем /proc/drbd на обоих машинах. «cs» должен быть «StandAlone», а
ro должен быть «Primary/Unknown» (на «более правильное») и «Secondary/Unknown» (на «менее правильной»).
6) Если в предыдущем пункте «что-то не так» или «вы не уверенны», то лучше убедиться что role Primary (поле ro в файле /proc/drbd) именно у той машины, данные который вы хотите оставить, а машина с role Secondary будет синхронизирована с Primary, при этом все локальные изменения будут утеряны.
7) Говорим «drbdadm connect r0» на обоих машинах и командой «cat /proc/drbd» убеждаемся что drbd начал синхронизироваться («ro» поменялся на «Primary/Secondary» или «Secondary/Primary» в зависимости от машины, на которой выполняется команда, появилась шкала синхронизации похожая на аналогичную в mdadm, cs и ds выставились в какое-то вменяемое значение).

Подробнее о значении полей файла /proc/drbd читаем тут

Ps у меня drbd-ресурс называется r0, если у вас по другому (или их больше одного), то меняйте на свое.

Обновление биоса через IPMI, часть 2

Я тут вроде как недавно писал про то, как создать iso-образ для обновления, но в процессе использования этой инструкции мои коллеги столкнулись с проблемой: на некоторых матерях\серверах все доходит до запуска прошивальщика, но он необычно быстро «что-то делает» (буквально за 30 секунд вместо привычных 5 минут) и автоматом ребутает сервер, версия биоса при этом естественно не обновляется.

Мои коллеги решили эту проблему в лоб: пишем тот же образ на флешку, идем к серверу, грузимся с флешки и все проходит штатно.
А на это посмотрел, пожал плечами и сказал «ну раз вас все устраивает — не буду мешать».

В общим коллеги поувольнялись, а мне приспичило вот обязательно обновить биос на одном, отдельно взятом сервере. Я взял тот свой образ, по своей инструкции положил на него нужные файлики, собрал iso, написал «flash.bat прошивка.bin», начался процесс, похожий на стандартную прошивку, я пошел за кофе, а вернувшись меньше чем через минуту увидел на экране уже загружающийся сервер. Сразу вспомнил своих коллег с флешкой, зашел в биос и убедился что ничего не обновилось, расстроился, но делать флэшку категорически нехотелось (ведь у меня нет правильной инструкции для этого).

Загрузился еще раз со своего образа, запустил батник еще раз, внимательно посмотрел на то, что происходил, попытался вдумчиво прочитать и осознать вывод, но сервер опять ушел в ребут. Третий раз забутался с образа (благо сервер не на «5 минут из продакшена для обновления выводили», а планировали пустить в эксплуатацию позже), запустил батник, и вместо вдумчивого чтения вывода занялся тыканьем в PrtSc, потом спокойно почитал текст со скринов, понял что прошивальщику не нравиться некий FDT. Опросил всех вокруг и выяснил что никто про такое не слышал. Почитал еще более внимательно скрины и догадался что это «Flash Descriptor Table», про который снова никто ничего не слышал и не знает. Загуглил пару досовских команд, еще раз посмотрел в .bat-файл и прозрел.

Эти «странные» люди из супермикры командой fdt (полностью команду не привожу, боюсь что ее параметры могут плавать от версии к версии) меняют файл c:\autoexec.bat (и это при том, что в Readme рядом с прошивкой написанно: «2. extract the files from the BIOS package to a DOS bootable device (such as a bootable USB stick, or CD«) и ребутаются даже не задумываясь о том, что дос этот может работать из оперативки загружаясь каждый раз с RO хранилища.

Проблема решается тем, что перед командами

yukra-ThinkPad-X230 data # umount /mnt
yukra-ThinkPad-X230 data # gzip fdboot.img 
yukra-ThinkPad-X230 data # mv fdboot.img.gz fdboot.img

(смотри ссылку выше) мы приводим файл autoexec.bat к виду

cd c:\BIOS\X11SSH-F
flash.bat x11ssh7.309

(естественно с поправкой на ваши версии и пути).

После этого все загрузилось и прошилось.
И да, сервер лежал в трех метрах от меня и все это время гудел куллерами :)

Q-Logic 5800 / 5802 — поиск порта по WWN

Поскольку редко пользуюсь, постоянно забываю как это делается.
Собственно у нас есть некое устройство, мы хотим найти порт, в который физически подключено оно, но не хотим лазить по ЦОДу и отслеживать оптику глазками, а маркировке мы не доверяем.
Первое — нужно узнать WWN устройства, например на HUAWEI S2200T:

admin:/> showfcmode 
============================================================================================================
                                           FC Port Topology Mode
------------------------------------------------------------------------------------------------------------
  Controller ID    Interface Module ID    Port ID    WWN                 Current Mode      Configured Mode  
------------------------------------------------------------------------------------------------------------
  A                0                      P0         2000d4b110ae8525    Loop              AUTO             
  A                0                      P1         2001d4b110ae8525    Point to Point    AUTO             
  A                0                      P2         2002d4b110ae8525    Point to Point    AUTO             
  A                0                      P3         2003d4b110ae8525    Loop              AUTO             
  B                0                      P0         2010d4b110ae8525    Loop              AUTO             
  B                0                      P1         2011d4b110ae8525    Point to Point    AUTO             
  B                0                      P2         2012d4b110ae8525    Point to Point    AUTO             
  B                0                      P3         2013d4b110ae8525    Loop              AUTO             
============================================================================================================

или HUAWEI 5300 V3:

admin:/>show port general physical_type=FC

  ID              Health Status  Running Status  Type       Working Rate(Mbps)  WWN               Role         Working Mode  Configured Mode  Enabled  
  --------------  -------------  --------------  ---------  ------------------  ----------------  -----------  ------------  ---------------  -------  
  CTE0.A.IOM0.P0  Normal         Link Up         Host Port  8000                2000f098388a53d6  INI and TGT  Fabric        Auto-Adapt       Yes      
  CTE0.A.IOM0.P1  Normal         Link Down       Host Port  --                  2001f098388a53d6  INI and TGT  --            Auto-Adapt       Yes      
  CTE0.A.IOM0.P2  Normal         Link Down       Host Port  --                  2002f098388a53d6  INI and TGT  --            Auto-Adapt       Yes      
  CTE0.A.IOM0.P3  Normal         Link Down       Host Port  --                  2003f098388a53d6  INI and TGT  --            Auto-Adapt       Yes      
  CTE0.B.IOM0.P0  Normal         Link Up         Host Port  8000                2010f098388a53d6  INI and TGT  Fabric        Auto-Adapt       Yes      
  CTE0.B.IOM0.P1  Normal         Link Down       Host Port  --                  2011f098388a53d6  INI and TGT  --            Auto-Adapt       Yes      
  CTE0.B.IOM0.P2  Normal         Link Down       Host Port  --                  2012f098388a53d6  INI and TGT  --            Auto-Adapt       Yes      
  CTE0.B.IOM0.P3  Normal         Link Down       Host Port  --                  2013f098388a53d6  INI and TGT  --            Auto-Adapt       Yes      
admin:/>

Смотрим нужные нам WWN, заходим на qlogic, первый делом убеждаемся что порт вообще в этой фабрике:

SANbox-2 #> fcping 2001d4b110ae8525 count 5

  28 bytes from local switch to 20:01:d4:b1:10:ae:85:25  time = 2000 usec
  28 bytes from local switch to 20:01:d4:b1:10:ae:85:25  time = 2000 usec
  28 bytes from local switch to 20:01:d4:b1:10:ae:85:25  time = 2000 usec
  28 bytes from local switch to 20:01:d4:b1:10:ae:85:25  time = 2000 usec
  28 bytes from local switch to 20:01:d4:b1:10:ae:85:25  time = 1000 usec

SANbox-2 #> 

Теперь делаем «show ns all», копируем вывод в текстовый файлик и ищем наш WWM, запоминаем id порта и домена.

SANbox #>  show ns all 

  Seq Domain     Port   Port
  No  ID         ID     Type COS PortWWN                 NodeWWN
  --- ------     ------ ---- --- -------                 -------
  1   1 (0x1)    010100 N    3   20:00:f0:98:38:8a:53:f3 21:00:f0:98:38:8a:53:f3
  2   1 (0x1)    010200 N    3   21:00:00:24:ff:89:ce:3b 20:00:00:24:ff:89:ce:3b
  3   1 (0x1)    010300 N    3   21:00:00:24:ff:89:cb:e4 20:00:00:24:ff:89:cb:e4
  4   1 (0x1)    010400 N    3   21:00:00:24:ff:77:56:82 20:00:00:24:ff:77:56:82
  5   1 (0x1)    010500 N    3   21:00:00:24:ff:77:55:a3 20:00:00:24:ff:77:55:a3
  6   1 (0x1)    010700 N    3   21:00:00:24:ff:4e:98:83 20:00:00:24:ff:4e:98:83
  7   1 (0x1)    010800 N    3   20:11:d4:b1:10:ae:85:25 21:00:d4:b1:10:ae:85:25
  8   1 (0x1)    010a00 N    3   20:00:f0:98:38:8a:53:d6 21:00:f0:98:38:8a:53:d6

  Seq Domain     Port   Port
  No  ID         ID     Type COS PortWWN                 NodeWWN
  --- ------     ------ ---- --- -------                 -------
  1   2 (0x2)    020100 N    3   20:10:f0:98:38:8a:53:f3 21:00:f0:98:38:8a:53:f3
  2   2 (0x2)    020200 N    3   21:00:00:24:ff:89:ce:3a 20:00:00:24:ff:89:ce:3a
  3   2 (0x2)    020300 N    3   21:00:00:24:ff:89:cb:e5 20:00:00:24:ff:89:cb:e5
  4   2 (0x2)    020400 N    3   21:00:00:24:ff:77:56:83 20:00:00:24:ff:77:56:83
  5   2 (0x2)    020500 N    3   21:00:00:24:ff:77:55:a2 20:00:00:24:ff:77:55:a2
  6   2 (0x2)    020600 N    3   21:00:00:24:ff:41:f6:dd 20:00:00:24:ff:41:f6:dd
  7   2 (0x2)    020700 N    3   21:00:00:24:ff:4e:98:82 20:00:00:24:ff:4e:98:82
  8   2 (0x2)    020800 N    3   20:01:d4:b1:10:ae:85:25 21:00:d4:b1:10:ae:85:25  <=== Вот оно. Восьмой порт во втором домене. 
  9   2 (0x2)    020a00 N    3   20:10:f0:98:38:8a:53:d6 21:00:f0:98:38:8a:53:d6

  Seq Domain     Port   Port
  No  ID         ID     Type COS PortWWN                 NodeWWN
  --- ------     ------ ---- --- -------                 -------
  1   98 (0x62)  620000 N    3   20:35:00:80:e5:2d:73:26 20:04:00:80:e5:2d:73:26
  2   98 (0x62)  620100 N    3   21:00:00:24:ff:5c:4d:f9 20:00:00:24:ff:5c:4d:f9
  3   98 (0x62)  620200 N    3   21:00:00:24:ff:4b:c8:14 20:00:00:24:ff:4b:c8:14
  4   98 (0x62)  620300 N    2,3 10:00:00:90:fa:3a:8d:26 20:00:00:90:fa:3a:8d:26
  5   98 (0x62)  620400 N    3   21:00:00:24:ff:5c:4e:60 20:00:00:24:ff:5c:4e:60
  6   98 (0x62)  620500 N    3   21:00:00:24:ff:5c:dc:56 20:00:00:24:ff:5c:dc:56
  7   98 (0x62)  620600 N    3   21:00:00:24:ff:54:84:da 20:00:00:24:ff:54:84:da
  8   98 (0x62)  620700 N    3   21:00:00:24:ff:35:4c:f0 20:00:00:24:ff:35:4c:f0
  9   98 (0x62)  620800 N    3   20:35:00:80:e5:3f:4d:ec 20:04:00:80:e5:3f:4d:ec
  10  98 (0x62)  620e00 N    3   21:00:00:24:ff:35:4c:f3 20:00:00:24:ff:35:4c:f3
  11  98 (0x62)  620f00 N    3   21:00:00:24:ff:2f:8d:bc 20:00:00:24:ff:2f:8d:bc
  12  98 (0x62)  621000 N    3   21:00:00:24:ff:35:4c:fc 20:00:00:24:ff:35:4c:fc
  13  98 (0x62)  621300 N    3   21:00:00:24:ff:07:8e:d1 20:00:00:24:ff:07:8e:d1

  Seq Domain     Port   Port
  No  ID         ID     Type COS PortWWN                 NodeWWN
  --- ------     ------ ---- --- -------                 -------
  1   99 (0x63)  630000 N    3   20:34:00:80:e5:2d:73:26 20:04:00:80:e5:2d:73:26
  2   99 (0x63)  630100 N    3   21:00:00:24:ff:5c:4d:f8 20:00:00:24:ff:5c:4d:f8
  3   99 (0x63)  630200 N    3   21:00:00:24:ff:4b:c8:15 20:00:00:24:ff:4b:c8:15
  4   99 (0x63)  630400 N    3   21:00:00:24:ff:5c:4e:61 20:00:00:24:ff:5c:4e:61
  5   99 (0x63)  630500 N    3   21:00:00:24:ff:5c:dc:57 20:00:00:24:ff:5c:dc:57
  6   99 (0x63)  630600 N    3   21:00:00:24:ff:54:84:db 20:00:00:24:ff:54:84:db
  7   99 (0x63)  630700 N    3   21:00:00:24:ff:35:4c:f1 20:00:00:24:ff:35:4c:f1
  8   99 (0x63)  630800 N    3   20:34:00:80:e5:3f:4d:ec 20:04:00:80:e5:3f:4d:ec
  9   99 (0x63)  630a00 N    3   21:00:00:24:ff:89:cc:c8 20:00:00:24:ff:89:cc:c8
  10  99 (0x63)  630c00 N    3   21:00:00:24:ff:41:f6:dc 20:00:00:24:ff:41:f6:dc
  11  99 (0x63)  630e00 N    3   21:00:00:24:ff:35:4c:f2 20:00:00:24:ff:35:4c:f2
  12  99 (0x63)  630f00 N    3   21:00:00:24:ff:2f:8d:bd 20:00:00:24:ff:2f:8d:bd
  13  99 (0x63)  631000 N    3   21:00:00:24:ff:35:4c:fd 20:00:00:24:ff:35:4c:fd
  14  99 (0x63)  631300 N    3   21:00:00:24:ff:35:59:69 20:00:00:24:ff:35:59:69

  Total: 44

SANbox #> 

А теперь «show fabric» и по Domain id определяем конкретную железку и конкретный порт:

SANbox #> show fabric  

  Domain           1  (0x01)
  WWN              10:00:00:c0:dd:18:e4:f9
  SymbolicName     SANbox
  HostName         d778
  EthIPv4Address   192.168.33.233
  EthIPv6Address   <undefined>

  Domain           2  (0x02) <=== Второй домен.
  WWN              10:00:00:c0:dd:13:42:f0
  SymbolicName     SANbox-2
  HostName         d777
  EthIPv4Address   192.168.33.232
  EthIPv6Address   <undefined>

  Domain           98 (0x62)
  WWN              10:00:00:c0:dd:24:64:6d
  SymbolicName     SANbox
  HostName         d384
  EthIPv4Address   192.168.33.29
  EthIPv6Address   fe80::2c0:ddff:fe24:646d

  Domain          *99 (0x63)
  WWN              10:00:00:c0:dd:24:64:5f
  SymbolicName     SANbox
  HostName         d393.colo.logol.ru
  EthIPv4Address   192.168.33.28
  EthIPv6Address   <undefined>

  * indicates principal switch

SANbox #> 

Для успокоения совести можно зайти на нужную железку и проверить:

SANbox-2 #> show topology 8

  Local Link Information
  ----------------------

  PortNumber 8
  PortID     020800
  PortWWN    20:08:00:c0:dd:13:42:f0
  PortType   F

  Remote Link Information
  -----------------------

  Device 0

    PortID      020800
    PortWWN     20:01:d4:b1:10:ae:85:25
    NodeWWN     21:00:d4:b1:10:ae:85:25
    PortType    N
    Description HUAWEI   S2200T           (Rev. 2105)
    IPAddress   <undefined>

SANbox-2 #> 

Все ок, WWN совпадает. Можно идти спокойно декометировать.

ntp и блокировка портов

Столкнулся тут что один говнохостер блочит исходящие со 123 UDP. То есть поставил ntpd со стандартным конфигом, запустил и вижу такое:

[root@localhost ~]# ntpq -p 
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 sip.dicode.nl   .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp.luna.nl     .INIT.          16 u    -   64    0    0.000    0.000   0.000
 metronoom.dmz.c .INIT.          16 u    -   64    0    0.000    0.000   0.000
 server1.bertold .INIT.          16 u    -   64    0    0.000    0.000   0.000

ntpdate тоже не работает:

[root@localhost ~]# ntpdate pool.ntp.org
13 Feb 11:16:33 ntpdate[16114]: no server suitable for synchronization found
[root@localhost ~]# 

Однако дебаг работает нормально:

[root@localhost ~]# ntpdate -d pool.ntp.org 
13 Feb 11:17:18 ntpdate[16209]: ntpdate 4.2.6p5@1.2349-o Mon Feb  6 07:22:46 UTC 2017 (1)
Looking for host pool.ntp.org and service ntp
host found : backup.kabelnetveendam.nl
transmit(213.109.127.82)
receive(213.109.127.82)
...
reference time:    dc4be672.223c708d  Mon, Feb 13 2017 11:01:54.133
originate timestamp: dc4bea0f.6d4c2184  Mon, Feb 13 2017 11:17:19.426
transmit timestamp:  dc4bea0f.6d238c2e  Mon, Feb 13 2017 11:17:19.426
filter delay:  0.02826  0.02809  0.02814  0.02835 
         0.00000  0.00000  0.00000  0.00000 
filter offset: -0.00049 -0.00073 -0.00082 -0.00077
         0.000000 0.000000 0.000000 0.000000
delay 0.02809, dispersion 0.00009
offset -0.000738

13 Feb 11:17:19 ntpdate[16209]: adjust time server 5.79.108.34 offset -0.000738 sec
[root@localhost ~]#  

Взял tcpdump, повтыкал пару минут и понял что при наличии опции ‘-d’ запросы уходит с непривилегированного порта, а без этой опции со 123 порта и ответ мне не приходит.

[root@localhost ~]# tcpdump host A.B.C.D -nn & ntpdate A.B.C.D > /dev/null 
[5] 16694
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:22:41.771719 IP X.Y.Z.A.123 > A.B.C.D.123: NTPv4, Client, length 48
11:22:41.771722 IP X.Y.Z.A.123 > A.B.C.D.123: NTPv4, Client, length 48
...
11:22:44.771655 IP X.Y.Z.A.123 > A.B.C.D.123: NTPv4, Client, length 48
11:22:44.771662 IP X.Y.Z.A.123 > A.B.C.D.123: NTPv4, Client, length 48
11:22:44.771645 IP X.Y.Z.A.123 > A.B.C.D.123: NTPv4, Client, length 48
13 Feb 11:22:45 ntpdate[16695]: no server suitable for synchronization found
[root@localhost ~]# tcpdump host A.B.C.D -nn & ntpdate -d A.B.C.D > /dev/null 
[6] 16697
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
host found : sip.dicode.nl
11:22:51.724108 IP X.Y.Z.A.59690 > A.B.C.D.123: NTPv4, Client, length 48
11:22:51.724112 IP X.Y.Z.A.59690 > A.B.C.D.123: NTPv4, Client, length 48
11:22:51.724115 IP X.Y.Z.A.59690 > A.B.C.D.123: NTPv4, Client, length 48
11:22:51.724118 IP X.Y.Z.A.59690 > A.B.C.D.123: NTPv4, Client, length 48
...
11:22:51.736426 IP A.B.C.D.123 > X.Y.Z.A.59690: NTPv4, Server, length 48
11:22:51.736435 IP A.B.C.D.123 > X.Y.Z.A.59690: NTPv4, Server, length 48
11:22:51.736422 IP A.B.C.D.123 > X.Y.Z.A.59690: NTPv4, Server, length 48
[root@localhost ~]# 

Уже было думал поднимать vpn только ради синхронизации времени, но потом подумал немного, почитал «man ntpd», «man ntp.conf» и «man ntpdate» и таки нашел нужную опцию (а заодно выяснил почему ntpdate с разных портов пакеты отправляет):

-u Direct ntpdate to use an unprivileged port for outgoing packets. This is most useful when behind a firewall that blocks incoming traffic to privileged ports, and you want to synchronize with hosts beyond the firewall. Note that the -d option always uses unprivileged ports.

В общем добавляем «ntpdate -u» в крон и радуемся жизни (костыль конечно, но меньший, чем поднимать vpn только ради синхронизации времени)

ssh ControlMaster и Port forwarding

Шел 2017 год. Я уже лет 15 администрировал linux, и как минимум лет 8 это было основной и почти единственной вещью, за которую я получал деньги.

Вчера я узнал о замечательной штуке: опция «ControlMaster» к ssh-клиенту. Эта штука работает примерно так: от ssh-клиента отфоркивается (через вызов clone) процесс, который «встает» между ssh-клиентом и ssh-сервером на удаленной машине. Принимает запрос аутентификации от сервера, перенаправляет его клиенту, получает ответ от клиента, устанавливает соединение и дальше прогоняет весь трафик через себя. Все это делается через создание локального сокета по адресу «ControlPath» из конфига клиента (или по адресу по умолчанию).

Пока что назначение всех этих действия пока не очень понятно наверное, да? Так вот, самое интересное начинается когда вы закрываете соединение с удаленным сервером или хотите установить еще одно соединение из соседнего шела (да, не всегда на целевом сервере есть screen\tmux). Если вы закрываете ssh клиент (нажимаете Ctrl+D или пишете exit в консоли), то соединение «ssh-клиент <=> локальный сокет» закрывается, а соединение «отфоркнутый процесс <=> удаленный сервер» остается висеть. Если после этого вы хотите установить новое соединение с тем же сервером(не важно закрыли вы первное или нет), то клиент ищет сокет с именем нужного сервера (параметр ControlPath), соединяется с ним и вы уже авторизованны. Нет, соединения не «мешают» друг другу, то есть они независимые, но при этом не происходит соединения нового коннекта к ssh-серверу, не запрашивается авторизация и не остаются записи в логах ssh-сервера и тп. Соединение будет висеть «ControlPersist» времени.

Собственно все хорошо, замечательно и удобно, но внимательный читатель может спросить меня «а причем тут порт-форвардинг?», который вместе с этой штукой тоже отлично работает. Отвечаю: у меня иногда бывает задача «сходить на виндовый сервер, который в защищенной сети, но рядом есть машина с доступным ssh». Обычно я делаю что-то типа «ssh SERVER_NAME -L 3389:10.0.0.5:3389» и потом «rdesktop 127.1». Вот и сегодня делаю — захожу, все ок. Поработал, закрываю rdesktop, закрываю ssh, нажимаю стрелку вверх и правлю предыдущую команду, вместо «-L 3389:10.0.0.5:3389» вписываю «-L 3389:10.0.0.6:3389», запускаю rdesktop и попадаю на сервер, с которого только что вышел. Сначала не понял что именно произошло и почему «сервер выглядит не так, как должен», потом вернулся в консольку с ssh-клиентом и заметил

mux_client_forward: forwarding request failed: Port forwarding failed
muxclient: master forward request failed
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 3389

Потом покопался у себя в системе и понял что виновен ControlMaster и заодно покопался в том, как именно работает эта магия.
Зы что-бы закрыть установленное ранее таким образом соединение нужно выполнить на своей машине команду «ssh -O exit <нужный сервер>«, при этом текущие соединения к этому серверу (которые установлены через ControlMaster закроются с сообщением «Shared connection to X closed.»

Зы ssh клиент можно обмануть сделав симлинк с «ожимаемого имени сокета» на другой аналогичный сокет.

debian8 sysctl.conf

Чем больше я вожусь с дебианом, тем больше складывается впечатление что systemd они себе впилили «не совсем добровольно и чисто для галочки».
В данном случае потребовалось добавить строчку «net.ipv4.netfilter.ip_conntrack_max = 1548576».

Добавил, делаю «sysctl -p» — работает. Ребутаюсь — значение откатывается на дефолт. Делаю «sysctl -p» — снова работает.

В итоге решилось созданием файла /etc/systemd/system/systemd-sysctl.service

[Unit]
Description=Apply Kernel Variables
Documentation=man:systemd-sysctl.service(8) man:sysctl.d(5)
DefaultDependencies=no
Conflicts=shutdown.target
After=systemd-readahead-collect.service systemd-readahead-replay.service
After=systemd-modules-load.service
After=network.target
Before=sysinit.target shutdown.target
ConditionPathIsReadWrite=/proc/sys/

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/lib/systemd/systemd-sysctl

[Install]
WantedBy=multi-user.target

и командой «systemctl daemon-reload && systemctl enable systemd-sysctl.service»

UPD Это «немножко» неверно. Не смотри сюда, смотри туда

Установка proxmox через PXE

Примерная последовательность команд для перепаковки образа proxmox для установки через PXE

# mount proxmox-ve_4.2-725d76f0-28.iso /mnt/iso/  -o loop
# mkdir tmp
# cd tmp/
# cp /mnt/iso/boot/initrd.img .

# file initrd.img 
initrd.img: gzip compressed data, from Unix, last modified: Tue Apr 26 17:29:33 2016, max compression
# gzip -d -S ".img" ./initrd.img
# mkdir initrd_tmp
# cd initrd_tmp/
# cpio -i -d < ../initrd
# cp ../../proxmox-ve_4.2-725d76f0-28.iso proxmox.iso
# find . | cpio -H newc -o > ../initrd_new
# cd ..
# ls -lah 
итого 864M
drwxr-xr-x  3 root root 4,0K Июн 16 10:29 .
drwxr-xr-x  3 root root 4,0K Июн 16 10:22 ..
-r--r--r--  1 root root  83M Июн 16 10:23 initrd
-rw-r--r--  1 root root 782M Июн 16 10:29 initrd_new
drwxr-xr-x 13 root root 4,0K Июн 16 10:28 initrd_tmp

# file initrd*
initrd:     ASCII cpio archive (SVR4 with no CRC)
initrd_new: ASCII cpio archive (SVR4 with no CRC)
initrd_tmp: directory

# mv initrd_new initrd
# gzip -9 -S ".img" initrd

Кусок конфига pxelinux:

    LABEL Proxmox-4.2
        menu label Proxmox-4.2
        kernel proxmox-ve-42/linux26
        append = initrd=proxmox-ve-42/initrd.img vga=791 video=vesafb:ywrap,mtrr ramdisk_size=16777216 splash=verbose

Debian iptables

В Centos есть файлик /etc/sysconfig/iptables, в который можно написать свои правила, и они будут работать после ребута.
В debian\ubuntu же все советуют написать скрипт из 3 строк и положить его в /etc/network/if-pre-up.d/ или в /etc/network/if-up.d/
В скрипте нужно вызвать iptables-restore. Так же по желанию можно написать еще 1 скрипт, положить его в /etc/network/if-down.d/ и сделать так, что бы он сохранял текущие настройки iptables перед выключением (вызываем iptables-save).

Мне всегда казалось это не логичным. Как мол так, проприетарщики(CentOS\RedHat) уже давно пришли к тому, что одни и теже настройки хранятся в одном и том же месте(это конечно все можно поменять, но 100% «чужих» хостов, которые я видел настроенны «по умолчанию» в этом плане), а в кругом свободном дебиане и убунте (которая впереди планеты всей … во всяком случае пытается быть) каждый админ сам себе костылик пишет. И вот сегодня я подумал «ээй чувак, у тебя ведь есть сюстемД, наверника так всеми нелюбимый Поттентинг уже подумал о тебе и сделал ‘единообразно’, посмотри же уже наконец в гугле» и полез в гугл с тематическими запросами.

Оказывается да, уже сделал, но не Поттентинг, а !!!! (в случае если мы говорим про дебиан8), положил его в universe/admin, и назвал iptables-persistent. Ставим его и у нас, как у нормальных людей (это я сейчас про CentOS) появляется отдельный сервис, отвечающий за фаервол. Называется он правда не iptables как в CentOS а netfilter-persistent, но зато все как мы любим: на любой системе единый для всех файл (точнее 2: /etc/iptables/rules.v4 и /etc/iptables/rules.v6). Пишем туда свои правила, включаем сервис (systemctl enable netfilter-persistent.service), ребутаемся и забываем об аде в виде «тут правила лежат в /etc/iptables.rules, а там в /etc/iptables.up»

Зы это все конечно легко обходится системой управления конфигурациями, которая делает все единообразно, но пока-что это не мой случай к сожалению.

Subscribe to RSS Feed