1. 概要
ここでは、Hyper-V を使って仮想マシンを構築します。
折角なので、マシン情報を標準化するためにスクリプトを用意します。
道のりをたどり始めたばかりのところです。
2. ロードマップ
- 1 全体的な説明
- 2 仮想マシンを構築 ★ 今ここ
- 3 GitLab の導入と GitLab Runner の導入
- 4 GitLab Runner 設定
- 5 テストラン
3. 構築
ここではいくつかの仮想マシンを構築するので、画面をポチポチするのはかったるいなぁと考えていました。
当初の予定では愚直に画面操作で作る予定でしたが、調べたところ Powershell で実現可能だと!
まあよく考えたら Hyper-V って「Windows の機能の有効化または無効化」から有効にできるから、Windows でコントロールしやすいだろうし。
利用した PowerShell は後に記載します。
3.1. 前提条件
-
ホスト PC で Hyper-V が有効にされていること。
-
Hyper-V で外部スイッチが設定されていること。
-
用語説明
| 用語 | 説明 |
|---|---|
| 外部スイッチ | ホスト PC 以外のマシンから、ホスト PC の NIC を介して仮想マシンへ接続できるようにする設定。 |
| NIC | ネットワークインターフェースという物理的な部品です。LAN ケーブルを指したり WiFi 接続できるようになります。 |
3.2. 仮想マシン構築時の引数
- 各マシンはこのような引数で構築させました。
- ISO ファイル置き場所などの、実行者によって確実に異なる引数は「略」としています。
| 用語 | 説明 | GitLab 用 | GitLab Runner (linux) 用 | GitLab Runner (windows) 用 |
|---|---|---|---|---|
| OsName | OS 名 | Ubuntu Desktop | Ubuntu Desktop | Windows Server |
| OsVersion | OS バージョン | 24.04.3 | 24.04.3 | 2019 |
| VmPurpose | 入れるアプリ名などの目的を示す | GitLab | GitLab Runner on Linux | GitLab Runner on Windows |
| VmMemoryStartupGigaBytes | 仮想マシンのメモリ(GB 単位) | 16 | 4 | 4 |
| IsoPath | OS の iso ファイルのフルパス | 略 | 略 | 略 |
| VMPath | 仮想マシン保存場所のフルパス | 略 | 略 | 略 |
| VHDGigaBytesSize | 仮想 HD のサイズ(GB 単位) | 50 | 50 | 50 |
| VMSwitch | 仮想マシンが利用するスイッチ名 | 略 | 略 | 略 |
| VMCpuCount | 仮想マシンの仮想プロセッサ数 | 8 | 4 | 4 |
3.3. 利用したスクリプト
- より細かく見たいかたは、GitHub にPSS スクリプトとスクリプト実行時のログを載せています。
- このログ出力方法は構築前後の比較がしにくいので、全体を Transcript で、前後の結果を各々別ファイルに書き出したりすればいい感じになると思っています。気が向けば改良しようかな...
Set-StrictMode -Version 3.0
$PSDefaultParameterValues["*:Encoding"] = "utf8"
$OutputEncoding = [Text.Encoding]::UTF8
[Console]::OutputEncoding = [Text.Encoding]::UTF8
$FileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.name);
$FileLocation = (Split-Path -Path $MyInvocation.MyCommand.Path -Parent)
$Now = Get-Date -Format yyyyMMdd_HHmmss
$LogFileName = "${FileNameWithoutExtension}_${Now}.log"
$LogFile = Join-Path -Path $FileLocation -ChildPath $LogFileName
Start-Transcript $LogFile -append
#----------------------------------------------
# Define variables
# $OsName os name will be used in VM
# $OsVersion os version will be used in VM
# $VmPurpose purpose of the VM
# $VMPath if you want to check existing VMs
# PS C:\Users\xxxxx> Get-VM | Select-Object Name, Path | Format-Table -AutoSize
# Name Path
# ---- ----
# CentOS Stream 9 E:\ProgramData\Microsoft\Windows\Hyper-V\CentOS Stream 9
# Debian 12.7.0 E:\ProgramData\Microsoft\Windows\Hyper-V\Debian 12.7.0
#
# $IsoPath path to the OS ISO file
# $VHDPath path to the VHDX file(auto completed)
# $VMSwitch existing virtual switch name
#----------------------------------------------
$OsName = "Ubuntu Desktop"
$OsVersion = "24.04.3"
$VmPurpose = "GitLab"
$VmName = "${OsName} ${OsVersion}(${VmPurpose})"
$VmMemoryStartupGigaBytes = 4
$IsoPath = "C:\Users\xxxxx\Desktop\system\os\Ubuntu Desktop\ubuntu-24.04.3-desktop-amd64.iso"
$VMPath = "E:\ProgramData\Microsoft\Windows\Hyper-V"
$VHDPath = "$VMPath\$VMName\Virtual Hard Disks\$VMName.vhdx"
$VHDGigaBytesSize = 50
$VMSwitch = "Hyper-V仮想スイッチ(外部)"
$VMCpuCount = 2
# get statue(before)
Get-VM | Select-Object Name, Path | Out-String -Width 4096
Get-Variable | Out-String -Width 4096
# create folder for VM
New-Item -ItemType Directory -Path $VMPath -Force
# create VM(generation 2)
# https://learn.microsoft.com/ja-jp/powershell/module/hyper-v/new-vm
New-VM -Name $VMName `
-Generation 2 `
-Path $VMPath `
-MemoryStartupBytes ([UInt64]$VmMemoryStartupGigaBytes * 1GB) `
-NewVHDPath $VHDPath `
-NewVHDSizeBytes ([UInt64]$VHDGigaBytesSize * 1GB) `
-SwitchName $VMSwitch
# set VM
# https://learn.microsoft.com/ja-jp/powershell/module/hyper-v/set-vm
Set-VM -VMName $vmName `
-ProcessorCount $VMCpuCount `
-StaticMemory -AutomaticCheckpointsEnabled $false
# set DVD drive
# https://learn.microsoft.com/ja-jp/powershell/module/hyper-v/add-vmdvddrive
Add-VMDvdDrive -VMName $VMName `
-Path $IsoPath
# set firmware(boot order, secure boot)
# https://learn.microsoft.com/ja-jp/powershell/module/hyper-v/set-vmfirmware
Set-VMFirmware -VMName $VMName `
-FirstBootDevice (Get-VMDvdDrive -VMName $VMName) `
-EnableSecureBoot Off
# create initial checkpoint
# https://learn.microsoft.com/ja-jp/powershell/module/hyper-v/checkpoint-vm
Checkpoint-VM -Name $VMName `
-SnapshotName "Init Checkpoint"
# get statue(after)
Get-VM | Select-Object Name, Path | Out-String -Width 4096
Get-Variable | Out-String -Width 4096
# start up the VM
# https://learn.microsoft.com/ja-jp/powershell/module/hyper-v/start-vm
Start-VM -Name $VMName
Write-Host "Completed. Press Enter to exit…" -ForegroundColor Yellow
[void] (Read-Host)
Stop-Transcript
- このように実行
PowerShell 7.5.4
PS C:\Users\whoami> ."C:\Users\whoami\Desktop\git\repositories\syachiku-kun\survey-ci-cd\01-setup-vm\setup-vm-with-hyperv.ps1"
Transcript started, output file is C:\Users\whoami\Desktop\git\repositories\syachiku-kun\survey-ci-cd\01-setup-vm\setup-vm-with-hyperv_20251229_104312.log
Name Path
---- ----
CentOS Stream 9 E:\ProgramData\Microsoft\Windows\Hyper-V\CentOS Stream 9
~~~中略~~~
Completed. Press Enter to exit… ]
Transcript stopped, output file is C:\Users\whoami\Desktop\git\repositories\syachiku-kun\survey-ci-cd\01-setup-vm\setup-vm-with-hyperv_20251229_104312.log
PS C:\Users\whoami>
4. OS セットアップ
4.1. OS インストール
OS インストール時のスクショは採取しました(地味だけど設定を忘れたらめんどいので...)。
量がおおいので折りたたんでいます。
ubuntu についてはautoinstall.yamlとやらを使ってインストールができるようだ。調べた限り結構学習コストが高そうなので、今回は見送ることにした(GRUB とか出てきたし...)。
気に入らない点があるといえば、gitlab-runner とホスト名が被ってしまったことだ。これはスルーして頂ければ…
運用上は IP アドレスでしか呼び出さないから問題は起きないだろう。
4.1.1. Ubuntu Desktop 24.04.3(GitLab) の場合
再起動時のfailed unmounting cdrom.mount - /cdromエラーは無視しても大丈夫です。
OS インストールのためにインストールメディアが使われているために、アンマウント失敗しただけのことです。
Hyper-V で仮想マシンの設定から、ハードウェア > SCSIコントローラー > DVDドライブ > メディアをなしに切り替えましょう。
4.1.2. Ubuntu Desktop 24.04.3(GitLab Runner on Linux) の場合
再起動時のfailed unmounting cdrom.mount - /cdromエラーは同じく予想していたのですが、後続のエラーについてはわかりませんでした。
こちらを見ると、sr0 は CdRom だから同じようなことを言っているのだろうか。有識者様、ご教授いただければ幸いです。
4.1.3. Windows Server 2019(GitLab Runner on Windows) の場合
Windows はホスト名を変える作業も含めます。Ubuntu みたいに OS インストール作業に含めてほしいものです。
1 枚目のMicrosoft Hyper-V UEFIとある画面は、メディアディスクを刺した状態の OS インストール前仮想マシンを起動してしばらく経つと勝手に遷移します。Enter キーなどの何かのキーを起動後に素早く押すと 2 枚目の画面が表示されます。
4.2. 静的 IP 割り当て&実機から仮想マシンへの疎通確認
4.2.1. FW 停止
-
個人用&めんどくさいので、いったん FW をとめちゃいます...
- 会社ではマネしないでください!
- Linux 側では、
sudo systemctl stop ufwでぶった切りましょう。
- Windows 側では、
設定 > 更新とセキュリティ > Windows セキュリティ > ファイアウォールとネットワーク保護にある各々の項目(ドメインネットワークなど)で、Microsoft Defender ファイアウォールを OFF にすることで無効化できます。
- もしくは PowerShell から
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False -PassThruで一発です。
4.2.2. Linux 側で静的 IP 割り当て
- まず DHCP サーバー側で、DHCP クライアントがどうなっているか確認します。
- 動的にどの IP アドレスが割り振られているかを確認します。
- 177, 178, 179 がそれぞれ割り振られていますね。
- 179 は WindowsOS セットアップ時に確認済なので、3 台の仮想マシン各々の IP アドレスを特定できました。
-
Ubuntu Desktop 24.04.3(GitLab)仮想マシンで、192.168.0.177を固定 IP アドレスにする設定をします。有線設定を開きます。

