
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 RapidReboot
2010 年的項目
烏班圖快速重啟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
正常的二進位下載後,您會看到以下畫面:
我回答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
祝你重啟愉快!
答案3
如果你想部分重啟你的電腦(而不是加速啟動),我的理解是:Linux啟動有3個主要部分:
- 步驟1:電腦啟動直至選擇啟動管理器/作業系統(rEFInd、Grub...)
- 第2步:啟動Linux和主要服務
- 步驟3:開始會話
- 使用者登入
- 視窗管理器,如 Cinnamon、KDE、Gnome,...)
僅重新啟動步驟 3:
- 類型Alt-F2和右
- 或者sudo 服務 $(cat /etc/X11/default-display-manager) 重新啟動
僅重新啟動步驟 2 和 3:
我不知道如何從啟動管理器重新啟動 Linux
重新啟動所有步驟
- 在主選單中,選擇“重新開始」
- 從命令列輸入須藤重新啟動