Домашний медиа-сервер на основе Ubuntu Server 12.04 LTS / Хабрахабр

Домашний медиа-сервер на основе Ubuntu Server 12.04 LTS / Хабрахабр.

Привет, Хабр! В ходе обсуждения одной статьи про «идеальную» домашнюю сеть, возник спор, что лучше, аппаратный NAS или мини-компьютер с Linux дистрибутивом. Автор предлагал использовать аппаратный NAS, т. к. якобы он проще в администрировании, не требует знаний Linux, да и вообще NAS тихий. Но при этом, для просмотра на DLNA-телевизоре видео, который он не поддерживает, предлагал включать ноутбук с транскодирующим DLNA. Меня это, мягко говоря, удивило, т. к. в идеальной сети такого быть не должно. Поэтому хочу представить своё видение одного из ключевых компонентов домашней сети — централизованного хранилища данных, и основано оно будет на мини-ПК с ОС Ubuntu Server.

Что нам нужно?

В первую очередь от NAS требуется, конечно, надёжное хранение данных и удобный доступ ним. В первую очередь для надёжности необходим RAID, потому как потерять весь домашний медиа-архив из-за отказавшего жёсткого диска как минимум глупо. Для доступа к данным необходимо настроить FTP и Samba-доступ. Конечно потребности у каждого свои, поэтому если вы используете MacOS или Linux, то вам наверняка больше потребуются другие протоколы (NFS, AFP), я же опишу настройку так, как я её делал для себя.
Для доступа к медиа-данным со smart-телевизоров, нам потребуется DLNA-сервер. А для для удобства скачивания, нам нужен torrent-клиент. Ну и желательно всё это администрировать через веб-интерфейс.

Почему не аппаратный NAS?

Казалось бы, производители давно позаботились о пользователях, и давно выпускают готовые коробочки специально для домашнего применения. Но у них есть недостатки:
1) Они дорогие. Вы вряд ли найдёте дешевле 20000 руб. NAS c возможностью подключения 4-х жёстких дисков, с процессором Atom. Те, что стоят недорого, в них обычно применяется слабенький процессор, которого уже не хватет на тот же torrent при одновременном скачивании двух потоков данных (просмотр фильма по DLNA и копирование, например, фоток). Собрать же полноценный мини-ПК на основе mini-ITX материнской плате с Atom и 4 Гбайтами памяти у меня получилось всего за 6000 рублей!
2) Они ограничены. То есть в нём предусмотрены только те функции, которые заложил производитель. Чтобы расширить его возможности, обычно требуются «танцы с бубном», т. к. ядро в прошивке бывает сильно урезанным. Применяя же Ubuntu, вы практически ничем не ограничены — огромный репозитарий всевозможного софта позволит вам сделать из вашего сервера всё что угодно, вплоть до поднятия виртуальных машин.

Почему не FreeNAS или OpenFiler?

Спросите вы. Во-первых, смотри пункт №2 недостатков аппаратных NAS, то есть наращивание функционала данных дистрибутивов очень проблематично, тогда как у Ubuntu есть огромный репозитарий уже настроенного софта. Во-вторых, это огромные системные требования, в частности FreeNAS 8 требует минимум 2 Гб оперативной памяти, а новые версии OpenFiler вообще уже не выпускают под x86-архитектуру. Кроме того у FreeNAS как-то не гладко идёт развитие — версия 0.7 который имеет торрент клиент и DLNA-сервер давно устарела, в восьмой, коммерческой версии мне так и не удалось настроить DLNA, да и с предлагающейся файловой системой ZFS как то сложно, в случае отказа системы, как прикажете восстанавливать данные? Сложно.

Почему выбран дистрибутив Server 12.04 LTS?

LTS (Long Term Support) — это дистрибутив с длительным периодом поддержки и выпуском обновлений. Так как нам нужен сервер, который, по возможности, единожды настроив, мог бы спокойно работать в дальнейшем годами, то выбирать лучше именно эту версию дистрибутива.
Server версия выбрана очевидно, т. к. в идеале нам совершенно не нужно растрачивать ресурсы на графическую оболочку. Хотя если вы, пока только знакомитесь с linux, или уже работали с desktop-версией ubuntu, то в принципе можете выбрать и обычную версию дистрибутива, это не принципиально.

Начнём

