От переводчика: это перевод второй части статьи George Georgovassilis Building the perfect, cheap DIY NAS
про его опыт самостоятельной постройки сетевого накопителя. Статья глубоко техническая, но даёт представление о процессе, даже если вы не понимаете всех деталей.


Предыдущая часть здесь.

Этот пост активно обсуждался на Hacker News (en).

Уже около десяти лет дома я пользуюсь сетевым накопителем собственной постройки. Я подумал, что было бы неплохо описать свой опыт, чтобы другие могли позлорадствовать над моими многочисленными провалами и восхититься несколькими триумфами.

В этой части:

Соображения по поводу загрузки из RAID

Как я писал выше, Ubuntu загружается из RAID 1. md дублирует все изменения во все загрузочные разделы, и это замечательно. Загрузочный RAID привязан через /dev/md0 — я не нашёл способ, как присвоить ему, но зато эта ссылка постоянная. К сожалению Ubuntu постоянно обращается к загрузочному разделу при нормальной работе, что в моём случае означает, что все диски всегда работают. Я пробовал разные способы вроде переназначить пути к директориям с логами на RAM диск (прим. переводчика: виртуальный диск, созданный в оперативной памяти) и предзагрузка необходимых файлов, но кашу из скриптов, которая в итоге получилась, невозможно поддерживать. Позже нашлось простое и элегантное решение, но с уловкой: установил SSD в пятый дисковый слот и добавил в RAID1-массив. Пока зеркалирование работает, BIOS Proliant (gen8) не будет запускаться с пятого диска, если он найдёт диски на других позициях. Решил это простым скриптом, которые запускается перед загрузкой операционной системы и помечает все механические диски как отказавшие:

mdadm --manage /dev/md0 --fail /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2

Сам скрипт немного сложнее, чем я написал, так как название устройств нестабильны и надо учитывать разнообразные сценарии ошибок (например, RAID нельзя трогать, если жёсткий диск отказал по-настоящему) — но это тема для отдельного поста. MD забудет, что диски были помечены отказавшими после перезагрузки, и это удобное поведение, позволяет сервер запуститься с любого жёсткого диска.

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

Соображения по поводу хранения данных в RAID

Второй программный RAID-раздел на сервере очень важен — это раздел с данными. Исторически мои потребности в хранении соревновались с развитием технологий для этого, так что RAID с файлами претерпел разнообразные изменения — начиная от двухдискового RAID 1, потом трёхдисковый RAID 5 и трёхдисковый RAID 1, и к теперешнему состоянию — RAID 6 из четырёх дисков.

Я считаю, что RAID 1 — это лучшее решение, если хватает денег, также оно самое простое в управлении и настройке, предлагает очень высокий уровень согласованности и доступности данных, лучшую производительность, а также бонусом самый низкий уровень шума в работе благодаря режиму write mostly, в котором только один диск из массива работает при чтении, а остальные — «припаркованы».

RAID 5 — это хороший компромис между избыточностью и эффективностью хранилища, поэтому я много лет использовал раздел с данными именно в этом режиме. Однако такой вариант немного рискован. Представим такой мысленный эксперимент: ночью один из дисков внезапно выходит из строя. Ко времени, когда я замечу поломку, закажу замену и установлю пройдёт, как минимум, 2 дня, плюс дополнительные 12 часов на полную синхронизацию. Получается, что массив остаётся незащищённым в течение 2,5 дней — ещё один отказ диска за это время уничтожит все данные невозвратно.

RAID 6 — пока мой выбор: предоставляет половину общей ёмкости при два раза большей доступности, может выжить при отказе двух дисков. Единственная проблема — write mostly режим mdadm не работает, поэтому любой запрос к RAID-массиву требует четырёх активных дисков и из-за этого довольно шумный.

Когда я создавал RAID-массив с помощью mdadm я дал разделу имя, и теперь он доступен по пути /dev/md/data.

Для поддержания согласованности даных, я запускаю на накопителе скрипт, который чистит (scrubs) массив с данными. Это длительный процесс, нагруженный по вводу/выводу, создаёт много шума и, пожалуй, должен выполняться, когда накопитель не нужен. Для домашнего NAS — это будние дни в рабочее время. Cron — ваш друг.

Шифрование RAID

Следующий шаг — это настройка шифрования для раздела с данными. Для этого я использовал dmcrypt LUKS и храню ключ на флешке. Обязательно надо сохранить ключ и заголовок LUKS в другом месте на всякий случай, иначе данные нельзя будет прочитать, если заголовок LUKS будет повреждён. Преимущество шифрования в том, что я могу без опасения перемещать сервер, конечно, если флешка с ключом будут передвигаться по разным маршрутам.

Зашифрованный раздел данных RAID — это блоковое устройство на /dev/mapper/data

Файловая система

Файловая система — это ext4 с некоторыми особенностями:

mkfs.ext4 -O metadata_csum -E lazy_itable_init=0,lazy_journal_init=0 /dev/mapper/data 

