Hyper-VとPXEサーバー構築

Hyper-VPXEサーバー構築を構築する。本稿のIPアドレスは一例のため、環境に合わせて変更すること。

何ができるか

成果物

  • network 172.17.64.0/24
  • 仮想PXEサーバー 172.17.64.1
  • 仮想マシン 172.17.64.200-172.17.64.250

Hyper-V

ハードウェアの仮想化プラットフォーム。Windowsで使用する方法を紹介する。

Hyper-V有効化方法

以下リンク先のインストラクションに従って、有効化する。

Hyper-V 環境構築

Hyper-Vの初期設定を行う。特に仮想ネットワークを設定する。

仮想ネットワーク作成

仮想ネットワーク名はprivateとする。種類は内部ネットワークで、作成する。 ホスト環境と、仮想マシンが相互に通信できるようにする。

PowerShellを管理者権限で開く。[スタート] をクリックし、「powershell」と入力し、 [PowerShell] を右クリックして、 [管理者として実行] をクリックする。

仮想ネットワーク(内部ネットワーク)を作成する。以下打鍵する。

# @host - PowerShell

new-vmswitch -name private -switchtype internal

ホストIPアドレス設定

WindowsNIC設定

仮想ネットワークにホストを参加させる。IPアドレス第4オクテット254を割り当てる。

  • Windowsキー」+「R」を押して、ファイル名を指定して実行を開き、名前に「ncpa.cpl」と入力
  • vEthernet(private)のアイコンを右クリック、プロパティを選択
  • IPアドレス(172.17.64.254)、ネットマスク(255.255.255.0)を入力
    • 前手順で作成したネットワークにホストのIPアドレスの割り当て

Linuxディストリビューションのメディア(ISO)の用意

使用するLinuxディストリビューションのメディア(ISO)を用意する。本稿では、RHEL8を想定とする。後続手順のPXEサーバーで使用するため、用意しておく。

ホストにダウンロードすること。

ローカルPXEサーバーの用意

VMマシンの新規作成

  • Hyper-V マネージャーでの仮想マシンの作成 Windows キーを押して「Hyper-V マネージャー」と入力するか、アプリケーションの一覧で [Hyper-V マネージャー] を見つけて、Hyper-V マネージャーを開く。
  • 右側ペーンの操作→新規→仮想マシンを選択
    • 名前、格納場所は好きなものに設定
    • 世代は第2世代を選択
    • 起動メモリも好きな量に設定
      • 前手順で用意したRHELメディアを使うこと
    • ネットワークは、privateを選択
    • HDDは20GBで十分
    • ブートイメージファイルからオペレーティングシステムをインストールするを選択

PXEサーバー用仮想マシンのブート

接続、起動

  • ゲストOSを右クリックして設定を選択
  • セキュリティ、セキュアブートを無効にする→OK
  • ゲストOSを右クリックして接続→起動を選択

参考: https://qiita.com/bitterrich/items/7003a3b2e09e38b656c0

RHELインストール

  • 省略(ミニマルで)

インストール後設定

ネットワーク設定

# @pxe server

nmcli networking on
nmcli device
# インターフェースを確認

c=enp0s # 確認したインターフェース名を代入にする。
nmcli c del $c
nmcli c add con-name $c ifname $c type ethernet
nmcli c mod $c ipv4.addresses 172.17.64.1/24
nmcli c mod $c ipv4.gateway 172.17.64.254
nmcli c mod $c ipv4.dns 172.17.64.254
nmcli c mod $c ipv4.method manual
nmcli c mod $c ipv6.method disabled
nmcli c mod $c connection.autoconnect yes
nmcli c up $c

パケットロスがないこと、疎通していること

  • テラタームなどで接続する(コマンドをコピペできるように、SSH接続する)。

パッケージレポジトリ設定

パッケージレポジトリ設定とLinuxディストリビューションのメディア(ISO)マウントをする。外部レポジトリを使用せず、メディアのレポジトリを使用するようにする。

以下打鍵する。

# @pxe server

