透過 binfmt_misc 讓 Linux 可以執行不同格式的執行檔

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 一文進行說明。