Эта статья предполагает что у Вас уже имеется mini2440 c установленным загрузчиком u-boot, скомпилированным и установленным ядром.
Для работы нам потребуется:
подготовленная виртуальная linux машина
исходники ядра (а вот тут есть варианты : либо репозитарий с repo.or.cz либо с диска в комплекте - подробности в теме про сборку ядра )
полный комплект проводов подключения (Serial, USB, Ethernet)
по желанию карту SD
особенности rootfs на flash Особенность размещения корневой файловой системы на устройствах flash (как NAND встроенная так и SD внешняя) заключается в том, что файловая система должна быть особой - она должна понимать что флешки записываются кратными блоками, а стираются вообще страницами. Если файловая система будет обычной (ext2,ext3,raiserfs), то для записи одной страницы флеша она сделает количество обращений по числу блоков, тем самым в десятки раз уменьшив срок службы микросхемы от возможного. Учитывая что количество циклов перезаписи не очень велико ~100000 то убивание флешки за месяц интенсивной работы близко к 100% Я лично убил NAND на одном из ранее разрабатываемых устройств за одну неделю разместив своп файл на обычной файловой системе
Другой особенностью является факт того что на NAND нормой является наличие BAD блоков, и файловая система должна уметь их обходить. Поскольку обход бэдов изначально проводился по цепочке в момент каждого подключения файловой системы и занимал много времени (так было в jffs) были придуманы методы сохранения информации о статусе файловой системы - вроде как она проверена по цепочке и новых сбойных секторов не обнаружено. Инфа о статусе появилось в jffs2. У jffs2 есть ещё ряд интересных фишек навроде сжатия на лету, но это предмет отдельной статьи.
Есть ещё более современная файловая система для флешек - yaffs, она немного по другому работает и её есть смысл применять на объёмах от 64MB NAND и выше. По сути применение yaffs для нас более предпочтительно НО, пока этой файловой системы нету в официальной ветке ядра, я не буду её рассматривать, тем не менее помнить о ней нужно. Вероятно скоро она станет стандартом и войдет в ядро.
Краткое описание действий В статье я опишу каким образом мы можем подготовить файловую систему jffs2 и разместить её на mini2440 Рассматривать кросс сборку файловой системы здесь не буду, это отдельная тема. Предлагаю экспериментировать с имеющимся на диске контролера архивом файловой системы для qtopia ( linux/arm-qtopia-20100108.tar.gz) Я буду рассматривать самый сложный случай когда нам потребуется разместить rootfs.jffs2 на максимально возможное место в NAND разделе rootfs (или root в некоторых версиях u-boot) Сложность заключается в том что писать с какого либо порта непосредственно в NAND не позволяет функционал загрузчика, а объем свободной оперативной памяти для загрузки блока под запись в несколько раз меньше объёма NAND. Следовательно подготовленный файл образа корневой системы мы будем дробить на куски и писать частями, тчательно рассчитав смещения
Итак приступим
Начнем издалека... Подготовка linux машины для работы с mtd блочными устройствами. Для сборки образа файловой системы на хостовой x86 машине нам потребуется съэмулировать флешку в оперативке. для этого ядро должно иметь соответствующие модули: # modprobe block2mtd # modprobe mtdblock # lsmod если в выводе есть что то типа
поэтому пересобираем модули ядра для включения соответствующей поддержки: (это прямая! не кросс компиляция) # cd /usr/src/linux # zcat /proc/config.gz > .config# здесь мы получам конфигурацию текущего ядра, эта возможность может не поддерживаться ядром или вы и так знаете что текущий конфиг ядра актуален - тогда пропускаем # make menuconfig нужно включить следующие опции: 1) MTD mtd support CONFIG_MTD 2) MTD caching block device access to MTD devices CONFIG_MTD_BLOCK mtdblock 3) MTD/Self-contained MTD device drivers emulation using block device CONFIG_MTD_BLKMTD blkmtd 4) File systems Journalling Flash File System v2 (JFFS2) support CONFIG_JFFS2_FS jffs2
ну и после сохранения новой конфигурации собираем новые модули и ставим их в систему
# make -j 3 modules # make modules_install
ещё нам потребуются утилиты для работы с mtd на gentoo это делается так: # emerge sys-fs/mtd-utils на других линуксах нужно будет поискать соответствующий пакет самостоятельно (вроде тут http://git.infradead.org/?p=mtd-utils.git;a=summary)
подготовка хостовой машины закончена, переходим к расчётам адресов и смещений
а здесь мы узнаем какими блоками ведется запись на NAND (2048=0x800) и какими размерами страницы происходит стирание (128k=131072=0x20000)
MINI2440 # nand bad show
Цитата:
Device 0 bad blocks: 04d20000 07f80000 07fa0000 07fc0000 07fe0000
здесь 4 сбойных блока приходится на rootfs это 4* 0x20000 = 0x80000 значит реальный размер rootfs = 0x7a60000 — 0x80000 = 0x79E0000 = 124800k
подготовим чистый образ jffs2 нужного размера
# cd /tftproot# я сразу работаю в этом каталоге чтобы потом загружать с tftp без лишнего переписывания # dd if=/dev/zero bs=1k count=124800 | tr '\000' '\377' > ./root_qtopia.jffs2# это такой линуксовый трюк для эмуляции свежеформатированной jffs2
далее смонтируем полученный образ в систему # losetup /dev/loop0 root_qtopia.jffs2 # mkdir rootfs# здесь будет смонтирован образ # modprobe block2mtd# здесь ядро должно иметь модули # modprobe mtdblock# для работы с mtd устройствами # echo /dev/loop0,131072 > /sys/module/block2mtd/parameters/block2mtd# здесь 131072 = 128k (sector size) # cat /proc/mtd# проверяем
Цитата:
dev: size erasesize name mtd0: 07a6000000020000 "block2mtd: /dev/loop0"
# mount -t jffs2 /dev/mtdblock0 ./rootfs# и наконец собственно монтируем
# mount# проверка
Цитата:
/dev/mtdblock0 on /tftproot/rootfs type jffs2 (rw)
далее производим перенос имеющихся файлов рутовой файловой системы в смонтированый образ копируем и разворачиваем архив linux/arm-qtopia-20100108.tar.gz с диска контроллера (или подготавливаем свою сборку): # tar -xvzf ./arm-qtopia-20100108.tar.gz -C /tftproot/root_qtopia
делаем перенос файловой структуры с сохранением прав: # cd /tftproot/root_qtopia # tar cpjf - ./* | (cd /tftproot/rootfs/ ;tar xvjpf - ) здесь желательно добавить в готовую файловую систему все модули от вашего ядра они должны лечь в каталог lib/modules/{номер ядра}... # umount /tftproot/rootfs
теперь файл /tftproot/root_qtopia.jffs2 содержит требуемую нам файловую систему
прежде чем его писать на NAND проверим его работоспособность по сети:
загрузка образа jffs2 через NFS
подготовим подсистему экспорта NFS на хост машине: # echo "/tftproot 192.168.0.0/16(rw,no_root_squash,sync,no_subtree_check,nohide,crossmnt,insecure_locks)" > /etc/exports # exportfs -a # /etc/init.d/nfs restart
MINI2440 # setenv ipaddr 192.168.150.33 MINI2440 # setenv serverip 192.168.150.65 MINI2440 # setenv bootargs console=ttySAC0,115200 noinitrd init=/sbin/init mini2440=3tbc nfsroot=192.168.150.65:/tftproot/root_qtopia.jffs2 root=/dev/nfs rw rootfstype=jffs2 ip=192.168.150.33 разумеется вам нужно поставить свои параметры для ip контроллера и сервера (хост машины) отдельное внимание параметру mini2440=3tbc здесь говорится использовать LCD 3го типа (T35), активировать тачскрин, включить подсветку, включить CMOS камеру MINI2440 # setenv bootcmd 'nboot.e kernel ; bootm' MINI2440 # saveenv
перегружаем контроллер...
если всё загрузилось - можно резать на кусочки и записывать на устройство
не буду вас мучать математикой, и так статья тяжелая для понимания просто поделюсь скритом который сделал для себя он разрезает на кусочки образ файловой системы
скрипт требует внимательной доработки, он для примера можно оптимизировать задержку времени оставленное на операцию записи NAND так же внимательно проверяйте соответствие таблицы разделов NAND тому что у вас определено в u-boot если убрать параметр mtdparts= то разбивка будет той что по умолчанию принята в ядре, это может отличаться от реального (смотри логи запуска ядра) /dev/mtdblock4 у меня потому что введен раздел splash (по умолчанию его нету и этот параметр root=/dev/mtdblock3)
Ничего так себе 10 строчек Я почему-то надеялся, что статья будет как раз таки про
setar писал(а):
...кросс сборку файловой системы здесь не буду, это отдельная тема.
Но вообще статья хорошая. И сразу пару вопросов.
setar писал(а):
Особенность размещения корневой файловой системы на устройствах flash (как NAND встроенная так и SD внешняя) .... Если файловая система будет обычной (ext2,ext3,raiserfs), то ....... убивание флешки за месяц интенсивной работы близко к 100%
Тоесть внешнюю SD тоже нужно форматировать как jffs2? И как ЭТО можно сделать? ЗЫ Моя SD (ext3) в последнее время в лине монтится как ридонли ,только через раз нормально.... умирает потихоньку мабуть...
_________________ Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
с Флешками обычными USB и SD немного ситуация попроще, там стоит встроенный контроллер который ремапит bad блоки и оптимизирует стирание страниц. Тем не менее на них использовать систему jffs2 гораздо полезнее традиционной Для флешк достаточно сделать размер erase блока кратным 512 байтам (размер одной линии записи)
допустим вы подключили SD через ридер к хост компьютеру и разбили разделы как 1 = kernel (кстати здесь вполне достаточно ext2 - мы только читаем) 2 = раздел под footfs тогда так: # mkfs.jffs2 -p -e 512 -o /dev/sdb2# здесь мы определяем длинну erase блока 512 и делаем padding файловой системы на этот же размер (пропущенный параметр после -p говорит что padded size = erase sise) # modprobe block2mtd block2mtd=/dev/sdb2,512 # mkdir /mnt/flash # mount -t jffs2 mtd0 /mnt/flash
теперь каталог /mnt/flash содержит смонтировонный как jffs2 раздел SD смело копируем на него всё что требуется: # cd /tftproot/root_qtopia # tar cpjf - ./* | (cd /mnt/flash/ ;tar xvjpf - )
после размонтирования имеем jffs2 на SD # umount /mnt/flash
Добавлено спустя 2 минуты 23 секунды:
Resident писал(а):
ЗЫ Моя SD (ext3) в последнее время в лине монтится как ридонли ,только через раз нормально.... умирает потихоньку мабуть...
проверь переключатель lock, закрепи кусочком скотча - некоторы кардридеры упругой пластинкой датчика просто сдвигают его в положение lock
Он может сдвигаться когда SD в картридер вставляешь, и становиться на место при изъятии ее. У меня такая SD карта была - я потом просто заклеил этот переключатель чтоб не сдвигался
Да я вроде как по аглицки читать умею... Вот этот бэд-суперблок меня и тревожит ФС то этот линух сам создал, в недалеком прошлом. Что-же теперь на своё дитё ругается?...
_________________ Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
Последний раз редактировалось setar 26 июл 2010, 20:32, всего редактировалось 2 раз(а).
Добавлено спустя 2 минуты 5 секунд: кстати по jffs2 на SD я похоже малость упростил подход оно так не монтируется - ругается что это не mtd устройство позже придумаю как правильно
Раз уж тут зашел разговор об SD-шках... Вопрос: Насколько часто Linux при работе обращается карточке? (имеется в виду только работа ОСи и клиентских приложений не использующих операции чтения/записи файлов) Просвятите неграмотного
_________________ Любой прибор, защищённый плавким предохранителем, сможет защитить этот предохранитель, сгорев первым.
если на карточке не лежит свопа то ровно настолько часто, как вы запускаете в системе какой то новый процесс самостоятельно или по расписанию ну или когда запущенные процессы начинают работать с данными
своп лучше не использовать вообще, программы которые не влезают в оперативку или их сильно много должны быть оптимизированы или заменены на аналоги линуксу без свопа хорошо, особенно если оперативки достаточно для задач
У меня телефон на линуксе (Motorola A1200), 3,5 года на карточке (microSD) размещен своп-файл. Карта работает, признаков глючности не замечено)) И не слышал чтобы у кого то были проблемы. Думаю жизненного цикла такой карты достаточно чтобы не думать об этом.
ты не прав, это всего навсего говорит о том что в этот своп ничего не ложится SD убивается на 123 это тебе любой девелопер embedded скажет
Добавлено спустя 4 минуты 2 секунды: или скажу по другому, я длительное время общаюсь в среде embedded разработчиков, сначала это был gentoo on hx4700 потом openmokko GTA1 потом GTA2 , мои друзья теряли не одну SD именно поэтому работают на маленьких недорогих картах
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения