переключаться между разными версиями ядра без перезагрузки

11

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

То есть, если у меня есть 3.0.0-16-genericядро, работающее в данный момент, и у меня есть старое ядро 3.0.0-14-generic, то, возможно, я смогу переключиться на 3.0.0-14-generic(другое ядро) без перезагрузки.

(Мне нужно делать отладку в реальном времени и вносить изменения, поэтому я не могу перезагрузиться)

кодировщик
источник

Ответы:

8

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

Самое близкое, что вы можете получить - это процесс установки патчей с использованием Ksplice . Он преобразует обновления ядра в волшебные прокладки, которые могут закрывать дыры в работающем ядре, позволяя держать компьютер включенным бесконечно без перезагрузки. Для ваших целей он также позволяет вам откатить изменения.

Это бесплатно для выпусков Ubuntu Desktop, так что вы можете поиграть с ним, но вы должны заплатить подписку на серверы (где такие вещи наиболее необходимы).


Только что видел ваши правки. Ksplice, вероятно, не поможет, если вы вручную взламываете и собираете свои собственные Ядра для отладки, поскольку «сервис» состоит в том, что они предоставляют специальные обновления, и вы не можете создавать их самостоятельно.

Если вы просто строите вещи против официального ядра, оно все равно может работать.


Еще одна идея: виртуализация. Вы можете собрать новое ядро, поменять местами на своей виртуальной машине и перезагрузиться. Это все еще займет время, необходимое для перезагрузки, но вы можете сделать виртуальную машину намного более легкой, чем ваша машина разработки (основать ее на Ubuntu Server, отбросить X-сервер, если он вам не нужен, и т. Д.).

Оли
источник
1
но я хочу переключаться между двумя разными ядрами в моем / boot каталоге
кодировщик
1
Да, вы не сможете произвольно переключаться между двумя ядрами. Я добавил еще одно редактирование с другой идеей, которая может работать для вас.
Оли
2

Как упоминал Оли , ваш лучший шанс, вероятно, виртуализация.

Тем не менее, если вы работаете с оборудованием, виртуализация может не помочь вам, и в этом случае вы можете использовать kexecдля замены работающего ядра без полной перезагрузки.

Взято со страницы ArchWikikexec :

kexec -l /boot/new-kernel --initrd=/boot/new-initrd --reuse-cmdline
kexec -e

Обратите внимание, что приведенное выше все равно перезапустит все сервисы , включая вашу систему инициализации, сервер отображения, сетевое взаимодействие и т. Д. Однако, если вы используете достаточно быструю систему инициализации, например systemd, вы можете загрузить новое ядро ​​через 2-3 секунды, так как вы обходите BIOS / UEFI и загрузчик.


Аналогичное описание можно найти на странице RapidReboot Ubuntu Wiki .

Аттила О.
источник
0

Я думаю, что эти ответы должны быть обновлены.

Существует kpatch в настоящее время , что является более родным , чем Ksplice и др.

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

Общая проблема всегда такова: запущенные процессы по-прежнему поддерживают структуры данных ядра, ожидая, что функции ядра будут ожидать их и возвращать. И без тех процессов, которые были сделаны для этого, на самом деле невозможно узнать, если это так. Таким образом, вы не можете изменить их, пока все процессы, которые их используют, не будут перезапущены. Это также потребовало бы патча всех этих программ.
И я даже не упомянул о смене драйверов, когда оборудование находится в особом состоянии. (Та же проблема, что и с kexec .)

Evi1M4chine
источник