Как известно boot (recovery то же самое) состоит из нескольких частей:
- header
- kernel header
- kernel
- ramdisk_header
- ramdisk
Собственно разбирается только ramdisk - в нем структура папок и исполняемые файлы. Остальное не разбирается. Вообще т.е. никак.
Ramdisk - это gzip архив внутри которого cpio архив внутри которого папки и файлы.
Т.е. процесс разборки выглядит так:
- ищем offset для всех блоков
- режем файл на куски
- ramdisk распаковываем 2мя разными архиваторами.
Обратный процесс аналогичен, но еще нужно в ramdisk_header вставить новый размер нового ramdisk.
Проблем было очень много.
1. Отсутствие в windows инструментария (команд у command.com) - никаких команд по поиску offset, работы с HEX, разделением/склеиванием файлов, поиска внутри файлов и т.п. и т.д. там нет. В общем это давно всем известно. В линуксе они есть - а в винде - нету.
Поэтому были привлечены сторонние утилиты, а также частично утилиты из cygwin - например find, dd, cpio, gzip и также одна универсальная утилита для windows - Swiss File Knife - A Command Line Tools Collection.
http://stahlforce.com/dev/swiss-file-knife.htmlСамо собой все это работает как ему хочется и увязать с батником дело не простое, но...
2. Основная засада из-за которой не получалось раньше пересобрать boot под windows - при работе с cpio и gz архивами терялись симлинки (symliink) а также (!) права. Если симлинки удалось починить почти сразу (cpio от cygwin в отличии от сторонних архиваторов с поддержкой cpio) прекрасно их сохраняет и восстанавливает, то вот с правами была полная засада... причем очень интересный момент - выяснил почти случайно.
Права на сами файлы и папки из директории rmdisk оставались такими как и было нужно, а вот на папку rmdisk права НЕ сохранялись при упаковке. В моем случае для создания архива использовалась функция "find ." - которая выводит список файлов внутри директории - и надо же так получится, что корневая папка тоже участвует в процессе - хотя ведь ее нет в архиве!!!
и отображается в cpio архиве как точка бл... с правами... вот когда я это увидел - попробовал прямо в cygwin сделать chmod на папку - и чудо чудное - бут загрузился и тело включилось! Затем недолго думая я выдернул chmod из пингвина и вставил в скрипт.
Каким образом это работает в windows - я хз если честно. Думаю что уровне NTFS.
Ну в общем вот как-то так....