Предисловие
Не так давно я начал пользоваться Plex media server для просмотра видео на ТВ через Amazon fire stick. Plex server был настроен на десктопе, а файлы с видео были подключены через внешний USB диск и такая связка меня в принципе устраивала. Однако при выключенном ПК доступа к контенту нет и каждый раз включать ПК только для того, чтобы посмотреть фильм или послушать музыку уже стало напрягать. Поэтому решил настроить plex на raspberry и подключить к нему внешний USB с уже имеющимся контентом. А уже в процессе понял, что еще бы не плохо иметь доступ к файлам и качалку для торентов и заодно упростить процесс настройки с помощью автоматизации на Ansible. Playbook выложил на GitHub.
Что потребуется (железо / софт)
Window и Ubuntu Desktop. В принципе, можно только что-то одно, но мне привычнее какие-то вещи делать на Windows, а какие-то на Ubuntu. (Ubuntu установлена через VirtualBox на Windows). Все то же самое думаю удастся без проблем и на Mac.
Raspberry Pi Imager под Windows. Можно скачать с официального сайта.
Образ Raspberry Pi OS Lite. Тоже с официального сайта. Быстрее скачать через торрент, чем по прямой ссылке.
Raspberry pi 3/4. Изначально проводил опыты на третьей версии, но потом закупил четвертую.
SD-карта 8Gb или больше. (USB кардридер)
Ansible под Ubuntu описание и установка здесь.
USB диск. Желательно с USB 3.0, если собираете на pi 4.
Блок питания на 3A, чтобы хватало мощности для подключенного USB диска.
Playbook для Ansible с GitHub.
Git.
Подготовка raspberry pi
Для начала зальем скачанный образ с ОС на SD-карту с помощью Pi Imager. В пункте Choose image выбираем Use custom и выбираем тот образ, что скачали. Можно выбрать тот же образ в самой программе, но тогда он будет скачивать его из интернета, у меня процесс закачки занимал очень длительное время, поэтому снача попробовал скачать по прямой ссылке с сайта, но это тоже оказалось медленно и в итоге скачал через торрент. Указываем нашу SD-карту и жмем write.
Дальше отформатируем внешний USB накопитель в NTFS и присвоим ему понятный метку тома (например usb_750g), который будем использовать в дальнейшем для монтирования диска на raspberry. У меня внеший USB накопитель был уже с данными и отформатирован в NTFS, поэтому просто списал название метки тома. Можно также отформатировать в диск в exFAT, но в таком случае на raspberry придется ставить дополнительный пакет, поэтому в данной статье рассмотрю только случай с NTFS. Возможно, в дальнейшем добавлю и для других.
На данном этапе работа с Windows заканчивается и дальнейшие действия будут производиться на Ubuntu.
Подключаем нашу SD-карту к компьютеру с Ubuntu или переподключаем устройство на гостевую систему в VirtualBox. Должны появиться два подмонтированных диска boot
и rootfs
. В boot cd /media/ваш_пользователь/boot/
. положим файл ssh-командой echo "" > /media/$LOGIN/boot/ssh
(спасибо berez за подсказку), который при первом запуске даст понять raspberry, что нужно включить ssh-соединения.
Для подключения к raspberry я буду пользоваться ssh ключом, он также понадобится для плейбука на Ansible. Создадим его командой cd ~/.ssh && ssh-gen
в папке для ключей (если ее нет, то создайте ее). Дайте понятное имя ключу например raspberry, на вопросе о секретной фразе жмем enter. На выходе получим два ключа: raspberry и raspberry.pub, приватный и публичный. С помощью приватного будем подключаться, а публичный скопируем на сам raspberry. На диске rootfs создадим директорию командой mkdir -p /media/$LOGIN/rootfs/home/pi/.ssh
и и скопируем сам ключ командой cp ~/.ssh/raspberry.pub /media/$LOGIN/rootfs/home/pi/.ssh/authorized_keys
.
Вставляем SD-карту в raspberry, подключем сетевой кабель, USB диск и питание. У меня в домашней сети IP адреса раздает роутер, если у вас такая же конфигурация, то в интерфейсе роутера можно посмотреть какой IP адрес выдан устройству и его MAC-адрес. А затем установть выдачу постоянного IP вашему raspberry по MAC-адресу. MAC-адрес можно посмотреть и на самом raspberry. Подключаем монитор с клавиатурой и запускаем команду cat /sys/class/net/eth0/address
.
Установка и настройка
Если на Ubuntu еще не установлен Ansible, то сделать это можно по ссылке выше. Клонируем репозиторий git clone https://github.com/notfoundsam/raspberry-plex-ansible.git
и заходим в папку с плейбуками cd raspberry-plex-ansible
.
Для начала установим статический IP адрес нашего raspberry в файле hosts.ini
, к которому будет обращаться Ansible для настройки. Можно указать и группу адресов, если необходимо настроить сразу несколько устройств.
В файле group_vars/all.yml
, если вы не изменяли имя пользователя на raspberry, то ansible_user
оставляем без изменений. Укажем путь к ssh ключу в переменной ansible_ssh_private_key_file
. Если все делали по шагам как описано выше, то оставляем без изменений. Установим имя хоста в переменной host_name
. В переменную usb_volume_label
запишем имя метки тома подключенного USB диска. Монтирование диска будет производиться как раз по ней. Если предполагается использовать transmission для закачки торентов, то установите в переменные transmission_username
, transmission_password
, transmission_white_list
свои значения. Для transmission_white_list
обязательно оставьте адрес 127.0.0.1.
Установка Plex и монтирование диска. Запустите плейбук plex.yml
командой ansible-playbook plex.yml
который установит необходимые пакеты, сам Plex изменит имя хоста и сделает перезагрузку. После завершения работы скрипта запустите другой плейбук ansible-playbook usb-volume.yml
, который подмонтирует наш USB диск и добавит автоматическое монтирование при старте. Зайдем на веб интерфейс плекса raspberry_ip:32400/web
и пройдем шаги, которые plex предлагает. На некоторых шагах бывало, что plex выдавал ошибку что нет доступа, но после обновления страницы или повторного перехода на raspberry_ip:32400/web
все корректно отображалось. Я думаю, это связано с тем, что при первом запуске plex сервер не успевает ответить клиенту из-за большой нагрузки. Дальше в интерфейсе plex уже можно выбрать наш USB диск.
Установка samba-сервера. Заливать файлы на raspberry удобнее по сети, поэтому добавил плейбук, который установит Samba сервер и расшарит USB диск в локальной сети. Для установки запускаем ansible-playbook samba.yml
. Замечание, если ваш Windows хост принадлежит группе, отличной от workgroup, то поправьте на свою в файле /etc/samba/smb.conf
на raspberry. Теперь можно зайти по IP и проверить доступ \\raspberry_ip
в проводнике Windows.
Установка Transmission. Запустите плейбук, который установит transmission демон и утилиту для работы с iptables, добавит папку downloads на USB диск для загрузок и сделает ее папкой по умолчанию для загружаемых торентов. Папка для временных файлов та же самая, но transmission будет добавлять .part к еще незавершенным файлам. Также откроет порт 51413 для входящих подключений. Проверим доступ зайдя на raspberry_ip:9091/transmission
, логин и пароль для входа те что прописаны в файле group_vars/all.yml
. В настройках клиента на вкладке Network проверим, что порт 51413 открыт. Если написано closed, то нужно настроить перенаправление этого порта на вашем роутере.
Сравнение raspberry 3 с raspberry 4
Проводил проверку работы на raspberry pi 3B / 3B+/ 4B. У pi 3 сетевой интерфейс поддерживает только 100Mbs, поэтому скопировать туда 100-200GB данных займет много времени. С 3B+ ситуация уже получше, потому что установлен сетевой интерфейс на 1Gbs. Plex сервер достаточно хорошо себя показал на нем, особенно если видео файлы в формате H.264, но на некоторых avi файлах сжатых MPEG4(XVID) кодеком, процессор еле-еле тянул, открывал видео долго, и порой не успевал отдавать видео и картинка останавливалась. Впринципе такие файлы можно заранее оптимизировать в плексе под TV и тогда эта проблема уйдет, но потребуется больше места для перекодированных файлов.
После некоторого времени использования pi 3B+ все таки стал замечать, что обновление библиотеки с несколькими сотнями файлов занимает приличное время и редкие залипания плеера про воспроизведении видео. Например, ни как не может открыть фильм, решил заказать себе pi 4B. У pi 4B процессор уже помощнее и это решило проблему с MPEG4, уже можно было смотреть файлы без сильных задержек и при перемотке не ждать по 10-15 секунд. USB 3.0 добавил быстроты работы с диском при обновлении библиотеки.
После прочтения этой статьи решил приобрести себе Samsung Evo+ вместо SanDisk Ultra. И по ощущениям загрузка ОС стала быстрее.
Стоимость / Комплектущие
Raspberry pi 4B 4GB RAM ~ $62
SD-карта Samsung Evo+ ~ $8
Металлический корпус с пассивным охлаждением ~ $17 (магазин) либо в поисковике "Geekworm Raspberry Pi 4B (P173 Black) Passive Cooling Metal Case"
USB 3.0 жесткий диск 750GB (покупал 4 года назад) ~ $50
Питание Anker PowerPort 6 (покупал 3 года назад) ~ $30
Если какие то комплектующие уже есть в наличии, то и список можно сократить. В моем случае получилось $87.
Выводы
За небольшую сумму удалось собрать медиа-центр, который на данный момент удовлетворяет все мои потребности. При выходе из строя внешнего накопителя я согласен с полной или частичной потерей данных. Для снижения нагрузки на внешний диск медиа-сервера собрал еще один комплект USB диск + Samba + Transmission на raspberry pi 3B, но передача данных по сети со скоростью 100Mbs начинает напрягать, планирую перенести на pi 3B+. Благодаря созданному скрипту на Ansible процесс настройки стал занимать гораздо меньше времени.
Плейбуки написаны по отдельности, что бы можно было использовать в различных комбинациях, например только для настройки Samba с подключением внешнего диска, для организации простого сетевого хранилища.
Надеюсь что данный материал поможет быстрее справиться с аналогичной задачей. Если есть предложения по улучшению, критика или ошибки пишите в коментариях.
Дальнейшие планы
Объем данных постоянно растет, поэтому планирую докупить стойку с USB хабом и несколькими отсеками для HDD дисков. В планах приобрести что-то из этого: Yottamaster Hard Drive с 4 отсеками. Есть уже со встроенным RAID контроллером, но наверное возьму без него. Если потребуется RAID, то настрою его на raspberry и только для двух дисков остальные оставлю как single. А старый 750GB диск переключу на закачку торрентов.
osscombat
не тратьте вы время на эти костыли из microSD, USB с raspberry, вложитесь сразу в нормальную железяку для этих задач.
KorP
Поддерживаю. Пусть это будет конечно не 12к, а немного дороже, но по крайней мере не будет проблем с производительностью того же трансмишена на высоких скоростях, когда проц будет просто захлёбываться
berez
А можно примеры «нормальных железяк»?
Я вот тоже подумывал сделать из малинки мини-NAS, в первую очередь из-за бесшумности. Останавливает отсутствие у нее SATA-интерфейсов. Но вот коробочка Yottamaster мне прям нравится.
Что касается скоростей — ну, для просмотра фильмов USB 3.0 вполне достаточно, мне кажется. А высоких скоростей от трансмишена у меня лично, например, не бывает — от провайдера идет кабель 100 МБит.
osscombat
если у вас зоопарк видеоформатов, то при транскодировании Plex будет молотить со 100% загрузкой всех ядер, даже если у вас 3+Ghz CPU и качество для кодирования ниже среднего. Это если FullHD источник, про 4К вообще отдельная тема. Поэтому если надо тихо и мощно, то что-то многоядерное с огромным радиатором и 12см кулерами лучший друг для Plex. Если транскодирование не нужно в принципе, то вероятно вам больше подходит не Plex, а samba share на диск, и плеер в ТВ.
berez
Мне не нужен Plex. Телевизор переваривает большинство форматов, которые у меня есть, а если чего-то не понимает — я неспешно перекодирую в х264 каким-нибудь ffmpeg'ом.
Вообще мой вопрос был больше про подсистему хранения.