🏠: компьютеры

Проброс USB по сети

Берём «железный» linux-сервер, например, Ubuntu 22.04 LTS, на котором есть порты USB, вставляем туда ключ HASP, широко использующийся для аппаратной защиты программ типа 1С или цифровой подписи. Проверяем, определился ли он в системе:

Определился, прекрасно. Теперь ставим usbip.

# Установка (usbip входит в стандартный набор утилит)
apt install linux-tools-common linux-tools-generic
# Вкл модуль ядра для сервера:
modprobe usbip-host
echo "usbip-host" >> /etc/modules
# Вкл службу
usbipd -D
# Проверить версию
usbip version # usbip (usbip-utils 2.0)

Выводим список локальных устройств usbip и предоставляем нужное устройство в общий доступ.

Теперь нужно настраивать клиента, в данном случае на Windows 11, работающей в виртуальной среде Hyper-V, где, как известно, USB с хоста пробросить в виртуалку нельзя (и это правильно). Предварительно на клиентской машине необходимо установить драйвер usbip, а для этого импортировать сертификат, идущий в комплекте, и отключать цифровую подпись драйверов. Это можно сделать из меню восстановления при загрузке, так как команда bcdedit /set TESTSIGNING ON в современных системах Windows уже не действует.

Итак, драйвер установлен, теперь можно посмотреть, какие устройства доступны на удалённом сервере, и подключить нужное.

Работает! Наш ключ определился как три устройства Sentinel (после установки драйверов HASP). Ниже виден ранее установленный usbip.

Чтобы отключить устройство от клиента, нужно знать порт usbip, на котором оно сидит.

Всё функционирует корректно. Флешка и внешний привод DVD-RW тоже успешно подключаются, а вот веб-камеру мне пробросить на Windows не удалось.

Конечно, применимость этой технологии в промышленной среде под вопросом, прежде всего из-за возни с неподписанными драйверами и отключения механизма проверки подписи для Windows-клиента (Upd: автор подписал драйвер, теперь всё гораздо проще). Как будут себя вести клиенты, если сервер перезагрузится? А если убрать устройство на сервере без отключения на клиенте - как восстанавливать работу, не повиснет ли система? Вопросами автоматической привязки и подключения устройств на сервере и клиентах я также пока не занимался, хотя и знаю, что это возможно. Ещё одной особенностью, которую необходимо учитывать, является невозможность ограничения доступа к USB-устройству, опубликованному на сервере; по всей видимости, нужно будет это делать с помощью межсетевого экрана.

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

От SATA на M.2

Сильно запоздалая новость, но в августе я решил сменить свой основной системный диск SSD Samsung 850 EVO, который в январе этого года был перемещён со старого неттопа на новый, а теперь работает в качестве серверного. Нареканий к его работе за эти пять лет не было никаких, но 250 ГБ его объёма стало не хватать, и устарел сам интерфейс SATA, ставший узким местом при обмене данными.

В качестве замены был выбран Samsung 970 EVO Plus 500 Гб, несмотря на наличие более новой модели 980, которая мне не понравилась. Есть ещё модель 980 PRO, но для моих нужд это перебор как по техническим характеристикам, так и по цене.

Этот накопитель уже совсем не похож очертаниями на привычный жёсткий диск — он крошечный и больше напоминает планку памяти SO-DIMM.

Эволюция размеров: вверху классический 'блинный' HDD SATA, в центре - SSD SATA, внизу - SSD M.2.

Скорость впечатляет даже по сравнению с 850 EVO, который в своё время был прорывным.

Новый неттоп

Когда-то давно, в прошлой жизни — 26 августа 2013 года — я купил прекрасный неттоп Pegatron Saishiat2+ за скромную цену в 5308 рублей, который проработал у меня без каких-либо проблем до вчерашнего дня. Он не сломался, нет — он всё так же отлично работает, просто мне уже нужен аппарат побыстрее, соответствующий сегодняшним требованиям; тем более, что старый компьютер уже на момент его покупки звёзд с неба не хватал, что уж говорить по прошествии стольких лет.

Критерии выбора:

  1. ПК должен быть компактным, времена громоздких жестяных ящиков давно ушли, поэтому форм-фактором также будет неттоп.
  2. Аппаратная поддержка процессором кодирования в x264 (AVC) и x265 (HEVC).
  3. Поддержка >= 32 ГБ оперативной памяти (виртуализация, контейнеры, вот это всё).
  4. Встроенный wi-fi c поддержкой 802.11ac.
  5. Нормальная работа Майнкрафта без тормозов на стандартных настройках графики.
  6. Цена — не космическая.

Выбор пал на линейку Intel NUC, где из современных вариантов есть 8-е и 10-е поколение процессоров. Десятое поколение дороже примерно на четверть и поддерживает аж до 64 ГБ памяти, но по производительности уступает восьмому из-за медленного графического ядра. Между вариантами на процессорах i3 и i5 я выбрал последний (i5-8259U), потому что разница в цене между ними — пара тысяч, а i5 ощутимо мощнее. Изначально я хотел рассмотреть что-то сопоставимое на процессоре AMD, но ничего похожего на сегодняшний день на рынке, к сожалению, не существует.

