2016年4月10日 星期日

如何製作可以在 Windows OS 執行的 ipmitool

這篇文章的目的, 主要是記錄如何使用 Cygwin 產生出可以在 Windows OS 上執行的 ipmitool.
如果你是想要使用 Windows 原生的驅動程式, 如: Intel IMB IPMI driver (imbdrv.sys) / Microsoft IPMI driver (ipmidrv.sys), 那就要使用 ipmiutil.


0. 編譯 ipmitool 時的失敗記錄:
  • 0.1 ipmi_sunoem.c:1168:4: error: unknown type name 'fd_set'
  •     我的 Windows 7 x64 系統上不會出現這個錯誤, Windows 10 x64 上有看到
  •     Bug ID 440: 1.8.17 已解決這個問題
  • 0.2 Avast 免費家用版: 會造成錯誤
  • 0.3 沒有 include file: usb.c:43:21: fatal error: scsi/sg.h: No such file or directory
  •     Bug ID 410: 說明請看 7.0,  v1.8.17 已解決這個問題


1. 下載 32-bit 64-bit 的安裝程式
https://www.cygwin.com/setup-x86_64.exe

2. 安裝時選擇下列的套件, 相依性套件 Cygwin setup program 會幫你選好
改用參數選擇要安裝的套件
  • gcc-core
  • make
  • openssl-devel
  • libssl-devel  (Sheng 2019/10/18 補充: libssl-devel 取代 openssl-devel)
  • diff
  • Fisher 2017/08/17 補充: Windows 10 / Cygwin 64, 尚須
  • autoconf
  • automake
  • m4
  • libtool
  • Puwen 2018/03/02 補充: 如果需要支援 ipmishel
  • libncurses-devel
  • libreadline-devel

$ setup-x86_64 --quiet-mode --disable-buggy-antivirus --upgrade-also --wait --arch="x86" --root="c:\cygwin" --only-site --site="ftp://ftp.cse.yzu.edu.tw/pub/cygwin/" --packages="bash,p7zip,libssl-devel,git,gcc-core,make,diff,autoconf,automake,m4,libtool,libncurses-devel,libreadline-devel" --verbose --no-admin
$ setup-x86_64 --quiet-mode --disable-buggy-antivirus --upgrade-also --wait --arch="x86" --root="d:\cygwin" --only-site --site="http://ftp.ntu.edu.tw/pub/cygwin/" --packages="bash,p7zip,libssl-devel,git,gcc-core,make,diff,autoconf,automake,m4,libtool,libncurses-devel,libreadline-devel" --verbose --wait




3. 下載 ipmitool 的 source code




4. 開啟 [Cygwin Terminal] 後, 解壓縮 ipmitool-1.8.18.tar.bz2

$ git clone https://github.com/ipmitool/ipmitool.git
$ cd ipmitool


5. 設定要支援的 interface , 需要 disable usb 因為 Cygwin 中沒有 kernel header files.

$ ./bootstrap
$ ./configure IANADIR="./" IANAUSERDIR="./" DEFAULT_INTF="lanplus" --enable-intf-lan --enable-intf-lanplus --disable-intf-bmc --disable-intf-free --disable-intf-open --disable-intf-imb --disable-intf-usb --enable-intf-serial --enable-ipmishell
$ LANG=C make


6. 把下列目錄裡的檔案, 單獨複製到一個目錄即可在不同的 Windows 中使用

$ mkdir -p $HOME/ipmitool-1.8.18-bin
$ cp src/.libs/ipmitool.exe $HOME/ipmitool-1.8.18-bin
$ cd $HOME/ipmitool-1.8.18-bin
$ cp /bin/cygreadline7.dll .
$ cp /bin/cygwin1.dll .
$ cp /bin/cygcrypto-1.1.dll .
$ cp /bin/cyggcc_s-1.dll .
$ cp /bin/cygncursesw-10.dll .
$ cp /bin/cygz.dll .
$ curl https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers -o enterprise-numbers
$ 7za a "/cygdrive/c/Users/$(echo $USERPROFILE|awk -F\\ '{print $NF}')/Desktop/ipmitool-1.8.18-bin_$(date +%F).7z" "$PWD/*"


    PS. 根據參考網頁的說明, [ipmitool-1.8.XX\src\ipmitool.exe] is only a wrapper script

