pxeboot完全に理解した(チュートリアル的設定が出来た)ので設定メモっておこうと思っていたがついつい時間が経って大半を忘れてしまった。
再確認する気力は起きないので、覚えている範囲で書いて終わりにしておく。覚えている範囲では書いたつもりだが、ちょっと自信がない。
いざというときのためにSystemRescueCDをpxebootで実行できるようにしておきたかったのがきっかけで設定した。
サーバの設定
たぶんこの辺を参考にして設定したような気がする。 他にも色々見て回ったが忘れてしまった。
dhcpの設定
dnsmasqを使う。/etc/dnsmasq.d/pxeboot.conf を編集。いろいろやって最終的には以下のようになった(詳細は後述)。サーバのIPは仮に192.168.11.50とする。
interface=lo,eth0
# dhcpはルータがやる。dhcp-proxyでpxeのところだけraspberry-piのdnsmasqがやる設定?
dhcp-range=192.168.11.0,proxy
# iPXE check: iPXEだと175が設定されるので、175が設定されてたらiPXEタグをセット
dhcp-match=set:iPXE,175
# キーで選択できるようにする(タイムアウト5秒)、F8は変えられないっぽい?
pxe-prompt="press F8 to select menu",5
# after iPXE
# tag:iPXEで、iPXEが設定されている場合のメニュー
pxe-service=tag:iPXE,x86PC,"BIOS autoexec.ipxe",ipxe/bios/autoexec.ipxe,192.168.11.50
pxe-service=tag:iPXE,x86-64_EFI,"EFI autoexec.ipxe",ipxe/efi/autoexec.ipxe,192.168.11.50
# 旧BIOS起動用
pxe-service=x86PC,"BIOS System Rescue CD",lpxelinux.0,192.168.11.50
pxe-service=x86PC,"BIOS iPXE",ipxe/bios/undionly.kpxe,192.168.11.50
pxe-service=x86PC,"BIOS netboot.xyz",netboot.xyz/pxelinux.0,192.168.11.50
# UEFI用
pxe-service=x86-64_EFI,"EFI System Rescue CD",syslinux.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE",ipxe/efi/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-legacy",ipxe/efi/ipxe-legacy.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-snponly",ipxe/efi/snponly.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb",ipxe/efi-sb/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb-snponly",ipxe/efi-sb/snponly.efi,192.168.11.50
pxe-service=x86-64_EFI,"EFI netboot",ipxe/netboot.xyz-snp.efi,192.168.11.50
tftpサーバー
openmediavaultを入れているので、tftpを設定するだけだった。/mnt/disk/tftpを作成してそこを指定した。
httpサーバー
cdイメージを全部tftpから持ってくるとかなり遅いらしく、イメージはhttpから取ってくるものがある模様。よってhttpサーバーを立てる必要があるものがある。
いちいちhttpサーバー立てるのが面倒なので、openmediavaultのWebDAVを設定した。httpで取ってこれるので大丈夫そう。 tftpと同じところを指すようにした。openmediavaultの設定ではhttp://192.168..11.50/webdav/*でアクセスできる。
イメージの準備
SystemRescueCD
イメージはCDから持ってきて、ブートのところはsyslinux/pxelinuxをつかったはず。
ブートのところ
apt install syslinux-efi pxelinux
インストールした以下のファイルをtftpのところに持ってくる。lpxelinuxとpxelinuxはどっちかでいいはず。なんかlpxelinuxのほうが良さそうなので、lpxelinuxを選んだ。
/usr/lib/PXELINUX/lpxelinux.0
/usr/lib/PXELINUX/pxelinux.0
/usr/lib/SYSLINUX.EFI/efi64/syslinux.efi
/usr/lib/syslinux/modules/bios/ldlinux.c32
/usr/lib/syslinux/modules/efi32/ldlinux.e32
/usr/lib/syslinux/modules/efi64/ldlinux.e64
syslinux/modulesの中には他にも色々ファイルがある。syslinuxの全機能を使いたいなら全部持ってきて置いておいたほうがいいのかもしれない。
dnsmasqの設定としては以下の部分となる。とりあえずこれでsyslinuxブートする。
# 旧BIOS起動用
pxe-service=x86PC,"BIOS System Rescue CD",lpxelinux.0,192.168.11.50
# UEFI用
pxe-service=x86-64_EFI,"EFI System Rescue CD",syslinux.efi,192.168.11.50
ディスクイメージ
ディスクイメージの中のsysresccdをtftpとhttpサーバーに置く。
mount -o loop image.iso /tmp/disk
cp -a /tmp/disk/sysresccd /mnt/disk/tftp
syslinuxがブートしたらtftpのpxelinux.cfg/defaultが読まれるので、そこにブート設定を書く。どうやって読まれるファイルを調べたかというとvirtualboxでpxeブートしているところをwiresharkで調べた。マニュアルは読んでないので他にいいやり方があるかもしれないが知らない。
設定の内容はhttps://www.system-rescue.org/manual/PXE_network_booting/に書いてあるのを参考にjp106だけ追加設定した。
DEFAULT sysresccd
LABEL sysresccd
LINUX sysresccd/boot/x86_64/vmlinuz
INITRD sysresccd/boot/intel_ucode.img,sysresccd/boot/amd_ucode.img,sysresccd/boot/x86_64/sysresccd.img
APPEND archisobasedir=sysresccd ip=dhcp archiso_http_srv=http://192.168.11.50/webdav/ checksum setkmap=jp106
SYSAPPEND 3
LINUX,INITRDまではtftpで取ってきて、それ以降はinitrd上で動いたlinuxでhttpで取ってくると思われる。
SystemRescueCDは確かこれでうまく行ったような気がする。
netboot.xyz
pxebootについて調べているうちにnetboot.xyzとやらを見つけた。pxebootで色々なdistributionのCDブートイメージでブートできるようになるらしい。これも動かせるようになっておくと、なんか便利そうだったので入れてみた。
netboot.xyzはただのPXEではなく、iPXEが必要らしい。おそらくhttpアクセスとかが必要だからだろう。当然うちの激古パソコンにはそんなものはないので、一旦PXEブートでiPXEになってからnetboot.xyzをブートしなくてはいけないようだった。
iPXEブート
まずはiPXEにならなければならない。netboot.xyz(https://netboot.xyz/downloads)とか、iPXE本家(https://ipxe.org/download) からiPXEブートするバイナリを取ってきてtftpに置く。
それをブートする設定が以下のあたり。 やってみたところ、UEFIはどうしてもその後のnetboot.xyzからの起動ができなかった。パソコンが古いせいかもしれない。色々コメントしてあるのはその試行錯誤の残骸である。
BIOSはうまく行った(はず)。iPXEになりさえすれば、iPXEのバイナリでもnetboot.xyzのバイナリでもどっちでもいいはず。
# 旧BIOS起動用
pxe-service=x86PC,"BIOS iPXE",ipxe/bios/undionly.kpxe,192.168.11.50
pxe-service=x86PC,"BIOS netboot.xyz",netboot.xyz/pxelinux.0,192.168.11.50
# UEFI用
#pxe-service=x86-64_EFI,"EFI iPXE",ipxe/efi/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-legacy",ipxe/efi/ipxe-legacy.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-snponly",ipxe/efi/snponly.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb",ipxe/efi-sb/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb-snponly",ipxe/efi-sb/snponly.efi,192.168.11.50
pxe-service=x86-64_EFI,"EFI netboot",ipxe/netboot.xyz-snp.efi,192.168.11.50
iPXEブート後
iPXEブート後は、tftpからiPXE用のスクリプトを取ってきて動く。dnsmasqの設定だと以下の部分。iPXEブート後、iPXEタグが設定されてないとメニューに出てこない設定。
# after iPXE
# tag:iPXEで、iPXEが設定されている場合のメニュー
pxe-service=tag:iPXE,x86PC,"BIOS autoexec.ipxe",ipxe/bios/autoexec.ipxe,192.168.11.50
pxe-service=tag:iPXE,x86-64_EFI,"EFI autoexec.ipxe",ipxe/efi/autoexec.ipxe,192.168.11.50
tftpのipxe/*/autoexec.ipxeにスクリプトを置いておく。中身は以下のような感じ。biosとUEFIで違うので、ディレクトリ分けて置いておく。netboot.xyzのQuickStartに書いてあるやつ。
#!ipxe
dhcp
chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.lkrn
これでなんとかBIOSでは起動したが、結構な確率でブートが失敗する。メニューが読み込めなかったり、ブートイメージを選択できてもブートイメージを取ってくる途中で止まったり。
iPXEのバイナリと古いPCのLANドライバ?的なものの相性が悪いのかもしれないし、全世界からアクセスされていてサーバが重いのかもしれない。よくわからないが結構不安定だ。
SytemRescueCDもnetboot.xyzに入ってるので、個別に入れる必要はなかったかと思ったが、netboot.xyzはかなり起動が不安定だったので、個別に入れて正解だった。
そして気づいたのは、これを使おうとする場合、いちいちLANケーブルをささないと使えないということだ。新しいパソコンならwifiからpxeブートできたりするのかなあ。
0 件のコメント:
コメントを投稿