Настоящая статья рассказывает об архитектуре сетевого хранилища MyBook World Edition. Статья подразумевает знание основ линукса и предназначена для тех, кто уже превратил свой NAS в кирпич, или пытается это сделать. Описывается второе поколение устройств, так называемые white lights. Описание базируется на статье http://mybookworld.wikidot.com/install-clean-hdd-in-white-light-my-book-world-edition и изучении скриптов, входящих в состав прошивки.
И одно- и двухдисковые версии MBWE сделаны по одному принципу soft raid. Причём однодисковая версия также имитирует raid 1 с одним отсутствующим диском.
Диск разбиваются по секторам следующим образом (на примере 1Gb):
Устройство | нач сектор | размер | назначение | ||||
начало /dev/sda | 0 | 64260 | MBR, загрузчик и ядро | ||||
/dev/sda1 | 64260 | 3919860 | корень файловой системы / | ||||
/dev/sda2 | 3984120 | 514080 | swap | ||||
/dev/sda3 | 4498200 | 1975995 | партиция для рабочих файлов/var | ||||
/dev/sda4 | 6474195 | 9976365 | партиция для данных /DataVolume |
Мы видим традиционное разбиение диска на партиции. /dev/sda1 содержит практически всю файловую систему: исполняемые файлы, конфигурационные файлы, скрипты, линки для псевдо-каталогов /dev, /proc итд. Большая часть этих файлов заменяется в процессе обновления. Файлы с пользовательскими настройками, лежащие в традиционных для юниксов местах, например в /etc, при апдейтах сохраняются отдельно. Используется файловая система ext2. В /dev/sda2 находится партиция для свопа. Партиция /dev/sda3 предназначена для рабочих и изменяемых в процессе работы файлов и монтируется как /var. Эти файлы не модифицируются при апдейте. Используется файловая система ext2. И /dev/sda4 - это пользовательские файлы, монтируемая как /DataVolume. На первом уровне находятся шары, которые и видны снаружи. Используется файловая система XFS.
Таким образом, если при смерти устройства диск остался цел, его можно вытащить и скопировать данные, подмонтировав /dev/sda4 как XFS.
По адресам партиций видно, что устройство резервирует в начале диска 32Mb. Это пространство используется для хранения загручика и ядра линукса. Рассмотрим карту секторов загрузочной области прошивки версии 1.1.x поподробнее.
назначение | нач сектор | размер в секторах | запас в секторах | комментарий | |||||
master boot record | 0 | 1 | 0 | сектор с partition table | |||||
stage 1 | 1 | 1 | 1 | сектор с первичным загрузчиком | |||||
u-boot | 3 | 218 | 18 | загрузчик das u-boot | |||||
переменные u-boot | 239 | 16 | 0 | переменные загрузчика. MAC-адрес, адрес ядра итд | |||||
переменные режимов загрузчика | 255 | 1 | 44 | флаги, используемые загрузчиком для выбора режимов загрузки | |||||
ядро linux | 300 | 3113 | 2587 | ядро linux 2.6.24.4 | |||||
rootfs для апгрейда | 6000 | 483 | 29 | файловая система для проведения апгрейда | |||||
ядро linux для апгрейда | 6512 | 1859 | 2237 | ядро linux для проведения апгрейда | |||||
копия stage 1 | 10608 | 1 | 1 | копия первичного загрузчика | |||||
копия u-boot | 10610 | 218 | 14 | копия u-boot | |||||
копия переменных u-boot | 10846 | 16 | 0 | копия переменных u-boot | |||||
копия ядра | 10862 | 3113 | 50285 | копия ядра |
Рассмотрим отдельные состовляющие поподробнее.
Первые сектора занимают Master boot record и первичный загрузчик.В отличие от традиционного, здешний MBR не содержит кода, только partition table. Начальный загрузчик располагается в следующем секторе. Начальный загрузчик делает единственное действие - загружает загрузчик das u-boot.
В следующих секторах располагается полноценный загрузчик. Используется широко распространенный загрузчик das u-boot. Загрузчик нужен для того, чтобы проинициализировать железо, определить модель устройства, режим работы и загрузить ядро. В интернетах можно найти распайку com-порта, с помощью которого можно с консоли наблюдать за загрузкой устройства.
Загрузчик использует для работы переменные, которые лежат в секторах после него, защищенные с помощью CRC-32. Эти переменные определяют порядок действий. Вкратце действия сводятся к “прочитать ядро по указанному адресу с указанного сектора и запустить его”. Также расписаны сектора резервной копии, откуда читают в случае ошибки чтения, мигание лампочками при ошибках чтения. Самое интересное, что там есть - это MAC-адрес сетевой карты. Как сказано выше, переменные защищены контрольной суммой. Поэтому для замены в каталоге /usr/local/wdc/uboot_env есть скрипты mac_get.sh и mac_set.sh. Кроме подсчета контрольной суммы, эти скрипты записывают две копии переменных - основную и резервную. Порядок действия определяется переменной
bootcmd=run select0 load boot || run select0 load2 boot || run lightled select1 load extinguishled boot || run lightled select1 load2 extinguishled boot || lightled
Команды расширяются макросами
select0=ide dev 0 select1=ide dev 1 load=ide read 0x48500000 12c 1644 load2=ide read 0x48500000 2a6e 1644 lightled=ledfail 1 extinguishled=ledfail 0
Параметры ядра задаются в переменной
bootargs=root=/dev/md0 console=ttyS0,115200 elevator=cfq mac_adr=0x00,0x90,0xA9,0x6E,0x11,0x11
. Кроме заданного в переменной, загрузчик автоматически добавляет модель NAS (WWLXN/WXLXN), объем оперативной памяти и еще несколько переменных. Так что полная строка с параметрами ядра выглядит длинее:
root=/dev/md0 console=ttyS0,115200 elevator=cfq mac_adr=0x00,0x90,0xA9,0x6E,0x11,0x11 mem=128M wixmodel=WWLXN powermode=controlledpdown poweroutage=yes timeINC=949558681
Другое назначение загрузчика - помощь при апгрейде прошивки. В этом режиме меняются переменные и происходит загрузка в память ядра для апгрейда и файловой системы для апгрейда. Такой механизм позволяет произвести апгрейд ядра ОС.
bootcmd=run select0 loadf loadk boot || run lightled select1 loadf loadk extinguishled boot || run lightled select0 loadf select1 loadk extinguishled boot || run lightled select1 loadf select0 loadk extinguishled boot || run lightled set loadf ide read 48700000 1770 200 set loadk ide read 48800000 1970 1000
Выбор режима работы загрузчика определяется по переменным, выставляемым в секторе 255. Три последовательных байта в секторе определяют режимы upgrade, autorecovery и power down. Выставление флага upgrade вызывает как раз способ загрузки альтернативного ядра.
Есть некоторая непонятность, связанная с тем, что ядро для обновления лежит с сектора 10842, а резервная копия переменных лежит с сектора 10846 и неизбежно перекрытие, но скорее всего устройство не очень рассчитано на резервные копии, хотя и делает их исправно.
Ядру передается указание монтировать /dev/md0 (md - это рейды на базе sda и sdb) как корень файловой системы и грузиться дальше. Загрузка ядра происходить традиционно. Интересующихся можно отослать к изучению /etc/inittab, и /etc/init.d/* .