вторник, 20 ноября 2012 г.

How to open SUSE on Thecus N3200PRO NAS

или

 Как открыть сущность твоего Thecus N3200PRO NAS


Зачем?!


Идея загрузки в коробку собственного набора софта у меня зудела давно, но найти время на детальное изучение вопроса подготовки и заливки ПО во внутреннюю флэш-память что-то не получалось. К тому же ограничение объема оной и нежелание в одночасье превратить "боевую" машинку в нерабочую, с перспективой поехать в сервис за перепрошивкой тормозили мои поползновения.
Оговорюсь сразу. Все попадающиеся ниже мои неточности исполнения, недопонимания матчасти и пр. отступления от истинного пути Дао относим на мой недостаточный пользовательский опыт. Это делается всего лишь ради забавы и расширения кругозора. Адепты могут дальше не читать :)



Основная идея и причина этой затеи в том, что за время пользования этим NAS (с 2007 г.) ядро linux ускакало далеко вперед и компилировать под него недостающие в официальном ПО программы и превращать их в модули стало неинтересно, а потребности есть. Конечно, недавнее обновление с версии 1.хх.хх до версии 3.хх.хх, которое я успешно пропустил год назад, улучшило картину (появилась поддержка UPS в виде пакета NUT; сделали официальный модуль webserver на Apache, правда теперь (11.2012) уже старой версии 2.0; переместили что-то в подключаемые модули для экономии ресурсов и много новых модных плюшек ). Хотя пользовательский функционал вроде галереи фото и файлообменника остался по сути прежним (унылым, хотя бы потому, что не принимал фотографии в RAW и не обрабатывал их в пакетном режиме - я залил через NFS, он обработал). Тем не менее, Open Source идет вперед, а ПО для "коробки" не успевает обновляться. По крайней мере, для такого древнего продукта, как мой. Однако, стоит отдать должное - запихивать в 128 МБ бортовой флэш-памяти образ такого ПО, это интересная работа. Еще интереснее было расковыривать это ПО в поисках возможностей улучшения.

Как?

Вид сзади на N3200PRO
Я конечно интуитивно догадывался, что софтовый RAID построен на обычном компьютере. Но ... Спасибо achiruel с форума Thecus, который в двух словах  объяснил, что коробка вполне позволяет грузиться с внешней флэшки. К тому же показал натурально скрытые особенности аппарата в виде второго заднего USB порта. Совершенно не понимаю - в чем был смысл его прятать? Даже задняя крышка изнутри как бы намекает, "здесь могла быть твоя флэшка!". Благо пластик мягкий и линолеумный ножик вполне аккуратно все поправил.Не будем мудрствовать и тоже откопаем старую PCI видеокарту от S3 и вставим ее в любезно предоставленный слот.

 Он сказал "Поехали!"

Чтобы вставить PCI карту расширения, необходимо:
  • вынуть диски;
  • вывернуть 4 винта, крепящие шасси к корпусу со стороны HDD слотов (только те, что между винтами салазок);
  • после снятия задней крышки вывернуть винты, крепящие шасси к корпусу (по периметру корпуса 7-8 шт.)

вид на выдвинутое шасси и порты USB&eSATA


Подключаем монитор, включаем, видим, делаем:
Экран настроек BIOS   Экран загрузки: CPU, RAM, BIOS ver.
Теперь, вынув флэшку, остается возможность загрузиться из встроенной флэш-памяти устройства.
Однако нас подстерегала засада - за 5 лет работы села батарейка CMOS. Значит все настройки BIOS сбрасываются при отключении питания. А по умолчанию первым устройством стоит встроенная флэш-память.
Чтобы более не морочиться с экраном, я записал последовательность навигации в BIOS для включения нужной опции без экрана (указанные действия актуальны для моей версии BIOS):
  1. Del (вход в BIOS)
  2. Один вниз, Ввод (меню доп. настроек)
  3. Два вниз, Ввод (меню выбора первого загрузочного устройства)
  4. Семь вниз, Ввод (Выбор USB-HDD). При выборе возвращаемся на уровень меню доп настроек.
  5. Один вниз, Ввод (меню выбора второго загрузочного устройства)
  6. Шесть вверх, Ввод (Выбор HDD-0)
  7. F10, Ввод (Выход с сохранением)

