binfmt_misc 是 Linux 提供支援額外的執行檔格式的方法。舉例來說,我們想在 Linux 裡面執行 Microsoft Windows 的 .exe 執行檔,都會透過 wine 這套軟體來執行,於是我們執行程式的 指令就變成
coldnew@Rosia ~ $ wine application.exe
有沒有方法可以直接使用 Linux 執行程式的方式來執行 .exe 程式呢?透過 binfmt_misc 就可以辦到, 首先先載入 binfmt_misc 模組
coldnew@Rosia ~ $ sudo modprobe binfmt_misc
接著用以下指令註冊資訊到系統,這個命令可以讓 Linux 直接執行 .exe 程式 (還是透過 wine)
coldnew@Rosia ~ $ sudo echo ':Wine:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register
接著你就可以用以下方式來執行 .exe 的執行檔
coldnew@Rosia ~ $ ./application.exe
binfmt_misc 註冊資訊格式
binfmt_misc 註冊資訊的格式為 (各欄位用 : 隔開)
:Name:Type:Offset:Magic:Mask:Interpreter:
其內容如下
名稱 | 用途 |
---|---|
Name | 產生在 /proc/sys/fs/binfmt_misc 目錄下的檔案名稱,用來識別所支援的執行檔環境 |
Type | M 代表透過比對標頭檔(Header)來辨認執行檔 |
E 代表透過延伸的副檔名來辨認執行檔 | |
Offset | 用來表示比對標頭檔(Header)資料所偏移的位置,通常為 0,表示由檔案開頭進行比對 |
Magic | 要比對的檔頭資料或是副檔名的名稱 |
Mask | 用來 Mask 比對字串的位元,通常不使用 |
Interpreter | 指派我們執行該程式所使用的載入器,該程式將成為載入器的第一個參數 |
透過 proc 來修改註冊過的資訊
我們可以使用以下幾種方式來修改註冊過的資訊
清除已經註冊過的資訊
Rosia coldnew # echo -1 > /proc/sys/fs/binfmt_misc/status
停用模組
Rosia coldnew # echo 0 > /proc/sys/fs/binfmt_misc/status
啟用模組
Rosia coldnew # echo 1 > /proc/sys/fs/binfmt_misc/status
事實上 binfmt_misc 的好處不是只有讓你可以在指令行直接執行 *.exe 的執行檔, 透過他我們還可以 chroot 到 arm 平台的 linux root filesyetem, 這邊的步驟將在 在 x86 下 chroot 到 ARM 平台的 rootfs 一文進行說明。