OpenWiki

My Book World Edition

Edit this page (last edited November 15, 2010)
Palm Notes | Recent Changes | Title Index | User Preferences | Random Page | Help
  • Введение
  • Разбиение диска
  • Загрузочная "партиция"
  • MBR & stage1
  • u-boot и его переменные
  • ядро
  • Введение

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


    Palm Notes | Recent Changes | Title Index | User Preferences | Random Page | Help
    Edit this page | View other revisions
    Print this page | View XML
    Find page by browsing, searching or an index
    Edited November 15, 2010 (diff)
    Valid XHTML 1.0!Valid CSS!