我怎样才能更快地重新启动?

Byt*_*der 8 reboot boot grub2 login uefi

Ubuntu 用户经常需要快速重启,例如在内核更新后或测试一些需要重启的设置时。

我想要一种方法(例如脚本),可以让我尽可能多地节省执行重启的时间。

在用户会话准备好之前,可以避免这些事情以减少重新启动时间:

  • 如果可能,跳过 BIOS/UEFI/固件初始化和 POST
  • 跳过 GRUB 菜单(预先选择所需的条目一次并直接启动它,没有任何超时)
  • 跳过登录屏幕(使用无密码自动登录一次)

也许还有更多的东西可以跳过以快速重启。

我在 Ubuntu Wiki 中看到了RapidReboot规范,但该页面的最后编辑时间为 2010 年 2 月 3 日。

但是,即使我们可能还不能正确地使用所描述的kexec来跳过固件初始化和其他内容,暂时预选 GRUB 条目并使用自动登录进行一次重新启动应该是可能的。我该如何设置?

我在带有 UEFI 的 Acer Aspire E5-773G 机器上使用 Ubuntu 16.04、64 位和 Unity DE、lightdm 和 GRUB 与 Windows 10(很快还有更多 Linux 发行版)进行双启动。

Win*_*nix 4

重启次数

在这个“过于忙碌”的世界中,我们有时可以推迟重新启动,并且不想浪费 5 或 15 秒。当我第一次看到这个问题时,使用 SSD 并进行调整后,我的启动时间从 45 秒缩短到了 14 秒systemd

最近,我购买了一台“现代”笔记本电脑,配备 NVMe M.2 Gen 3.0 x 4 SSD,Windows 读取速度高达 3.4 GB/s,Linux 读取速度高达 2 GB/s。所以应该会更快吧?不。它慢得令人痛苦:

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

这次其实是经过调整之后的。80 秒的情况要糟糕得多,因为 nVidia 和 Dell 选择切断驱动 HDMI 端口的 nVidia GTX970M 显卡上 HDMI 音频的电源。由于setpci需要这样的命令,这会导致“低图形错误”消息,并且您必须等待 20 秒鼠标指针才能继续。然后它将重新加载所有图形驱动程序并重新启动 lig​​htdm。

“现代”笔记本电脑的另一个问题是 BIOS POST 需要 15 秒。调整 BIOS 以关闭硬件错误检查、关闭加载网卡启动驱动程序以及其他我不记得的调整,刚刚将 BIOS POST 时间更改为 6 秒。相比之下,使用传统 BIOS CSM 且未进行 BIOS 调整的“旧”笔记本电脑 BIOS POST 时间仅为几秒钟。


Ubuntu RapidReboot2010 年的项目

ByteCommander 的帖子中提到的Ubuntu RapidReboot项目是从 2010 年开始的。该项目的基本原理总结如下:

基本原理

在某些情况下,我们可以放心地假设用户不想看到引导加载程序;在这些情况下,我们应该使用 kexec 来避免长时间的重新启动、BIOS POST 和引导加载程序时间。在最佳情况下,这可能需要 10 秒;但对于 SCSI 或 RAID BIOS 以及网络引导 rom,时间可能会攀升至 20、30 甚至超过 60 秒,即使在加载内核和看到登录屏幕之间的时间为 30-60 秒的情况下也是如此。

该项目的使用示例:

用例

  • Bob 刚刚升级了他的内核;update-notifier 通知他必须重新启动才能使更改生效,并且“重新启动”按钮使用 kexec 来加快速度。
  • Alice刚刚升级了dbus;update-notifier 告诉她重新启动,并使用 kexec。
  • Seveas 在过去一个月中执行了多次更新,由于不同的程序使用不同的共享库副本,现在面临着三倍的内存压力。他决定重新启动以清除此问题,并使用“快速重新启动”来加快速度。
  • Keybuk 刚刚安装了 Ubuntu Edgy 并想要启动它。LiveCD使用kexec加载目标内核和initrd;卸载所有基于磁盘的文件系统;同步; 然后使用 kexec 启动新系统而不是重新启动。

