Страницы

11 августа 2016 г.

Ubuntu Server. Домашний медиа-сервер (miniDLNA)

В данной статье представлен пример развертывания сервиса DLNA для домашней сети на базе Ubuntu Server 14.04 LTS (16.04 LTS) и miniDLNA.
Подробнее о технологии DLNA можно узнать тут.

Установите операционную систему Ubuntu Server 14.04 LTS или 16.04 LTS.
При установке, желательно выбрать опцию для установки OpenSSH server.
Убедитесь, что на подготовленном компьютере имеется доступ в сеть Интернет.

Установка потребует root доступа.
sudo su
Обновите систему перед установкой до актуального состояния:
apt-get update
apt-get upgrade
Установка miniDLNA — сервера
Установить библиотеки-зависимости:
sudo apt-get install gcc debhelper libavcodec-dev libavformat-dev libavutil-dev libexif-dev libflac-dev libid3tag0-dev libjpeg-dev libogg-dev libsqlite3-dev libvorbis-dev
Можно просто установить пакет minidlna из репозитория, и после этого сразу перейти к настройке minidlna.
sudo apt install minidlna
А можно самостоятельно собрать minidlna из исходников.
Для этого нужно установить пакет checkinstall:
sudo apt-get install checkinstall
Скачать исходники с сайта разработчика minidlna-сервера.
Скачиваем командой wget:
wget http://downloads.sourceforge.net/project/minidlna/minidlna/1.1.5/minidlna-1.1.5.tar.gz
Распаковать в корневой каталог исходники:
tar -xf minidlna-1.1.5.tar.gz
Перейти в папку с исходниками, и приступить к их сборке.
cd /minidlna-1.1.5
Конфигурируем:
./configure
Сразу приступаем к сборке пакета
sudo checkinstall -D
Если сборка прошла успешно, вывод должен быть примерно таким:
checkinstall 1.6.2, Copyright 2009 Felipe Eduardo Sanchez Diaz Duran
           This software is released under the GNU GPL.
