
У меня на машине есть несколько отдельных установок Linux, и я перезагружаюсь в подходящую. Мне интересно, можно ли переключиться с одной на другую без полной перезагрузки, сделав что-то вроде, скажем, копирования fstab с разделами для новой установки, а затем mount -a
.
Очевидно, ядро не изменится, но это нормально, я надеюсь просто изменить рабочие разделы. Я также считаю очевидным, что это должно быть сделано из командной строки без чего-либо запущенного (если это вообще возможно). Или эта идея недействительна и является чистым безумием с самого начала?
Причина этого в том, что я обычно экспериментирую с радикальными изменениями (например, переход на ядро 'amd64' в Debian) в отдельной 'экспериментальной' установке. Перезагрузка для запуска, конечно, просто замечательна, но было бы здорово, если бы я мог как бы перепрыгнуть на эту установку без полной перезагрузки. Вы можете думать об этом как о простом изменении корневого раздела на лету, но, возможно, это вообще невозможно.
Да, это возможно, как я узнаю ниже. Если вам не нужно менять само ядро, используйте 'chroot'. Если вы хотите симулировать полную перезагрузку, используйте 'kexec'.
решение1
Я не думаю, что это возможно.
Теоретически вам нужно сделать следующее:
- Переведите систему на уровень «одиночного» запуска с помощью
init 1
, где теоретически у вас будут работать только init и bash. - Размонтируйте все разделы, кроме /. В этот момент ваша система может перестать работать, в зависимости от того, находится ли /usr в корневом разделе.
- Смонтируйте где-нибудь корень другой вашей ОС.
- pivot_root для изменения корня на новый раздел.
- Сообщите 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