Установка вполне прозрачна, поэтому особо подробно описывать её не буду. Подробнее лишь остановлюсь на разбивке жёстких дисков.
      

      

 
Я взял бюджетную материнскую плату без поддержки аппаратного RAID, да и на моей практике аппаратный RAID встроенный в материнскую плату часто показывает себя не с лучшей стороны, поэтому организовывать мы будем так называемый «программный» RAID. Для хранения данных будут использоваться два новеньких жёстких диска. Лишних носителей информации у меня не оказалось, поэтому диск буду разбивать на два раздела, один из которых будет системным, а второй — для данных. Оба раздела на двух жёстких дисках будут объединены в RAID 1 (все операции для удобства я выполняю на виртуальной машине, так что не обращайте внимание на маленький размер разделов).
Сначала создаём таблицу разделов на первом диске и разбиваем его на две части. Помечаем их как «раздел для RAID», хотя это и не обязательно.
      

  
Аналогично разбивается и второй диск. После чего выбираем пункт «Настройка программного RAID». Говорим «Создать MD-устройство», выбираем первые разделы на двух дисках. Аналогично с разделами для данных. К слову, RAID можно динамично менять и расширять, поэтому если у вас пока только один жёсткий, но планируете покупку второго — смело настраивайте, после покупки запросто сможете его подцепить.
      

 
После создания RAID, помечаем их для использования. Выбираем файловую систему ext4, и назначаем точки монтирования: системный раздел как корень (/), а раздел данных в произвольное место (я предпочитаю монтировать в папку /mnt).
      

 
Дальше система известит, хотим ли мы загружать систему если RAID-массив отказал. Советую ответить «нет», т. к. если откажет жёсткий диск, вы это даже не заметите — система продолжит работать с одним диском, но если откажет и второй диск, то тут придётся нести их в фирму по восстановлению данных.

Раздел подкачки создавать не буду, т. к. во-первых его можно сделать файлом, а во-вторых лично мне он не нужен — на моём мини-ПК установлено 4 Гб, при этом использование памяти никогда не превышало более 10% (400 Мбайт), а в обычном состоянии и того меньше (прямо сейчас используется всего 130 Мбайт). Хотя если вы планируете поднимать виртуальные машины, возможно, она вам и понадобится, поэтому после установки я опишу как создать файл подкачки, сейчас же на предложение создать swap-раздел отвечаем отрицательно.

После непродолжительного процесса копирования файлов система начнёт обновлять данные с репозитариев, а после спросит, каким образом будут устанавливаться обновления. Так как у нас администрирование системы сводится к минимуму, выбираем автоматическое обновление. Затем система спросит, какие пакеты необходимо установить сразу же. Я выбрал OpenSSH (нам нужна удалённая командная строка), LAMP (понадобится для веб-интерфейса), Print server (в этой статье я не буду описывать подключение принтера), и конечно Samba file server для доступа с windows-машин.
   
Ну и в финальной стадии система запросит пароль для MySQL и запрос на установку GRUB. Перезагружаемся — система установлена! Залогинемся, чтобы посмотреть какой ip-адрес нам присвоил DHCP (также это можно сделать с помощью команды ifconfig), в моём случае был выдан адрес 192.168.1.180.

Всё, можно отключать монитор и убирать системник в удобное место, дальше будем работать с ним через SSH. Я использую для этого PUTTY.
   

Конфигурация

1) файл подкачки

В первую очередь опишу как настроить файл подкачки, если он вам действительно нужен, всё делается буквально в несколько строчек команд.
Создаём файл заполненый нулями:

> sudo dd if=/dev/zero of=/swap bs=1M count=2048

Подготавливаем его для использования как swap:

> sudo mkswap /swap

Добавляем в файл fstab наш созданный файл для использования как файл подкачки:

> sudo nano /etc/fstab
/swap none swap sw 0 0

Перезагружаемся:

> sudo shutdown -r now
2) обновление ПО

Сразу же обновляем все пакеты, делается это двумя командами:

> sudo apt-get update
> sudo apt-get upgrade
3) Веб-интерфейс

Для управления системой через веб-интерфейс есть есть пакет webim, но его к сожалению в репозитарии нет, поэтому скачаем подготовленный пакет вручную:

> wget http://prdownloads.sourceforge.net/webadmin/webmin_1.580_all.deb

Для установки webim потребуются некоторые зависимые пакеты, в моём случае это такой список, возможно, вам потребуется включить ещё что-нибудь.

> sudo apt-get install libnet-ssleay-perl libauthen-pam-perl libio-pty-perl apt-show-versions

Ну и собственно установка:

> sudo dpkg --install webmin_1.580_all.deb

Всё, можно заходить в веб-интерфейс:

https://192.168.1.180:10000

4) Настраиваем ftp-доступ

Для ftp я использую pure-ftpd (хотя вы можете выбрать на свой вкус — proftpd и vsftpd)
Создадим публичную папку:

> sudo mkdir /mnt/data/public

Устанавливаем pure-ftpd из репозитария:

> sudo apt-get install pure-ftpd

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

> sudo pure-pw useradd public -u local -g nogroup -d /mnt/data/public

Обновим базу данных:

