Linux Out-of-Memory Killer (OOM)

OOM Killer – это компонент ядра Linux, призванный решать проблему недостатка памяти. Известно, что виртуальной памяти может быть бесконечно много (в пределах адресации), а вот физической – вполне конечное число. Ядро выделяет память процессам “с запасом” в сумме превышающую физическую память системы. В основном, всё разруливается нормально (вся выделенная память одновременно редко требуется), но бывает ситуация когда становится нужно памяти больше, чем ее физически есть. И системе тогда нужно завершить какой-то процесс, чтобы продолжить работу. Вот этим и занимается OOM Killer.

Текущая реализация OOM Killer в Linux стремится выбрать наименее важный процесс. Он выбирается среди всех процессов, кроме init и kernel threads, на основе подсчета для всех процессов очков и тот, что набрал больше всех очков – убивается. Алгоритм анализа достаточно сложен и я не буду его приводить здесь.
Бывает, необходимо защитить определенный, важные процессы от “убиения”. В конце подсчета очков для процесса, число возводится в степень приоритета, которая может принимать значения -15…15 или -17. “-17” означает, что процесс не будет принудительно завершен вообще. Значение приоритета хранится в файлике /proc/$PID/oom_adj. Т. е. этот файлик создается для каждого процесса и уничтожается с его завершением.

Соответственно, дабы защитить процесс от “убиения”, необходимо узнать PID этого процесса и записать в его файл oom_adj значение -17. Например, для процесса sshd, можно использовать команду:

pgrep -f “/usr/sbin/sshd” | while read PID; do echo -17 > /proc/$PID/oom_adj; done

Эта команда для всех процессов демона sshd назначает приоритет. Но нужно быть осторожным с приоритетами – система может вести себя непредсказуемо, если защищенный таким образом процесс займет всю память (скорее всего закончится это т. н. kernel panic). Поэтому рекомендуют ставить минимальный приоритет “-15”.
Приведенную выше команду нужно выполнять после запуска процесса, т. е. или в конце стартового скрипта или по cron-у.
Ссылки на более детальную информацию:
http://geckich.blogspot.com/

Ошибка 0x0000005 при запуске практически всех приложений в Windows 7 x64

Бывает, после установки обновлений и последующей перезагрузки появляется ошибка 0x0000005 при запуске практически всех приложений в Windows 7 x64

Причина кроется в обновлениях KB2859537 и KB2872339 (или одном из них) на некоторых системах  Windows 7 x64.

Но апплет Центра обновлений запустить нельзя, т. к. все 32-битные приложения не запускаются в системе. Чтобы удалить обновления, запускаем командную строку с правами Администратора и удалем обновления командами:

wusa.exe /uninstall /kb:2859537
wusa.exe /uninstall /kb:2872339

Перезагружаемся – и система должна работать как раньше.

Кстати, не забываем скрыть эти обновления после перезагрузки дабы потом случайно опять их не поставить (в Центре обновления Windows правой кнопкой на обновлении – Скрыть обновление)

http://geckich.blogspot.com/

Как убрать панель рекламы в KMPlayer 3.7

Неприятное нововведение ожидает поклонников этого очень достойного с технической точки зрения медиа плеера для ОС Windows в версии 3.7. Это – панель с рекламой в правой части окна плеера. Разработчикам надо монетизировать свой продукт, который является бесплатным – безусловно… Но не совсем хороший способ, как по-моему:

Но есть способ убрать эту новую фишку с рекламой.

Запускаем от имени Администратора (Run as administrator) ваш любимый текстовый редактор (Notepad++, например), открываем файл C:WindowsSystem32driversetchosts и дописываем в конец следующее:

127.0.0.1 player.kmpmedia.net

Рекламная панель пропадает.

Update.

Для KMPlayer версии 3.8+ необходимо вместо добавления в hosts добавить адрес сайта в Опасные в Свойствах обозревателя:

Панель управления – Все элементы панели управления – Свойства браузера – Безопасность – Опасные сайты – Сайты – Добавить в зону следующий узел – вставить player.kmpmedia.net – Добавить – Закрыть – ОК

http://geckich.blogspot.com/

Полезные Bash Shell команды и однострочные скрипты

