重啟次數

重啟次數

Ubuntu 使用者經常需要快速重新啟動,例如在核心更新後或測試某些需要重新啟動的設定時。

我希望有一種方法(例如腳本)可以讓我在執行重新啟動時節省盡可能多的時間。

在使用者會話準備好之前,可以避免這些事情以減少重新啟動時間:

  • 如果可能,請跳過 BIOS/UEFI/韌體初始化和 POST
  • 跳過 GRUB 選單(預選一次所需項目並直接啟動,沒有任何逾時)
  • 跳過登入畫面(使用無密碼自動登入一次)

也許還有更多的事情可以跳過以快速重新啟動。

我見過快速重啟Ubuntu Wiki 中的規範,但該頁面的最後編輯時間為 2010 年 2 月 3 日。

但即使我們可能還無法正確使用所描述的方法kexec來跳過韌體初始化等內容,暫時預選 GRUB 條目並使用自動登入進行一次重新啟動應該是可能的。我該如何設定?

我在具有 UEFI 的 Acer Aspire E5-773G 機器上使用 Ubuntu 16.04(64 位元)和 Unity DE、lightdm 和 GRUB,與 Windows 10(很快還會有更多 Linux 發行版)進行雙重啟動。

答案1

重啟次數

在這個「過於忙碌」的世界中,我們有時可以推遲重新啟動,並且不想浪費 5 或 15 秒。當我第一次看到這個問題時,使用 SSD 並systemd進行調整後,我的啟動時間從 45 秒縮短到了 14 秒。

最近,我購買了一台「現代」筆記型電腦,配備 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

這次其實是調整。 80 秒的情況要糟糕得多,因為 nVidia 和 Dell 選擇切斷驅動 HDMI 連接埠的 nVidia GTX970M 顯示卡上 HDMI 音訊的電源。由於setpci需要這樣的命令,這會導致“低圖形錯誤”訊息,並且您必須等待 20 秒滑鼠指標才能繼續。然後它將重新加載所有圖形驅動程式並重新啟動 lightdm。

「現代」筆記型電腦的另一個問題是 BIOS POST 需要 15 秒。調整 BIOS 以關閉硬體錯誤檢查、關閉載入 NIC 啟動驅動程式以及其他我不記得的調整,剛剛將 BIOS POST 時間更改為 6 秒。相較之下,使用傳統 BIOS CSM 且沒有進行 BIOS 調整的「舊」筆記型電腦 BIOS POST 時間僅為幾秒鐘。


Ubuntu RapidReboot2010 年的項目

烏班圖快速重啟ByteCommander 的貼文中提到的項目是從 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

第一個命令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機器,請呼叫reboot核心函數。它將刷新磁碟(至少在核心版本 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 服務 $(cat /etc/X11/default-display-manager) 重新啟動

僅重新啟動步驟 2 和 3:

我不知道如何從啟動管理器重新啟動 Linux


重新啟動所有步驟

  • 在主選單中,選擇“重新開始
  • 從命令列輸入須藤重新啟動

相關內容