Время перезагрузки

Время перезагрузки

Часто возникают ситуации, когда пользователям Ubuntu требуется выполнить быструю перезагрузку, например, после обновления ядра или при тестировании некоторых настроек, требующих перезагрузки.

Мне бы хотелось иметь метод (например, скрипт), который позволил бы мне сэкономить как можно больше времени при выполнении перезагрузки.

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

  • если возможно, пропустите инициализацию BIOS/UEFI/прошивки и POST
  • пропустить меню GRUB (предварительно выбрать нужную запись один раз и сразу загрузить ее без какого-либо тайм-аута)
  • пропустить экран входа в систему (использовать автоматический вход без пароля один раз)

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

Я виделRapidRebootspec в Ubuntu Wiki, но страница последний раз редактировалась 03.02.2010.

Но даже если мы пока не можем правильно использовать это, kexecчтобы пропустить инициализацию прошивки и прочее, временный предварительный выбор записи GRUB и использование автоматического входа только для одной перезагрузки должны быть возможны. Как мне это настроить?

Я использую Ubuntu 16.04, 64-бит с Unity DE, lightdm и GRUB в двойной загрузке с Windows 10 (а вскоре и с другими дистрибутивами Linux) на компьютере Acer Aspire E5-773G с UEFI.

решение1

Время перезагрузки

Мы можем иногда откладывать перезагрузку в этом мире «чрезмерной занятости» и нежелания тратить 5 или 15 секунд. Когда я впервые занялся этим вопросом, время загрузки у меня сократилось с 45 до 14 секунд с SSD и systemdнастройками.

Недавно я приобрел "современный" ноутбук с NVMe M.2 Gen 3.0 x 4 SSD с молниеносной скоростью чтения Windows 3,4 ГБ/с и скоростью чтения Linux 2 ГБ/с. Так что он должен быть быстрее, верно? Эм... нет. Он мучительно медленнее:

$ systemd-analyze
Startup finished in 6.823s (firmware) + 4.447s (loader) + 3.467s (kernel) + 8.412s (userspace) = 23.151s

На этот раз на самом делепослеtweaking. Это было намного хуже 80 секунд, потому что nVidia и Dell решили отключить питание HDMI-аудио на видеокарте nVidia GTX970M, которая управляет портом HDMI. Так как setpciтребовалась команда, которая вызывала сообщение "low grapics error", и приходилось ждать 20 секунд, пока указатель мыши обработается. Затем он перезагружал все графические драйверы и перезапускал lightdm.

Другая проблема с "современным" ноутбуком - BIOS POST занимал 15 секунд. Настройки BIOS для отключения проверки аппаратных ошибок, отключения загрузки загрузочных драйверов для сетевых карт и другие настройки, которые я сейчас не помню, изменили время BIOS POST до 6 секунд. Для сравнения, время BIOS POST "старого" ноутбука составляло всего пару секунд с использованием Legacy BIOS CSM и без настройки BIOS.


Проект Ubuntu RapidRebootот 2010 года

УбунтуRapidRebootУпоминание проекта в посте ByteCommander датируется 2010 годом. Обоснование проекта можно резюмировать следующим образом:

Обоснование

Есть несколько случаев, когда мы можем с уверенностью предположить, что пользователь не хочет видеть загрузчик; в этих случаях мы должны использовать kexec, чтобы избежать длительных перезагрузок, BIOS POST и времени загрузчика. Это может занять 10 секунд в оптимальных ситуациях; но с SCSI или RAID BIOS и сетевыми загрузочными ПЗУ время может увеличиться до 20, 30 или даже более 60 секунд, даже в случаях, когда время между загрузкой ядра и появлением экрана входа составляет 30-60 секунд.

Примеры использования проекта:

Случаи использования

  • Боб только что обновил свое ядро; update-notifier сообщает ему, что для вступления изменений в силу необходима перезагрузка, а кнопка «Перезагрузить» использует kexec, чтобы ускорить этот процесс.
  • Алиса только что обновила dbus; update-notifier сообщает ей о необходимости перезапуска и использует kexec.
  • Seveas выполнил несколько обновлений в прошлом месяце, и теперь испытывает в три раза большее давление памяти из-за того, что разные программы используют разные копии общих библиотек. Он решает перезагрузиться, чтобы это очистить, и использует «Быструю перезагрузку», чтобы сделать это быстрее.
  • Keybuk только что установил Ubuntu Edgy и хочет загрузиться в него. LiveCD загружает целевое ядро ​​и initrd с помощью kexec; размонтирует все файловые системы на диске; синхронизирует; а затем использует kexec для запуска новой системы вместо перезагрузки.

Использование kexec для перезагрузки

kexecэто магическое заклинание, которое мы применяем для перезагрузки без BIOS POST и некоторых других низкоуровневых механизмов обнаружения, таких как настройка RAID.

Ядро должно быть скомпилировано с CONFIG_KEXECфлагом

Первый шаг — убедиться, что ваше ядро ​​скомпилировано с CONFIG_KEXEC=yопцией:

$ uname -r
4.14.2-041402-generic
$ grep KEXEC= /boot/config-`uname -r`
CONFIG_KEXEC=y

