find и позиция параметра

~/123 $ ls
~/123 $ touch foo
~/123 $ touch bar
~/123 $ find . -name '*oo' -print
./foo
~/123 $ find . -print -name '*oo' 
.
./foo
./bar
~/123 $ ls
bar  foo
~/123 $ 

С параметром -delete тоже самое. То есть если написать find . -delete -name ‘ololo’ то оно удалит все в текущей директории.

Это конечно описано в документации, но даже как-то странно что за многие годы я на это не разу ни наступил … или не заметил.

Облако mail.ru через webdav

Задача: зацепить через WebDAV в свою систему место от mail.ru

sudo apt install davfs2 
echo "use_locks 0" > ~/.davfs2/davfs2.conf
echo "https://webdav.cloud.mail.ru user@corp.mail.ru Passw0rd" > .davfs2/secrets 

Добавляем в fstab что-то типа «https://webdav.cloud.mail.ru /home/user/mount davfs user,rw,noauto 0 0», а своего пользователя в группу davfs2. При необходимости запускаем команду «sudo dpkg-reconfigure davfs2» и отвечаем Yes на вопрос «Should unprivileged users be allowed to mount WebDAV resources?» После этого монтировать\демонтировать можно обычными mount\umount.

Ps есть подозрение что для работы вот этого всего нужно купить любой платный тариф или быть сотрудником компании.

logger и пересылка логов для сервисом, которые не умеют слать логи в syslog.

В прекрасном и идеально мире каждый должен заниматься своим делом.
В частности я убежден что когда логи пишет логи самостоятельно — это неправильно. Более того совсем неправильно если приложение не умеет отправлять логи в syslog (через сокет или сеть). Сейчас пришел systemd и логи вообще можно писать в STDIN и не париться.

Например apache ну умеет писать логи в syslog. Но он умеет писать их в пайп. Пишем в конфиге

	ErrorLog "| /usr/bin/logger --tag example.org_apache-error -n 192.168.5.254"
	CustomLog "| /usr/bin/logger --tag example.org_apache -n 192.168.5.254" combined

и логи полетели на syslog-сервер 192.168.5.254. Или не указывает «-n» и логи уходят в локальный syslog.

Но сегодня наткнулся на debian7 (да древность, да нужно выкидывать уже, но тем не менее на данный момент оно еще поддерживается).
Запускаю «echo 123 | /usr/bin/logger -n 192.168.5.254» и на сервер ничего не доходит.
Проверил связанность, настройки фаерволов с обоих сторон, позапускал tcpdump, поперебирал разные варианты настроек и ничего. Взял strace:

	[root@d314 /var/log]# date | strace -f /usr/bin/logger  -n 192.168.5.254  