The package documentation directory ./doc-pak does not exist. 
Should I create a default set of package docs?  [y]: y
Preparing package documentation...OK
Please write a description for the package.
End your description with an empty line or EOF.
>> 
*****************************************
**** Debian package creation selected ***
*****************************************
This package will be built according to these values: 
0 -  Maintainer: [ root@unl01 ]
1 -  Summary: [ Package created with checkinstall 1.6.2 ]
2 -  Name:    [ minidlna ]
3 -  Version: [ 1.1.5 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ amd64 ]
8 -  Source location: [ minidlna-1.1.5 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ minidlna ]
12 - Conflicts: [  ]
13 - Replaces: [  ]
Enter a number to change any of them or press ENTER to continue: 
Installing with make install...
========================= Installation results ===========================
Making install in po
make[1]: Entering directory `/home/bbox/minidlna-1.1.5/po'
test ! -f ./minidlna.pot || \
 test -z "da.gmo de.gmo es.gmo fr.gmo it.gmo ja.gmo ko.gmo nb.gmo nl.gmo pl.gmo ru.gmo sl.gmo sv.gmo" || make da.gmo de.gmo es.gmo fr.gmo it.gmo ja.gmo ko.gmo nb.gmo nl.gmo pl.gmo ru.gmo sl.gmo sv.gmo
make[2]: Entering directory `/home/bbox/minidlna-1.1.5/po'
rm -f da.gmo && /usr/bin/msgfmt -c --statistics --verbose -o da.gmo da.po
da.po: 22 translated messages.
rm -f de.gmo && /usr/bin/msgfmt -c --statistics --verbose -o de.gmo de.po
de.po: 22 translated messages.
rm -f es.gmo && /usr/bin/msgfmt -c --statistics --verbose -o es.gmo es.po
es.po: 22 translated messages.
rm -f fr.gmo && /usr/bin/msgfmt -c --statistics --verbose -o fr.gmo fr.po
fr.po: 22 translated messages.
rm -f it.gmo && /usr/bin/msgfmt -c --statistics --verbose -o it.gmo it.po
it.po: 22 translated messages.
rm -f ja.gmo && /usr/bin/msgfmt -c --statistics --verbose -o ja.gmo ja.po
ja.po: 22 translated messages.
rm -f ko.gmo && /usr/bin/msgfmt -c --statistics --verbose -o ko.gmo ko.po
ko.po: 22 translated messages.
rm -f nb.gmo && /usr/bin/msgfmt -c --statistics --verbose -o nb.gmo nb.po
nb.po: 22 translated messages.
rm -f nl.gmo && /usr/bin/msgfmt -c --statistics --verbose -o nl.gmo nl.po
nl.po: 22 translated messages.
rm -f pl.gmo && /usr/bin/msgfmt -c --statistics --verbose -o pl.gmo pl.po
pl.po: 22 translated messages.
rm -f ru.gmo && /usr/bin/msgfmt -c --statistics --verbose -o ru.gmo ru.po
ru.po: 22 translated messages.
rm -f sl.gmo && /usr/bin/msgfmt -c --statistics --verbose -o sl.gmo sl.po
sl.po: 22 translated messages.
rm -f sv.gmo && /usr/bin/msgfmt -c --statistics --verbose -o sv.gmo sv.po
sv.po: 22 translated messages.
make[2]: Leaving directory `/home/bbox/minidlna-1.1.5/po'
touch stamp-po
installing da.gmo as /usr/local/share/locale/da/LC_MESSAGES/minidlna.mo
installing de.gmo as /usr/local/share/locale/de/LC_MESSAGES/minidlna.mo
installing es.gmo as /usr/local/share/locale/es/LC_MESSAGES/minidlna.mo
installing fr.gmo as /usr/local/share/locale/fr/LC_MESSAGES/minidlna.mo
installing it.gmo as /usr/local/share/locale/it/LC_MESSAGES/minidlna.mo
installing ja.gmo as /usr/local/share/locale/ja/LC_MESSAGES/minidlna.mo
installing ko.gmo as /usr/local/share/locale/ko/LC_MESSAGES/minidlna.mo
installing nb.gmo as /usr/local/share/locale/nb/LC_MESSAGES/minidlna.mo
installing nl.gmo as /usr/local/share/locale/nl/LC_MESSAGES/minidlna.mo
installing pl.gmo as /usr/local/share/locale/pl/LC_MESSAGES/minidlna.mo
installing ru.gmo as /usr/local/share/locale/ru/LC_MESSAGES/minidlna.mo
installing sl.gmo as /usr/local/share/locale/sl/LC_MESSAGES/minidlna.mo
installing sv.gmo as /usr/local/share/locale/sv/LC_MESSAGES/minidlna.mo
if test "minidlna" = "gettext-tools"; then \
 /bin/mkdir -p /usr/local/share/gettext/po; \
 for file in Makefile.in.in remove-potcdate.sin quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot   Makevars.template; do \
   /usr/bin/install -c -m 644 ./$file \
   /usr/local/share/gettext/po/$file; \
 done; \
 for file in Makevars; do \
   rm -f /usr/local/share/gettext/po/$file; \
 done; \
else \
 : ; \
fi
make[1]: Leaving directory `/home/bbox/minidlna-1.1.5/po'
make[1]: Entering directory `/home/bbox/minidlna-1.1.5'
  CC       minidlna.o
  CC       upnphttp.o
  CC       upnpdescgen.o
  CC       upnpsoap.o
  CC       upnpreplyparse.o
  CC       minixml.o
  CC       clients.o
  CC       getifaddr.o
  CC       process.o
  CC       upnpglobalvars.o
  CC       options.o
  CC       minissdp.o
  CC       uuid.o
  CC       upnpevents.o
  CC       sql.o
  CC       utils.o
  CC       metadata.o
  CC       scanner.o
  CC       inotify.o
  CC       tivo_utils.o
  CC       tivo_beacon.o
  CC       tivo_commands.o
  CC       playlist.o
  CC       image_utils.o
  CC       albumart.o
  CC       log.o
  CC       containers.o
  CC       tagutils/tagutils.o
  CCLD     minidlnad
sed -e s@:SBINDIR:@/usr/local/sbin@ <linux/minidlna.init.d.script.tmpl >linux/minidlna.init.d.script
make[2]: Entering directory `/home/bbox/minidlna-1.1.5'
 /bin/mkdir -p '/usr/local/sbin'
  /usr/bin/install -c minidlnad '/usr/local/sbin'
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/bbox/minidlna-1.1.5'
make[1]: Leaving directory `/home/bbox/minidlna-1.1.5'
=============== Installation successful ===============
Copying documentation directory...
./
./AUTHORS
./NEWS
./README
./TODO
./ChangeLog
./INSTALL
./ABOUT-NLS
./COPYING
Some of the files created by the installation are inside the home directory: /home
You probably don't want them to be included in the package.
Do you want me to list them?  [n]: n
Should I exclude them from the package? (Saying yes is a good idea)  [n]: y
Copying files to the temporary directory...OK
Stripping ELF binaries and libraries...OK
Compressing man pages...OK
Building file list...OK
Building Debian package...OK
Installing Debian package...OK
Erasing temporary files...OK
Writing backup package...OK
OK
Deleting temp dir...OK
**********************************************************************
 Done. The new package has been installed and saved to
 /home/bbox/minidlna-1.1.5/minidlna_1.1.5-1_amd64.deb
 You can remove it from your system anytime using: 
      dpkg -r minidlna
**********************************************************************

Настройка miniDLNA
Проверить init-скрипт по пути /etc/init.d/minidlna

Если файл отсутствует, создать его со следующим содержимым:

#!/bin/sh
#
# MiniDLNA initscript
#
# Based on the mediatomb debian package.
# Original authors: Tor Krill <tor@excito.com>
#                   Leonhard Wimmer <leo@mediatomb.cc>
#                   Andres Mejia <mcitadel@gmail.com>
#
# Modified by: Benoit Knecht <benoit.knecht@fsfe.org>
#
### BEGIN INIT INFO
# Provides:          minidlna
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop::    $network $local_fs $remote_fs
# Should-Start:      $all
# Should-Stop:       $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start minidlna at boot time
# Description:       Manage the minidlna daemon, a DLNA/UPnP-AV media server.
### END INIT INFO
#
unset USER
#
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="DLNA/UPnP-AV media server"
NAME=minidlnad
DAEMON=/usr/local/sbin/minidlnad
PIDDIR=/run/$NAME
PIDFILE=$PIDDIR/$NAME.pid
SCRIPTNAME=/etc/init.d/minidlna
DEFAULT=/etc/default/minidlna
#
# Exit if the package is not installed
[ -x $DAEMON ] || exit 0
#
# Read configuration variable file if it is present
[ -r $DEFAULT ] && . $DEFAULT
#
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
#
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
#
# Do not start the daemon if NO_START is enabled in DEFAULT
if [ "$START_DAEMON" != "yes" ] && [ "$1" != "stop" ]; then
        log_warning_msg "$NAME: Not starting $DESC."
        log_warning_msg "$NAME: Disabled in $DEFAULT."
        exit 0
fi

# Set the default configuration file
if [ -z $CONFIGFILE ]; then
        CONFIGFILE=/etc/minidlna.conf
fi

# Set the default log file
if [ -z $LOGFILE ]; then
        LOGFILE=/var/log/minidlna.log
fi

# Run as `minidlna' if USER is not specified or is `root'
if [ -z $USER ]; then
        USER=minidlna