7. 附註

  • 7.1 沒有 [--disable-intf-usb] 會出現的錯誤訊息

without --disable-intf-usb
Interfaces
  lan : yes
  lanplus : yes
  open : no
  free : no
  imb : no
  bmc : no
  usb : yes
  lipmi : no
  serial : yes
  dummy : no
usb.c:43:21: fatal error: scsi/sg.h: No such file or directory


  • 7.2 Windows 7 64-bit compile 後的檔案在 Windows Server 2008 R2 Standard 64-bit with SP1 上的執行截圖


8. Binaries for Windows


參考網址:
How to compile ipmitool for Windows 32-bit (404)
https://www.rodneybeede.com/How_to_compile_ipmitool_for_Windows_32-bit.html
ipmitool for windows
https://stackoverflow.com/questions/12907005/ipmitool-for-windows

更新記錄:
2020/05/09 19:01, 最佳化 Cygwin 安裝流程, 使用 git 下載 ipmitool 的 source code.
2019/10/19 08:22, 加入 Sheng 與 Andy 的回饋.
2018/03/02 12:56, 更新成 ipmitool-1.8.18, 加入 --enable-ipmishell
2016/05/19 09:35, 加入 LANG=C
2016/05/19 09:26, 加入 ./bootstrap
2016/05/09 13:25, USB Issue been fixed by 1.8.17
2016/05/08 22:16, ipmitool-1.8.17 釋出, 加入 [Binaries for Windows]
2016/04/26 16:23, 加入 7.0/7.1
2016/04/24 23:16, 加入  Code Block CSS
2016/04/22 22:06, 更新 unknown type name 'fd_set'

