
Возникла как-то на работе потребность организовать в сети хранилище для документации всякой разной. Требования: надежность, небольшой размер, объем в несколько террабайт. Мой выбор остановился на сетевом хранилище (Network Attached Storage) Iomega StoreCenter Ix2-200. В процессе исследования рынка выяснилось, что на этом устройстве используется урезанный вариант Debian Lenny, и есть возможность установить полноценный Debian Squeeze. Тем самым получить все возможности, предоставляемые данной ОС.
Итак, устройство было закуплено, я обложился документацией, найденной в интернет и приступил к установке ОС Debian Squeeze для архитектуры armel. К сожалению, доступная документация оказалась на английском, не полной и не точной, в общем был простор для размышлений. К тому же для первоначальной загрузки и переустановки ОС потребовался достаточно специфичный кабель RS-232.
В итоге под катом описан мой эксперимент (успешный), переведены необходимые куски чужих инструкций, и представлена полученная мною экспериментальная информация.
Про кабель
Для установки нам понадобится интерфейсный кабель, работающий по протоколу rs-232 с обыкновенным DB9 с одной стороны и необыкновенным (не знаю есть ли у него свое название) разъемом с другой. Сам я путаюсь с какой стороны к паяльнику подходят, так что обратился к коллегам, которые спаяли мне вот такое вот:
UPD от 19.01.2012: Как мне подсказали, разъем с другого конца (не DB9) называется BLS-04. Некоторые технические подробности про кабель тут.

Распиновка:
Пин 1 VCC (3.3V) Пин 2 TxD Пин 3 GND Пин 4 RxD Пин 1 подписан "JP1"
Вместо этого в оригинальной инструкции рекомендуют использовать кабель TTL-232-R-3V3-AJ. Он лучше моего тем, что на стороне компа включается в USB, и на него не фонит все вокруг (у меня, когда плата касалась корпуса компа, шли шикарные помехи), но хуже тем, что малой кровью в Москве купить его я не смог.
Поэтому и сделали свой.
UPD от 19.01.2012: Другие варианты интерфейсного кабеля написаны в комментах, за что их авторам большое спасибо.
Характеристики Iomega Storcenter ix2-200
Параметры железа:
CPU 1.0 GHz Marvell Kirkwood 88F6281 RAM 256 MB Zentel/Hynix Flash ROM 32 MB Hynix Сеть Gigabit Marvell Alaska 88E81116R USB 3x USB 2.0 порта Внутренние HDD Два SATA-II диска Емкость HDD Поставляется с вариантами суммарного объема 1/2/4 TB
Параметры последовательного соединения:
- cкорость: 115200 бод
- четность (parity): нет (none)
- управление потоком (flow control): xon/xoff
- 8 битов данных (data bits)
- 1 стоповый бит (stop bit)
Про установочные файлы
Файлы (uImage — ядро и uInitrd — initrd.img) для загрузки установщика NAS может брать с разделов на одном из жестких дисков, установленных внутри, с флешки или по сети с tftp сервера. Я выбрал последний вариант и использовал tftpd32 (там же есть и 64-битная версия tftpd64) под рабочей виндой и net-ftp/tftp-hpa под домашней гентой.
Скачиваем пресловутые файлы отсюда и кидаем в директорию, из которой раздает tftp-сервер.
Запускаем терминал (putty, hyperterminal и т.п.) в режиме прослушивания соответствующего порта (в моем случае это был COM1), выставив правильно параметры последовательного соединения (см. выше).
Подключаем NAS:
- к компьютеру с tftp-сервером по сети
- к компьютеру, с которого будем управлять установкой через rs-232 кабель (может совпадать с п.1)
- к электричеству
Если все пошло хорошо, то видим в терминале следующую картину:

Останавливаем автозагрузку в нужный момент, нажав любую клавишу и переходим к следующему этапу.
Загрузка установщика
Вводим следующие комманды:
setenv mainlineLinux yes setenv arcNumber 1682 saveenv reset
Тем самым мы выставляем конфигурационные параметры так, чтоб NAS грузился с нужного нам ядра и перезапускаем устройство.
Грузим ядро установщика:
Для TFTP:
setenv serverip 192.168.1.2 setenv ipaddr 192.168.1.147 tftpboot 0x01100000 uInitrd tftpboot 0x00800000 uImage
192.168.1.2 — адрес tftp сервера, 192.168.1.147 — адрес, присвоенный NAS.
Для флешки (только FAT):
usb start fatload usb 0:1 0x01100000 /uInitrd fatload usb 0:1 0x00800000 /uImage
Установка Debian
Подробно описывать стандратный установщик Debian я не буду, так как это много где сделано до меня. Например в официальном руководстве. Остановлюсь лишь на следующих тонких моментах по порядку возникновения во время установки.
Разбиение дисков
У меня сейчас сделано так: каждый из двух двухтеррабайтных жестких дисков разбит на два раздела: 230 мегабайт и все остальное. 230-мегабайтные разделы на первом и втором диске используются под /boot и корневой раздел соответственно. Как показывает вывод df -hT ниже — размер в 200 мегабайт весьма избыточен.
Вторые разделы на каждом из дисков объединены в программный рейд 1 (зеркалирующий) и на нем создан LVM.
df -hT:
Ф. система Тип Разм Исп Дост Исп% смонтирована на /dev/sda1 ext2 223M 18M 194M 9% /boot /dev/sdb1 ext4 230M 79M 140M 36% / /dev/mapper/vg-home ext4 1,8T 267G 1,6T 15% /home /dev/mapper/vg-opt ext4 938M 18M 873M 2% /opt /dev/mapper/vg-tmp ext2 893M 17K 845M 1% /tmp /dev/mapper/vg-usr ext4 4,6G 782M 3,6G 18% /usr /dev/mapper/vg-var ext4 19G 802M 17G 5% /var
Еще есть /dev/mapper/vg-swap на 512MB (удвоенное количество оперативы).
Разбивал на разделы я глубокой ночью, с трудом приходя в себя после ночи с 31 декабря на 3 января, поэтому получилось, очевидно, далеко от идеала. Но переделывать откровенно было лень. Сейчас, уже подумав, я бы сделал так:
1) Корень и /boot НЕ могут быть на рейде и\или lvm, поэтому они создаются как обыкновенные разделы на жестких дисках. При этом, так как все остальное будет на рейдах — корневой и /boot разделы должны лежать на разных дисках и быть равного размера. 150 мегабайт должно хватить под корень и особенно под /boot. Хоть /boot и скорее всего может быть с ext[3-4], но смысла в журналируемости нет никакой, так как писаться данные туда будут только при обновлении ядра.
Я не уверен, что это обязательно, но лучше /boot сделать на sda1.
2) /tmp и своп не надо делать на рейд 1. Под них стоит создать рейд 0, на нем свою volume group и на ней уже /tmp и своп разделами на гигабайт и 512 мегабайт соответственно.
3) Остальное свободное место на обоих винтах отдаем под рейд 1, создаем на нем lvm, и разбивая разделы так, как Вам удобнее.
Хочу заметить, что предложенная схема разбиения на разделы ориентирована на сетевое хранилище, предназначенное для бэкапов, т.е. основное требование надежность. Если Вы планируете хранить фильмы\музыку, т.е. то, что легко выкачивается из интернет, основной раздел (у меня это /home, но вполне может быть и /var, например) должен лежать на рейд 0.
Преобразование ядра
К сожалению, загрузчик в данном устройстве не умеет использовать стандартные vmlinuz-2.6.32-5-kirkwood и initrd.img-2.6.32-5-kirkwood, а инсталятор Debian ничего не знает про наше устройство и не прошивает ядро туда, куда надо. Поэтому нам самим надо сконвертировать его в нужный формат и скормить загрузчику.
Делается это следующими двумя командами (в /boot):
mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n "Debian kernel" -d vmlinuz-2.6.32-5-kirkwood uImage mkimage -A arm -O linux -T ramdisk -C gzip -a 0x0 -e 0x0 -n "Debian InitRD" -d initrd.img-2.6.32-5-kirkwood uInitrd
К сожалению, я не помню ставится ли mkimage по умолчанию, если нет, то его можно поставить из пакета uboot-mkimage.
Исполняется это либо в конце установки, либо после, перезагрузившись в rescue mode, введя при старте вместо
setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=mostэто
setenv bootargs console=ttyS0,115200n8 rescue/enable=true
Автоматическая загрузка
После установки системы, чтоб наш
setenv bootargs_console console=ttyS0,115200 root=/dev/sdb1 setenv bootcmd_sata 'ide reset; ext2load ide 0:1 0x01100000 /uInitrd; ext2load ide 0:1 0x00800000 /uImage' setenv bootcmd 'setenv bootargs $(bootargs_console); run bootcmd_sata; bootm 0x00800000 0x01100000' saveenv
И, наконец-то, грузимся в нашу полноценную систему, перезагрузившись, или дав команду:
run bootcmd
Примечания
Невредная ошибка
В логах ядра во время загрузки будет появляться подобное сообщение об ошибке:
kernel: [ 6.327359] uncorrectable error : kernel: [ 96.499883] uncorrectable error : kernel: [ 96.503342] end_request: I/O error, dev mtdblock0, sector 8
Это совершенно нормально, как выяснилось из глубокого гугленья. Связано, как я понял, с некоторыми проблемами в загрузчике uboot, а может и нет. Главное, что все прекрасно работает с этой ошибкой. Вот если бы ошибка была про mtdblock1, тогда было бы плохо.
Мониторинг железа
Очень хотелось бы мониторить температуру устройства, тем более оно ее пишет при загрузке, но sensors-detect на определенном этапе вешает систему наглухо. Спасает только отключение и включение питания. В логах при этом тихо. Работает только smartmontools, позволяющие увидеть температуру жестких дисков.
Использованные материалы
nas-central wiki:
Ix2-200
Ix2-200 Debian Installation
Installing Debian on OpenRD от сyrius