やりたいこと
- iLOやiDRACを使って、リモートからOSをインストールしたい
- URL経由でISOイメージファイルをサーバに仮想的にマウントしたい
- インストール対象と同じLAN内にあるUbuntu 18.04.2サーバをWebサーバにしてISOファイルを配信したい
- でも、このためだけに余計なパッケージをインストールしたくない
環境
Ubuntu 18.04.2 LTS Server
方針
twistd3で簡易Webサーバを立てる
twistd3を使う
配信したいファイルがあるディレクトリに移動して、次のコマンドを実行する。twistd3コマンドは標準でインストールされているようだが、無ければ sudo apt install python3-twisted
でインストールする。
twistd3 web --port tcp:8080 --path .
8080/TCPでWebサーバが待ち受けている。
$ netstat -lntp (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1512/python3 tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp6 0 0 :::22 :::* LISTEN -
http://サーバのIPアドレス:8080/
にアクセスすると、カレントディレクトリにあるファイルのリストが表示される。ファイル名をクリックすると、そのファイルをダウンロードできる。
カレントディレクトリにはtwistd.log
とtwistd.pid
が作成され、twistd.log
にアクセスログが記録されていく。
この方法でISOファイルを配信して、iLOの仮想メディアでこのURLを指定すると、次のようなアクセスログが記録される。ステータスコードが206 (Partial Content) になっているので、ISOファイルを分割して少しずつ送信しているのだろう。
2019-05-19T15:33:45+0000 [twisted.python.log#info] 10.XX.XX.XX - - [19/May/2019:15:33:45 +0000] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 206 256 "-" "-" 2019-05-19T15:33:45+0000 [twisted.python.log#info] 10.XX.XX.XX - - [19/May/2019:15:33:45 +0000] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 206 61440 "-" "-" 2019-05-19T15:33:45+0000 [twisted.python.log#info] 10.XX.XX.XX - - [19/May/2019:15:33:45 +0000] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 206 61440 "-" "-" 2019-05-19T15:33:46+0000 [twisted.python.log#info] 10.XX.XX.XX - - [19/May/2019:15:33:45 +0000] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 206 61440 "-" "-" 2019-05-19T15:33:46+0000 [twisted.python.log#info] 10.XX.XX.XX - - [19/May/2019:15:33:46 +0000] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 206 61440 "-" "-" 2019-05-19T15:33:46+0000 [twisted.python.log#info] 10.XX.XX.XX - - [19/May/2019:15:33:46 +0000] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 206 524288 "-" "-" 2019-05-19T15:33:55+0000 [twisted.python.log#info] 10.XX.XX.XX - - [19/May/2019:15:33:54 +0000] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 206 61440 "-" "-" 2019-05-19T15:33:55+0000 [twisted.python.log#info] 10.XX.XX.XX - - [19/May/2019:15:33:55 +0000] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 206 524288 "-" "-"
ダメだったやり方
twistd3の前にPython3のhttp.serverモジュールで試してみたが、ISOファイルのサイズが大きすぎるのかBrokenPipeError
が出てしまい、仮想メディアとしてマウントできなかった。
$ python3 -m http.server 8000 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 10.XX.XX.XX - - [19/May/2019 15:13:58] "GET /VMware-VMvisor-Installer-6.5.0.update02-8294253.x86_64.iso HTTP/1.1" 200 - ---------------------------------------- Exception happened during processing of request from ('10.XX.XX.XX', 56405) Traceback (most recent call last): File "/usr/lib/python3.6/socketserver.py", line 317, in _handle_request_noblock self.process_request(request, client_address) File "/usr/lib/python3.6/socketserver.py", line 348, in process_request self.finish_request(request, client_address) File "/usr/lib/python3.6/socketserver.py", line 361, in finish_request self.RequestHandlerClass(request, client_address, self) File "/usr/lib/python3.6/socketserver.py", line 721, in __init__ self.handle() File "/usr/lib/python3.6/http/server.py", line 418, in handle self.handle_one_request() File "/usr/lib/python3.6/http/server.py", line 406, in handle_one_request method() File "/usr/lib/python3.6/http/server.py", line 639, in do_GET self.copyfile(f, self.wfile) File "/usr/lib/python3.6/http/server.py", line 800, in copyfile shutil.copyfileobj(source, outputfile) File "/usr/lib/python3.6/shutil.py", line 82, in copyfileobj fdst.write(buf) File "/usr/lib/python3.6/socketserver.py", line 800, in write self._sock.sendall(b) BrokenPipeError: [Errno 32] Broken pipe ----------------------------------------