Я пытаюсь разработать платформу, которая позволила бы мне делать полное транзакционное обновление Ubuntu и корневой файловой системы.
Требование - то, что, если мое обновление перестало работать, я хочу смочь откатывать к точному состоянию, в котором я был прежде.
Ядро Ubuntu, кажется, обеспечивает точный вид функциональности, в которой я нуждаюсь, но это идет с большим количеством ограничений безопасности и является действительно довольно другой системой по сравнению с классической Ubuntu.
Одна опция состоит в том, чтобы иметь 2 раздела. Я установил бы новую версию ОС на 2-м разделе, повторно применил бы все мои конфигурации и затем обновил бы личинку для начальной загрузки от того раздела.
Однако я должен был бы затем выбрать размер каждого раздела, который не идеален. Это также сделало бы это более сложным для совместного использования некоторых каталогов между 2 версиями ОС (т.е. вместо копирования входит в систему /var
, Я смог бы просто связать - монтируются /var
от где-то в другом месте).
То, что я думаю, имеет корневой каталог с набором пустых каталогов /etc
, /lib
, /opt
, и т.д., и один каталог такой как /versions
который содержал бы мои различные версии ОС. Например. /versions/v1/
, /versions/v2/
.
Во время начальной загрузки процесс начальной загрузки выбрал бы правильную версию и затем связал бы, монтируют каждый из дочерних каталогов на корневые подкаталоги.
Другими словами, если я хочу загрузиться от /versions/v2
, это связало бы, смонтируйтесь: /versions/v2/etc
на /etc
/versions/v2/opt
на /opt
и т.д.
То, что я задаюсь вопросом, - то, если это - правильный подход к этой проблеме и раз так затем, как мог это быть выполненным.
После некоторого исследования я нашел способ достигнуть того, что я искал.
Я должен был вырыть в изображение initramfs (/boot/initrd.img-...
) узнать, как монтирование различных файловых систем было выполнено. Изображение initramfs для ядра человечности было особенно полезно.
Дизайн, на котором я обосновался, на самом деле довольно подобен ядру человечности. Я создаю начальную установку человечности, реализовываю конфигурации, я нуждаюсь и затем делаю глубокое использование копии cpio
и наконец упакуйте копию в squashfs использование файловой системы только для чтения mksquashfs
. Я сохраню изображение squashfs на основном разделе новой ОС. Во время загрузки ОС я отредактировал initrd.img
для монтирования squashfs изображения версии, я хочу на /root
, и затем настроили overlayroot
сверху его, который является перезаписываемым наложением.