User Tools

Site Tools


mybookworldedition

Введение

Настоящая статья рассказывает об архитектуре сетевого хранилища 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/sda064260MBR, загрузчик и ядро
/dev/sda1642603919860корень файловой системы /
/dev/sda23984120514080swap
/dev/sda344982001975995партиция для рабочих файлов/var
/dev/sda464741959976365партиция для данных /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 record010сектор с partition table
stage 1111сектор с первичным загрузчиком
u-boot321818загрузчик das u-boot
переменные u-boot239160переменные загрузчика. MAC-адрес, адрес ядра итд
переменные режимов загрузчика255144флаги, используемые загрузчиком для выбора режимов загрузки
ядро linux30031132587ядро linux 2.6.24.4
rootfs для апгрейда600048329файловая система для проведения апгрейда
ядро linux для апгрейда651218592237ядро linux для проведения апгрейда
копия stage 11060811копия первичного загрузчика
копия u-boot1061021814копия u-boot
копия переменных u-boot10846160копия переменных u-boot
копия ядра10862311350285копия ядра

Рассмотрим отдельные состовляющие поподробнее.

MBR & stage1

Первые сектора занимают Master boot record и первичный загрузчик.В отличие от традиционного, здешний MBR не содержит кода, только partition table. Начальный загрузчик располагается в следующем секторе. Начальный загрузчик делает единственное действие - загружает загрузчик das u-boot.

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/* .

mybookworldedition.txt · Last modified: 2010/11/15 16:11 by 127.0.0.1