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

ping 172.17.64.254

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

  • テラタームなどで接続する(コマンドをコピペできるように、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

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.254;
  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 --allow-ssh ${pass}" >> /var/www/html/ks/${dis_name}-ks.cfg
pass=''

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

※/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 20gb -generation 2 -switch private

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

手順書の書き方について個人的な考察

コンピューターに関する作業手順書作成について、簡単に考察をする。

特別に人に相談したりしていない。特別参考にした文献はない。そのため、理論があるわけではない。ベストプラクティスではないため、参考にする場合は、注意が必要である。

手順書作成時にどんな順番で、どんな内容を記述するか迷うことがあるため、考察を記録する。

手順書作成時

  • 具体的な手順以外、何を書くべきか迷う
  • 設定理由が不要・余計な場合もある
  • 逆に経緯や理由を一緒に残しておきたい場合もある
  • 誰でも出来るようにしたい
  • 手順書、成果物が高品質であることは挙げるべきでもない、当たり前のこと

何を書くべきか?

手順書であるため、"具体的な"手順は、もちろん記載すべきである。具体的が重要である。具体的でなければ、ただのメモである。他には、作業手順の見出し、概要が必要となる。 さらに、他人にシェアするという必要を考え、手順の意思、"なぜか"の理由を含めるべきであろう。

記述例

Hyper-Vの仮想ネットワーク作成を例にフォーマットを考えてみる。


[見出し]仮想ネットワークの構築

[方針、内容]内部ネットワークを作る。ネットワーク名はprivateにする。

[理由]ホスト、マシン間で接続可能になる。

[前提条件]

[具体的な手順]

new-vmswitch -name private -switchtype internal

[手順の補足]内部ネットワーク(internal)であるが、意図的にネットワーク名をprivateとしている。

[期待値] - マシンから、ホストへpingをしたとき、疎通が出来ること

期待値通りにならない場合は(省略) —-

社会は、ルールを作るだけではよくはならないが、コンピューターはルール、論理の世界。

Hyper-Vのマシン作成コマンド

Hyper-Vのマシン作成コマンドを紹介する。

本記事では、PXEサーバーに合うマシン作成を行う。

create network(internal)

new-vmswitch -name private -switchtype internal

prepare: deletion

$vm_name="4pxe"
stop-vm -name $vm_name
remove-vm -name $vm_name

create machine: for pxe

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

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
get-command -module hyper-v | out-gridview

こういう基本的なことを行う記事が少ない。

PXEサーバー構築手順

yumayxx.hateblo.jp

ref.

qiita.com

learn.microsoft.com

シェル内でRubyを使ったIPアドレスのネットワーク計算

シェルで、Rubyを利用して、IPアドレスを簡単に扱う方法を紹介する。

入力:192.168.123.45/24

ipaddress='192.168.123.45'
mask='24'

echo "${ipaddress}/${mask}"
echo

# network
network=$(
   ruby -ripaddr -e "puts IPAddr.new(\"${ipaddress}/${mask}\")"
   )
echo "Network"
echo $network

# netmask
netmask=$(
   ruby -ripaddr -e "puts IPAddr.new('255.255.255.255/32').mask(${mask}.to_i)"
   )
echo "Netmask"
echo $netmask

# range
range_f=$(
   ruby -ripaddr -e "puts IPAddr.new(\"${ipaddress}/${mask}\").to_range.first.succ"
   )
echo "First"
echo $range_f
# 最終はpredが実装されていないため、スキップ

# broadcast
broadcast=$(
   ruby -ripaddr -e "puts IPAddr.new(\"${ipaddress}/${mask}\").to_range.last"
   )
echo "Broadcast"
echo $broadcast

実行結果

 sh app.sh 
192.168.123.45/24

Network
192.168.123.0
Netmask
255.255.255.0
First
192.168.123.1
Broadcast
192.168.123.255

DHCPなど、IPアドレスが絡む設定ファイルの作成に便利かもしれない。

Ref.

docs.ruby-lang.org

Hashicorp Vagrant on Windowsの使用方法

Windowsで、Hashicorp Vagrantを使う方法である。

インストール

winget install Hashicorp.Vagrant
winget install Oracle.Virtualbox
  • 別途Rubyをインストールする必要なし

簡単な説明

winget install Hashicorp.Vagrant このコマンドは、Windows パッケージマネージャー Winget を使って、HashiCorp 社の Vagrant ツールをインストールしています。Vagrant は、仮想マシンの作成、管理、プロビジョニングを簡単に行えるツールです。

winget install Oracle.Virtualbox このコマンドは、Winget を使って、Oracle 社の VirtualBox をインストールしています。VirtualBox は無料で利用できる仮想化ソフトウェアで、Vagrant と組み合わせて使うことが多いです。

つまり、これらのコマンドを実行すると、VagrantVirtualBox がインストールされ、仮想マシンを簡単に構築・管理できるようになります。この組み合わせは開発者が異なる環境を手軽にテストできるため、ソフトウェア開発やテスト、学習などの用途で広く使われています。

Windowsパッケージマネージャーwinget

存在を忘れないため、記事にしておく。

winget コマンド ライン ツールを使用すると、Windows 10 および Windows 11 コンピューター上でアプリケーションを検出、インストール、アップグレード、削除、および構成することができます。 このツールは、Windows パッケージ マネージャー サービスに対するクライアント インターフェイスです。

learn.microsoft.com

winget -v

wは衝突するからwinなのか。。

UNIX系には当たり前にあるのに、Windowsにはな無かった。 働きたがりワーカホリックどもは、いつもWindowsを使う。足を引っ張ると日本は滅ぶ。

コンピューターって便利だぞ。


以下Claude 3 Sonnet より

Winget は、Microsoft が開発した Windows 10 および Windows 11 向けのオープンソースのパッケージマネージャーです。

主な概要は以下の通りです。

  • リリース日: 2020年5月19日にプレビュー版が公開され、2022年5月24日に安定版 (v1.0) がリリースされました。

  • 目的: Windows上でソフトウェアのインストール、アップグレード、削除を素早く簡単に行えるようにすること。

  • 特徴:

    • コマンドラインツールとGUIの両方が利用可能
    • Microsoft StoreおよびWindows Packageマネージャー経由でたくさんのアプリをインストール可能
    • YAML 設定ファイルでインストール設定をカスタマイズ可能
    • 将来的にはWindows UpdateMicrosoft Intune経由でアプリを更新できる予定
  • オープンソース: GitHub 上で開発が行われ、MITライセンスの下でリリースされている

  • マイクロソフトは今後Windows自体にWingetを統合し、Windows標準のパッケージマネージャーとして機能拡張を続ける予定です。

Wingetの登場により、Windows環境でもLinux/macOSのようにコマンド1つでソフトウェアの管理が行えるようになり、開発者の生産性が大幅に向上することが期待されています。

Apple Silicon Macでx86Linuxを動かす

Apple Silicon MacでUTM(https://mac.getutm.app)を使って、AlmaLinux/Rocky Linuxをインストールする方法を記録する。

インストールする目的は、インストールすることではなく、Linuxディストリビューションを動かす、動かせる環境を作ることである。Rosetta 2を使って、VirtualBoxをインストールして、Linuxディストリビューションが動かずに、喜ぶ記録ではない。

UTMのインストール

brew install utm

Brewのインストールを前提とする。

UTMの操作

マシン作成後、マシンを編集

  • システムのCPUをデフォルトからx86のCPUに変更
    • 例えばIntelのSkylakeなどを選択する
    • Intel Core Processor (Skylake, IBRS, no TSX) [IBRS, XSAVES, no TSX] (Skylake-Client-v4)
  • ディスプレイの設定
    • 仮想ディスプレイカードに、VGAを選択する(他のもので動作するかは検証していない)

ブートに必要なメディアの接続は省略する。

実用的か

実用的かを考えると、速度面で実用的ではないと感じられた。どうしても必要なときには使える程度である。

Arm、x86で動かす動機

ググるとArmでLinuxディストリビューションを動かす記事が出てくる。目的に沿ってアーキテクチャを選ぶべきである(何でもそう)。

VirtualBox

VirtuaBoxも試した。下の参考ページにて、たしかにApple Silicon MacVirtualBoxをインストールすることはできる。しかし、自分が試した限り、Intel Mac同様に、VMは起動できないようである。必要な手順が書かれていないため、手順が足りないかどうか確認できない(21 April, 2024)。 VirtualBoxをインストールことする自体に、自分の視点からでは、価値が見いだせなかったため、VirtualBoxは使用せず、UTMを使用している。

VMマシンを動作させないで、VirtualBoxをインストールすること自体が、どこかで一定数需要があるのかもしれない。

Ref.

github.com