UEFIブートのサーバでWindows Server 2016のインストール用USBメモリが起動しない


hpeのProLiantサーバにWindows Server 2016をインストールする場合、通常はIntelligent Provisioning を使う。

しかし、Administratorパスワードが不明な場合、Windows Server 2016の標準ISOイメージのレスキューモードで起動することになるのだが、Smart Array B140i用のドライバが含まれていないため、内蔵ディスクが見えない。

対処するためにはISOイメージ内のsources\boot.wim にDSIMコマンドを使ってAdd-driverすることになる。

手順は「Windows インストールメディアにドライバーを追加する」にあるものをほぼそのまま使い、下記の様に実施した。

カスタマイズしたWindows Server 2016ISOイメージの作り方

1. 作業用Windows10を用意
2. Windows ADK 1709の「Deployment Tools」と「Windows Preinstallation Environment (Windows PE)」をインストール
3. メニューの登録されている「展開およびイメージング ツール環境」を選択してコマンドプロンプトを起動
4. 「copype amd64 c:\work\pe_x64」(今回、C:\work を作業用ディレクトリとした)でWindows PE環境を展開
5. C:\work\iso にWindows Server 2016 ISOの中身をコピー
6. マウント用ディレクトリ c:\work\offline を作成
7. 「dism /get-imageInfo /imagefile:”C:\work\iso\sources\boot.wim”」でインデックス番号を確認
 インデックス1とインデックス2があることを確認
 レスキューの際にどちらを使うかわからないので、とりあえず両方使う

8. まずインデックス1をc:\work\offlineにマウント
「dism /mount-image /imagefile:”C:\work\iso\sources\boot.wim” /index:1 /mountdir:”C:\work\offline”」

9. smart array b140i用のドライバをc:\work\hpedriver に展開

10. ドライバを追加。複数ある場合も考慮して、/recurseオプション付きで実行
「dism /add-driver /image:”c:\work\offline” /driver:”c:\work\hpedriver” /recurse」

11. ドライバが追加されたことを確認
「dism /get-drivers /image:”c:\work\offline”」

12. アンマウントする
「dism /unmount-image /mountdir:”c:\work\offline” /commit」

13. 今度はインデックス2に対して実行
「dism /mount-image /imagefile:”C:\work\iso\sources\boot.wim” /index:2 /mountdir:”C:\work\offline”」

14. ドライバを追加。複数ある場合も考慮して、/recurseオプション付きで実行
「dism /add-driver /image:”c:\work\offline” /driver:”c:\work\hpedriver” /recurse」

15. ドライバが追加されたことを確認
「dism /get-drivers /image:”c:\work\offline”」

16. アンマウントする
「dism /unmount-image /mountdir:”c:\work\offline” /commit」

17. oscdimgコマンドを実行してISOイメージの作成
「oscdimg -m -o -u2 -udfver102 -bootdata:2#p0,e,bc:\work\PE_x64\fwfiles\etfsboot.com#pEF,e,bc:\work\PE_x64\fwfiles\efisys.bin c:\work\iso c:\work\win2016-new.iso」

これで、作成したISOイメージをFAT32でフォーマットしたUSBメモリにコピーしようとしたところ、install.wimのコピーで失敗した。

原因はinstall.wimのサイズがFAT32制限である4GB以上の約6GBであるためです。

NTFSもしくはexFATでフォーマットしなおしたところ、コピーはできたものの、サーバ側で起動ディスクとして認識せず、起動できなかった。

確認したところ、 UEFIの場合、ファイルシステムがFAT32であること、という前提があった。 この制限については、マイクロソフトの「起動可能な USB フラッシュ ドライブを作成します。」に記載がされている。

サーバー プラットフォームが Unified Extensible Firmware Interface (UEFI) をサポートする場合は、NTFS ではなく FAT32 として、USB フラッシュ ドライブをフォーマットする必要があります。 フォーマットするパーティションを FAT32 として、次のように入力します。 format fs=fat32 quick、し、[入力] をクリックします。

ブート可能な USB フラッシュ ドライブの作成

この記事を書くきっかけとなった件ではiLO Advancedライセンスがあったため、isoイメージをiLOからマウントすることで、DVDを作成する必要はなく対応することができた。