Эти опции добавляют контрольные суммы для метаданных, что повышает согласованность данных и отключают ленивую инициализацию; последнее особенно важно для больших массивов механических дисков, иначе инициализация inode займёт несколько дней.

В духе модульности RAID-раздел с данными не монтируется в /etc/fstab, вместо этого он монтируется скриптом и mdadm во время загрузки системы. Этот скрипт также монтирует файловую систему этого раздела с параметрами noatime, nodiratime и data=journal, запускает fsck перед монтированием и настраивает stripe_cache_size и управление питанием.

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

Стоковый Celeron для этого сервера быстро стал узким местом производительности системы, так как он не поддерживает аппаратное шифрование. Поэтому дешёвый апгрейд до Xeon E3-1220L для этого же сокета решил проблему, а также снизил TDP до 17Вт.

Сентябрь 2020: Не уверен, работало ли так с самого начала или стало происходить после обновления, но жёсткие диски, на которых размещён раздел с данными перестали «засыпать» даже, если к ним нет обращений. Причина кроется в защите multi mount файловой системы ext4, которая постоянно пишет на диск. Эта защита может быть настроена или отключена (что я и сделал) с помощью tune2fs.

Больше защиты данных!

В 2020-м ext4 и md всё ещё не очень эффективно борются с деградацией данных (bit rot), которая тихо искажает файлы. Я постоянно слышу и читаю конфликтующие мнения по поводу того, ZFS справляется с этим лучше, и собираюсь когда-нибудь испытать эту файловую систему. А пока я использую md5sum для создания и проверки контрольных сумм моих резервных .tar.gz архивов, и parchive для создания файлов восстановления. Я уже писал про parchive ранее и по сей день остаюсь его ярым поклонником.

Автоматизация

Я уже несколько раз упоминал зловещие «скрипты», но жестокая правда состоит в том, что текущая конфигурация требует значительного количества скриптов для нормальной работы. Из преимуществ могу заметить, что львиная доля ежедневных операций уже автоматизирована и требует минимального вмешательства с моей стороны: RAID массив собирается сам, отказоустойчив и сервер продолжает работать даже, если один или два диска выйдут из строя. Бэкапы — в архивах, контрольная сумма для которых пересчитывается автоматически, а периодическая проверка уведомляет меня о повреждённых файлах, которые я потом исправляю вручную (люблю я принимать в этом участие…). Некоторые скрипты доступны в моём репозитории на Гитхабе, постараюсь выложить ещё в скором времени.

Сеть

Сервер использует следующие сетевые компоненты:

  • netplan для управления двумя встроенными сетевыми карта (см. Установка)
  • UFW для блокирования всего входящего трафика, кроме SSH, samba и netbios
  • netbios для объявления имени сервера для роутера и других устройств в сети
  • samba для сетевых дисков

Я использую самбу в режиме чтения; некоторые директории (вроде музыки и фильмов) открыты с гостевым доступом, некоторые другие с личными документами защищены паролем, но опять же, только для чтения. Любые операции записи на диск требуют доступа по SSH. Так как ext4 не предоставляет снэпшоты файловой системы (прим. переводчика: регулярные снимки диска для восстановления данных), то я всё ещё беспокоюсь по поводу ночного «удалил по ошибке» после пары бокалов, для этого я пока не нашёл хорошего решения. Просмотр samba-разделов через Ubuntu nautilus может быть довольно медленным для больших папок — в особо сложных случаях попробуйте CIFS или sshfs.

Видео и графика

Я думал, что мне никогда это не понадобится, но пришёл момент, когда мне пришлось подключить клавиатуру и монитор к моему сетевому накопителю — и оказалось, что десктопная среда не запускается. gen8 использует видеокарту Matrox g200,  Ubuntu давно её не поддерживает, но есть способ заставить её работать.

Шаг первый: установить поддержку десктопа в серверной версии:

apt install ubuntu-desktop

После перезагрузки вы увидите экран авторизации в разрешении 640×480. Другого режима в настройках нет. Этот комментарий [1] на схожий вопрос помог:

# Установите vesa xserver. В моём случае это было необязательно.
apt-get install xserver-xorg-video-vesa
# Загрузитесь в текстовом режиме
init 3
# Создайте новую конфигурацию X-server
X -configure
# Установите конфигурацию.
# Оригинальный пост рекомендует заменить mga на vesa.
# В моём случае, vesa уже было предзаполнено.
mv xorg.conf.new /etc/X11/xorg.conf
# Загрузитесь в графическом режиме
init 5

Предупреждаю, что аппаратное ускорение графики недоступно, и максимальное разрешение 1280×1024.

Забавный факт, который я обнаружил в процессе изучения этого вопроса: у gen8 нестандартный DisplayPort на передней панели за дверкой.

Ссылки

[1] https://bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/1316035/comments/32

Опубликовано Алекс Бузник

Веб-программист и компьютерный энтузиаст со стажем. Интересуюсь и пишу про сетевые накопители.

Вливайтесь в общение

1 комментарий

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

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: