Возникла как-то на работе потребность организовать в сети хранилище для документации всякой разной. Требования: надежность, небольшой размер, объем в несколько террабайт. Мой выбор остановился на сетевом хранилище (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:
  1. к компьютеру с tftp-сервером по сети
  2. к компьютеру, с которого будем управлять установкой через rs-232 кабель (может совпадать с п.1)
  3. к электричеству

Если все пошло хорошо, то видим в терминале следующую картину:


Останавливаем автозагрузку в нужный момент, нажав любую клавишу и переходим к следующему этапу.

Загрузка установщика


Вводим следующие комманды:
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


Автоматическая загрузка


После установки системы, чтоб наш NASсервачок грузился так, как надо, прописываем следующие параметры при старте:
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