
Часто возникают ситуации, когда пользователям 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
После обычной загрузки бинарных файлов вы увидите следующий экран:
Я ответил 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
Приятной перезагрузки!
решение3
Если вы хотите частично перезагрузить компьютер (а не ускорить загрузку), то, как я понимаю, загрузка Linux состоит из 3 основных частей:
- Шаг 1: Загрузка компьютера до выбора менеджера загрузки/ОС (rEFInd, Grub, ...)
- Шаг 2: Запуск Linux и основных служб
- Шаг 3: Начать сеанс
- Логин пользователя
- оконный менеджер, такой как Cinnamon, KDE, Gnome, ...)
Перезапустите только шаг 3:
- ТипAlt-F2ир
- Илиsudo service $(cat /etc/X11/default-display-manager) перезапустить
Перезапустите только шаги 2 и 3:
Я не знаю, как перезапустить Linux из вашего менеджера загрузки.
Перезапустить все шаги
- В главном меню выберите "перезапуск"
- В командной строке введитеперезагрузка sudo