しかし、USBメモリを使ってWindows Server 2016のインストールを行う手法があるかどうか
つまりは4GBを超えてしまったinstall.wimをダイエットすることができるのか、分割することはできるのか、という点は不明なままであった・・・


2018/03/13追記

Microsoftの公式記述を発見した。

手法1「WinPE: Store or split images to deploy Windows using a single USB drive
 USBメモリにパーテーションを2つ作り、FAT32のメイン領域と、NTFSのinstall.wimのみをおく領域を作る、というもの

手法2「Split a Windows image file (.wim) to span across multiple DVDs
Dism /Split-Imageコマンドを使ってinstall.wimをinstall.swmに分割するというもの

Dism /Split-Image /ImageFile:C:\work\iso\sources\install.wim /SWMFile:C:\work\iso\sources\install.swm /FileSize:4000

(上記ページだと4700となっているけど、4GB超えてて大丈夫なの?と心配なので余裕をもって)

2020/12/21 追記

これを再度hpe dl360 gen10環境で実施する必要があったので確認した。

(1) FAT32フォーマットのUSBドライブ(Eドライブにマウント)にISOの中身(Dドライブにマウント)を全部コピーするも install.wim のみエラー
(2) コマンドプロンプト開いて「 dism /split-image /imagefile:d:\sources\install.wim /swmfile:e:\sources\install.swm /filesize:4000」を実行
(3) e:\sources\ にinstall.swm とinstall2.swm ができていることを確認
(4) できたUSBメモリで起動

ネットワーク上にあるhpサーバのiLO IPアドレスとライセンスを収集するスクリプト


2019/01/09 追記

オリジナルのNachoTech Blogがアクセスできなくなっていたので、「https://github.com/osakanataro/findilos」にオリジナルと後述の改変版をアップロードした。


hpサーバをリモートから制御するために使用するiLO。
稼働させたあとにIPアドレスを確認するのがめんどくさい。
そういう場合に、総当たりでiLOのIPアドレスを確認するスクリプトがあった。

NachoTech Blogの「How to find all the iLO’s on your network」にあるfindilosである。

早速ダウンロードして実行してみる。

[root@adserver ~]# ./findilos 172.17.17.0/24
Scanning...
--------------- ------ -------- ------------ -------------------------
iLO IP Address  iLO HW iLO FW   Server S/N   Server Model
--------------- ------ -------- ------------ -------------------------
172.17.17.xxx   N/A    1.26     CN71xxxMxx   ProLiant DL360 G7
1 iLOs found on network target 172.17.17.0/24
[root@adserver ~]#

iLO HWのモデル名は拾ってくれない。

blogのコメントを確認していくと、元のスクリプトはiLO-2までしか対応しておらず、その後のバージョンについてはコメント欄にある修正を実施すれば良いようだ。

また、iLO Advanceを買っている場合に、そのライセンスコードを表示するための案も提示されていた。

ただ、スクリプト例は汚い実装となっていて、せっかくの元スクリプトを活かしていない形だったので、元スクリプトの実装に従ってライセンスを表示するバージョンを作成した。

その実行例がこちら

[root@adserver ~]# ./findilos 172.17.17.0/24
Scanning...
--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------
iLO IP Address  iLO HW iLO FW   Server S/N   Server Model              iLO Edition          iLO Licence Key
--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------
172.17.17.xxx   iLO-3  1.26     CN71xxxMxx   ProLiant DL360 G7         iLO 3 Advanced       xxxxx-xxxxx-xxxxx-xxxxxx-xxxxx
1 iLOs found on network target 172.17.17.0/24
[root@adserver ~]#

スクリプトの修正例は以下

