Складання недорогої домашньої NAS-системи на Linux

Складання недорогої домашньої NAS-системи на Linux

Я, як і багато інших користувачів MacBook Pro, зіткнувся з проблемою нестачі внутрішньої пам'яті. Якщо говорити точніше, то використовуваний мною щодня rMBP був оснащений SSD об'ємом всього 256GB, чого, звичайно, надовго не вистачало.

А коли я плюс до всього почав записувати відео під час своїх польотів, ситуація лише посилилася. Об'єм знятих матеріалів після таких польотів становив 50+ GB, і мій нещасний SSD на 256GB дуже швидко заповнився, змусивши мене придбати зовнішній диск на 1TB. Тим не менш, через один рік, і він перестав справлятися з обсягами даних, що генеруються мною, не кажучи вже про те, що недолік надмірності і резервного копіювання робили його непридатним для розміщення важливої ​​інформації.

Отже, раптово я вирішив зібрати NAS великого обсягу, сподіваючись, що ця система протримається хоча б пару років, не вимагаючи чергового апгрейду.

Цю статтю я написав насамперед як пам'ятку про те, що саме і як я робив на випадок, якщо мені потрібно зробити це знову. Сподіваюся, що і для вас вона виявиться корисною, якщо ви зберетеся робити те саме.

Може бути простіше купити?

Отже, нам відомо, що ми хочемо отримати, залишається питання як?

Спочатку я ознайомився з комерційними рішеннями та розглянув, зокрема, компанію Synology, яка, як передбачалося, надає найкращі NAS-системи споживчого рівня на ринку. Однак вартість цього сервісу виявилася досить високою. Найдешевша система з чотирма відсіками коштує $4+, і при цьому жорсткі диски в комплект не входять. Крім того, сама внутрішня начинка такого комплекту не є особливо вразливою, що ставить під питання її реальну продуктивність.

Тоді я подумав: а чому б не зібрати NAS-сервер самому?

Пошук відповідного сервера

Якщо збираєшся комплектувати такий сервер, то насамперед необхідно знайти правильне залізо. Для цієї збірки повинен цілком підійти вживаний сервер, так як для завдань сховища нам не буде потрібно особливої ​​продуктивності. З необхідного потрібно відзначити великий обсяг RAM, кілька SATA конекторів і хороші мережеві карти. Оскільки мій сервер буде працювати в місці мого постійного проживання, то рівень шуму теж має значення.

Свої пошуки я почав з eBay. Незважаючи на те, що там я знайшов багато вживаних Dell PowerEdge R410/R210 вартістю менше $100, маючи досвід роботи в приміщенні сервера, я знав, що ці блоки 1U видають занадто багато шуму і для домашнього використання не підійдуть. Як правило, сервери формату tower частіше менш галасливі, але, на жаль, на eBay їх було виставлено небагато, і всі вони були дорогі або малопотужні.

Наступним місцем для пошуку став сайт Craiglist, де я знайшов людину, яка продавала уживаний HP ProLiant N40L всього за $75! Я був знайомий з цими серверами, які навіть у вживаному вигляді зазвичай стоять в районі $300, так що я відправив продавцю листа в надії, що оголошення ще актуальне. Дізнавшись, що так воно і є, я, недовго думаючи, подався до Сан Матео, щоб забрати цей сервер, який вже з першого погляду мене однозначно порадував. Він мав мінімальне зношування і, за винятком невеликого нальоту пилу, все інше було чудово.

Складання недорогої домашньої NAS-системи на Linux
Фото сервера, відразу після покупки

А ось специфікація придбаного мною комплекту:

  • центральний процесор: AMD Turion(tm) II Neo N40L Dual-Core Processor (64-bit)
  • Оперативна пам'ять: 8 GB non-ECC RAM (встановлений попереднім власником)
  • спалах: 4 GB USB Drive
  • Роз'єми SATA: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

Нетаталк – це відкрита реалізація AFP (Apple Fileing 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 також має працювати.

Додаткові установки
SMART моніторинг

Рекомендується відстежувати статус дисків з метою попередження їх відмови.

$ 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. 1 * HP ProLiant N40L = $75
  2. 2 * 8 ГБ ECC RAM = $174
  3. 4 * WD Red 3 TB HDD = $440

Разом = $ 689

Ось тепер я можу сказати, що ціна того коштувала.

А ви робите самостійно сервер NAS?

Складання недорогої домашньої NAS-системи на Linux

Складання недорогої домашньої NAS-системи на Linux

Джерело: habr.com

Додати коментар або відгук