fi

# If no group is specified, use USER
if [ -z $GROUP ]; then
        GROUP=$USER
fi

DAEMON_ARGS="-f $CONFIGFILE -P $PIDFILE $DAEMON_OPTS"

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        touch $LOGFILE && chown $USER:$GROUP $LOGFILE || return 2
        if [ ! -d $PIDDIR ]; then
            mkdir $PIDDIR || return 2
        fi
        chown $USER:$GROUP $PIDDIR || return 2

        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --chuid $USER:$GROUP --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --chuid $USER:$GROUP --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -rf $PIDDIR
        return "$RETVAL"
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
    do_start
    case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
  ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                if [ "$1" = "force-reload" ]; then
                        # Rescan the collection
                        DAEMON_ARGS="$DAEMON_ARGS -R"
                fi
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac

:

Дать права на запуск скрипта:
sudo chmod 755 /etc/init.d/minidlna
Назначить запуск init-скрипта:
sudo update-rc.d minidlna defaults
По умолчанию служба запускается под пользователем minidlna, нужно создать соответствующую учетную запись:
sudo adduser --system --home /var/lib/minidlna --group --gecos "MiniDLNA server" minidlna
Проверить параметры init-скрипта etc/default/minidlna:
sudo nano /etc/default/minidlna
Если файл отсутствует создать его со следующим содержимым:

# Defaults for minidlna initscript
# sourced by /etc/init.d/minidlna
# installed at /etc/default/minidlna by the maintainer scripts
# These options can be set to modify the behavior of the minidlna init script.
# The options commented out show the default values.
# Start the daemon if set to "yes"
START_DAEMON="yes"
# Path to the configuration file
CONFIGFILE="/etc/minidlna.conf"
# Path to the log file
#LOGFILE="/var/log/minidlna.log"
# User and group the daemon should run as
#USER="minidlna"
#GROUP="minidlna"
# Additional options that are passed to the daemon
DAEMON_OPTS=""

Перезапустить init-скрипт
sudo /etc/init.d/minidlna restart
Конфигурация MiniDLNA
Открыть файл конфигурации:
sudo nano /etc/minidlna.conf
Нужно задать путь к папке с медиа-файлами, параметр: media_dir.
Можно задать имя сервера, отображаемое клиентом, параметр: friendly_name.
Необходимо задать внутренний сетевой интерфейс, параметр: network_interface. У меня на этом же ПК настроен сетевой мост в лаборатории UNetLab интерфейсом под названием – pnet0. Параметры в комментариях файла конфигурации содержат значения по умолчанию.

