Dual-Boot

可以在不啟動的情況下執行已安裝發行版磁碟中的執行檔嗎?

  • August 6, 2013

這個問題“弄清楚哪個作業系統在哪個分區上? ”讓我開始思考是否可以從已安裝的發行版執行執行檔而無需實際啟動到該發行版。

這個問題的答案“如何從 chmod -R 000 /bin 中恢復? ”讓我想到也許你可以從已安裝的發行版的分區中呼叫載入程序。

這可能嗎?

例子

當我嘗試它時,它沒有用,但我想我可能會遺漏一些其他的東西。

我嘗試使用的命令是lsb_release. 如果這很重要,我目前正在安裝 64 位 Fedora 14。

$ sudo /lib/ld-2.13.so /usr/bin/lsb_release
/usr/bin/lsb_release: error while loading shared libraries: /usr/bin/lsb_release: invalid ELF header

是的,前提是正在執行的核心能夠執行已安裝發行版中的二進製文件。

這要求安裝的發行版用於正在執行的處理器架構或兼容的架構。例如,您將無法在 x86 處理器上執行 ARM 二進製文件。兼容性取決於 CPU;例如,在 x86/amd64 上,64 位二進製文件僅在 64 位 CPU 上執行,而 32 位二進製文件同時在 32 位和 64 位 CPU 上執行。兼容性還取決於作業系統;例如,在 x86_64 CPU 上,Solaris 可以在 32 位和 64 位核心上無差別地執行 64 位和 32 位程序;Linux 64 位核心可以執行 32 位程序,反之則不行;而 OpenBSD 64 位核心無法執行 32 位程序。

靜態連結的執行檔將毫不費力地在原地執行,前提是它們不是在固定位置尋找文件。如果安裝的發行版具有更新版本的 C 庫,或者正在使用不同的 C 庫(例如 uClibc 與 Glibc),或者正在使用主機沒有使用者空間支持的不同架構,則動態連結的執行檔可能無法工作(例如 i386 與 amd64、armhf 與 armel)。

有時,要使動態連結的執行檔工作,您需要顯式呼叫動態連結器,並將已掛載系統的庫目錄放在庫搜尋路徑的首位。

LD_LIBRARY_PATH=/mnt/lib:/mnt/usr/lib /mnt/lib/ld-linux.so.2 /mnt/bin/foo

確保已掛載系統中的程序將在正確的位置(載入程序、庫、配置文件、數據文件等)找到所需的一切的簡單方法是在chroot中執行它。chroot 將文件系統的視圖限制為單個目錄及其子目錄。只有 root 可以呼叫該chroot命令。

chroot /mnt /bin/foo

由於程序/mnt以其根目錄執行,它不會看到該層次結構之外的任何內容:沒有/home(或者更確切地說,來自 的那個/mnt),沒有/proc,只有 的靜態預設值/dev,等等。特殊的文件系統,例如/proc可以安裝在chroot,從外部 ( mount -t proc proc /mnt/proc) 或從內部 ( mount -t proc proc /proc)。在 Linux 下,可以使用 或 將目錄重新掛載到第二個位置(同時保留它們已經存在的位置)mount --bindmount --rbind也可以複製掛載在指定目錄下的文件系統。

mount --rbind /dev /mnt/dev
mount --bind /home /mnt/home
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/foo

Debian 和其他一些發行版提供了一個名為schroot的工具來自動化此類掛載並執行其他細節。這對於一次性的事情來說有點過頭了,但如果你想維護多個發行版,它會很方便。

引用自:https://unix.stackexchange.com/questions/85629