> sudo pure-pw mkdb

Включим использование виртуальных пользователей:

> sudo ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/50pure

Перезапускаем сервис:

> sudo service pure-ftpd restart
5) Samba

Настроим доступ к серверу с windows-машин, более того у меня лично дома семья большая и требуется разделение прав между несколькими пользователями. А для удобного редактирования прав на папки прямо из Windows (через вкладку «безопасность» в свойствах), будем использовать ACL.
Домена у нас нет, поэтому придётся создать пользователей таких же, как и на windows-машинах:

> sudo useradd -d /home/PaulZi -s /bin/true -g users PaulZi

Задаём пароль, такой же, как на windows:

> sudo passwd PaulZi

Добавляем созданного пользователя к Samba:

> sudo smbpasswd -a PaulZi

Для управления расширенными правами, можете установить утилиты (необязательно):

> sudo apt-get install acl
> sudo apt-get install attr

Для того, чтобы samba работала с ACL, необходима файловая система с поддержкой POSIX ACL, ext4 вполне подходит, но по умолчанию она примонтирована без этой поддержки. Для включения этой возможности добавим опцию «acl» в файл /etc/fstab. Но более того, в Windows реализована поддержка наследования прав, чтобы и это реализовать в linux, нужно чтобы samba где-то хранила дополнительные данные. Для этого необходимо включить расширенные атрибуты файлов, опция «user_xattr». Заодно запретим выполнение файлов на всём разделе с данными, с помощью опции «noexec» (для безопасности):

> sudo nano /etc/fstab
/dev/md0 /mnt/data       ext4    defaults,noexec,acl,user_xattr        0       2

Перезагружаемся:

> sudo shutdown -r now

Редактируем настройки samba (для краткости привожу только изменения и добавления):

> sudo nano /etc/samba/smb.conf
[global] 
   workgroup = Home
   netbios name = Server
   security = user

   # add settings
   admin users = PaulZi			# действие этих пользователей будут производиться от root 
   map acl inherit		= yes	# включаем наследование acl
   store dos attributes	= yes	# включаем хранение dos атрибутов
   # отключаем хранения windows атрибутов:
   map archive		= no
   map system		= no
   map hidden		= no
   map readonly		= no

# public share
[public]
   comment = Public
   path = /mnt/data/public
   browseable = yes				# шара видна
   read only = no				# включаем возможность записи
   guest ok = yes				# разрешаем гостевой доступ
   inherit permissions = yes	# включаем наследование прав
   inherit acls = yes			# включаем наследование windows-прав
   inherit owner = yes			# включаем наследование владельца
   hide unreadable = yes		# прятать файлы недоступные для чтения

Перезапускаем сервис:

> sudo service smbd restart
6) DLNA/UPnP — сервер

В качестве DLNA-сервера я выбрал minidlna. Выбрал его по одной просто причине, что он не тянет за собой кучу ненужных зависимостей, как MediaTomb и Serviio (они тянут Java либо графические библиотеки). Однако если вам необходим транскодинг, советую установить один из них, вместо minidlna.
Установка из репозитария:

> sudo apt-get install minidlna

Настраиваем:

> sudo nano /etc/minidlna.conf
media_dir=/mnt/data/public
friendly_name=Ubuntu

Перезапускаем:

> sudo service minidlna restart
7) torrent

Ну и последний освещённый в данной статье сервис — torrent-клиент. Я использую Transmission, как успешно зарекомендовавший себя клиент с веб-интерфейсом.
Устанавливаем:

> sudo apt-get install transmission-daemon

Останавливаем сервис, иначе все изменения затрутся после завершения процесса:

> sudo service transmission-daemon stop

Настраиваем:

> sudo nano /etc/transmission-daemon/settings.json
"download-dir": "/mnt/data/public/torrents"
"rpc-password": "local"
"rpc-username": "local"
"rpc-whitelist-enabled": false

Тут меняем четыре настройки — задаём путь для загрузки, имя пользователя и пароль для веб-интерфейса, а также отключаем «белый» список доступа к интерфейсу — разрешаем для всех. Пароль указываем в открытом виде, после последующего запуска он будет зашифрован.
Запускаем сервис:

> sudo service transmission-daemon start

Заходим в веб-интерфейс, убеждаемся, что всё хорошо:

http://192.168.1.180:9091/

Послесловие

В итоге мы получили вполне себе полноценный домашний сервер. Конечно в статье указано лишь базовые настройки сервисов, и скорее всего вам нужно будет что-то настроить под себя. Да и возможно вам потребуется какие-то дополнительные сервисы, но как видно из статьи, всё это делается довольно просто, без особых «плясок с бубном», достаточно всего лишь обратиться к гуглу — по настройке сервисов в Ubuntu информации очень много.