使用 kexec 重新启动

kexec是我们施展的魔法,无需 BIOS 开机自检和其他一些低级发现机制(例如 RAID 设置)即可重新启动。

CONFIG_KEXEC内核必须使用标志编译

第一步是确保您的内核是使用以下CONFIG_KEXEC=y选项编译的:

$ uname -r
4.14.2-041402-generic
$ grep KEXEC= /boot/config-`uname -r`
CONFIG_KEXEC=y
Run Code Online (Sandbox Code Playgroud)

第一个命令uname -r是可选的,只是为了显示您使用什么内核启动。正如我们在第二个命令中看到的,内核是由 Ubuntu 团队编译的,并设置了必要的标志。不确定何时添加,但可能 <= 2012 年。

安装kexec-tools

下一步是安装kexec用户空间的工具:

$sudo apt install kexec-tools
Run Code Online (Sandbox Code Playgroud)

正常的二进制下载后,您会看到以下屏幕:

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) ...
Run Code Online (Sandbox Code Playgroud)

配置kexec

我们 ArchLinux 的团队有很棒的 kexec 文档,但它需要针对 Ubuntu / Debian 发行版进行修改。

基本用法是使用两个命令:

sudo kexec -l /boot/vmlinuz-`uname -r` --initrd=/boot/initrd.img-`uname -r` --reuse-cmdline
sudo kexec -e
Run Code Online (Sandbox Code Playgroud)

从现在开始,每次您单击重新启动时都会出现它,它会自动以快速重新启动模式重新加载最后一个内核。

使用 Systemd 加载 kexec

创建文件/etc/systemd/system/kexec-load@.service

[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
Run Code Online (Sandbox Code Playgroud)

然后启用要加载的内核的服务文件,例如简单地设置当前内核uname -r

$ sudo systemctl enable kexec-load@`uname -r`
Created symlink from /etc/systemd/system/kexec.target.wants/kexec-load@4.4.0-101-generic.service to /etc/systemd/system/kexec-load@.service.
Run Code Online (Sandbox Code Playgroud)

然后到 kexec:

$ sudo systemctl kexec
Run Code Online (Sandbox Code Playgroud)

如果您正在youtube运行,则可能存在系统抑制剂,阻止您重新启动,在这种情况下请使用:

$ sudo systemctl kexec -i
Run Code Online (Sandbox Code Playgroud)

如果您希望为下一个 kexec 加载不同的内核,例如 4.12.2-041202-generic,请禁用当前内核的服务并为新内核启用该服务:

$ sudo systemctl disable kexec-load@`uname -r`
$ sudo systemctl enable kexec-load@4.12.2-041202-generic
Run Code Online (Sandbox Code Playgroud)

更多即将推出

我现在必须发布这个答案,因为是时候启动、修复、启动、修复、重复。我有一个复杂的设置,其中systemd加载了五个nVidia驱动程序,我必须卸载它们,运行setpci以打开 HDMI 音频电源,重新加载 nVidia 驱动程序并重新启动 lig​​htdm。可能需要一段时间才能锻炼出来。

在使这些cli方法起作用后,我将创建一个桌面快捷方式,以便在提示密码的情况下一键重新启动sudo。之后,我将创建一个yad对话框的桌面快捷方式,允许您从已安装的内核中进行选择以重新启动。类似于grub的高级选项菜单。


san*_*rys -2

如果你想部分重启你的计算机(而不是加速启动),我的理解是:Linux启动有3个主要部分:

  1. 第 1 步:计算机启动直至选择启动管理器/操作系统(rEFInd、Grub...)
  2. 第2步:启动Linux和主要服务
  3. 第 3 步:开始会话
    • 用户登录
    • 窗口管理器,如 Cinnamon、KDE、Gnome,...)

仅重新启动步骤 3:

  • 键入Alt-F2R
  • 或者sudo service $(cat /etc/X11/default-display-manager) restart

仅重新启动步骤 2 和 3:

我不知道如何从启动管理器重新启动 Linux


重新启动所有步骤

  • 在主菜单中选择“重新启动
  • 从命令行输入sudo restart