Можно ли осуществлять горячую замену одной установки Linux на другую?

Можно ли осуществлять горячую замену одной установки Linux на другую?

У меня на машине есть несколько отдельных установок Linux, и я перезагружаюсь в подходящую. Мне интересно, можно ли переключиться с одной на другую без полной перезагрузки, сделав что-то вроде, скажем, копирования fstab с разделами для новой установки, а затем mount -a.

Очевидно, ядро ​​не изменится, но это нормально, я надеюсь просто изменить рабочие разделы. Я также считаю очевидным, что это должно быть сделано из командной строки без чего-либо запущенного (если это вообще возможно). Или эта идея недействительна и является чистым безумием с самого начала?

Причина этого в том, что я обычно экспериментирую с радикальными изменениями (например, переход на ядро ​​'amd64' в Debian) в отдельной 'экспериментальной' установке. Перезагрузка для запуска, конечно, просто замечательна, но было бы здорово, если бы я мог как бы перепрыгнуть на эту установку без полной перезагрузки. Вы можете думать об этом как о простом изменении корневого раздела на лету, но, возможно, это вообще невозможно.

Да, это возможно, как я узнаю ниже. Если вам не нужно менять само ядро, используйте 'chroot'. Если вы хотите симулировать полную перезагрузку, используйте 'kexec'.

решение1

Я не думаю, что это возможно.

Теоретически вам нужно сделать следующее:

  1. Переведите систему на уровень «одиночного» запуска с помощью init 1, где теоретически у вас будут работать только init и bash.
  2. Размонтируйте все разделы, кроме /. В этот момент ваша система может перестать работать, в зависимости от того, находится ли /usr в корневом разделе.
  3. Смонтируйте где-нибудь корень другой вашей ОС.
  4. pivot_root для изменения корня на новый раздел.
  5. Сообщите init о необходимости запустить новую систему, выполнив команду init 5(или 2, или что-то другое, что подойдет).

Проблема в том, что pivot_root изменяет только корневой раздел для текущего процесса, что означает, что это не повлияет на init, и когда вы скажете init запустить систему, он запустит вашу старую. Вам нужно будет как-то сказать init сделать pivot_root, что, я думаю, невозможно.

О, и давайте не будем вдаваться в то, что происходит, когда ваша другая ОС использует другую службу init (например, Fedora использует systemd, а Ubuntu — upstart). Вам нужно будет заменить процесс init (pid 1) в ядре, и это действительно бесполезно.

решение2

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

Если вы хотите иметь разные настройки с разными наборами установленных программ, вы также можете использовать виртуальную машину. Если вы хотите избежать накладных расходов виртуальной машины, вы можете установить дистрибутив вchroot. Я часто делаю это, чтобы иметь легкий доступ к 32-битным программам на 64-битной установке или чтобы иметь последние версии (например, Debian stable) в дополнение к стабильной версии (например, Debian stable). Я написалруководство по настройке chroot для альтернативных выпусков Debian/Ubuntu. Смотрите такжеЛегковесная изолированная среда Linux

решение3

Если вынехочу/нужно сменить ядра, но просто хочу использовать другие файловые системы, как вы, кажется, указали здесь:

Очевидно, ядро ​​не изменится, но это нормально, я надеюсь просто изменить рабочие разделы.

Тогда, возможно, вам просто нужно (монтировать и) chroot, что, выражаясь вашими словами,

Вы можете думать об этом как о простом изменении корневого раздела на лету.

Я постоянно использую chroot из систем восстановления (типа clonezilla) для взаимодействия с файловой системой, которая обычно использовалась бы другим ядром. Я не ожидаю, что смогу делать что-то вроде загрузки новых модулей ядра, но это нормально для чтения и записи файлов (исправления fstab, корректировки grub.conf и т. д.).

Вы можете использовать привязку монтирования, чтобы сделать среду chroot более полезной. Я использую это все время для репликации смонтированных файловых систем внутри цели chroot:

mount /dev/sda1 /mnt
for d in dev sys proc; do mount -obind /$d /mnt/$d; done
chroot /mnt

Связанный контент