Серия «ИТ»

Проброс видеокарты в виртуальную машину. Небольшой UPD

Приветствую!

Сей UPD является продолжением статьи "Проброс видеокарты в виртуальную машину".

На полноценную публикацию для Хабра не тянет, но описанный ниже момент для кого-то может оказаться полезным.

Итак, краткие исходные данные таковы (полный расклад в статье по ссылке выше):
1) 2 видеокарты: "Lexa PRO [Radeon 540/540X/550/550X / RX 540X/550/550X]" (используется для ВМ с Win10) и "Park [Mobility Radeon HD 5430]" (используется для хост-системы);

2) "Radeon HD 5430" (старенькая видюха) воткнута в первый pcie-слот материнки, а "Lexa PRO" (железяка поновее) - во второй (кстати, в статье этот момент описан не совсем корректно);

Видеокарту "Radeon HD 5430" понадобилось перекинуть с хост-системы на ВМ, а "Lexa PRO" - на хост-систему.

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

Очерёдность инициализации выводится посредством получения содержимого procfs-файла "/proc/fb" (fb = framebuffer). Выглядеть это будет, например, так

0 efifb vga
1 amdgpudrmfb

Чтобы не использовать видеокарту в хост-системе для передачи в ВМ в статье было задействовано как изменение параметров ядра (grub) при загрузке, так и механизм подгружаемых модулей ядра (modprobe), т.е.

1) добавление параметров «intel_iommu=on iommu=on rd.driver.pre=pci-stub pci-stub.ids=1002:67ff,1002:aae0» (идентификаторы "Lexa PRO") в grub
и
2) «blacklist amdgpu» и «options pci-stub ids=1002:699f,1002:aae0» -> «/etc/modprobe.d/local.conf».

Т.к. первой хост-система (ОС AlmaLinux8) захватывала "Radeon HD 5430", то проблем в рамках описанной в статье конфигурации не было.

В случае же, когда есть необходимость в ВМ прокинуть карту, находящуюся в более приоритетном слоте, в параметры загрузки мы должны прописать явный запрет на захват целевой карты. Делается это посредством добавления подстроки "video=efifb:off" (подстрока "efifb" взята из вывода "cat /proc/fb") в параметр GRUB_CMDLINE_LINUX ("/etc/default/grub") и последущим исполнением команд grub2-mkconfig + dracut + перезагрузка.

Итого, файл "/etc/default/grub" должен иметь примерно такой вид.

Проброс видеокарты в виртуальную машину. Небольшой UPD IT, Linux, Windows, Виртуализация

1002:68e1,1002:aa68 - идентификаторы "Radeon HD 5430"

В файле «/etc/modprobe.d/local.conf» также меняем идентификаторы, но не отправляем в блэк-лист драйвер "radeon", т.к. оный необходим ОС при загрузке. В общем, файл "local.conf" должен содержать только одну строку - "options pci-stub ids=1002:68e1,1002:aa68".

Показать полностью 1

Firewalld. Занимательный факт

Салом! (привет на таджикском)

Занимательный (и чуточку возмутительный) факт обнаружил при скриптовании правил фаервола (который firewalld) в ОС вида "RHEL8" (AlmaLinux8, Rocky Linux 8, etc).

По какой-то неведомой причине добавление элементов ipset-а в сам ipset через файл работает "через раз" (в общем, как повезёт), если использовать "--add-entries-from-file" в рамках bash-скрипта.

Провёл не менее десятка попыток запуска скрипта. Корректно ряд подобных команд (для 4-х ipset-ов) отработал только единожды, хотя ввод вручную отрабатывает стабильно (не проверял более трёх раз).

При этом, если в рамках скрипта использовать в цикле команду на добавление единичного элемента в конкретный ipset ("--add-entry"), то проблем не возникает.

В общем, в скриптах лучше задействовать добавление элементов в ipset при помощи "--add-entry".

Firewalld. Занимательный факт Linux, Информационная безопасность, IT, Red Hat, Firewall, Командная оболочка bash

Firewalld (RHEL8). Интересный факт

Максимальное время нахождения элемента ipset-а во временном наборе (элемента ipset-а в ipset-е, где при создании был указан параметр "timeout" > 0) - чуть менее 25 дней, а если точнее, то 24 дня, 20 часов, 31 минута и 23 секунды или 2147483 секунд.

