
Я, как и многие другие пользователи MacBook Pro, столкнулся с проблемой недостачи внутренней памяти. Если говорить точнее, то используемый мной ежедневно rMBP был оснащен SSD объемом всего 256GB, чего, естественно, надолго не хватало.
А когда я плюс ко всему стал записывать видео во время своих полетов, ситуация только усугубилась. Объем заснятых материалов после таких полетов составлял 50+ GB, и мой несчастный SSD на 256GB очень скоро заполнился, вынудив меня приобрести внешний диск на 1TB. Тем не менее, спустя один год, и он перестал справляться с генерируемыми мной объемами данных, не говоря уже о том, что недостаток избыточности и резервного копирования делали его неподходящим для размещения важной информации.
Итак, в один момент я решил собрать NAS большого объема в надежде, что эта система продержится хотя бы пару лет, не требуя очередного апгрейда.
Эту статью я написал в первую очередь как памятку о том, что именно и как я делал на случай, если мне потребуется сделать это снова. Надеюсь, что и для вас она окажется полезна, если вы соберетесь делать то же самое.
Быть может проще купить?
Итак, нам известно, что мы хотим получить, остается вопрос как?
Сначала я ознакомился с коммерческими решениями и рассмотрел, в частности, компанию Synology, которая, как предполагалось, предоставляет лучшие NAS-системы потребительского уровня на рынке. Однако стоимость этого сервиса оказалась достаточно высока. Самая дешевая система с 4-мя отсеками стоит $300+, и при этом жесткие диски в комплект не входят. Кроме того, сама внутренняя начинка такого комплекта не особо впечатляюща, что ставит под вопрос ее реальную производительность.
Тогда я и подумал: а почему бы не собрать NAS-сервер самому?
Поиск подходящего сервера
Если собираешься комплектовать такой сервер, то в первую очередь необходимо найти правильное железо. Для данной сборки должен вполне подойти подержанный сервер, так как для задач хранилища нам не потреб��ется особой производительности. Из необходимого же нужно отметить большой объем RAM, несколько SATA коннекторов и хорошие сетевые карты. Поскольку мой сервер будет работать в месте моего постоянного проживания, то и уровень шума тоже имеет значение.
Свои поиски я начал с eBay. Несмотря на то, что там я нашел много подержанных Dell PowerEdge R410/R210 стоимостью менее $100, имея опыт работы в серверном помещении, я знал, что эти блоки 1U издают слишком много шума и для домашнего использования не подойдут. Как правило, сервера формата tower чаще менее шумны, но, к сожалению, на eBay их было выставлено немного, и все они были либо дорогие, либо маломощные.
Следующим местом для поиска стал сайт Craiglist, где я нашел человека, продававшего подержанный HP ProLiant N40L всего за $75! Я был знаком с этими серверами, которые даже в подержанном виде обычно стоят в районе $300, так что я отправил продавцу письмо в надежде, что объявление еще актуально. Узнав, что так оно и есть, я, недолго думая, направился в Сан Матео, чтобы забрать этот сервер, который уже с первого взгляда меня однозначно порадовал. У него был минимальный износ и, за исключением небольшого налета пыли, все остальное было отлично.

