
我最近發現,如果我在啟動之前編輯 GRUB 並添加,rw init=/bin/bash
我最終會得到一個 root shell。
處於一種我想了解一切的狀態,我想知道為什麼會發生這種情況。我的意思是這是一個錯誤嗎?這是一個功能嗎?它是否可以幫助管理員解決問題,因為它只有在您可以實際存取電腦時才有效?
它是由 GRUB 還是實際內核提供的?
答案1
這是一項功能,用於系統維護:它允許系統管理員從混亂的初始化檔案中恢復系統或更改忘記的密碼。
紅帽郵件列表中的這篇文章解釋了一些事情:
在類別 Unix 系統中,init 是第一個運行的進程,也是所有運行的進程的最終祖先。它負責運行所有初始化腳本。
您告訴 Linux 核心將 /bin/bash 作為 init 運行,而不是系統 init。 [...]
因此,您沒有利用任何東西,您只是使用標準內核功能。
此外,正如評論中所述,該rw
標誌與 分開init=
,它只是告訴系統將根檔案系統掛載為讀寫(因此您可以編輯錯誤配置的檔案或更改密碼)。
答案2
您的系統具有運行和調試機制(如 init 參數),並且可能具有安全機制來阻止不需要的用戶利用它們。這些是功能,而不是錯誤。
引導程式負責啟動作業系統。作業系統安全顯然在此時不適用。您可以載入不同的核心、initrd、root fs 或設定不同的選項(如 init 路徑)。如果您想阻止使用者這樣做,則必須在引導程式中完成。
您的系統(可能是 PC,即 BIOS)會載入引導程序,因此顯然引導程式安全性不適用於它。如果您想阻止使用者從 USB 等方式啟動 BIOS,您需要在該層級上執行此操作。
您的系統可能位於桌子上的某個地方。如果您想阻止使用者開啟電腦並將硬碟切換為自己的硬碟或移除磁碟機以將其安裝到他們的電腦中,您需要在實體層級上執行此操作。但這並不能阻止他們拿起整張桌子並開著他們的逃亡車離開...
安全就是這樣。大像一路下來。
答案3
這就是內核的設計方式。必須有某物在電腦啟動時運行,雖然有預設值,但內核命令列允許您更改該預設值。
通常它運行一個名為“init”的程序,通常可以在/bin/init
或 處找到/sbin/init
。該程式負責所有系統啟動並創建可用環境。
指定init=/bin/bash
告訴內核運行/bin/bash
(這是一個 shell)。指定rw
告訴核心以讀寫模式而不是唯讀模式引導硬碟。傳統上,核心以唯讀模式啟動磁碟,然後在切換到讀寫模式之前檢查磁碟的完整性。
答案4
init=
可以採取任何執行檔
init=
可以接受任何可執行文件,包括外殼腳本。根本原因很可能是exec
syscall 可以直接處理 ELF 執行檔和 shebangs。
例如,我在這裡示範如何建立任意最小的 C 編譯init
:如何建立一個只運行一個程式而不運行其他程式的自訂 Linux 發行版?
那為什麼會這樣不是Accept /bin/bash
,最重要的是,它只是一個常規的可執行文件,實際上有用嗎? :-)
init
接下來,您還應該嘗試了解與您的常規系統(例如 systemd 或 Busybox)之間的權衡是什麼?
基本上,使用 raw /bin/bash
,您:
- 失去使用密碼控制登入的能力。但這有時是可取的,例如在進行系統模擬時:如何在 Buildroot BusyBox init 中無需輸入 root 使用者名稱或密碼而自動登入?
- 失去工作控制,例如 Ctrl + C 不起作用
- 如果您執行 Ctrl+C,則 shell 退出,並且核心會因
init
存在而出現恐慌
作業控制可以在 Busybox 的 init 和其他類似的 init 上恢復,並帶有-
以下開頭inittab
:
tty3::respawn:-/bin/sh
更正常的inittab
條目,使用登入並在您執行 Ctrl+D 時保持產生 shell 是:
::respawn:/sbin/getty -L ttyS0 0 vt100
它使用getty
可執行文件,但 TODO:如果沒有 Busybox ,我自己無法產生這些文件init
:getty 從命令列啟動?
您可以使用這個設定試試看並得出上述結論。