Что теперь?

Вопрос о том какой дистрибутив использовать не стоял, т.к. много лет пользуюсь openSUSE. Пошел на SUSE Studio , поискал там "Home Media Server" и нашел одноименную сборку от LeoRivas . Дополнил ее пакетами ImageMagick для фотогалереи, NUT, screen, mediatomb (вместо serviio и subsonic, приложенных Leo) и еще немного по мелочи.
Попробовал прямо в студии, скачал образ, залил его на флэшку. Предварительные настройки, перевод пакетов на репозитории Current и установку недостающих пакетов (подергав YaST, обнаружил таковые) я провел в VirtualBox на большом брате, чтоб не выключать коробку из рабочего режима. Настройку сети и RAID пришлось делать на живой машине, т.к. в виртуальной не было драйвера сетевого адаптера, установленного в коробке. Хотя отличие было незначительным, YaST их не путал.
Так получилось, что монитором я пользовался только для смены настроек BIOS. И видеокарта не показала мне в лучшем виде загрузившуюся ОС. Видимо в виртуальной машине, на которой я модифицировал сборку из SUSE Studio, стоило зажать видеопамять до реальных значений - карточка мне попалась ну совсем старая. В принципе, в мониторе на сетевом хранилище нет необходимости. После настройки и запуска SSHD и сети. И если первый мы можем поднять еще в виртуальной машине, то вторую придется поднять либо вслепую, либо загрузочным скриптом. Мы не ищем легких путей и потому выбрали вариант "вслепую" (глядя на моргание светодиода флэшки :) ). После загрузки и входа в систему root'ом выполняем команду ifconfig eth0 <IP-address>.
Быстро сказка сказывается. На самом деле, пришлось немного повозиться. В результате возни выяснилось, что сетевой порт, помеченный на задней крышке, как "LAN", соответствует интерфейсу eth0. После включения интерфейса все последующие настройки проводятся через SSH. Первым делом конечно же закрепляем настройки сетевых адаптеров. Тут на любителя, кто любит руками править файлы, кто через YaST.
Всё, теперь мы имеем актуальные версии ПО и возможность установки любого пакета из репозитория или с сайта разработчика. Если совсем хочется, то можно и исходники скомпилировать. Фантазия ограничивается только объемом флэшки и производительностью процессора.
Замечу об одной странности - то ли в результате многочисленных переносов файлов с флэшки на диск, то ли они изначально так записались в образ - у большинства файлов и каталогов в правах стояла "7" на "чужих". Разумеется это все нужно править и из соображений безопасности и хотя бы потому, что тот же SSHD не запустится с такими правами на конфигурационных файлах.

"А что же дальше-то было?"

Хм. SUSE Studio по умолчанию создает корневой раздел с файловой системой ext3. Но мы-то хотим быть на острие прогресса? Раз уж взялись за это все, то, видимо, хотим. Для SSD, вроде как, имеет заточки (mount -o ssd,...) BTRFS. USB флэшки используют динамический wear-leveling, что не совсем круто, но все же. Даже если на свистки эта опция для btrfs не возымеет действия, то можно будет попробовать eSATA SSD. Будем считать, что несмотря на ломающиеся копья относительно ext4 vs. btrfs, все будет хорошо. И вообще, мы тут занимаемся экспериментами и инновациями, а наш бронепоезд (бортовая флэшка) - на запасном пути. Однако, пока GRUB2 не умеет грузиться с нее. Поэтому, мы сделаем загрузочный раздел (/boot) с ext4 с прицелом на последующую безболезненную конвертацию в btrfs, когда grub2 научится и если мы этого очень захотим.
Копируем все с флэшки, размечаем ее, как наметили: /boot - ext4, / - btrfs с созданием подтомов (subvolume) /home, /usr, /var, что позволит нам менять опции монтирования в пределах одной файловой системы, когда и как мы захотим. Классно!
Запускаем ... не работает. Оказывается initrd собран под корневую ФС с ext3 и монтировать корень с btrfs наотрез не хочет. Я даже пересобрал его с помощью mkinitrd с указанием необходимого модуля btrfs и он его честно включил и подцепил при загрузке. Решив долго не разбираться почему он игнорирует или не видит тип файловой системы, хотя вроде как должен был, я произвел грубое, но хирургическое вмешательство в RAM-disk. Инструкции как правильно его препарировать и зашить обратно нашел в статье "Советы по Linux: Поиск rootfs во время загрузки"
Если кратко и применительно к моему случаю, то:
1. копию initrd распаковываем в каталог с помощью gzip и cpio:
[root]# mkdir init; cd init/[root]# cp ../initrd-3.4.11-2.16-default ../initrd.gz[root]# gzip -dc ../initrd.gz | cpio -id
2. правим run_all.sh:
rootfsck='/sbin/fsck.btrfs'
#[ "$rootfsck" ] || rootfsck='/sbin/fsck.ext3'

