Ответ 1
Я использовал следующий подход. Это было несколько основано на документе "Построение встроенных систем Linux, совместимых с Murphy", доступных здесь. Я использовал материал version.conf, описанный в этой статье, а не материал cfgsh.
- Использовать загрузочное ядро, чье задание состоит в обратном подключении к корневой файловой системе. Если вам нужно более новое ядро, тогда kexec в это новое ядро сразу после его установки. Я решил поместить загрузочное ядро в init init в initramfs вместе с busybox и kexec (оба статически связаны), а мой init был простой оболочкой script, которую я написал.
- В файловой системе "OS image" существует одна или несколько корневых файловых систем "основной ОС" в виде файлов образа диска. Ядро загрузки выбирает один из них на основе файла version.conf. Я поддерживаю только два основных файла образа ОС: текущий и аварийный файлы. Если текущий сбой (подробнее об обнаружении сбоев позже), тогда загрузочное ядро загружает спад. Если оба отказа или нет возврата, загрузочное ядро предоставляет оболочку.
- Конфигурация системы находится на отдельном разделе. Обычно это не обновляется, но нет причин, по которым это не могло быть.
- Существует четыре полных раздела: загрузка, образ ОС, конфигурация и данные. Раздел данных предназначен для пользовательских приложений, предназначенных для частого письма. boot никогда не монтируется read/write. Изображение ОС - это только (повторно) смонтированное чтение/запись во время обновлений. config только монтируется чтение/запись, когда необходимо изменить конфигурацию (надеюсь, никогда). данные всегда установлены для чтения/записи.
- Каждый файл образа диска содержит полную систему Linux, включая ядро, сценарии инициализации, пользовательские программы (например, busybox, приложения для продуктов) и конфигурацию по умолчанию, которая копируется в конфигурационный раздел при первой загрузке. Файлы имеют размер, необходимый для размещения в них всех. До тех пор, пока я достаточно места для роста, чтобы раздел образа ОС всегда был достаточно большим, чтобы соответствовать трем основным файлам образа ОС (во время обновления я не удаляю старый откат до тех пор, пока новый не будет извлечен), я могу чтобы основной образ ОС развивался по мере необходимости. Эти файлы изображений всегда (loop-back) устанавливаются только для чтения. Использование этих файлов также устраняет боль, связанную с сбоями в обновлении отдельных файлов внутри rootfs.
- Модификации выполняются путем переноса самораспаковывающегося tarball на tmpfs. Начало этого script повторно устанавливает образ/запись образа ОС, затем извлекает новый основной образ ОС в файловую систему образа ОС, а затем обновляет файл version.conf(используя метод переименования, описанный в документе "murphy" ), После этого я коснусь файла штампа, указывающего, что произошло обновление, а затем перезагрузитесь.
- Ядро загрузки ищет этот файл штампа. Если он найдет его, он переместит его в другой файл штампа, а затем загрузит новый файл образа ОС. Ожидается, что основной файл образа ОС удалит файл штампа при его успешном запуске. Если этого не произойдет, сторожевой таймер вызовет перезагрузку, а затем ядро загрузки увидит это и обнаружит сбой.
- Вы заметите, что во время обновления есть несколько возможных проблем: синхронизация версий .conf во время обновления и трогание/удаление файлов штампа (три экземпляра). Я не мог найти способ уменьшить их дальше и добиться всего, что хотел. Если у кого-то есть лучшее предложение, я бы хотел его услышать. Ошибки файловой системы или сбои питания при записи образа ОС также могут произойти, но я надеюсь, что файловая система ext3 предоставит вам шанс выжить в этом случае.