в стопервый раз про debian на ix2-200



Листая интернеты по ключевым словам сложилось ощущение, что только ленивый не писал про то, как установить debian на iOmega ix2-200 - сеть пестрит такого рода "историями успеха". Но, скоро сказка сказывается, как говорится...

Вместо предисловия: iOmega (позже был куплен и стал частью компании Lenovo) ix2-200 - легендарный для своих времен сетевой накопитель, построенный на открытой reference designe платформе openrd kirkwood от компании marvell. Несет на борту разъемы для подключения двух жестких дисков с интерфейсом SATA, 256 Мб оперативной памяти, гигагерцовый процессор Feroceon 88FR131 rev 1 (v5l) и определяется в системе как Marvell RD-88F6281 Reference Board. Вполне может быть, что зависит от ревизии, у меня есть только такой образец.

Для начала нужен доступ до консоли, порта для подключения монитора же у NAS нет. Находится он внутри устройства, на плате. Придется разбирать. Для этого вынимаем жесткие диски (помечены для удобства) - 4 винта, откручиваем заднюю крышку - 4 винта по углам, открычиваем еще два винта под резиновыми ножками и вся плата с передней панелью подается вперёд.




Хорошая новость - ничего распаивать не надо - гребенка есть на плате.  А раз уж разобрали, то проверьте состояние конденсаторов и других элементов на плате на предмет повреждений корпуса и/или вспучиваний, вот такого быть не должно, конденсатор в центре фотографии явно просит его перепаять (Samxon 470uF, 16V) -- цена вопроса 9 рублей в ближайшем магазине радиотоваров.


Далее берем любой доступный нам USB-TTL (UART) адаптер, который последнее время как палочка-выручалочка спасает в воскрешении или перепрошивке разных устройств (ubqiquity, несколько sonoff, теперь вот iOmega). 



Получив доступ к консоли (задействованы три контакта - rx, gnd, tx - именно в таком порядке они подключены на фото) на скорости 115200 лицезреем приветствие загрузчика u-boot: 
Если вы видите что-то похожее, двигаемся дальше. Жмите любую кнопку, чтобы остановить процесс автоматической загрузки и попасть в консоль u-boot.
 Необходимо задать параметры платформы, на которой собран ix2:

setenv mainlineLinux yes
setenv arcNumber 1682
saveenv
reset

Reset заставит всю железку перезагрузиться, saveenv сохранит в памяти все внесенные изменения для значений arcNumber и mainlineLinux. Двигаемся дальше, идем за свежей версией образов инсталятора для архитектуры armel и скачиваем их на заранее подготовленную USB Flash с файловой системой ext2 (в теории uboot умеет и fat, но со старой версией в ix2 получается это как-то не очень.

Подключили USB флешку в порт
usb start
ext2load usb 0:1 0x01100000 /uInitrd
ext2load usb 0:1 0x00800000 /uImage
setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=most
bootm 0x00800000 0x01100000
Инициализируем usb подсистему (аналагично для загрузски с жестких дисков делается командой sata reset, а чтобы увидеть что uboot видит содержимое файловых систем можно воспользоваться командой ext2ls usb 0:1). После задаем параметры загрузки, не забываем про консоль, в которую мы будем "подсматривать всем процессом загрузки, параметры инсталятора ну и собственно команда продолжения загрузки образа ядра из памяти, с указанием адресов памяти.

И... жестко обламываемся -- сталкиваемся с проблемой инициализации сетевого интерфейса "No Ethernet card was detected". 

Да вы шутите, что за фигня? Может можно подсунуть драйвер на этапе установки, достаточно же знать версию и подмонтировать флешку... Или вставить USB-WiFi, USB-Ethernet, что угодно еще.... Но нет. Инсталятор дебиана не содержит в себе даже usb-storage модуля, он его подтягивает по сети позже (об этом отдельно будет позже). Как же так, у всех работает, мне особенно не повезло, что ли? Был еще вариант с разбивкой жесткого диска
Листая тонны форумов и мейл-листов вспомнил, что попадалась на глаза информация, что ix2-200 был исключен из списка поддерживаемых платформ в дистрибутиве Debian, потому что мейнтейнера в срок не нашли (или что-то подобное). И было это, если не изменяет память, в середине 2015 примерно. Это похоже зацепка, значит нужен образ тех времен, и спасибо команде debian за snapshot'ы - вот по этой ссылке лежит рабочий образ для kirkwood:

https://snapshot.debian.org/archive/debian/20150722T094321Z/dists/jessie/main/installer-armel/20150422+deb8u1/images/kirkwood/netboot/marvell/openrd/

(на случай, если ссылка перестанет открываться по прошествии времени, просто найдите дерево снепшотов дебиан от середины 2015 года примерно).

Все по новой, подключили USB флешку (предварительно обновив там образа)
usb start
ext2load usb 0:1 0x01100000 /uInitrd
ext2load usb 0:1 0x00800000 /uImage
setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=most
bootm 0x00800000 0x01100000
Увидели предложение выбрать язык на черно-белом фоне - снова хороший знак.
Спрашивает про страну, в которой мы живем (other->Europe->Russia)
 Локаль
И предложит выбрать на каком из сетевых интерфейсов (да-да, несмотря на один физический порт в системе их почему то два определяется) настраивать сетевую активность. Выбирать eth1
На экране выбора зеркала придется указать кастомный адрес вручную. Связано это с тем самым пресловутым снапшотом, который мы используем. И чтобы инсталятор подгрузил себе модули ядра той же версии, что мы стартуем, указываем следующие параметры:
Debian archive mirror hostname: snapshot.debian.org
Debian archive mirror directory: /archive/debian/20150722T094321Z/
Разбивку диска я сделал следующей: все, кроме swap на зеркалах (иначе зачем тогда иметь два диска в системе, если не использовать преимущества отказоустойчивости). /boot и / отдельным программными массивами, а в конце один большой под LVM. Оба диска разбиты зеркально.

На хабре есть статья пользователя, который пишет про невозможность грузится с рута на зеркале, но это только из-за того что он выбрал путь загрузки с диска, а не прошивать образа в NAND память устройства. Я пробовал по неосторожности оба варианта (послушав его советы в статье) и с уверенностью могу сказать, что он ошибается (или ленится).
Ну в-общем то из тонкостей пожалуй и все. Дальше "стандартная" установка debian, которая обломится на стадии установки загрузчика (что в какой-то степени даже логично). Не прерывая установку заходим в консоль и
mount /proc/ /target/proc/ -o bind
chroot /target
Прокинуть /proc в chroot хорошая идея, если обновлять потом дистрибутив (напомню, что мы на снепшоте середины 2015 года в данный момент). Соответственно, меняем /etc/apt/source.list на актуальный путь до зеркала пакетов, например:
deb http://deb.debian.org/debian jessie main
deb http://deb.debian.org/debian jessie-updates main
apt-get update и apt-get dist-upgrade поднимут версии пакетов до последних доступных в debian 8.

Если в ходе обновления вы получаете сообщение вида

Unsupported platform.
run-parts: /etc/initramfs/post-update.d//flash-kernel exited with return code 1
dpkg: error processing package initramfs-tools (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
initramfs-tools
E: Sub-process /usr/bin/dpkg returned an error code (1)

то быстрый хак как это исправить - снять бит исполняемого файла с flash-kernel в хуках initramfs:
chmod -x /etc/initramfs/post-update.d/flash-kernel
Однако делать это придется, скорее всего, при каждом обновлении flash-kernel, если не выставить соответствующий атрибут на файл (я побаиваюсь таких вмешательств в систему, потому что потом быстро забудешь что делал с файлом а про атрибуты вспоминаешь далеко не в первую очередь в момент отладки).

Не забыть сконвертировать образа для u-boot:
cd /boot
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initramfs -d initrd.img-3.16.0-7-kirkwood uInitrd
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n Linux-3.16.0-7 -d vmlinuz-3.16.0-7-kirkwood uImage
Названия файлов могут отличаться в зависимости от версии, проверьте содержимое каталога перед запуском. Такое именование (3.16.0-7-kirkwood) характерно для восьмого дебиана (или ядер 3.x - не знаю точно), потому что в 9-ом и ядре 4.x уже kirkwood сменено на marvell.

Получившиеся файлы uInitrd  и uImage  закидываем на флешку. Выходим из инсталятора, ребутаем устройство. Прежде, чем записывать их в память на постоянной основе, убедимся что debian загружается. Если все ок и вы можете в него залогиниться, продолжаем.

Для записи загрузочных образов в память проверим сначала какие уже существуют разделы:
root@storage:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00020000 "u-boot"
mtd1: 00200000 00020000 "uImage"
mtd2: 07d00000 00020000 "root"
В ходе поиска в сети по ix2 сложилось ощущение, что вывод этой команды может отличаться от ревизии ix2. Поэтому проверяйте, что адреса указанные в /proc/mtd соответствуют адресам в командах далее по тексту. 

Ну и собственно запись в память:
flash_erase /dev/mtd1 0 0
flash_erase /dev/mtd2 0 0
nandwrite -p /dev/mtd1 /boot/uImage
nandwrite -p /dev/mtd2 /boot/uInitrd
Перезагружаемся в u-boot:
setenv mtdids 'nand0=orion_nand'
setenv mtdparts 'mtdparts=orion_nand:0x00100000(uboot)ro,0x00200000(uImage),0x07d00000(uInitrd)'
setenv bootargs_console 'console=ttyS0,115200 mtdparts=orion_nand:0x00200000(uImage),0x07d00000(uInitrd) root=/dev/md1'
setenv bootcmd 'setenv bootargs $(bootargs_console); nand read 0x00800000 uImage; nand read 0x01100000 uInitrd; bootm 0x00800000 0x01100000'
saveenv

Тут мы задаем команды и параметры для загрузки. В нашем варианте bootcmd переносит образы из NAND флеш в память устройства из адресов, заданных ранее в адреса, указанные в параметрах и передает управление загрузчику. Возможны также команды загрузки по сети (rarp/tftp), usb, sata.
Проверяем, что все работает и наслаждаемся жизнью. Если нет, то в образах инсталятора есть rescue режим, который вызывается указанием следующих параметров при запуске
setenv bootargs console=ttyS0,115200n8 rescue/enable=true
Если версия debian на ix2 для вас не играет роли, то можно остановиться и на этом шаге. Но я настоятельно рекомендую обновиться до девятки, тем более поддержка необходимых мне пакетов появилась именно там. Для этого, меняем jessie на stretch в /etc/apt/source.list:
deb http://deb.debian.org/debian stretch main contrib non-free
deb http://deb.debian.org/debian stretch-updates main contrib non-free
(я попутно включил еще репозитории contrib и non-free).
apt-get update
apt-get dist-upgrade
И повторить шаги с конвертацией образов и записью их в память. Я остановился на ядрах серии 3.x, потому что в 4.x сходу загрузиться не удалось, может дойдут руки при наличии времени поизучаю этот вопрос:
P.$.: возможно это проблема USB-TTL адаптера, но при копировании больших объемов текстовой информации некотоые буквы терялись и команды съедались. Так я ошибочно залил не туда разок образ ядра и не сразу понял почему не работает конвертация образов с помощью mkimage. Всегда проверяйте, что то что вы скопировали из буфера успешно добралось до командной строки.








Comments

Кирилл said…
wget http://ftp.debian.org/debian/dists/stretch/main/installer-armel/current/images/kirkwood/device-tree/kirkwood-iomega_ix2_200.dtb
wget http://ftp.debian.org/debian/dists/stretch/main/installer-armel/current/images/kirkwood/netboot/initrd.gz
wget http://ftp.debian.org/debian/dists/stretch/main/installer-armel/current/images/kirkwood/netboot/vmlinuz-4.9.0-9-marvell

cat initrd.gz kirkwood-iomega_ix2_200.dtb.1 >initrd.dtb
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initramfs -d initrd.dtb uInitrd
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n Linux-4.9.0.9 -d vmlinuz-4.9.0-9-marvell uImage

вот с этих файлов и грузиться.

конкатенация dts даст распознать все девайсы ix2-200 в том числе и сетевуху.



mtdparts в следующих 2-х переменных должны быть одинаковые иначе при следующей прошивке ядра снесете u-boot как я и придется восстанавливать загрузчик через jtag


'mtdparts=orion_nand:0x00100000(uboot)ro,0x00200000(uImage),0x07d00000(uInitrd)'
setenv bootargs_console 'console=ttyS0,115200 mtdparts=orion_nand:0x00200000(uImage),0x07d00000(uInitrd) root=/dev/md1'
alexma said…
Все-таки затер uboot, как восстановить?
Виктор said…
Евгений, было ли время разобраться с ядрами 4.х?
Erasmo Jr said…
Amigo! muito obrigado pelas informações. Eu estou usando o Iomega ix-200, com duas unidades de SSD (2 X 1TB- SAMSUNG EVO). Mas! qual o seu e-mail ??
:)
Abraço !(ERASMO CLARET - BRAZIL)