2026年4月30日木曜日

pxeboot完全に理解した

 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 件のコメント:

コメントを投稿