В восьмом поколении есть две модификации нужной мне модели — NUC8I5BEK и NUC8I5BEH, первый тоньше и в него можно вставить «жёсткий диск» только формата M.2; второй толще, потому что у него, помимо того же M.2, есть возможность поставить стандартный SATA-диск 2,5″.

Слева направо: старый неттоп, планки памяти, новый неттоп

Так как у меня уже есть SATA-диск Samsung SSD 850 EVO 250 GB, который стоит в старом неттопе, я выбрал второй вариант как более универсальный. Получается дешевле, так как не нужно прямо сейчас тратиться на диск M.2, да и переехать проще — просто переставить уже имеющийся диск из одной коробочки в другую. Памяти я взял 2 планки по 16 ГБ, с уменьшенной CAS Latency (CL15, стандартное значение — 17).

IMG_20210120_193005.jpg
IMG_20210120_193527.jpg

Всё-таки, к вещам привязываешься. Разбирая свой старый компьютер и вытаскивая из него диск, мне было жалко его, и я думал об этих прошедших 7 годах с какой-то ностальгией. Тем не менее, и монитор-долгожитель Benq G900, который мне подарили на новый 2008 год, и стол, и даже клавиатура с мышкой всё те же — вид моего рабочего места мало чем отличается от прежнего. У монитора недавно провалилась кнопка включения — отломились пластмассовые маленькие капельки, которыми кнопка была приварена одним концом к тыльной стороне передней панели, но я зафиксировал её с помощью смеси суперклея и соды — теперь монитор выглядит как новый, и менять я его на сегодняшний день не планирую.

IMG_20210120_194307.jpg
IMG_20210120_194536.jpg

Переезд прошёл безо всяких трудностей, Windows 10 завелась как ни в чём не бывало, нужно было только поставить несколько пакетов с драйверами да обновить пару прошивок; машинка работает отлично и шустро, надеюсь, на следующие 7 лет хватит. Впоследствии можно будет перейти на диск M.2 как более скоростной и прогрессивный вариант, но это совершенно не к спеху. Старый неттоп я буду продавать вместе с установленной в него планкой памяти на 8 ГБ, тем более, что у меня сохранился полный комплект — и коробка, и документация, и совершенно новая нога для установки на стол, и даже компакт-диск (Upd: 27 января ушёл за 2400).

Общий вид рабочего места

Нормализация громкости

Меня всегда интересовало, существуют ли какие-то критерии правильной нормализации громкости аудиодорожек. Ну, что обычно подразумевается под нормализацией, так сказать, в быту? Простой пересчёт пиков до отметки в 0 дБ. Однако, результат чаще всего неудовлетворителен — динамический диапазон, т. е., разница между самым громким и самым тихим звуками вроде бы сохраняется (хотя ещё вопрос, так ли это в действительности при простом пересчёте), но сама по себе общая громкость может не повыситься совсем или повыситься незначительно из-за того, что самые громкие звуки, которых может быть один-два на всю запись, уже нормализованы и их повышать уже некуда, а остальной материал так и остался где-то снизу, и слышно его всё так же плохо.

Понятно, что простая линейная нормализация не подходит и нужна какая-то динамическая (в сочетании с компрессией), причём желательно основанная на каких-то объективных критериях. Последнее время я увлёкся изучением возможностей совершенно прекрасного консольного медиаконвертера ffmpeg, где я обнаружил аудиоплагин loudnorm, как раз занимающийся нормализацией аудиосигнала по стандарту Европейского вещательного союза EBU R128.

Какими основными критериями оперирует loudnorm?

  1. Общая громкость (Integrated loudness), измеряемая в единицах абсолютного значения громкости (Loudness units relative to full scale, LUFS). Общая громкость вычисляется на основании анализа звуковых частот и уровня сигнала, применимое к чувствительности человеческого слуха к ним.
  2. Точный пик сигнала (True peak), измеряемый в децибелах (dB). Это одномоментное наивысшее значение пика сигнала во всём звуковом материале, то есть, грубо говоря, самый громкий звук. По этому критерию как раз и делается линейная нормализация, описанная мной в начале статьи.
  3. Диапазон громкости (Loudness Range, LRA), измеряемый в единицах громкости (Loudness units, LU). Разница между самым громким и самым тихим звуками.
  4. Порог (Threshold). Я до конца не понял, что это за критерий, но вероятно, ниже этого порога сигнал не обрабатывается.

Чтобы повысить качество обработки аудиодорожки, loudnorm предусматривает обработку в два прохода. Первый — сбор данных, второй — непосредственно обработка с параметрами, полученными во время первого прохода. В интернете есть статья автора loudnorm, где он показывает на примере, как это работает. За основу там взят документ американского Сообщества аудиоинженеров AES TD1004.1.15-10 Recommendation for Loudness of Audio Streaming and Network File Playback, где в рекомендациях сказано, что общая громкость (Integrated loudness) не должна быть выше -16 LUFS и ниже -20 LUFS, а максимальный пик (True peak) не должен превышать -1.0 dB.

