И снова USB-IP — сервер теперь с автобиндом и детачем и сам подхватит ключ клиент

от автора

HA — как много в этом слове: Автоматический перенос виртуальных машин в кластере. 8 секунд и, например, сервер терминалов сменил место жительства совместно со всеми своими предустановленными программами — в другую серверную.
И … оставил аппаратные лицензии и ЭЦП, заботливыми руками проброшенные в виртуалки, тоскливо торчать из, возможно, погибшего железа.

Настройки без лирики

При проектировании кластера виртуализации приходится учитывать и такой сценарий — шанс его достаточно высок — и, скорее всего, выпадет на период обслуживания — штатный перенос с ноды на ноду прошел гладко — вечернее обновление, инженер-техник дождался отключения, продувает пыль, меняет термопасту, ssd, добавляет оперативу (нужное подчеркнуть). Вторая нода ласково подхватила машины и контейнеры и где -то далеко тихо подвывает в опечатанном и совершенно недоступном помещении. Админ в полглаза наблюдает за возросшей нагрузкой на ноду — ничего заслуживающего дополнительного внимания — какой то час и их снова две, и нагрузка мягко размажется как масло по бутербродам.

На руке бешено начинают дрожать смарт-часы — с гневом сообщая, что :

«ВсеПропало/ ЕдьСамДелай/СрокГорит/ Тендер по Магаданскому времени/Подпись недоступна/Лицензии отъехали»

Все мы знаем, что такое (обязательно произойдет) не произойдет — регламент, согласование — прочие защитные механизмы. Но удобнее совсем не позволить выполниться сценарию.

С проблемой удаленного проброса прекрасно справляются множества аппаратных устройств USBoverIP и можно выделить бюджет, отстоять необходимость приобретения, стоически пробиться через бюрократические джунгли, но статья не об этом. Наш путь — самим собрать свой программно-аппаратный пепелац «USB через родную ЛВС».

Железо берем с достаточным количеством портов USB, одним, а лучше двумя портами ethernet (не забываем про резервирование коммутаций), SSD в Первый RAID . Накатим Ось -в примере — Alt -Linux/Debian, зададим имя хоста, ip адрес, если не резервируете в DHCP.

Далее установка — которая мало отличается от всех описанных, ранее (например в USB over IP для личного использования):

sudo apt-get update sudo apt-get install usbip

загрузка модулей

sudo modprobe usbip-core sudo modprobe usbip-host sudo modprobe vhci-hcd

настройка их автозагрузки

sudo nano /etc/modules

добавим в конец файла

usbip‑core
usbip‑host
vhci‑hcd

Здесь вводная часть статьи заканчивается — вот мы и дошли до сути.

Серверная часть

в ручную

Сам по себе USB-IP ничего биндить, да расшаривать не желает, предлагая каждое устройство выбрасывать в сеть руками

usbip list -l #Получили список портов - busid 1-1 (064f:0bd7) usbip bind -b 1-1

полуавтомат

Жить это будет до перезагрузки, что легко решается через systemd

sudo nano /etc/systemd/system/usbip-device@1-1.service
sudo nano /opt/check_usb_device.sh 
usbip-device@1-1.service
[Unit]  Description=USBIP Device %I  Requires=usbipd.service  After=usbipd.service  [Service]  Type=simple  RemainAfterExit=yes  ExecStart=/usr/sbin/usbip bind -b %i  ExecStop=/usr/sbin/usbip unbind -b %i  Restart=always  RestartSec=3  [Install]  WantedBy=multi-user.target

Включаем наш сервис — и можем переходить к настройке клиента или читаем дальше:

sudo systemctl enable usbip-device@1-1 --now

автомат

поставили — барышню вынули

Но мы то желаем вставить ключ и на старт, и пусть лишние ключи сами убираются из списка расшаренных. А еще нам не нужны клавиатуры, мыши usb сетевые карты :