mkdir /root/repos
mv /etc/yum.repos.d/* /root/repos

cat <<DVDREPO >/etc/yum.repos.d/dvd.repo
[DVD-BaseOS]
name=DVD-BaseOS
baseurl=file:///media/BaseOS/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[DVD-AppStream]
name=DVD-AppStream
baseurl=file:///media/AppStream/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
DVDREPO

cat <<DVDMOUNT >dvd_mount.sh
mount /dev/cdrom /media
DVDMOUNT
sh dvd_mount.sh
レポジトリ確認
# @pxe server

dnf list

PXEサーバー構築

Linuxディストリビューションのメディア(ISO)をPXEサーバーへアップロードする。/tmpにlinux8.isoの名前で格納する。

以下打鍵する。

# @pxe server

cat <<'PXESET' > /tmp/pxe.sh

dis_name=linux8

dnf -y install tftp-server
systemctl enable --now tftp.socket

dnf -y install firewalld
firewall-cmd --permanent --zone=public --add-service=tftp
firewall-cmd --reload

dnf -y install dhcp-server
cat <<DHCPCONFIG > /etc/dhcp/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
authoritative;

option space pxelinux;
option pxelinux.magic code 208 = string;
option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
option pxelinux.reboottime code 211 = unsigned integer 32;
option architecture-type code 93 = unsigned integer 16;

subnet 172.17.64.0 netmask 255.255.255.0 {
  range dynamic-bootp 172.17.64.200 172.17.64.250;
  option broadcast-address 172.17.64.255;
  option routers 172.17.64.254;
  class "pxeclients" {
    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
    next-server 172.17.64.254;
    if option architecture-type = 00:07 {
      filename "BOOTX64.EFI";
    } else {
      filename "pxelinux.0";
    }
  }
}
DHCPCONFIG

firewall-cmd --permanent --zone=public --add-service=dhcp
firewall-cmd --reload
systemctl enable --now dhcpd
systemctl restart dhcpd
cat /var/lib/dhcpd/dhcpd.leases

rpmdir=/tmp/rpm
mkdir -p ${rpmdir}
dnf -y reinstall --downloadonly --downloaddir=${rpmdir} shim grub2-efi-x64
cd ${rpmdir} && rpm2cpio shim-x64-*.rpm | cpio -dimv
cd ${rpmdir} && rpm2cpio grub2-efi-x64-*.rpm | cpio -dimv
cp -v ${rpmdir}/boot/efi/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/
cp -v ${rpmdir}/boot/efi/EFI/*/grubx64.efi    /var/lib/tftpboot/
chmod 644 /var/lib/tftpboot/{BOOTX64.EFI,grubx64.efi}
ls -ld /var/lib/tftpboot/{BOOTX64.EFI,grubx64.efi}

mkdir -p /var/pxe/${dis_name}
mount -t iso9660 -o loop,ro /tmp/${dis_name}.iso /var/pxe/${dis_name}

mkdir /var/lib/tftpboot/${dis_name}
cp -prv /var/pxe/${dis_name}/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/${dis_name}

cat <<GRUBCONF > /var/lib/tftpboot/grub.cfg
set timeout=5
menuentry "Install ${dis_name}" {
  linuxefi ${dis_name}/vmlinuz ip=dhcp inst.ks=http://192.168.255.2/ks/${dis_name}-ks.cfg
  initrdefi ${dis_name}/initrd.img
}
GRUBCONF

cat /var/lib/tftpboot/grub.cfg
chmod 644 /var/lib/tftpboot/grub.cfg

dnf -y install httpd
systemctl enable --now httpd
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload

cat <<APACHEEOF > /etc/httpd/conf.d/pxeboot.conf
Alias /${dis_name} /var/pxe/${dis_name}
<Directory /var/pxe/${dis_name}>
  Options Indexes FollowSymLinks
  Require all granted
</Directory>
APACHEEOF

systemctl restart httpd

mkdir /var/www/html/ks

cat <<KICKSTART > /var/www/html/ks/${dis_name}-ks.cfg
text
reboot
url --url=http://172.17.64.254/${dis_name}/

keyboard --vckeymap=jp106 --xlayouts='jp','us'
lang en_US.UTF-8

network --bootproto=dhcp --ipv6=auto --activate --hostname=localhost
zerombr

%packages
@core
%end

ignoredisk --only-use=sda
autopart
clearpart --all --initlabel

timezone Asia/Tokyo --utc
KICKSTART

dnf -y install python3

pass=$(python3 -c 'import crypt; print(crypt.crypt("root", crypt.METHOD_SHA512))')
echo "rootpw --iscrypted ${pass}" >> /var/www/html/ks/${dis_name}-ks.cfg
pass=''

chmod 644 /var/www/html/ks/${dis_name}-ks.cfg

PXESET
sh /tmp/pxe.sh

※/tmp/linux8.isoがマウントされているときのみPXEサーバーが正常に動作する。再起動の際の動作未確認

環境構築完了

次は、PXEサーバーを試す。

PXEサーバーを利用した新規マシン構築

新規仮想マシンの作成(CUI)

管理者権限で、powershellを開き、以下打鍵する。

# @host - powershell
$vm_name="4pxe"

new-vm -name $vm_name -memorystartupbytes 2gb -bootdevice vhd -newvhdpath .\$vm_name\vms\test.vhdx -path .\$vm_name\vmdata -newvhdsizebytes 32gb -generation 2 -switch private

set-vmmemory -vmname $vm_name -dynamicmemoryenabled $false
set-vmfirmware $vm_name -enablesecureboot off

$nw = get-vmnetworkadapter -vmname $vm_name
set-vmfirmware $vm_name -firstbootdevice $nw

start-vm -name $vm_name

$hdd = get-vmharddiskdrive -vmname $vm_name
set-vmfirmware $vm_name -firstbootdevice $hdd

マシンの作成は前手順でGUIで行っているが、この箇所では、CUI仮想マシン作成を行っている。

  • Hyper-Vの新規マシンが作成される
    • 仮想マシン用のハードディスクも同時に作成されている
  • 待つとRHELがインストールされる。前手順で構築したPXEサーバーのサービスが利用され、自動でRHELのインストールが行われる。

新しく新しいマシンが作成され、RHELがインストールされていること(ログイン画面が現れること)

補足事項

新規マシンに付与されるIPアドレス

PXEサーバーを利用して作成される(PXEブートで起動した)サーバーはのIPアドレスPXEサーバーで構築したDHCPサーバーのアドレスプールれんじで設定される。DHCPの設定ファイルもしくは、PXEブートしたマシンでIPアドレスを確認できる。

# @pxe server

grep range /etc/dhcp/dhcpd.conf
# @new machine
ip a