
我的機器上安裝了多個獨立的 Linux,然後重新啟動到合適的一個。我想知道是否可以在不完全重新啟動的情況下從一個切換到另一個,例如,複製 fstab 並列出新安裝的分區,然後mount -a
.
顯然,核心不會改變,但沒關係,我希望只改變工作分區。我還認為很明顯,這必須在沒有任何運行的情況下從命令列完成(如果可能的話)。或者這個想法從一開始就是無效的和純粹的瘋狂?
原因是我通常會在單獨的“實驗”安裝中嘗試根本性的更改(例如移至 Debian 中的“amd64”內核)。重新啟動來啟動它當然很好,但如果我可以在不完全重新啟動的情況下跳到該安裝,那就太酷了。您可以認為這只是動態更改根分區,但也許這根本不可能。
是的,這是可能的,正如我在下面所了解的那樣。如果您不需要換出核心本身,請使用“chroot”。如果您想模擬完全重新啟動,請使用“kexec”。
答案1
我認為這是不可能的。
理論上你想做的是:
- 使用 將系統移至“單一”運行級別
init 1
,理論上您只運行 init 和 bash。 - 卸載除 / 之外的所有分割區。此時您的系統可能會停止運作,這取決於 /usr 是否位於根分割區上。
- 將其他作業系統的根目錄安裝到某處。
- ivot_root 將根更改為新分割區。
init 5
告訴 init 透過運行(或 2 或任何合適的)來啟動新系統。
問題是pivot_root只改變目前進程的根分割區,這表示它不會影響init,當你告訴init啟動系統時,它會啟動你的舊系統。您需要某種方法來告訴 init 執行pivot_root,我認為這是不可能的。
哦,我們不要討論當您的其他作業系統使用不同的 init 服務時會發生什麼(例如,Fedora 使用 systemd,而 Ubuntu 使用 upstart)。您需要替換內核下的 init 進程(pid 1),這確實是不行的。
答案2
如果您想嘗試不同的內核,則必須重新啟動或在虛擬機器中執行它們。虛擬機器更方便,但你無法在真實硬體上測試核心。
如果您想對不同的已安裝組件進行不同的設置,您也可以使用虛擬機器。如果您想避免虛擬機器的開銷,您可以在chroot。我經常這樣做是為了在 64 位元安裝上輕鬆存取 32 位元程序,或者除了穩定版本(例如 Debian stable)之外還可以獲得最新的東西(例如 Debian stable)。我寫了一個為備用 Debian/Ubuntu 版本設定 chroot 的指南。也可以看看輕量級隔離linux環境
答案3
如果你不想要/需要更改內核,但只想使用其他文件系統,正如您在這裡指出的那樣:
顯然,核心不會改變,但沒關係,我希望只改變工作分區。
那麼也許你只需要(掛載和)chroot,用你的話來說,
您可以認為這只是動態變更根分割區
我一直在救援系統(如 Clonezilla)中使用 chroot 來與通常使用不同核心的檔案系統進行互動。我不希望能夠執行諸如加載新核心模組之類的操作,但它對於讀取和寫入檔案(修復 fstab、調整 grub.conf 等)來說很好。
您可以使用綁定安裝來使 chroot 環境更有用。我一直使用它來複製 chroot 目標內已安裝的檔案系統:
mount /dev/sda1 /mnt
for d in dev sys proc; do mount -obind /$d /mnt/$d; done
chroot /mnt