Фото сервера, сразу после покупки
А вот спецификация приобретенного мной комплекта:
- CPU: AMD Turion(tm) II Neo N40L Dual-Core Processor (64-bit)
- RAM: 8 GB non-ECC RAM (установлен предыдущим владельцем)
- Flash: 4 GB USB Drive
- SATA Connectors: 4 + 1
- NIC: 1 Gbps on-board NIC
Стоит ли говорить, что несмотря на возраст в несколько лет, спецификация этого сервера по-прежнему превосходит большинство вариантов систем NAS, предлагаемых на рынке, особенно по оперативной памяти. Несколько позже я даже сделал апгрейд до 16 GB ECC с увеличенным объемом буфера и повышенной защитой данных.
Выбор жестких дисков
Теперь у нас есть отличная работоспособная система и осталось подобрать для нее жесткие диски. Очевидно, что за те $75 я получил только сам сервер без HDD, что меня не удовлетворило.
Проведя небольшое исследование, я выяснил, что для работы с NAS-системами в круглосуточном режиме 24/7 лучше всего подходят HDD WD Red. Для их покупки я обратился на Amazon, где приобрел 4 экземпляра объемом по 3 TB. По сути, вы можете подключить любой предпочтительный HDD, но обратит�� внимание, чтобы они были одинакового объема и скорости. Это поможет вам избежать возможных проблем с производительности RAID в перспективе.
Настройка системы
Думаю, что многие будут использовать для своих NAS-сборок систему FreeNAS, и в этом нет ничего плохого. Однако, несмотря на возможность установки этой системы на своем сервере, я предпочел использовать CentOS, поскольку система ZFS on Linux изначально подготовлена к продакшен-среде, и вообще управление Linux-сервером мне более знакомо. Кроме того, меня не интересовал модный интерфейс и функции, предоставляемые FreeNAS – мне было достаточно массива RAIDZ и совместного использования AFP.
Установить CentOS на USB достаточно просто – достаточно указать USB в качестве источника загрузки, и при запуске мастер установки проведет вас по всем ее этапам.
Сборка RAID
После успешной установки CentOS я также установил ZFS on Linux, следуя перечисленным здесь шагам.
По завершении этого процесса я загрузил модуль ZFS Kernel:
$ sudo modprobe zfs
И создал массив RAIDZ1 при помощи команды
zpool:$ sudo zpool create data raidz1 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609145 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609146 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609147 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609148 $ sudo zpool add data log ata-SanDisk_Ultra_II_240GB_174204A06001-part5 $ sudo zpool add data cache ata-SanDisk_Ultra_II_240GB_174204A06001-part6
Обратите внимание, что здесь я использую ID жестких дисков вместо их отображенных имен (
sdx), чтобы уменьшить шанс сбоя их монтирования после загрузки из-за смены буквенного обозна��ения.Я также добавил ZIL и кэш L2ARC, выполняющиеся на отдельном SSD, разбив этот SSD на два раздела: 5GB под ZIL и остаток под L2ARC.
Что касается RAIDZ1, то он может выдержать отказ 1 диска. Многие утверждают, что данный вариант пула не следует использовать из-за вероятности выхода из строя второго диска в процессе пересборки RAID, что чревато потерей данных. Я же пренебрег этой рекомендацией, поскольку регулярно делал резервные копии важных данных на удаленном устройстве, и выход из строя даже всего массива может повлиять лишь на доступность данных, но не их сохранность. Если у вас нет возможности делать резервные копии, то лучше будет использовать решения, наподобие RAIDZ2 или RAID10.
Убедиться в успешности создания пула можно, выполнив:
$ sudo zpool status
и
$ sudo zfs list NAME USED AVAIL REFER MOUNTPOINT data 510G 7.16T 140K /mnt/data
По умолчанию ZFS монтирует только что созданный пул прямо в
/, что, как правило, нежелательно. Изменить это можно, выполнив:zfs set mountpoint=/mnt/data data
Отсюда вы можете выбрать создать один или несколько датасетов для хранения данных. Я создал два, один для бэкапа Time Machine и второй для общего хранилища файлов. Объем датасета Time Machine я ограничил квотой в 512 GB, чтобы предупредить его бесконечный рост.
Оптимизация
zfs set compression=on data
Эта команда включает поддержку сжатия ZFS. Сжатие задействует минимум мощности CPU, но может существенно улучшить пропускную способность I/O, поэтому всегда рекомендуется к использованию.
zfs set relatime=on data
С помощью этой команды мы уменьшаем количество обновлений до
atime, чтобы уменьшить генерацию IOPS при обращении к файлам. По умолчанию ZFS on Linux использует для ARC 50% физической памяти. В моем случае, когда общее число файлов невелико, этот объем можно безопасно увеличить до 90%, так как другие приложения на сервере выполняться не будут.
$ cat /etc/modprobe.d/zfs.conf options zfs zfs_arc_max=14378074112
Затем при помощи arc_summary.py можно убедиться, что изменения вступили в силу:
$ python arc_summary.py ... ARC Size: 100.05% 11.55 GiB Target Size: (Adaptive) 100.00% 11.54 GiB Min Size (Hard Limit): 0.27% 32.00 MiB Max Size (High Water): 369:1 11.54 GiB ...
Настройка повторяющихся задач
Я использовал systemd-zpool-scrub для настройки systemd-таймеров на выполнение очистки раз в неделю и zfs-auto-snapshot для автоматического создания снимков состояния каждые 15 минут, 1 час и 1 день.
Установка Netatalk
Netatalk – это открытая реализация AFP (Apple Filing Protocol). Следуя официальной инструкции по установке для CentOS, я буквально за пару минут получил собранный и установленный пакет RPM.
Настройка конфигурации
$ cat /etc/netatalk/afp.conf [datong@Titan ~]$ cat /etc/netatalk/afp.conf ; ; Netatalk 3.x configuration file ; [Global] ; Global server settings mimic model = TimeCapsule6,106 ; [Homes] ; basedir regex = /home ; [My AFP Volume] ; path = /path/to/volume ; [My Time Machine Volume] ; path = /path/to/backup ; time machine = yes [Datong's Files] path = /mnt/data/datong valid users = datong [Datong's Time Machine Backups] path = /mnt/data/datong_time_machine_backups time machine = yes valid users = datong
Обратите внимание, что
vol dbnest является в моем случае серьезным улучшением, так как по умолчанию Netatalk пишет базу данных CNID в корень файловой системы, что было совсем нежелательно, поскольку моя основная файловая система выполняется на USB, в связи с чем работает относительно медленно. Включение же vol dbnest приводит к сохранению базы данных в корне Volume, который в этом случае относится к пулу ZFS и уже на порядок производительнее. Включение портов в Firewall
$ sudo firewall-cmd --permanent --zone=public --add-service=mdns $ sudo firewall-cmd --permanent --zone=public --add-port=afpovertcp/tcp
sudo firewall-cmd --permanent --zone=public --add-port=afpovertcp/tcp
Если все было настроено верно, то ваша машина должна отображаться в Finder, и Time Machine тоже должна работать.
Дополнительные установки
S.M.A.R.T мониторинг
Рекомендуется отслеживать статус ваших дисков с целью предупреждения их отказа.
$ sudo yum install smartmontools $ sudo systemctl start smartd
Демон для ИБП
Мониторит заряд ИБП APC и выключает систему, когда заряд становится критически мал.
$ sudo yum install epel-release $ sudo yum install apcupsd $ sudo systemctl enable apcupsd
Аппаратный апгрейд
Спустя неделю после настройки системы, я начал все больше беспокоиться о том, что в сервере установлена память без ECC. К тому же в случае с ZFS дополнительная память для буферизации будет весьма кстати. Поэтому я снова обратился к Amazon, где приобрел 2x Kingston DDR3 8GB ECC RAM за $80 каждый и заменил десктопный RAM, установленный предыдущим владельцем. Система с первого раза загрузилась без каких-либо проблем, и я убедился в том, что поддержка ECC была активирована:
$ dmesg | grep ECC [ 10.492367] EDAC amd64: DRAM ECC enabled.
Результат
Результат меня очень порадовал. Теперь я могу постоянно загружать 1Gbps LAN соединение сервера копированием файлов, и Time Machine работает безупречно. Так что, в общем и целом, настройкой я доволен.
Итоговая стоимость:
- 1 * HP ProLiant N40L = $75
- 2 * 8 GB ECC RAM = $174
- 4 * WD Red 3 TB HDD = $440
Итого = $689
Вот теперь я могу сказать, что цена того стоила.
А вы делаете самостоятельно сервера NAS?