-
有線項目の右端にある歯車アイコンをクリックします。
-
有線 > 詳細タブが開き、ネットワーク設定を確認できます。自分の環境のスクショを貼っておきますが、実際は各環境によって異なります。
- 初めに
ipコマンドで状態確認をします。ifconfigはまだ入っていないのでこちらのコマンドでチェックします。
- いったん仮想マシンを再起動し、再度 IPv4 アドレスを確認します。うまく割り振られていないならば、再起動時に DHCP サーバーがまたアドレスを割りなおすので、IPv4 アドレスが変わってしまいます。
-
eth0 > inetは192.168.0.177で固定されてますね。
-
gitlab@gitlab:~$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:55:01:11 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.177/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
gitlab@gitlab:~$
-
Ubuntu Desktop 24.04.3(GitLab Runner on Linux)仮想マシンで、192.168.0.178を固定 IP アドレスにする設定をします。作業は先ほどと同じです。
4.2.3. Windows 側で静的 IP 割り当て
-
Windows Server 2019(GitLab Runner on Windows)仮想マシンで、192.168.0.178を固定 IP アドレスにする設定をします。作業は先ほどと同じです。
- 用語説明
| 用語 | 説明 |
|---|---|
| DHCP | Dynamic Host Configuration Protocol の略称です。動的に設定を割り振ってくれるプロトコルです。詳細はこちら にも。 |
| DHCP サーバー | 動的に設定を割り当てる側です。平たく言えばルーター等が当てはまります。詳細はこちら にも。 |
| DHCP クライアント | 動的に設定を割り当てられる側です。ルーター等に繋いでいる PC やスマホなどもろもろが当てはまります。 |
4.2.2. 疎通確認
- 別マシンから ping を通せたらヨシ!
Microsoft Windows [Version 10.0.26200.7462]
(c) Microsoft Corporation. All rights reserved.
C:\Users\xxxxx>ping 192.168.0.177
192.168.0.177 に ping を送信しています 32 バイトのデータ:
192.168.0.177 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.177 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.177 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.177 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.177 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms
C:\Users\xxxxx>ping 192.168.0.178
192.168.0.178 に ping を送信しています 32 バイトのデータ:
192.168.0.178 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.178 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.178 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.178 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.178 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms
C:\Users\xxxxx>ping 192.168.0.179
192.168.0.179 に ping を送信しています 32 バイトのデータ:
192.168.0.179 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.179 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.179 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.179 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.179 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 0ms、平均 = 0ms
C:\Users\xxxxx>
5. まとめ
- この作業をしたことで、下記に含まれる派手なピンク部分のOS構築が終わりました。
- 次はこの中身のアプリを導入します。




























