execve("/usr/bin/logger", ["/usr/bin/logger", "-n", "192.168.5.254"], [/* 22 vars */]) = 0
brk(0)                                  = 0xe26000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff32ee1f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26469, ...}) = 0
mmap(NULL, 26469, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff32ee18000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\357\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1607696, ...}) = 0
mmap(NULL, 3721272, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ff32e875000
mprotect(0x7ff32e9f9000, 2093056, PROT_NONE) = 0
mmap(0x7ff32ebf8000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x183000) = 0x7ff32ebf8000
mmap(0x7ff32ebfd000, 18488, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ff32ebfd000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff32ee17000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff32ee16000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff32ee15000
arch_prctl(ARCH_SET_FS, 0x7ff32ee16700) = 0
mprotect(0x7ff32ebf8000, 16384, PROT_READ) = 0
mprotect(0x603000, 4096, PROT_READ)     = 0
mprotect(0x7ff32ee21000, 4096, PROT_READ) = 0
munmap(0x7ff32ee18000, 26469)           = 0
brk(0)                                  = 0xe26000
brk(0xe47000)                           = 0xe47000
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2709120, ...}) = 0
mmap(NULL, 2709120, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff32e5df000
close(3)                                = 0
getpid()                                = 2530
open("/etc/resolv.conf", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff32ee1e000
read(3, "nameserver 8.8.8.8\n", 4096)   = 19
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7ff32ee1e000, 4096)            = 0
uname({sys="Linux", node="d314", ...})  = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(514), sin_addr=inet_addr("192.168.5.254")}, 16) = 0
close(1)                                = 0
fstat(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff32ee1e000
read(0, "\320\241\321\200\320\264 \320\244\320\265\320\262 21 10:18:33 MSK 20"..., 4096) = 35
time([1519197513])                      = 1519197513
open("/etc/localtime", O_RDONLY)        = 1
fstat(1, {st_mode=S_IFREG|0644, st_size=1470, ...}) = 0
fstat(1, {st_mode=S_IFREG|0644, st_size=1470, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff32ee1d000
read(1, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\r\0\0\0\r\0\0\0\0"..., 4096) = 1470
lseek(1, -903, SEEK_CUR)                = 567
read(1, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\0\0\0\16\0\0\0\0"..., 4096) = 903
close(1)                                = 0
munmap(0x7ff32ee1d000, 4096)            = 0
socket(PF_FILE, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 1
connect(1, {sa_family=AF_FILE, path="/dev/log"}, 110) = 0
sendto(1, "<13>Feb 21 10:18:33 logger: \320\241\321\200"..., 62, MSG_NOSIGNAL, NULL, 0) = 62
read(0, "", 4096)                       = 0
close(1)                                = 0
exit_group(0)                           = ?
[root@d314 /var/log]#  

Сокет до 192.168.5.254 открывается (строки 43-44), но почему-то UDP, в хелпе (и мане сказанно):

[root@d314 /var/log]# logger -h 

Usage:
 logger [options] [message]

Options:
 -d, --udp             use UDP (TCP is default)
 -i, --id              log the process ID too
 -f, --file <file>     log the contents of this file
 -h, --help            display this help text and exit
 -n, --server <name>   write to this remote syslog server
 -P, --port <number>   use this UDP port
 -p, --priority <prio> mark given message with this priority
 -s, --stderr          output message to standard error as well
 -t, --tag <tag>       mark every line with this tag
 -u, --socket <socket> write to this Unix socket
 -V, --version         output version information and exit

[root@d314 /var/log]# 

То есть должен быть tcp по умолчанию (опции «переключи на tcp» нет, только обратная ей «переключи на udp»), но у нас UDP (SOCK_DGRAM).
Но что самое интересное — в сокет даже не пытается ничего отправляться. Тупо открыли сокет до указанного сервера, потом открываем до локального syslog-а и отправляем в локальный.

Ладно, хер с ним. Беру и пишу свою реализацию logger’а (писать багрепорты на ОС, которую через месяц выкинул с поддержки смысла не вижу):

#!/usr/bin/env perl

use warnings;
use strict;
use Net::Syslog;

my $syslog=new Net::Syslog(Facility => 'local4',SyslogHost => '192.168.5.254', Name => 'tag' );

while(42){
	open(FIFO, "< /var/log/fifo") || die("Err opening a fifo: $!");

	while (42) {
		my $line = <FIFO>;
		if ( ! defined($line) ) {
			sleep 1;
			next;
		}
		$syslog->send( $line , Priority => 'info');
	}
}

Код конечто не идеальный, но хочется использовать именновой пайп (что бы не дергать лишний раз диск). Если из пайпа перестать выбирать данные, то тот, кто их туда пишет просто залипнет в состоянии D. Поэтому 2 бесконечных цикла в коде, а третий во врапере на баше был. Проверил, перероверирил и вот это все, убедился что само запуститься если там oom прибъет или еще почему-либо упадет. Захожу в мускуль говорю «вкдючай slow-лог и пиши вон в тот пайп, хуй там был.

2018-02-21 06:25:03 10912 [ERROR] Could not open /var/log/mysql/mysql-slow.log for logging (error 11). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.

И только гугл нам подсказывает что ни я первый и единственный вариант — в новых версиях мускуля есть штатный механизм записи в syslog.

Пиздец в общем. Такую простую задачу вот так эпично сьфейлить.

IPv6 в помощь системному администратору

IPv6 уже давно захватил мир, только рассказать об этом всем забыли.
Почти более-менее крупные провайдеры, датаценры и прочие «проф. игроки» уже давно не просто готовы к внедрению ipv6, но уже внедрили и давно используют его.
Тот же гугл на данный момент получает 25% своего мирового трафика по ipv6, однако в из Россиии этот показатель всего 1,35%.
Но речь немного не об этом.
Сегодня мне приехала Huawei Storage 2600 V3. Собрал, скоммутировал, включил и теперь бы ее настроить. В мануале сказано: «For a 2 U controller enclosure, the default IP addresses of the management network ports on controllers A and B are respectively 192.168.128.101 and 192.168.128.102, and the default subnet mask is 255.255.0.0.»
А у меня в этом влане используются другие адреса. Конечно можно повесить адрес из 192.168.0.0/16 на интерфейс, зайти на стору, поменять адреса на свои, снять адрес 192.168.0.0/16 с интерфейса и радоваться жизни, но как-то влом, тем более этот влан «где-то в дц», а не на моем ноуте, а лишний раз трогать настройки сети на серверах в том же влане не хочется.
Поэтому:
1) Смотрим мак на порту:

dln-sw22.logol.ru# show bridge address-table ethernet g47
Aging time is 300 sec

  Vlan        Mac Address       Port     Type    
-------- --------------------- ------ ---------- 
  840      00:2e:c7:49:0e:e1    g47    dynamic   

dln-sw22.logol.ru# 

(Это для аллида, для циски show mac …)
2) Дампим трафик по маку на сервере в том же влане

[root@jail ~]# tcpdump -i eth2 ether host 00:2e:c7:49:0e:e1  -vv
tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 262144 bytes
16:54:37.862583 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.128.101 (Broadcast) tell 192.168.128.101, length 46
16:54:37.920261 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.128.101 (Broadcast) tell 0.0.0.0, length 46
16:54:38.920346 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.128.101 (Broadcast) tell 0.0.0.0, length 46
16:54:39.920338 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.128.101 (Broadcast) tell 0.0.0.0, length 46
16:56:05.252595 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.128.101 (Broadcast) tell 192.168.128.101, length 46
16:56:05.306504 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.128.101 (Broadcast) tell 0.0.0.0, length 46
16:56:06.306557 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.128.101 (Broadcast) tell 0.0.0.0, length 46
16:56:07.306565 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.128.101 (Broadcast) tell 0.0.0.0, length 46
16:56:11.585823 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::2e:c700:549:ee1 > ff02::1:ff49:ee1: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has fe80::2e:c700:549:ee1
	  source link-address option (1), length 8 (1): 00:2e:c7:49:0e:e1
	    0x0000:  002e c749 0ee1
16:56:12.586549 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::2e:c700:549:ee1 > ff02::1:ff49:ee1: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has fe80::2e:c700:549:ee1
	  source link-address option (1), length 8 (1): 00:2e:c7:49:0e:e1
	    0x0000:  002e c749 0ee1
16:56:13.587508 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::2e:c700:549:ee1 > ff02::1:ff49:ee1: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has fe80::2e:c700:549:ee1
	  source link-address option (1), length 8 (1): 00:2e:c7:49:0e:e1
	    0x0000:  002e c749 0ee1
^C
11 packets captured
11 packets received by filter
0 packets dropped by kernel
[root@jail ~]# 

3) Заходим через ssh по линк-локал адресу и творим все, что хотим(не забываем что для работы линк-локал адреса нужно указать интерфейс, в моем случае eth2, и разделить адреса и интерфейса через %:

[root@jail ~]# ssh  admin@fe80::2e:c700:549:ee1%eth2

Authorized users only. All activities may be monitored and reported.
admin@fe80::2e:c700:549:ee1%eth2's password: 
Last login: Wed Dec 27 22:08:42 2017 from fe80::216:3eff:fe65:632e%eth5

WARNING: You have accessed the system.
You are required to have a personal authorisation from the system administrator before you use this computer. Unauthorised access to or misuse of this system is prohibited.


  System Name     : Huawei.Storage               
  Health Status   : Normal                       
  Running Status  : Normal                       
  Total Capacity  : 7.988TB                      
  SN              : 2102350SHS10HC000023         
  Location        :                              
  Product Model   : 2600 V3                      
  Product Version : V300R006C00                  
  Time            : 2017-12-27/22:39:03 UTC+08:00 
  Patch Version   : SPC100                       
admin:/>

Я например сразу сменил адрес командой

admin:/>change system management_ip eth_port_id=CTE0.A.H4 ip_type=ipv4_address ipv4_address=X.X.X.X mask=255.255.255.0 gateway_ipv4=X.X.X.Y

и потом зашел уже браузером

Причем даже ssh немного лишнее, можно было сделать так:
С ноута:

yukra@yukra-ThinkPad-X230 ~ $ ssh -L '8088:[fe80::2e:c700:549:ee1%eth2]:8088' jail
X11 forwarding request failed on channel 2
Last login: Wed Dec 27 18:04:19 2017 from office.logol.ru
[ykurilkin@jail ~]$ 

jail — имя сервера, прописанного в ~/.ssh/config, fe80::2e:c700:549:ee1 — адрес из п.2
Потом в браузере просто открывает https://127.1:8088

jumbo frame на cisco Nexus 5000

Как-то примерно так:

policy-map jumbo
  class class-default
    mtu 9216
system qos
  service-policy jumbo

А почему пишу, потому что смотрим на интерфейс:

5020# show interface e1/1
Ethernet1/1 is up
  Hardware is 1000/10000 Ethernet, address is 000d.ec6d.c548 (bia 000d.ec6d.c548)
  MTU 1500 bytes, BW 10000000 Kbit, DLY 10 usec,
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA
  Port mode is access
  full-duplex, 10 Gb/s, media type is 1/10g
  Input flow-control is off, output flow-control is off
  Auto-mdix is turned on
  Rate mode is dedicated
  Switchport monitor is off
  Last clearing of "show interface" counters never
  5 minute input rate 382 bytes/sec, 0 packets/sec
  5 minute output rate 31 bytes/sec, 0 packets/sec
  Rx
    63 input packets 0 unicast packets 32 multicast packets
    31 broadcast packets 14 jumbo packets 0 storm suppression packets
    133750 bytes
    0 No buffer 0 runt 0 Overrun
    0 crc 0 Ignored 0 Bad etype drop
    0 Bad proto drop
  Tx
    1019 output packets 1019 multicast packets
    10 broadcast packets 19 jumbo packets
    78417 bytes
    0 output CRC 0 ecc
    0 underrun 0 if down drop     0 output error 0 collision 0 deferred
    0 late collision 0 lost carrier 0 no carrier
    0 babble
    0 Rx pause 0 Tx pause 0 reset

5020# 

И то, что «MTU 1500 bytes» это так и нужно, что вы враги видимо запутались, а вот подтверждение что все работает — это параметр «14 jumbo packets» в Rx или Tx.

Установка старой 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 совпадает. Можно идти спокойно декометировать.

Subscribe to RSS Feed