sudo nano /opt/check_usb_device.sh 
check_usb_device.sh
!/bin/bash declare -A usbdevices current_usbdevices=()  bind_usb_device() {     local busid="$1"     if usbip bind -b "$busid"; then         logger -t usbip-service "bind Key $busid"   #       echo "bind Key $busid"      fi }  unbind_usb_device() {     local busid="$1"     if usbip bind -b "$busid"; then         logger -t usbip-service "unbind Key $busid"    #      echo "unbind Key $busid"      fi }  while true; do     output="$(/usr/sbin/usbip list -p -l)"     updated_usbdevices=()     while IFS='#' read -r line; do         busid="$(echo "$line" | grep -oE 'busid=[0-9]+-[0-9]+.[0-9]+|busid=[0-9]+-[0-9]+' | cut -d '=' -f 2)"         usbid="$(echo "$line" | grep -oE '[0-9a-fA-F]{4}:[0-9a-fA-F]{4}')"         usbdevices["${busid}"]="${usbid}"         updated_usbdevices+=("$busid")     done <<< "$output" echo "UPD: ${updated_usbdevices[@]}" for busid in "${current_usbdevices[@]}"; do     if [[ ! " ${updated_usbdevices[@]} " =~ " $busid " ]]; then         # busid отсутствует в обновленном списке, удаляем е         current_usbdevices=(${current_usbdevices[@]//$busid/})         unbind_usb_device "$busid"     fi done     for busid in "${!usbdevices[@]}"; do         result=$(lsusb | grep "${usbdevices[$busid]}" | grep -ivE 'keyBoard|mouse|ethernet|wireless' && echo true || echo false)         if [ "$result" != false ]; then              if [[ ! " ${current_usbdevices[@]} " =~ " $busid " ]]; then                 current_usbdevices+=("$busid")                 bind_usb_device "$busid"             fi fi     done #    echo CUR: "${current_usbdevices[@]}"     sleep 10 done
sudo chmod ugo+x /opt/check_usb_device.sh 

Описываем наш сервис и включаем

sudo nano /etc/systemd/system/usbip-device@allusb.service
usbip-device@allusb.service
[Unit] Description=USBIP Device Binding Service After=usbipd.service Requires=usbipd.service  [Service] Type=simple ExecStart=/opt/check_usb_device.sh Restart=always StartLimitBurst=0 StartLimitIntervalSec=1 KillMode=control-group  [Install] WantedBy=multi-user.target
sudo systemctl enable usbip-device@allusb --now

Устройства теперь будут доступны всем разрешенным их увидеть (а запрещаем, например поставив и настроив firewalld , iptables — но это вне рамок данной статьи).

Можно переходить к клиентской части.

клиент

Тут все тот же systemd и описание сервиса (скрипт поместился прямо в тело юнита в одну строку).

sudo nano /etc/systemd/system/usbip-device@1-1.service
usbip-device@1-1.service
#вместо <usbip-servername>  подставьте свое имя сервера [Unit] Description=USBIP Attach Device %I After=network.target  [Service] Type=simple ExecStart=/usr/sbin/usbip attach -r keys -b %i RemainAfterExit=yes ExecStartPre=/bin/bash -c 'while trueusbip list; do result=$(usbip list -p -r <usbip-servername> | grep -q /%i && echo True || echo False); if [ "$result" != "False" ]; then logger -t usbip-service "Key %i available to attache"; usr/sbin/usbip attach -r keys -b %i; fi; sleep 60; done' ExecStop=/usr/sbin/usbip detach -p 00  Restart=always StartLimitBurst=0 StartLimitIntervalSec=1 KillMode=control-group  [Install] WantedBy=multi-user.target

Включаем сервис

sudo systemctl enable usbip-device@1-1 --now

Вместо заключения

Сервис сам будет отслеживать доступность и подключаться к USB устройствам через USBIP.

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


ссылка на оригинал статьи https://habr.com/ru/articles/901988/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *