Замените корень во время выполнения

Я разрабатываю встроенную систему Linux. Обычно система устанавливается путем создания файла ISO, который записывается на USB-накопитель, с которого может загружаться плата.

Чтобы сделать установку возможной автоматически (скажем, за ночь), я хотел бы иметь возможность выполнить установку на плате во время работы старой системы.

Моя установка состоит из двух частей: файла initrd, содержащего загрузочный столбец и установочных скриптов, а также архива .tar.gz, который содержит остальную корневую файловую систему для установки.

  1. Загрузочный загрузчик загружает ядро ​​и указывает его на initrd и загружает ядро.
  2. Сценарии установки initrd монтируют целевой диск / dev / sda, форматируют его, устанавливают загрузчик и, наконец, копируют корневую файловую систему из .tar.gz и initrd.

Теперь я вместо этого хочу

  1. Скопируйте install.iso с главного компьютера на целевое устройство. (Нет проблем)
  2. Выполняйте шаги установки, как указано выше.

Моя проблема в том, что я не знаю, как мне следует заменить текущую систему на новую. Я предполагаю, что текущий установленный root (/) должен быть размонтирован и заменен initrd. Но я не могу понять, как это сделать!

  • Медленная система после запуска приложения KDE GUI из Debian Squeeze chroot
  • Как построить gcc внутри chroot Debian?
  • Серверы, запущенные из chrooted Ubuntu на HP TouchPad?
  • Как запустить Gnome из контейнера systemd-nspawn на втором сервере X?
  • ptys не работает в chroot под lxc
  • Есть ли «поддерживаемый» способ в RHEL / CentOS 7 для объединения монтирования дерева каталогов поверх точки монтирования NFS?
  • PID в arch-chroot неверен
  • Как я `umount` / proc?
  • 2 Solutions collect form web for “Замените корень во время выполнения”

    Я могу думать о разных способах делать то, что вы хотите. Все из них несут уровень риска и трудности. Основной риск состоит в том, что если установка идет не так, вы получите не загружаемую систему, которая должна быть установлена ​​вручную.

    Моя основная мысль (которая зависит от вашего загрузчика и тому подобное) заключается в том, чтобы использовать именно ту процедуру, которая у вас есть сейчас. В основном скопируйте новый установочный образ на USB-накопитель, который навсегда останется в машине. Затем просто перезагрузитесь и отпустите его и установите нормально.

    Он полагается на следующее

    1. Ручная переустановка. Я предполагаю, что у вас есть, что иначе переустановка в ночное время не будет проблемой.
    2. Ваш загрузчик может автоматически выбирать загрузку через USB или локальную файловую систему (или с помощью команды уровня приложения перед перезагрузкой)
    3. В конце вам нужно настроить загрузчик для загрузки с локальной платы, а не на USB-устройство, или просто удалить содержимое USB-устройства / сделать его загрузочным, чтобы загрузчик упал

    Альтернативой этому было бы иметь два загрузочных / корневых раздела на вашей доске и просто установить в тот, который вы не используете, а в конце перезагрузки заставляет загрузчик загружаться в другой. Вы можете использовать среду chroot, чтобы заставить установщика думать, что он загружается с нуля. Это, вероятно, большое изменение в вашей среде, хотя и не будет быстрой победой.

    Вы пытались установить initrd, а затем pivot_root? Кажется, что вы хотите сделать.

    Linux и Unix - лучшая ОС в мире.