#!/bin/bash
#
# findilos - Search a local network segment for iLOs
#            The iLO is the Integrated Lights-Out management processor
#            used on HP ProLiant and BladeSystem servers
#
scriptversion="1.0"
#
# Author: iggy@nachotech.com
#
# Website: http://blog.nachotech.com
#
# Requires: tr sed expr curl nmap
#
# Tested with: Nmap 4.20, curl 7.17.1, RHEL4
#
# Note: Discovery of an iLO is dependent upon the Virtual Media port
#       being set to the default of 17988.  If this has been changed
#       by the iLO administrator, then this script will NOT find it.
#
#       Also, if the iLO XML Reply Data Return has been Disabled by
#       the iLO administrator, this script will not be able to
#       gather any information about the server.  It will still be
#       discovered, but all you will see is its IP address.
#
# GLOBAL VARIABLES
scriptname="findilos"
iloips="/tmp/tmpilos.$$"
iloxml="/tmp/tmpiloxml.$$"
ilohwvers="/tmp/tmpilohwvers.$$"
declare -i ilosfound=0
# FUNCTIONS
function parseiloxml {
  fgrep "$1" $iloxml > /dev/null 2>&1
  if [ $? -ne 0 ]
  then
    # tag not found in xml output, return empty string
    parsedstring="N/A"
  else
    # tag was found - now we parse it from the output
    tempstring=$( cat $iloxml | tr -d -c [:print:] | sed "s/^.*<$1>//" | sed "s/<.$1.*//")
    # trim off leading and trailing whitespace
    parsedstring=`expr match "$tempstring" '[ \t]*\(.*[^ \t]\)[ \t]*$'`
  fi
}
function is_installed {
  which $1 > /dev/null 2>&1
  if [ $? -ne 0 ]
  then
    printf "\nERROR: %s not installed.\n\n" $1
    exit 255
  fi
}
# MAIN
# check for tools that we depend upon
is_installed tr
is_installed sed
is_installed expr
is_installed curl
is_installed nmap
# check syntax - should have 1 and only 1 parameter on cmdline
if [ $# -ne 1 ]; then
  printf "%s %s ( http://blog.nachotech.com/ )\n" $scriptname $scriptversion
  printf "Usage: %s {target network specification}\n" $scriptname
  printf "TARGET NETWORK SPECIFICATION:\n"
  printf "  Can pass hostnames, IP addresses, networks, etc.\n"
  printf "  Ex: server1.company.com, company.com/24, 192.168.0.1/16, 10.0.0-255.1-254\n"
  printf "EXAMPLE:\n"
  printf "  %s 16.32.64.0/22\n" $scriptname
  exit 255
fi
iprange=$1
# prepare lookup file for iLO hardware versions
cat > $ilohwvers << EOF
iLO-1 shows hw version ASIC:  2
iLO-2 shows hw version ASIC:  7
iLO-3 shows hw version ASIC: 8
iLO-3 shows hw version ASIC: 9
iLO-4 shows hw version ASIC: 12
iLO-4 shows hw version ASIC: 16
i-iLO shows hw version T0
EOF
#
# scan a range of IP addresses looking for an
# open tcp port 17988 (the iLO virtual media port)
#
printf "Scanning..."
nmap -n -P0 -sS -p 17988 -oG - $iprange | fgrep /open/ | awk '{print $2}' > $iloips
printf "\n\n"
#
# open and read the list of IP addresses one at a time
#
exec 3< $iloips
echo "--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------"
echo "iLO IP Address  iLO HW iLO FW   Server S/N   Server Model              iLO Edition          iLO Licence Key"
echo "--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------"
while read iloip <&3 ; do
  ilosfound=$ilosfound+1
  #
  # attempt to read the xmldata from iLO, no password required
  #
  curl --proxy "" --fail --silent --max-time 3 http://$iloip/xmldata?item=All > $iloxml
  #
  # parse out the Server model (server product name)
  # from the XML output
  #
  parseiloxml SPN;  servermodel=$parsedstring
  parseiloxml SBSN; sernum=$parsedstring
  parseiloxml PN;   ilotype=$parsedstring
  parseiloxml FWRI; ilofirmware=$parsedstring
  parseiloxml HWRI; ilohardware=$parsedstring
  ilohwver=$(grep "$ilohardware" $ilohwvers|awk '{print $1}')
  if [ "$ilohwver" == "" ]; then
    ilohwver="N/A"
  fi
  if [ "$sernum" == "" ]; then
    sernum="N/A"
  fi
  # add start
  curl --proxy "" --fail --silent --max-time 3 http://$iloip/xmldata?item=CpqKey > $iloxml
  parseiloxml LNAME; ilomodel=$parsedstring
  parseiloxml KEY; ilokey=$parsedstring
  # add end
  printf "%-15s %-6s %-8s %-12s %-25s %-20s %-30s\n" $iloip "$ilohwver" "$ilofirmware" "$sernum" "$servermodel" "$ilomodel" "$ilokey"
done
printf "\n%d iLOs found on network target %s.\n\n" $ilosfound $iprange
rm -f $iloips $iloxml $ilohwvers
exit 0

hp ProLiant Gen8サーバのiLOをESXiからアップデートする


VMware ESXiサーバとして動作しているhp ProLiant DL380p Gen8サーバのiLOをアップデートした。

まず、ESXi上から、iLOのバージョンと、iLOに割り当てられているIPアドレスを確認するため「hponcfg」コマンドを実行

/tmp # /opt/hp/tools/hponcfg -g
HP Lights-Out Online Configuration utility

Version 4.4-0 (c) Hewlett-Packard Company, 2014
Firmware Revision = 1.40 Device type = iLO 4 Driver name = hpilo
iLO IP Address: 172.17.15.99
Host Information:
                        Server Name: esxi1.osakana.local
                        Server Serial Number: SGH421XXXX
/tmp #

iLOのアップデータファイル CP025110.scexe を、/tmpに配置し、実行権限を与え、実行。

/tmp # chmod a+x CP025110.scexe
/tmp # ./CP025110.scexe
OS Version found  [5.5.0]
sh: 6.0=./ESXi_5.5: unknown operand
./CP025110.scexe: Okay process the path [./ESXi_5.5 6.0]
sh: 6.0: unknown operand
./CP025110.scexe:  Update flash engine from ./ESXi_5.5 6.0
sh: 6.0/clean_target_location.sh: unknown operand
sh: 6.0/copy_FE_to_target_location.sh: unknown operand
Copy Flash Engine files from [./ESXi_5.5 6.0] to [/tmp/sctmpdir4924713]
cp: './ESXi_5.5' and './ESXi_5.5' are the same file
cp: can't stat '6.0/*': No such file or directory

iLO Flasher v1.0.2-2 for VMware ESXi (Jan  7 2014)
(C) Copyright 2002-2014 Hewlett-Packard Development Company, L.P.
Firmware image: ./ilo4_203.bin
Current iLO 4 firmware version  1.40; Serial number ILOSGH421XXXX

Component XML file: ./CP025110.xml
./CP025110.xml reports firmware version 2.03
This operation will update the firmware on the
iLO 4 in this server with version 2.03.
Continue (y/N)?y
Current firmware is  1.40 (Jan 14 2014 00:00:00)
Firmware image is 0x1001b1c(16784156) bytes
Committing to flash part...
******** DO NOT INTERRUPT! ********
Flashing is underway... 100 percent programmed. \
Succeeded.
***** iLO 4 reboot in progress (may take up to 60 seconds.)
***** Please ignore console messages, if any.
iLO 4 still rebooting. Try again...
iLO 4 reboot completed.
/tmp #

firmwareのバージョンが上がっていることを確認。

/tmp #  /opt/hp/tools/hponcfg -g
HP Lights-Out Online Configuration utility

Version 4.4-0 (c) Hewlett-Packard Company, 2014
Firmware Revision = 2.03 Device type = iLO 4 Driver name = hpilo
iLO IP Address: 0.0.0.0
Host Information:
                        Server Name: esxi1.osakana.local
                        Server Serial Number: SGH421XXXX
/tmp #

・・・と、実行が早すぎたようで、DHCPで割り当てているIPアドレスが「0.0.0.0」となっている。
時間をおいて再実施

/tmp #  /opt/hp/tools/hponcfg -g
HP Lights-Out Online Configuration utility

Version 4.4-0 (c) Hewlett-Packard Company, 2014
Firmware Revision = 2.03 Device type = iLO 4 Driver name = hpilo
iLO IP Address: 172.17.15.99
Host Information:
                        Server Name: esxi1.osakana.local
                        Server Serial Number: SGH421XXXX
/tmp #

これで、問題なしですね。

hpからProLiant Generation 9サーバが登場



アメリカでhpがProLiant Gen9サーバを発表した模様。

2014/08/28:HP Unveils New ProLiant Gen9 Servers to Help Customers Address Evolving Data Center Demands
Gen9_family_FT_PR

といっても、詳細は9月9日~11日にサンフランシスコで開催されるIntel Developers Forumにて発表される、とのこと。

このIntel Developers Forumでは、DDR4メモリ対応のサーバ向け新CPU Haswell-EP搭載 Xeon E5-2600v3プロセッサが発表される見込みなので、それに合わせて詳細発表、となるんでしょうね。

上記URLで公開されている情報、「Reimagine the server. Think compute.」の下部にあるリンクから「HP ProLiant Gen9 Servers FAQ」、The Register:「HP busts out new ProLiant Gen9 servers」の記事の内容を合わせて

発表される機種

従来モデルのアップデート
・タワー型 ML350 Gen9(5Uラックも可)
High-performance server with unmatched capacity and reliability in a rack or tower
form factor

・1U DL360 Gen9
Dense performance for multi-workload compute in the data center

・2U DL380 Gen9
The no-compromise data center standard for multi-workload compute, and the most
popular server model in the world’s best-selling ProLiant server family

・ブレード用 WL460c Gen9
The world’s leading server blade accelerates service delivery with advanced Compute
performance that’s truly optimized for core IT workloads.

・Apollo6000用 XL230a
Apollo 6000 System server, density optimized performance for rack-scale workloads

・Apollo8000用 XL730f
Apollo 8000 System server for high performance computing workloads

名前変更での登場
・DL160 Gen9 (旧DL360e)
Right-sized performance for space- and budget-constrained environments
・DL180 Gen9 (旧DL380e)
The new standard for growing data center needs

特徴
・Haswell-EP Xeon E5-2600v3
・DDR4メモリ
・UEFIへの移行
・RESTful APIによるUEFI設定変更対応
・12Gb/s Smart Array Controller
・Windows Server 2003非対応

DL360G9のフロント写真を見ると、USBポートが青い・・・USB3.0対応の可能性が・・・
DL360_Gen9_10SFF_FT

DL180G9/DL160G9の方は、黒なので、300シリーズのみなのかも?

hp ProLiantをLinuxで使う場合にインストールするService Pack for ProLiantについて


hp ProLiantをLinuxで使う場合、Service Pack for ProLiantという追加ドライバ&管理ソフトウェア集をインストールする・・・ということになっている。

製品ページ:Service Pack for ProLiant(SPP) / Smart Update Manager(SUM) v6.x
Service Pack for ProLiant(SPP) / Smart Update Manager(SUM) v8

基本的にはisoイメージで配布されており、ディストリビューション特化型の縮小版がtar.gzでも配布されている。
それぞれ、中に「hpsum」というパッケージインストール用フロントエンドプログラム(Smart Update Manager/SUM)が入っているので、それを実行して、インストールを行うことになる。

詳細についてはSUM: Smart Update Manager hpsum v6.2対応環境とインストール方法についてSUM: Smart Update Manager hpsum v6.3.1対応環境とインストール方法について」を参照のこと。

で・・・hp USAのページを見ていたらhp Software Delivery RepositoryHPE Software Delivery Repository」なんてものを発見。

RHEL/CentOSであれば、yumコマンドでhpの管理系ソフトウェアがインストールできるようになるらしい。
対応している管理ソフトウェアは、以下のものらしい。

 

Browse repository Project & subscription information Contents
spp Service Pack for ProLiant Drivers, agent software, firmware for RedHat and SLES
mcp Management Component Pack for ProLiant Agent software for Ubuntu, Oracle and community distros
isp Integrity Support Pack Agent software for RedHat and SLES on IA64
iwbem Integrity WBEM Providers WBEM providers for RedHat and SLES on IA64
mlnx_ofed Mellanox OFED VPI Drivers and Utilities Mellanox OFED VPI for RedHat and SLES
vibsdepot VMware® ESXi bundles Drivers and vibs for VMWare®
hpsum HP Smart Update Manager Software to update firmware and drivers on RedHat and SLES
stk HP ProLiant Scripting Toolkit Useful commands for scripting/automating ProLiant hardware

 

このレポジトリを使って、Service Pack for ProLiantをインストールする手順はSubscribe your system to the spp repositorySubscribe your system to the spp repository」か、もしくはLinux best practices using HP Service Pack for ProLiant (SPP) and Software Delivery Repository (SDR)Linux best practices using HP Service Pack for ProLiant (SPP) and Software Delivery Repository (SDR)」 で紹介されている。