Первая команда uname -rнеобязательна, просто чтобы показать, с каким ядром вы загрузились. Как мы видим во второй команде, ядро ​​скомпилировано командой Ubuntu с необходимым набором флагов. Не уверен, когда это было добавлено, но, скорее всего, <= 2012 год.

Установитьkexec-tools

Следующий шаг — установка kexecинструментов для пользовательского пространства:

$sudo apt install kexec-tools

После обычной загрузки бинарных файлов вы увидите следующий экран:

kexec-tools install.png

Я ответил Noчастично из-за этого сообщения об ошибке, что эта опция неактуальна в systemd.

Затем установка продолжается (фрагмент показан ниже):

Unpacking kexec-tools (1:2.0.10-1ubuntu2.4) ...
Processing triggers for man-db (2.7.5-1) ...
Processing triggers for systemd (229-4ubuntu21) ...
Setting up kexec-tools (1:2.0.10-1ubuntu2.4) ...
Generating /etc/default/kexec...
Generating grub configuration file ...
  (... CUT ...)
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Found Windows Boot Manager on /dev/sda1@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for EFI firmware configuration
done
Processing triggers for systemd (229-4ubuntu21) ...

Настройкаkexec

Наши коллеги в ArchLinux имеютотличная документация по kexecно его нужно доработать для дистрибутивов Ubuntu / Debian.

Основное использование — две команды:

sudo kexec -l /boot/vmlinuz-`uname -r` --initrd=/boot/initrd.img-`uname -r` --reuse-cmdline
sudo kexec -e

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

Использование Systemd для загрузки kexec

Создайте файл :/etc/systemd/system/[email protected]

[Unit]
Description=load %i kernel into the current kernel
Documentation=man:kexec(8)
DefaultDependencies=no
Before=shutdown.target umount.target final.target

[Service]
Type=oneshot
ExecStart=/usr/bin/kexec -l /boot/vmlinuz-%i --initrd=/boot/initrd.img-%i --reuse-cmdline

[Install]
WantedBy=kexec.target

Затем включите служебный файл для ядра, которое вы хотите загрузить, например, чтобы просто установить текущее ядро uname -r:

$ sudo systemctl enable kexec-load@`uname -r`
Created symlink from /etc/systemd/system/kexec.target.wants/[email protected] to /etc/systemd/system/[email protected].

Затем в kexec:

$ sudo systemctl kexec

Если у вас youtubeзапущена система, возможно, она блокирует перезагрузку, в этом случае используйте:

$ sudo systemctl kexec -i

Если вы хотите загрузить другое ядро ​​для следующего kexec, например 4.12.2-041202-generic, отключите службу для текущего ядра и включите ее для нового ядра:

$ sudo systemctl disable kexec-load@`uname -r`
$ sudo systemctl enable [email protected]

Еще не все

Я должен опубликовать этот ответ сейчас, так как пришло время загрузиться, исправить, загрузиться, исправиться, повторить. У меня сложная установка, которая systemdзагружает пять nVidiaдрайверов, которые мне нужно выгрузить, запустить, setpciчтобы включить звук на hdmi, перезагрузить драйверы nVidia и перезапустить lightdm. Это может занять некоторое время, чтобы разобраться.

После того, как cliметоды заработают, я создам ярлык на рабочем столе для перезагрузки в один клик с sudoзапросом пароля. После этого я создам ярлык на рабочем столе для yadдиалогового окна, позволяющего вам выбрать из установленных ядер для перезагрузки. Похоже на меню дополнительных параметров grub.

решение2

Чтобы максимально быстро перезагрузить машину Linux, вызовите функцию ядра перезагрузки. Она очистит диски (по крайней мере, в версии ядра 3.x) и немедленно перезагрузится. Между ними нет ничего, никаких функций ОС, скриптов и т. д., только вызовы ядра.

Как?

Создайте reboot.c с содержимым:

#include <stdio.h>
#include <sys/reboot.h>


int
main (int argc, char **argv)
{
    if (reboot (RB_AUTOBOOT) < 0) {
        fprintf (stderr, "%s: call to reboot() system call failed.\n",
             argv[0]);
    }

    return 0;
}

Скомпилируйте reboot.c в reboot:

gcc reboot.c -o reboot

Выполните перезагрузку (данные будут сброшены на диски и выполнена перезагрузка, вот и все!):

./reboot

Приятной перезагрузки!

https://github.com/masikh/reboot

решение3

Если вы хотите частично перезагрузить компьютер (а не ускорить загрузку), то, как я понимаю, загрузка Linux состоит из 3 основных частей:

  1. Шаг 1: Загрузка компьютера до выбора менеджера загрузки/ОС (rEFInd, Grub, ...)
  2. Шаг 2: Запуск Linux и основных служб
  3. Шаг 3: Начать сеанс
    • Логин пользователя
    • оконный менеджер, такой как Cinnamon, KDE, Gnome, ...)

Перезапустите только шаг 3:

  • ТипAlt-F2ир
  • Илиsudo service $(cat /etc/X11/default-display-manager) перезапустить

Перезапустите только шаги 2 и 3:

Я не знаю, как перезапустить Linux из вашего менеджера загрузки.


Перезапустить все шаги

  • В главном меню выберите "перезапуск"
  • В командной строке введитеперезагрузка sudo

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