Поэтому, если, например, требуется предоставить некий доступ через firewalld на довольно долгий срок, но всё-таки не на постоянной основе, то требуется решение, отличное от временных элементов ipset-ов.

Проблема с data-кабелем SATA III

Oel ngati kame!

Столкнулся недавно с весьма интересной неполадкой. Начало классическое - после отправки в reboot домашний сервер (от сервера тут только одно название, т.к. системный блок собран из того, что возможно купить на потребительском рынке) операционная система (AlmaLinux8) хоть кое-как загрузилась (через раз), но дальше приглашения ввести логин/пароль дело не пошло. При вводе корректных авторизационных данных - возврат к приглашению.

Симптомы весьма таки знакомые. Подозрение пало на жесткий диск, поэтому решил вытащить из запаса новенький диск и восстановить ОС из заранее подготовленного бэкапа посредством замечательной команды "dd if=/dev/SOURCE_DISK_DEVICE of=/dev/TARGET_DISK_DEVICE bs=4096" (где *_DISK_DEVICE - символьное обозначение дискового устройства), дабы не тратить время на новую установку. И финт ушами не сработал, хотя я точно помнил, что после покупки диск был мной проверен через "smartctl -t short /dev/DISK_DEVICE", о чем сообщала надпись с датой проверки на монтажной ленте, наклеенной сразу после тестирования.

Проблема разрешилась довольно быстро. Помогла замена data-кабеля SATA III (хорошо, что запас разного рода "шнурков" всегда под рукой), что спасло старенький HDD от физических повреждений и отправки в утиль. Читал, конечно, когда-то про то, что некачественный data-кабель может привести к потере данных, но на практике столкнулся впервые (видимо, до этого везло с data-кабелями). Дело в том, что наилучший вариант - это кабель с позолоченными контактами (стандарт де-факто), но в данном случае, видимо, это было не так (думал, кстати, просто протереть контакты, но у современных sata-шлейфов они хорошо так утоплены в пластик), что привело к постепенному окислению соединений (позолота или иное покрытие от этого защищает).

P.S. Наглядный пример вывода команды "dmesg", демонстрирующий в том числе описанную выше проблему.

Проблема с data-кабелем SATA III IT, Linux, Жесткий диск, Sata 3, Системное администрирование, Компьютер

Такой вот интересный случай.

В общем, доброй ночи и удачи!

Показать полностью 1

Про firewalld и ipset-ы с ограниченным временем жизни элементов (RHEL8)

Slan!

Довольно забавный момент связан с "механикой" добавления/удаления ipset-элементов в ipset-списки с ограниченным временем жизни (параметр "timeout") элементов. Для краткости будем называть такие списки "temporary_ipset".

1. Создадим temporary_ipset через firewall-cmd
"firewall-cmd --permanent --new-ipset=temporary_ipset --option=timeout=6000"
"firewall-cmd --reload".

2. Добавим в ipset пару элементов
"firewall-cmd --ipset=temporary_ipset --add-entry="11.12.13.14""
"firewall-cmd --ipset=temporary_ipset --add-entry="14.13.12.11"".

3. Попытаемся посмотреть список элементов через firewall-cmd
"firewall-cmd --permanent --info-ipset=temporary_ipset".

Список элементов мы не увидим, т.к. для просмотра элементов с ограниченным временем жизни необходимо использовать команду
"ipset list temporary_ipset". Так вот не очень удобно реализовано (RHEL8).

4. Удаление элемента из temporary_ipset тоже с подвохом.
Команда "firewall-cmd --permanent --ipset=temporary_ipset --remove-entry="11.12.13.14"" не даст нужного результата и выдаст ответ вида "Error: IPSET_WITH_TIMEOUT".

Для удаления из temporary_ipset необходимо воспользоваться утилитой ipset -
"ipset del temporary_ipset 11.12.13.14".

5. Добавление элемента в temporary_ipset с таймаутом, отличным от заданного, невозможно через firewall-cmd. В этом случае нам также поможет утилита ipset -
"ipset add temporary_ipset 11.12.13.144 timeout 500".

6. Чтобы переопределить таймаут уже добавленного элемента, необходимо через утилиту ipset сначала удалить элемента, а после добавить с иным таймаутом.

(Небольшой бонус)
7. Удаление temporary_ipset осуществляется уже стандартно -
"firewall-cmd --permanent --delete-ipset=temporary_ipset".
После необходимо выполнить "firewall-cmd --reload". Если этого не сделать, то ipset всё ещё будет доступен через одноимённую утилиту.

Если по каким-то причинам нежелательно проводить reload, то исполняем команду удаления ipset-а (выше), а после удаляем temporary_ipset посредством команды
"ipset destroy temporary_ipset".

Показать полностью

Cеть на RHEL8-based хостах. Error fixed

Доброго утра/дня/вечера/ночи (нужное подчеркнуть)!
===
Дополнение к публикации: Разворачиваем сеть на RHEL8-based хостах (копия с Хабра)
===
Неприятный баг, созданный собственноручно (увы, недосмотрел), обнаружил сегодня.

Как оказалось, в код ansible-хелпера "conf_int_ipv4_via_network_scripts" закралась ошибочка, не позволявшая корректно настраивать сетевые интерфейсы (или их сочетание), связанные с VLAN-ами.

Ошибка устранена.
===
Если вы пользуетесь репозиторием и нашли баг, то send email to vladimir.chursin000@yandex.ru

Пасхалочка

Пасхалочка IT, Linux, IT юмор, Firewall, 1984

Приветы!

Работая над небольшим СПО-проектом, обнаружил забавный сервис фаервола (firewalld). Обратите внимание на имя и порт ;-)

Такая вот неожиданная пасхалочка.

Разворачиваем сеть на RHEL8-based хостах (копия с Хабра)

Разворачиваем сеть на RHEL8-based хостах (копия с Хабра) Linux, IT, Программирование, Perl, Командная оболочка bash, Длиннопост

1. Предисловие

Развертывание ИТ-инфраструктуры с нуля — задача интересная и трудозатратная. Особенно, когда речь не о постепенном развитии (как это часто случается при поступательно-линейном росте бизнеса и, соответственно, его потребностей), а о куда более сжатых сроках, например, при открытии филиала или обособленного подразделения (другой вариант — необходимость в короткие сроки развернуть инфраструктуру для тестирования), где важную роль играет организация сети.


Конечно, первоначальная установка и настройка — это всегда полевая работа: монтаж СКС, сетевого оборудования и серверов; конфигурирование DHCP и организация удалённого доступа; иногда — заведение VLAN-ов.


2. Описание задачи

Итак, представим, что первичная настройка сети проведена: монтаж СКС осуществлён, DHCP выдал всем устройствам IP-адреса, удалённый доступ до сети филиала (или обособленного подразделения) в наличии, на одни сервера заведены 2 (или более) физических соединения для организации BOND-ов, на другие поданы транковые соединения с несколькими VLAN-ами и т.д.

Список IP-адресов серверов сведён в таблицу и доступ по SSH в наличии. Если размер списка невелик (например, до 3-5 единиц), то ручная настройка покажется неплохим вариантом, хоть и отнимет какое-то время.


А если список содержит, например, 10 (или более) хостов, на части из которых необходима уникальная сетевая конфигурация (разделение trunk-соединения на vlan-ы, виртуальные bridge-ы, etc)? Тут уж временные затраты существенно возрастают.


Но нет необходимости тратить время на рутину, если готовое решение есть и ожидает вас ниже (со ссылкой на guthub-репозиторий в конце публикации).


3. Стек технологий

1) Ansible. Весьма популярен (хотя кому-то ближе Puppet, Chef или Salt). Применяется для доставки контента/команд на целевые хост-системы.

2) Командная оболочка Bash. Присутствует во всех linux-системах. В рамках решения используется как для создания оболочки над Ansible, так и для отложенного выполнения операций (если конкретнее — отката сетевых настроек по таймеру) на целевых хостах.

3) Perl 5. Отличный инструмент в умелых руках. С помощью этого ЯП написан функционал генерации ifcfg-файлов на основе текстового конфига (т.е. Perl задействован только на ansible-хосте).

4) Network-scripts. Хоть и не включён в минимальный вариант установки ОС семейства RHEL8, но является проверенным средством настройки сетевой подсистемы.