3. правим boot/83-mount.sh:
#echo mount $opt $rootdev /root
#mount $opt $rootdev /root
echo "Hi there! Here is handmade initrd! rebuild me!"
echo mount -o rw,noatime,nodiratime,noacl -t btrfs /dev/root /root
mount -o rw,noatime,nodiratime,noacl -t btrfs /dev/root /root
4. упаковываем обратно:
[root]# find ./ | cpio -H newc -o > ../initrd[root]# gzip ../initrd[root]# cp ../initrd.gz ../initrd-3.4.11-2.16-default
кладем обратно на флэшку и загружаемся. Что б я делал без виртуальной машины???

Желательно пересобрать initrd цивилизованным путем на целевой машине:
# mkinitrd
Kernel image: /boot/vmlinuz-3.4.11-2.16-default
Initrd image: /boot/initrd-3.4.11-2.16-default
Root device: /dev/disk/by-id/usb-_USB_FLASH_DRIVE_19681500002A-0:0-part2 (/dev/sda2) (mounted on
/ as btrfs)
modprobe: Module hid_generic not found.
WARNING: no dependencies for kernel module 'hid-generic' found. (???)
Kernel Modules: hwmon thermal_sys thermal processor fan libcrc32c zlib_deflate btrfs scsi_dh scsi_dh
_hp_sw scsi_dh_emc scsi_dh_alua scsi_dh_rdac sunrpc usb-common usbcore usb-storage ohci-hcd uhci-hcd
ehci-hcd xhci-hcd hid usbhid hid-logitech-dj crc32c
Features: acpi plymouth block usb btrfs resume.userspace resume.kernel


Следующий шаг на острие прогресса - создать GPT (GUID Partition Table). В качестве эксперимента.
Конечно же подумалось и об оптимизации записей временных файлов в /var. Но об этом где и чего только не написано. Повторяться нет смысла. Разве только есть мысль записывать при выключении машины необходимые при последующей загрузке файлы на флэшку или диск или восстанавливать структуру каталогов на старте.
И экран с кнопками на передней панели покамест не удел остались - железка производителя специфическая. Придется посмотреть в открытые исходники старой версии ПО и попробовать скомпилировать драйвера для них, если не найдется иного выхода.
Есть где покопаться, в общем.

Что мы имеем?

После настройки RAID, SMART, NUT и пр. у меня появился рабочий UPnP медиасервер с более гибкой и прозрачной, чем ранее настройкой; VLC-стример, которого не было вовсе; OpenVPN сервер для проникновения в сеть не через ssh-туннель (старый роутер не имеет такой возможности) и пр. и пр. Все это обновляется, собирается, устанавливается и работает. Спасибо проекту openSUSE за мое светлое будущее.
На этом можно и закончить описание. Т.к. дальше у всех свои пути применения NAS. Разумеется, это не решение "из коробки" для конечного пользователя. И хотя оно может быть упрощено в некоторых местах, все равно имеет непаханое поле для приложения рук и головы ... или рук к голове. Или выдергивания волос руками ... и из головы в том числе.


Надеюсь, Вам было с нами интересно.

P.S. Продолжение этой занимательной истории