==== Введение ==== Настоящая статья рассказывает об архитектуре сетевого хранилища 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||копия ядра|| Рассмотрим отдельные состовляющие поподробнее. === 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/* .