Что касается диапазона громкости (Loudness Range, LRA), то здесь нужно действовать по ситуации. Я нашёл на сайте AudioKinetic рекомендации по максимальному уровню LRA, там даны примерные значения для разных условий:
- Домашний кинотеатр — 20 единиц - Гостиная — 18 единиц - Кухня — 15 единиц - Гостиная (поздний вечер) — 9 единиц - Общественный транспорт, мобильное устройство — 6 единиц

Чем шумнее вокруг, тем меньший динамический диапазон нужно выставлять, чтобы расслышать все звуки в записи. Чем больше и громче динамики, тем больший LRA возможен. В общем, однозначного критерия здесь быть не может, хотя некоторые значения мы выяснили.

Перейдём, наконец, к практике. Имеется DVD-Video с полукустарно записанным концертом классической музыки, имеющий стандартные проблемы: громкие аплодисменты, тихая музыка и речь ведущей концерта. Графически аудиодорожка выглядит так:

Оригинальная аудиодорожка до обработки loudnorm

Делаем первый проход для сбора данных. Берём среднее значение из рекомендуемых для общей громкости -18 LUFS и рекомендуемый максимальный пик -1.0 dB. Диапазон громкости и порог, как значения неизвестные или приблизительные, пусть высчитываются автоматически.

ffmpeg -i in.wav -af loudnorm=I=-18:TP=-1:print_format=json -f null -

После окончания анализа получаем следующие данные:

[Parsed_loudnorm_0 @ 000000eef2eeea80]
{
"input_i" : "-22.27",
"input_tp" : "0.03",
"input_lra" : "20.10",
"input_thresh" : "-33.99",
"output_i" : "-19.39",
"output_tp" : "-1.00",
"output_lra" : "13.20",
"output_thresh" : "-30.08",
"normalization_type" : "dynamic",
"target_offset" : "1.39"
}

Запускаем второй проход в соответствии с полученными данными. Параметр -ar 48k нужен для сохранения результата в файл с частотой сэмплирования 48000 Гц. Если этого не сделать, то на выходе будет файл с нечеловеческими 192000 Гц. Это преобразование связано с наиболее точным поиском точного пика сигнала (True peak), но полагаю, что в данном случае этим можно пренебречь.

ffmpeg -i in.wav `
-af loudnorm=I=-16:TP=-1:measured_I=-22.27:measured_TP=0.03:measured_LRA=20.10:measured_thresh=-33.99:offset=1.39:print_format=summary `
-ar 48k out.wav

После окончания обработки получаем следующую картину:

[Parsed_loudnorm_0 @ 0000003e678ee8c0]
Input Integrated: -22.3 LUFS
Input True Peak: +0.0 dBTP
Input LRA: 20.1 LU
Input Threshold: -34.0 LUFS

Output Integrated: -16.2 LUFS
Output True Peak: -1.0 dBTP
Output LRA: 13.0 LU
Output Threshold: -26.8 LUFS

Normalization Type: Dynamic
Target Offset: +0.2 LU

Видно, что общая громкость стала на 6,1 выше, несмотря на то, что максимальный пик снизился на единицу, в соответствии с рекомендованным значением. Динамический диапазон стал уже на 7,1 — это привело к более ровному звучанию без резких перепадов громкости, но и сохранило динамику.

Результат обработки в графическом виде:

Обработанная аудиодорожка

Субъективно могу сказать, что стало гораздо лучше. Приведу отрывки из записи, где есть большой перепад громкости.

— - До обработки (—, —)

Upd: Всё же, нужно задавать динамический диапазон вручную, чтобы автомат не зажимал его слишком сильно. В итоге, более-менее универсальные параметры получились следующие: -af loudnorm=I=-16:TP=-1:LRA=18. Если LRA уже узкий, то он обратно не разжимается, насколько я успел заметить.

Сетевое хранилище своими руками

Собрал себе сетевое хранилище на 2 терабайта. Что-то из железа у меня уже было, что-то было закуплено. Цены на оборудование, которое пришлось покупать, указываю с доставкой.

  • Корпус: 3Cott M01, встроенный преобразователь питания ADD12P6020 заменён на LR1106-250W12VDC (Aliexpress, 1123,34 руб.), штатный блок питания заменён на Mean Well GST90A12-P1M (Чип и Дип, 1759 руб.)
  • Материнская плата + процессор: Gigabyte GA-3800N (Regard, 2980 руб.)
  • Память: Crucial 4 ГБ DDR3.
  • Жёсткие диски: Seagate Ironwolf ST2000VN004 и WD Red WD20EFRX, USB-флешка Silicon Power Jewel J08 16 ГБ (Ситилинк, 10720 руб.)

Итоговая стоимость составила 16582 руб. 34 коп.

Почти готовое хранилище - осталось привинтить крышку и подключить диски

В качестве операционной системы я установил OpenMediaVault, потому что он основан на более привычном мне Debian Linux, в отличие от FreeNAS и NAS4Free, основанных на BSD. Оказался вполне неплохой дистрибутив, довольно функциональный и удобный.


Состояние дисков


Управление дисковым массивом


Перечень физических дисков

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

Финальный вид хранилища