Т. к. количество всяких полезный команд и скриптиков для консоли Linux неуклонно растет и всех их не упомнишь, буду записывать сюда что-нибудь эдакое полезное.
Статья будет дополняться.
1. Сделать что-либо со всеми файлами в папке, например, распаковать все zip архивы в текущей папке:
for f in *.zip ; do unzip $f ; done
2. То же самое, только с файлами из поддиректорий текущей. Например, установить rpm пакеты:
for D in *; do [ -d “${D}” ] && yum install ${D}/*.rpm ; done
3. Добавить пользователя в группу:
usermod -a -G group user
4. Как расшарить содержимое папки по протоколу HTTP.
Заходим в нужную папку и выполняем команду:
python -m SimpleHTTPServer 8080
Далее зайдя в браузере по адресу http://ip_of_that_server:8080, мы увидим содержимое с возможностью навигации и скачивания файлов:

5. Получение информации о Virtual Hosts для apache2 в Debian Linux:
apache2ctl -t -D DUMP_VHOSTS
6. Создание файла заданного размера:
truncate -s 14M filename

7. Замена строчек в текстовом файле:
sed -Ei ‘s/foo|bar|baz/foobar/g’ file
Заменить foo, bar или baz на foobar
8. Подмонтировать CD-ROM с указанием типа файловой системы:
mount -t iso9660 /dev/scd0 /media/cdrom
9. Посмотреть параметры загрузки ядра Linux:
cat /proc/cmdline
10. Максимальный уровень компрессии в tar:
env GZIP=-9 tar cvzf file.tar.gz /path/to/directory

Анализ падения ядра в Linux (kernel crash dump)

Завалить ядро линукс не так то и просто (если не преднамеренно, конечно), но такое случается… не все баги выловлены, а новые “фишки” приносят новые баги.

Итак, для сохранения дампа при падении ядра в Linux или kernel panic, необходимо настроить сервис kdump и установить несколько дополнительных пакетов.
Сам механизм представляет собой дополнительное маленькое ядро, смысл существования которого состоит в том, чтобы после падения основного ядра системы, перехватить управление, сохранить дамп и перезагрузить систему.

Для Fedora Linux устанавливается всё хозяйство просто командой:

yum install –enablerepo=fedora-debuginfo –enablerepo=updates-debuginfo kexec-tools crash kernel-debuginfo

А вот для Oracle Linux 6.4 чуть сложнее:

yum install crash -y
export DLP=”https://oss.oracle.com/ol6/debuginfo”

wget ${DLP}/kernel-uek-debuginfo-`uname -r`.rpm 
wget ${DLP}/kernel-uek-debuginfo-common-`uname -r`.rpm

rpm -Uhv kernel-uek-debuginfo-`uname -r`.rpm kernel-uek-debuginfo-common-`uname -r`.rpm

Команды приведены для текущего ядра системы. Если нужны пакеты для других версий ядра, то нужно указать версию вместо `uname -r`.

Далее, необходимо добавить в конфиг загрузчика (/boot/grub/grub.conf или /boot/efi/EFI/redhat/grub.conf – зависит от того, используется UEFI при загрузке сервера или нет): параметр ядра “crashkernel=128M“. Цифра указывает, сколько ОЗУ резервируется под резервное ядро. Через @ можно указать так же смещение в памяти, если необходимо. Например 128M@16 – зарезервирует 128 Мб ОЗУ начиная с физического адреса 0x01000000 (16MB).

Находим запись с нужной версией ядра (или можно ко всем добавить) и в итоге получим что-то в виде:
kernel /boot/vmlinuz-2.6.39-400.109.4.el6uek.x86_64 ro root=UUID=<> rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16   KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet crashkernel=128M

Теперь надо включить службу kdump для автозагрузки:

chkconfig kdump on

Также можно подредактировать конфиг /etc/kdump, но он и по-умолчанию достаточно хорош.
Теперь перезагрузим сервер, чтобы ядро загрузилось с новым параметром:

shutdown -r now

Проверяем, правильно загрузилось ядро с нашими параметрами:

cat /proc/cmdline

Также проверим, работает ли kdump:

service kdump status
Kdump is operational

Теперь, искусственно вызовем kernel panic командой:

echo c > /proc/sysrq-trigger

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

После перезагрузки, мы сможем найти наши дампы (по-умолчанию) в папке /var/crash. Запускаем анализатор дампа:

crash /var/crash/2009-07-17-10:36/vmcore /usr/lib/debug/lib/modules/`uname -r`/vmlinux

После запуска crash покажет нам некоторую полезную инфу и даст свою командную строку:

GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type “show copying”
and “show warranty” for details.
This GDB was configured as “x86_64-unknown-linux-gnu”…

      KERNEL: /usr/lib/debug/lib/modules/2.6.39-400.210.2.el6uek.x86_64/vmlinux
    DUMPFILE: /var/crash/127.0.0.1-2013-11-13-12:04:56/vmcore  [PARTIAL DUMP]
        CPUS: 2
        DATE: Wed Nov 13 12:03:52 2013
      UPTIME: 00:21:58
LOAD AVERAGE: 0.23, 0.17, 0.10
       TASKS: 93
    NODENAME: nagios
     RELEASE: 2.6.39-400.210.2.el6uek.x86_64
     VERSION: #1 SMP Thu Oct 17 16:28:13 PDT 2013
     MACHINE: x86_64  (3292 Mhz)
      MEMORY: 2 GB
       PANIC: “Oops: 0002 [#1] SMP ” (check log for details)
         PID: 1902
     COMMAND: “bash”
        TASK: ffff880037a88200  [THREAD_INFO: ffff880037f86000]
         CPU: 1
       STATE: TASK_RUNNING (PANIC)

crash>

Помощь по командам: help или help command

Core dump от любого процесса также можно посмотреть командой: gdb path_to_core
Но, чтобы создавались дампы от процессов необходимо подредактировать файл /etc/limits.conf, например, командой:

sed -i ‘s/.. *soft *core *0/*tsoftttcorettunlimited/g’ /etc/security/limits.conf

Более подробно по командам можно почитать здесь:
http://docs.oracle.com/cd/E37670_01/E41138/html/ch10s02.html

Всем удачи и поменьше багов! 🙂

http://geckich.blogspot.com/

Запуск графических приложений на удаленной Linux-машине с помощью Putty и Xming (export display)

Суть задачи в следующем. Есть у нас сервер, на котором нету X-сервера, только консоль. А нам нужно, к промеру, установить Oracle Solaris Studio и запусктаь ее удаленно. Или какое-то другое приложение, работающее в GUI-режиме.
Для решения этой задачи выполняем следующее.
1. На сервере устанавливаем пакеты xauth и xterm. Например, для Oracle Linux (или другого RHEL):
yum install xauth xterm

2. Также, нужно проверить, включено ли X11 Forwarding в конфигурационном файле SSH-демона:

nano /etc/ssh/sshd_config

X11Forwarding yes

3. Eсли вы заходите с помощью Windows-машины, то вам необходимо установить Xming – X-эмулятор для форточек.  Ну и, собсно, сам Putty – ssh-клиент для Windows.

Установка Xming тривиальна, по типу далее, далее, далее. Только поставить галочку, что мы будем использовать его вместе с Putty. Сам Putty так же устанавливаем.
4. Запускаем Xming, он свернется в трей и после этого запускаем Putty и на вкладке Connection / SSH / X11 отмечаем галочку Enable X11 forwarding, а также дописываем в поле X display location значение localhost:0.

4. Далее подключаемся к удаленному серверу и запускаем наше приложение. Например, Solaris Studio:
/opt/oracle/solarisstudio12.3/bin/solstudio

Когда всё подгрузиться, вы увидите заветное окошко:

Для тех, кто работает в Linux-среде всё еще проще. Запускать приложения на удаленной машине можно, добавляя к подключению по ssh ключ -X.

Если нужно запустить графическое приложение на удаленной машине, не доступной с вашей рабочей, но доступной через третью машину, то на этой третьей машине необходимо сделать форвардинг 22го порта для ssh и 6010 порта (для дисплея localhost:0) TCP.

Полезные команды Asterisk (буду дополнять)

1. Переполнение памяти SMS
Если нужно принять SMS-ку, а в консоли (asterisk -rvv) пишет следующее:
ERROR[15627]: at_response.c:1420 at_response_smmemfull: [dongle0] SMS storage is full
то, логично – нам необходимо почистить память для смс-ок.

Есть два вида памяти:
  • память SIM
  • память модема
Для очистки памяти SIM применяем в консоли астериска последовательно команды:
dongle cmd <dongle_name> AT+CPMS=”SM”,”SM”,”SM” 
dongle cmd <dongle_name> AT+CMGD=1,4
Для очистки памяти модема применяем в консоли астериска последовательно команды:
dongle cmd dongle_name AT+CPMS=”ME”,”ME”,”ME” 
dongle cmd dongle_name AT+CMGD=1,4
Консолька нам выдасть что-то типа:

[dongle_name] ‘AT+CMGD=1,4’ Command queued for execute
[dongle_name] Got Response for user’s command:’OK’
[Oct 25 07:41:57] NOTICE[15627]: at_response.c:1714 at_response: [dongle_name] Got Response for user’s command:’OK’
Всё прошло гладко. Теперь можно принимать SMS-ки.
2. Прием PDU SMS
Если при приеме SMS в консоль пишет следующее:
WARNING[15638]: at_response.c:1204 at_response_cmgr: [dongle0] Error parsing incoming message ‘+CMGR: 0,,73 <куча HEX цифр>’ at possition 40: Can’t parse OA 
то это значит, что SMS-ка пришла в PDU формате и модуль chan_dongle её самостоятельно разобрать не может.
Здесь нам поможет сайтик http://twit88.com/home/utility/sms-pdu-encode-decode , где в поле Hexadecimal PDU Message вводим нашу непонятную мессагу и нажимаем Convert.
Или здесь: http://www.smartposition.nl/resources/sms_pdu.html
3. Просмотр инфо о GSM модемах в системе
Проверить статус модема можно командочкой в консоли астериска:
dongle show devices
ID           Group   State RSSI   Mode   Submode   Provider Name   Model      Firmware          IMEI             IMSI             Number
<dongle_name>  0     Free  22     0         0       life:)         E173       21.157.71.00.388  <imei_number>  <imsi_number>  <tel_number>
Т. к. библиотека для работы с модемами chan_dongle в Астериске опен сорцная и довольно сырая, то можем иногда зависает и отказывается принимать входящие звонки – сьрасывает сразу их. Тогда статус модема будет не Free а Dialing, причем звонков в этот момент нет.
4. Просмотр статистики звонков
Проверить есть ли сейчас активные звонки и сколько было обработано звонков можно командой:
core show calls
 
0 active calls
5. Перезапуск GSM модема
Чтобы перезагрузить модем не перезагружая всю астериску, нужно выполнить команду в CLI:
dongle restart now <dongle_name>
[<dongle_name>] Restart scheduled
[Oct 25 07:42:05] NOTICE[15627]: chan_dongle.c:417 do_monitor_phone: [<dongle_name>] stopping by restart request
Update.

6. Прерывание определенных звонков.
Вначале отобразим инфо о текущих звонках:

asterisk2*CLI> core show channels
Channel              Location             State   Application(Data)
SIP/3224-00000a19    s@macro-dial-one:42  Up      Dial(SIP/4027,15,trI)
IAX2/IAX_Trunk_to_US (None)               Up      AppDial((Outgoing Line))
SIP/4003-00000a2f    s@macro-dialout-trun Up      Dial(IAX2/IAX_Trunk_to_US/1001
SIP/4001-0000089e    s-CHANUNAVAIL@macro- Up      VoiceMail(3102@default,u””)
SIP/3117-00000102    s-NOANSWER@macro-vm: Up      VoiceMail(3106@default,u””)
SIP/4027-00000a1a    (None)               Up      AppDial((Outgoing Line))
6 active channels
4 active calls
1553 calls processed

Допустим, мы хотим обрубить звонок пользователю 4003 (выделен). Выполняем команду:

asterisk2*CLI> channel request hangup SIP/4003-00000a2f
Requested Hangup on channel ‘SIP/4003-00000a30’
— Executing [h@macro-dialout-trunk:1] Macro(“SIP/4003-00000a30”, “hangupcall,”) in new stack
— Executing [s@macro-hangupcall:1] GotoIf(“SIP/4003-00000a30”, “1?theend”) in new stack
— Goto (macro-hangupcall,s,3)
— Executing [s@macro-hangupcall:3] ExecIf(“SIP/4003-00000a30”, “0? Set(CDR(recordingfile)=)”) in new stack
— Executing [s@macro-hangupcall:4] Hangup(“SIP/4003-00000a30”, “”) in new stack
== Spawn extension (macro-hangupcall, s, 4) exited non-zero on ‘SIP/4003-00000a30′ in macro hangupcall’
== Spawn extension (macro-dialout-trunk, h, 1) exited non-zero on ‘SIP/4003-00000a30’
— Hungup ‘IAX2/IAX_Trunk_to_US-49’

Теперь можно увидеть, что звонок завершен.

asterisk2*CLI> core show channels
Channel              Location             State   Application(Data)
SIP/3224-00000a19    s@macro-dial-one:42  Up      Dial(SIP/4027,15,trI)
SIP/4001-0000089e    s-CHANUNAVAIL@macro- Up       VoiceMail(3102@default,u””)
SIP/3117-00000102    s-NOANSWER@macro-vm: Up       VoiceMail(3106@default,u””)
SIP/4027-00000a1a    (None)               Up      AppDial((Outgoing Line))
4 active channels
3 active calls
1554 calls processed

(Источник)
7. Отслеживание активных звонков в Asterisk
В консоли Linux набираем:

watch -n 1 “sudo asterisk -vvvvvrx ‘core show channels’ | grep call”
Информация обновляется каждую секунду.
8. Просмотр структуры базы данных:
database show status
9. Послать USSD-запрос через GSM-модем, работающий с chan_dongle:
dongle ussd dongle0 *111#
10. Показать список каналов, доступных в системе asterisk:
core show channeltypes
Пример вывода:

Проверка доступности портов между двумя Linux-машинами (для Solaris тоже работает)

Бывают ситуации, когда нам необходимо проверить видимость TCP портов одной машины для другой. Казалось бы всё просто – telnet. А если на серверной машине еще не установлено или не запущено приложение, слушающее нужный порт? Я уверен, что существует масса способов, но мне было проще написать 2 маленьких скрипта на Python.

Один скрипт – сервер. Слушает заданный порт и пишет в консоль информацию о клиентах. А второй – клиентский скрипт – стучится по заданному IP в заданный порт и возвращает ответ от сервера (если порт доступен).

Серверный скрипт.

#!/usr/bin/env python
import socket, sys
# Server address and buffer size
TCP_IP = '0.0.0.0'
BUFFER_SIZE = 1024
# Usage string
usage = "server.py PORT"
# Check number of arguments and print usage if not enough arguments
if (len(sys.argv) < 2):
print(usage)
sys.exit(0)
TCP_PORT = int(sys.argv[1])
# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
# Listen for client connection until Ctrl+C will be pressed
while 1:
c = s.accept()
cli_sock, cli_addr = c
cli_sock.send("Hello, person from %s"%(str(cli_addr)))
cli_sock.close()
print("received data from:", str(cli_addr))


Запуск. Копируем в текстовый файл вышенаписанный код и запускаем:

python server.py <port>

Клиентский скрипт.

#!/usr/bin/env python
import socket, sys
usage = "client.py IP PORT"
# Check number of arguments and print usage if not enough arguments
if (len(sys.argv) < 3):
print(usage)
sys.exit(0)
TCP_IP = sys.argv[1]
TCP_PORT = int(sys.argv[2])
BUFFER_SIZE = 1024
# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
# Recieving response from the server
data = s.recv(BUFFER_SIZE)
s.close()
print("received data:", data)

Запуск. Копируем в текстовый ф
айл вышенаписанный код и запускаем:

python client.py <server_IP> <server_port>

http://geckich.blogspot.com/

Как сохранить кадр из видео в Linux

В командной строке переходим в нужную папку и выполняем команду:

mplayer -vo png -ss 00:30:00 -frames 1 video-file.mp4

Это даст нам следующее:

-vo png – формат изображения png
-ss 00:25:00 – кадр будет взят из 25й минуты фильма (формат ЧЧ:ММ:СС)
-frames 1 – сохранит только 1 кадр, в текущую директорию.
video-file.mp4 – путь к файлу содержащему видео (кодек видео должен присутствовать в системе)

http://geckich.blogspot.com/

Использование iperf для тестирования мультикаста

Для того, чтобы проверить, приходит ли на наш сервер/рабочую машину/ПК мультикаст, можно использовать и tcpdump:

tcpdump -i bond0.666 udp -nn port 4444

 но он не делает join к мультикаст группе и, в зависимости от настройки сетевого оборудования, вы можете мультикаст и не увидеть.

Лучше использовать утилиту iperf. Она служит для анализа быстродействия сети, и для наших целей отлично подходит.

 
Итак, на Debian устанавливаем просто: 
 
aptitude install iperf
 
А для RHEL дистрибутивов (RedHat, Oracle Linux, CentOS etc.) нужно или добавить репозиторий RepoForge или посмотреть пакет для своей версии ОС тут http://pkgs.repoforge.org/iperf/ и установить, например:
 

yum install http://pkgs.repoforge.org/iperf/iperf-2.0.4-1.el6.rf.x86_64.rpm

или

rpm -Uhv http://pkgs.repoforge.org/iperf/iperf-2.0.4-1.el6.rf.x86_64.rpm

Далее, если адрес мультикаст группы 239.200.1.1, а порт 4444, то делаем команду и смотрим результат:

iperf -s -u -B 239.200.1.1 -i 1 -p 4444

здесь

  • -s -режим сервера, 
  • -u – использовать UDP, 
  • -i 1 – выводить информацию каждую секунду, 
  • -B и -p – адрес нашего мультикаста.
 

Полезные команды для мультикаста:

Посмотреть подписку по группам:

netstat -gn

или

ip maddr show

Дамп по интерфейсу и группе мультикаста:

tcpdump -n -nn -i eth0 host 239.31.82.10
tcpdump -i p1p1.1302 -s0 -vv net 224.0.0.0/4

Иногда необходимо поменять системные перменные:

sysctl -ar '.rp_filter'
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.em1.rp_filter = 0
net.ipv4.conf.em2.rp_filter = 0
net.ipv4.conf.em3.rp_filter = 0
>net.ipv4.conf.em4.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.p1p1.rp_filter = 0
net.ipv4.conf.p1p1/1302.rp_filter = 0
net.ipv4.conf.p1p1/2202.rp_filter = 0
net.ipv4.conf.p1p2.rp_filter = 0
net.ipv4.conf.p1p2/1402.rp_filter = 0
net.ipv4.conf.p1p2/2202.rp_filter = 0

Изменить значение переменной sysctl:

sysctl -w net.ipv4.conf.em3.rp_filter=0

Включить маршрутизацию пакетов:

sysctl -w net.ipv4.ip_forward=1

Кофиги sysctl могут быть в:

  1. /run/sysctl.d/*.conf
  2. /etc/sysctl.d/*.conf
  3. /usr/local/lib/sysctl.d/*.conf
  4. /usr/lib/sysctl.d/*.conf
  5. /lib/sysctl.d/*.conf
  6. /etc/sysctl.conf

RHEL выключить мультикаст на интерфейсе:

ip link set multicast off dev br0

RHEL включить мультикаст на интерфейсе:

ip link set multicast oт dev br0

Проверить включен ли мультикаст:

ip link show br0
8: br0: mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000

Включить мультикаст на фаерволле (по-умолчанию выключен):

firewall-cmd --zone=zone-name --add-protocol=igmp

Выключить SELinux:

nano /etc/selinux/config

Источники:

  1. https://www.cyberciti.biz/faq/reload-sysctl-conf-on-linux-using-sysctl/
  2. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-enabling_ip_multicast_with_igmp
  3. https://unix.stackexchange.com/questions/299163/app-cannot-receive-multicast-packets-on-centos-7
  4. https://superuser.com/questions/324824/linux-built-in-or-open-source-program-to-join-multicast-group
  5. https://serverfault.com/questions/163244/linux-kernel-not-passing-through-multicast-udp-packets/216568
  6. https://support.citrix.com/article/CTX116493