30 則留言:

  1. 你好我安照你的方式作完可以windows7 64bit使用,但無法在windowsserver2008 64bit下使用,不知是什麼問題

    回覆刪除
    回覆
    1. Hi Sam,
      我手邊沒有 Windows Server 2008 64-bit 的環境,
      你可以附上錯誤訊息的截圖或 log 嗎?

      刪除
  2. Hi Puwen
    我後來直接在windows2008 64BIt下重新compile,目前已可以使用了
    只是想了解一下,是否有方式可以一次compile for 所有的windows版本皆可使用,謝謝!!

    回覆刪除
    回覆
    1. Hi Sam,
      理論上你把 [Section 6] 的東西放在一塊,
      丟到其它的 Windows 都可以用.
      我早上裝了一個 Windows 2008 R2 Standard 64-bit w/ SP1 的 VM,
      把在 Windows 7 上產出的檔案放到 VM 上,
      是可以執行的.
      請看 [Section 7.1]

      刪除
  3. windows 10/cygwin64编译

    还需要
    autoconf
    automake
    m4
    libtool

    回覆刪除
    回覆
    1. Hi Fisher,

      感謝你的資訊, 已更新到文章中.

      刪除
  4. 十分感谢博主的资料,讲的非常详细!

    回覆刪除
  5. 請問這個做出來的ipmitool.exe 可以執行 -I ms 或是對Local的BMC做下指令嗎??

    回覆刪除
    回覆
    1. 不行, 用要 Microsoft IPMI Driver 可以試看看 ipmiutil - http://ipmiutil.sourceforge.net/

      刪除
    2. 同事提供的舊版本1.8.10可以做到。
      新版本不行了嗎?謝謝

      刪除
    3. 我在 ipmitool source code 裡找不到 ms 這個 interface. 所以合理推測是提供你同事 v1.8.10 的人 (公司) 自行加入的. 也許你可以問一下你同事, 看提供者有沒有給出新的版本.

      刪除
  6. 您好,請問這樣build出來的ipmitool是不是只能支援Out-Of-Band的command呢?
    如果我用In-Band的方式下ipmi command,ex: ipmitool.exe sel
    會顯示"no hostname specified".

    回覆刪除
    回覆
    1. Hi,
      如果要在 Windows 下使用 system interface,
      可以參考看看 ipmiutil http://ipmiutil.sourceforge.net/

      刪除
  7. 您好,我依照您的方法後,發現lanplus無法啟用,經過爬文,lanplus要 "libssl-devel"這隻套件,但"openssl-devel"與"libssl-devel"套件衝突,所以要移除"openssl-devel"。

    回覆刪除
    回覆
    1. 補充:
      OS:Windows 10
      ipmitool Version: 1.8.18

      刪除
    2. Hi Sheng,

      感謝提醒, 我會更新文章內容 :)

      但 openssl-devel 與 libssl-devel 二個都是 OpenSSL 的 development library. 只是在 Cygwin 中, 用 libssl-devel 取代 openssl-devel.

      且 https://cygwin.com/packages/summary/openssl-devel.html 有提示, The openssl-devel package is obsolete. Selecting this package for installation will cause the libssl-devel package, which replaces this one, to be installed instead.

      所以你的無法啟用 lanplus 會不會是其它的原因造成的?

      刪除
    3. Hi Puwen,

      剛開始我安裝了openssl-devel:1.1.1d-1,進行configure時,lanplus總是無法被Enable.

      The relevant log snippet is:
      checking for EVP_aes_128_cbc in -lcrypto... no
      checking for MD5_Init in -lcrypto... no
      checking for MD2_Init in -lcrypto... no
      ** The lanplus interface requires an SSL library with EVP_aes_128_cbc defined.

      查詢一下Bug list後,在/usr/bin/底下需要有"libcrypto.a"及"libcrypto.dll.a"這兩個檔案,而在我未安裝libssl-devel前,目錄底下是沒有這兩個檔案的.

      The Bug list:
      https://sourceforge.net/p/ipmitool/bugs/458/
      https://sourceforge.net/p/ipmitool/bugs/441/
      https://github.com/ipmitool/ipmitool/issues/34

      這裡要跟您說聲抱歉,因為我不是專業人士,不懂lanplus無法啟用的原因是否為libssl-devel,但我確實是因為安裝了套件後,才在編譯時能Enable.
      備註:我在重新補安裝libssl-devel套件時,確實只有安裝一支libssl-devel,並且安裝程序顯示與openssl-devel套件衝突.

      刪除
  8. Hi,您好,我window10 64位系统,依照您的方法後,可以make,但是make过程出现错误,如下:
    lanplus_crypt_impl.c: In function 'lanplus_encrypt_aes_cbc_128':
    lanplus_crypt_impl.c:167:17: error: storage size of 'ctx' isn't known
    167 | EVP_CIPHER_CTX ctx;
    | ^~~
    lanplus_crypt_impl.c:167:17: warning: unused variable 'ctx' [-Wunused-variable]
    lanplus_crypt_impl.c: In function 'lanplus_decrypt_aes_cbc_128':
    lanplus_crypt_impl.c:242:17: error: storage size of 'ctx' isn't known
    242 | EVP_CIPHER_CTX ctx;
    | ^~~
    lanplus_crypt_impl.c:242:17: warning: unused variable 'ctx' [-Wunused-variable]
    make[4]: *** [Makefile:432: lanplus_crypt_impl.lo] Error 1
    make[4]: Leaving directory '/home/ipmitool-1.8.18/src/plugins/lanplus'
    make[3]: *** [Makefile:485: all-recursive] Error 1
    make[3]: Leaving directory '/home/ipmitool-1.8.18/src/plugins'
    make[2]: *** [Makefile:584: all-recursive] Error 1
    make[2]: Leaving directory '/home/ipmitool-1.8.18/src'
    make[1]: *** [Makefile:459: all-recursive] Error 1
    make[1]: Leaving directory '/home/ipmitool-1.8.18'
    make: *** [Makefile:390: all] Error 2

    回覆刪除
    回覆
    1. Hi Unknown,

      由下面這二個 link 來看,
      https://github.com/ipmitool/ipmitool/issues/161
      https://stackoverflow.com/questions/55992010/openssl-error-storage-size-of-ctx-isn-t-known

      錯誤應該是 openssl 的版本所造成,
      請試看看用不同版本.

      刪除
  9. 感謝博主的整理和回應,
    我也遇到相同問題, 並試了openssl 1.1.1c/d/f, 皆無法成功
    從您提供的link https://github.com/ipmitool/ipmitool/issues/161
    按照下方junlizhang 2020/02/22提供的檔案lanplus_crypt_impl.txt做修改後, 解決了此問題:D
    解決當下openssl版本為1.1.1c-1

    回覆刪除
    回覆
    1. Hi,
      我更新了新流程, 在全新的安裝下看起來是沒有問題.
      使用最新的 source code (2020/05/09).
      也不用上 patch (也有可能是整合進去了?).
      如果你還有需要的話可以再試看看.

      刪除
  10. 在windows 2019上執行./bootstrape會出現%\r command not found
    解決辦法 下載dos2unix
    在cywin terminal內轉換格式 dos2unix bootstrape

    回覆刪除
    回覆
    1. 作者已經移除這則留言。

      刪除
    2. 不只有bootstrap 我直接dos2unix * 把所有的都改就可以過
      只有改bootstrap在1.8.18 ./bootstrap可以過
      但是在./configure的時候會有其他問題
      而在master還是要改其他檔案 ./bootstrap才會過
      總之~直接dos2unix * 比較快
      OS: Windows Server 2019

      另外如果懶得解決"unused variable 'ctx"的問題
      直接build master的code也可以 這問題在master已解

      刪除
    3. 你遇到的現象還蠻奇怪的說.
      我剛才試了一下, source code 是由 github 下載的.
      解壓縮後 bootstrap 是 LF 沒錯.
      你可以說一下 source code 的來源嗎?

      刪除
    4. Hi,
      我更新了新流程, 在全新的安裝下看起來是沒有問題.
      使用最新的 source code (2020/05/09).

      刪除
    5. https://github.com/ipmitool/ipmitool.git
      我從這裡git clone下來的

      刪除
    6. 你是在 Cygwin Terminal 中執行 git command嗎?
      不然你遇到的現象算是正常,它跟你 git 的設定有關。

      刪除
  11. 感謝博主的分享,但我遇到另一個問題,想要詢問您...
    因為OEM的hex code無法被ipmitool有效的翻譯, 而我在help指令內中, 發現了-O的參數, 並且嘗試修改contrib\oem_ibm_sel_map檔案, 但我失敗了, 我始終無法將Unknown Event自動翻譯, 不知道博主是否有這方面的研究?

    回覆刪除
    回覆
    1. Hi sheng,
      因為這個功能只針對 OEM SEL 有用.
      實際範例:
      // oem_event.txt 的內容
      # cat oem_event.txt
      "0xC1","XX","XX","XX","XX","XX","XX","XX","XX","XX","XX","XX","XX","XX","CPU shutdown - Potential cause 'triple fault' a software address problem"

      // 手動產生一筆 OEM SEL (Record Type 0xC1)
      # ipmitool raw 0x0a 0x44 0x00 0x00 0xC1 0x00 0x00 0x00 0x00 0x20 0x00 0x04 0x10 0xff 0x6f 0x02 0xff 0xff
      02 00

      // 使用 oem_event.txt 轉換 OEM SEL 的說明
      # ipmitool -O oem_event.txt sel list
      nrecs=1
      2 | 01/22/2021 | 15:52:38 | OEM record c1 | 040020 | 10ff6f02ffff | CPU shutdown - Potential cause 'triple fault' a software address problem

      刪除