# Порт сервера
port=8200
# Привязка к сетевому интерфейсу
# Можно задать несколько интерфейсов
# в формате network_interface=eth0,eth1
network_interface=br0
# Имя пользователя или UID, под которым будет работать служба
# Добавлен в версии 1.1.0
# В Debian задается в параметрах init-скрипта
#user=minidlna
# Путь к папке с медиа-файлами
# Для сканирования нескольких папок, укажите несколько параметров media_dir
# Чтобы сканировать файлы определенного типа, укажите соответствующий префикс:
#   A - аудио: media_dir=A,/home/jmaggard/Music
#   V - видео: media_dir=V,/home/jmaggard/Videos
#   P - изображения: media_dir=P,/home/jmaggard/Pictures
# Начиная с версии 1.1.0, можно задать несколько типов:
#   PV - изображения и видео: media_dir=AV,/var/lib/minidlna/digital_camera
#
# При изменении параметра, потребуется повторное сканирование файлов.
# Необходимо выполнить команду "service minidlna force-reload" от имени root.
# Начиная с версии 1.1.0, при изменении параметра, сканирование выполняется автоматически.
media_dir=A,/home/Music
media_dir=V,/home/Films
media_dir=P,/home/Pictures
# Имя DLNA-сервера, отображаемое клиентом
# По умолчанию: "$HOSTNAME:$USER"
friendly_name=DLNA_Server
# Путь к папке для хранения базы данных и кэша обложек альбомов
db_dir=/var/lib/minidlna
# Путь к папке с лог-файлами
log_dir=/var/log
# Уровень детальности лога
# В формате log_level=источник1,источник2=значение1,источник3,источник4=значение2 ...
# Доступные источники: "general", "artwork", "database", "inotify", "scanner", "metadata", "http", "ssdp", "tivo"
# Возможные значения: "off", "fatal", "error", "warn", "info" or "debug"
#log_level=general,artwork,database,inotify,scanner,metadata,info,ssdp,tivo=warn
# Перечень имен файлов-обложек альбомов, разделитель: "/"
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg
# Автообнаружение новых файлов
# Включено по умолчанию
#inotify=yes
# Поддержка устройств TiVo
#enable_tivo=no
# Строго следовать DLNA-стандарту
# Использовать серверное масштабирование для очень больших JPEG-изображений
# Что может снизить скорость их обработки.
#strict_dlna=yes
# Адрес веб-страницы устройства
# По умолчанию IP-адрес и заданный порт сервера
#presentation_url=http://www.mylan/index.php
# Интервал отправки SSDP-уведомлений, в секундах
notify_interval=120
# Серийный номер и номер модели DLNA-сервера, сообщаемый клиенту
serial=12345678
model_number=3
# Путь к сокету MiniSSDPd, если установлен
# Требуется для обеспечения работы нескольких DLNA/UPnP служб на одном сервере
#minissdpdsocket=/run/minissdpd.sock
# Контейнер, используемый в качестве корневой папки для клиентов
#   * "." - стандартный контейнер
#   * "B" - "Обзор папки"
#   * "M" - "Музыка"
#   * "V" - "Видео"
#   * "P" - "Изображения"
# Если задано "B" и клиент представится как аудиоплеер, в качестве корня будет использована папка "Music/Folders"
#root_container=.
# Всегда использовать заданный критерий сортировки, вместо значения, запрошенного клиентом
#force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title
# Максимальное число одновременных подключений
# Учтите: многие клиенты открывают несколько подключений одновременно
max_connections=20
# Параметр для отображения директорий подробно или нет
disable_extended_directories=yes

Запустить службу:
/etc/init.d/minidlna start
или так
sudo service minidlna force-reload
Проверить, работает ли служба:
ps ax | grep minidlna
Проверить, слушается ли порт:
sudo ss -4lnp | grep minidlna
Проверить лог:
cat /var/log/minidlna.log
Если есть сообщения вида: “WARNING: Inotify max_user_watches [8192] is low.”, необходимо увеличить число дескрипторов слежения inotify до 100 000. Для этого в файл /etc/sysctl.conf в конце добавим строки:

#MiniDLNA warning fix
fs.inotify.max_user_watches = 100000

Использование DLNA
Windows






Android
Подключиться можно, к примеру, с помощью приложения BubbleUPnP





Комментариев нет:

Отправить комментарий