4. Концепция приложения

Приложение «conf_int_ipv4_via_network_scripts» (ansible-приложение) представляет собой набор perl/bash-скриптов и файлов конфигурации (inventory-file, etc). Хотя и является составной частью репозитория «ansible_helpers», но имеет автономный характер.


5. Описание приложения

5.1. Структура директорий1. Корневой раздел (условно обозначим «../»). Содержит все основные скрипты поддиректории.

2. Директория с дополнительными конфигами («../additional_configs»). Содержит дополнительные файлы конфигурации, с помощью которых возможно задать содержание resolv.conf (указать NS-сервера), таймаут отката конфигурации и опцию удаления неиспользуемых ifcfg-файлов на стороне целевых хостов.

3. Директория с playbook-ами («../playbooks), которая в свою очередь имеет свои подразделы:

3.1) dyn_ifcfg_playbooks. Тут динамически генерируеются уникальные для каждого хоста плейбуки, ifcfg-файлы и настройки dns (resolv.conf).

3.2) ifcfg_backup_from_remote. Содержит резервные копии сетевых настроек с привязкой к дате («history»), текущую конфигурацию до изменения («now») и полную информацию о сетевых интерфейсах («network_data»).

3.3) ifcfg_tmplt. Как следует из названия, хранит шаблоны ifcfg-конфигураций, на основе которых формируются уникальные для каждого inventory-хоста настройки сети.

3.4) scripts_for_local. Хранит скрипты для исполнения на ansible-хосте. В данном случае подразумевается скрипт преобразования сырых данных в файлы c информацией о сетевых интерфейсах (размещаются в директории «../ifcfg_backup_from_remote/network_data»).

3.5) scripts_for_remote. Скрипты для исполнения на удалённых хостах. В данном случае он один — rollback_ifcfg_changes.sh (скрипт отката к предыдущим настройкам сетевой подсистемы).

6) tasks. Используемые в плейбуках файлы задач.

4. «../run_history». Логи запуска/исполнения сценариев приложения.


5.2. Файлы конфигурации

1. «../conf_network_scripts_hosts» — inventory-файл приложения.

2. «../config» – основной файл конфигурации приложения. Также имеется файл «config_examples» с примерами настроек. Для получения имён сетевых интерфейсов и соответствующих им MAC-адресов, требуемых при заполнении файла «config», необходимо запустить скрипт «just_run_ifcfg_backup.sh» и ознакомиться с файлом «../playbooks/ifcfg_backup_from_remote/network_data/inv_hosts_interfaces_info.txt».

3. «../additional_configs/config_del_not_configured_ifcfg» - задаёт действие относительно тех ifcfg-файлов, которые не сконфигурированы в «../config». Если в «config_del_not_configured_ifcfg» вписать адрес хоста, то ansible-приложение удалит на remote-хосте все ifcfg-файлы, выключит соответствующие интерфейсы («ifdown») и удалит линки (через «ip link delete»), но только те, которые относятся к bond/bridge и vlan-интерфейсам (например, eth0.100). Настройка будет полезна в случая, когда, например, требуется переименовать какое-либо bond/bridge-соединение.

4. «../additional_configs/config_temporary_apply_ifcfg» - тут возможно задать таймаут (как общий, так и для различных inventory-хостов индивидуально) отката к предыдущим настройкам.

5. «../additional_configs/dns_settings». Предоставляет возможность выставить настройки dns индивидуально для каждого inventory-хоста.


5.3. Скрипты и их назначение

1. «install_network_scripts_and_configure_network.sh» - производит бэкап ifcfg-файлов, устанавливает «network-scripts» (если функционал не установлен ранее), проверяет статус сервиса «network.service» (если не запущен, то стартует), исполняет скрипт «generate_dynamic_ifcfg.pl» и применяет изменения сетевых настроек (заданных в файле «config») на удалённых хостах (если, конечно, настройки корректны).

2. «just_install_network_scripts.sh» устанавливает «network-scripts» (если функционал не установлен ранее).

3. «just_run_ifcfg_backup.sh» - производит бэкап ifcfg-файлов.

4. «check_network_scripts_serv_is_started.sh» - проверяет статус сервиса «network.service» (если не запущен, то стартует).

5. «check_ifcfg_without_apply.sh» - проверяет корректность сетевых настроек (файл «config»).

6. «apply_temporary_ifcfg.sh» - временно применяет сетевые настройки. Таймаут отката задается в конфиге «../additional_configs/config_temporary_apply_ifcfg».

7. «apply_immediately_ifcfg.sh» - немедленно применяет новые сетевые настройки, если, конечно, они изменились с момента предыдущего запуска (в т.ч. если были внесены какие-либо изменения вручную на удалённых хостах).


5.4. Описание основного файла конфигурации (UPD 2022-12-19)

Разворачиваем сеть на RHEL8-based хостах (копия с Хабра) Linux, IT, Программирование, Perl, Командная оболочка bash, Длиннопост

Каждая строка в файле представляет собой набор параметров, разделённых символами "пробел/табуляция":
1) INV_HOST. Должен соответствовать одному из хостов inentory-файла "conf_network_scripts_hosts".
2) CONF_ID. Уникальный идентификатор сетевого интерфейса (или набора сетевых интерфейсов) в рамках каждого inventory-хоста.
3) CONF_TYPE. Определяет тип конфигурации для конкретных сетевых интерфейсов. Возможные значения:
3.1) just_interface (обычный интерфейс);
3.2) interface-vlan (интерфейс, поднимаемый в рамках транкового соединения, из которого каждый vlan возможно выделить по vlan-идентификатору);
3.3) virt_bridge (виртуальный мост);
3.4) just_bridge (обычный мост);
3.5) bridge-vlan (мост поверх vlan-интерфейса);
3.6) just_bond (конфигурация агрегированного канала, состоящего из 2-х и более физических соединений);
3.7) bond-vlan (vlan-итерфейс поверх bond-соединения);
3.8) bond-bridge (соединение типа "мост" поверх bond-соединения);
3.9) bond-bridge-vlan (соединение типа "bridge-vlan" поверх bond-соединения).
Каждому из этих значений соответствует свой набор шаблонов ifcfg-файлов (директория "ifcfg_tmplt").
4) INT_LIST. Список сетевых интерфейсов (разделённых запятой), используемых в рамках конкретного типа конфигурации (CONF_TYPE).
5) HWADDR_LIST. Список MAC-адресов, соответствующих сетевым интерфейсам из INT_LIST. Для CONF_TYPE=virt_bridge параметру необходимо присвоить значение "no".
6) VLAN_ID. Идентификатор VLAN. В случае, если речь не про vlan, то должен иметь значение "no".
7) BOND_NAME. Используется только для CONF_TYPE, равных "just_bond, bond-vlan, bond-bridge, bond-bridge-vlan". В остальных случаях необходимо выставлять значение "no".
8) BRIDGE_NAME. Используется только для CONF_TYPE, равных "virt_bridge, just_bridge, bridge-vlan, bond-bridge-vlan". В остальных случаях необходимо выставлять значение "no".
9) IPv4_ADDR_OPTS. Опции IPv4. Возможные значения: строка вида "ipv4,gateway,netmask" (для использования статической адресации) или "dhcp" (для получения ip-адреса и прочих параметров через DHCP).
10) BOND_OPTS. Настройки агрегирования для bond-соединения. Возможные значения: "def" ("mode=4,xmit_hash_policy=2,lacp_rate=1,miimon=100") или иное сочетание параметров, разделённых запятой.
11) DEFROUTE. Флаг "маршрут по умолчанию". Для конкретного inventory-хоста должен быть только один.


Чтение и обработка файла "config" происходит посредством Perl-скрипта "generate_dynamic_ifcfg.pl", который осуществляет ряд проверок конфигурации (в т.ч. и используя информацию, полученную посредством «just_run_ifcfg_backup.sh»), инициирует приостановку исполнения сценариев на удалённых хостах, если данные в "config" некорректны, формирует необходимые наборы ifcfg-файлов для каждого inventory-хоста, а также создаёт персональные для каждого хоста ansible-playbook-и (в директории "dyn_ifcfg_playbooks"), если сгенерированные файлы интерфейсов отличаются от текущих.


6. Постскриптум

Ссылка на репозиторий


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

Спокойного кодинга всем причастным!

=====================
Статья на Хабр

Показать полностью 1
Отличная работа, все прочитано!