はじめに
このシリーズでは、Ubuntu 26.04 LTSを使って、Webサーバー・データベース・ファイル共有・監視ツールなど、実際に手を動かして構築できる定番アプリケーションのガイドを継続的に公開していきます。第1回となる本ページでは、その基盤となる「USBブートメディアの作成」から「OSインストール」「SSHでのリモート管理設定」までを扱います。
今回はノートPCの実機にインストールしましたが、手順自体はデスクトップPCでも共通です。
1. コンセプト
Server版のUbuntuを実機にインストールする作業は、仮想マシンへのインストールと違って「起動USBの作り方」「実際のネットワークカードの型番による違い」など、教科書通りにいかない部分に多くつまずきポイントがあります。本ページでは、実際に発生したエラーや設定の食い違いをすべてそのまま記録し、同じ状況に遭遇した際の解決の道しるべとなることを目指します。
2. なぜこれを学ぶのか
Webサーバーやデータベースの構築ガイドは世の中に数多くありますが、その前提となる「クリーンな検証環境の作り方」は意外と情報が少なく、つまずくと最初の一歩で止まってしまいます。ここを確実に押さえておくことで、この後のシリーズ全体(Webサーバー、CMS、ファイル共有等)をスムーズに進められます。
3. 詳細な技術要素
| 用語 | 説明 |
|---|---|
| DDモード(生書き込み) | ISOファイルの中身をファイルとして展開するのではなく、ディスクの先頭から1バイトずつそのまま転写する書き込み方式。ブートローダーの位置情報などが保持されるため、正しく起動できる。 |
| ISOイメージモード | ISO内のファイルを個別に取り出してUSBのファイルシステムにコピーする方式。手軽だが、ブートローダーが自分の構成ファイルを見つけられず起動に失敗することがある。 |
| 予測可能なネットワークインターフェース名 | systemdが採用する命名規則。PCI直付けのNICはenp1s0のような名前になるが、USB接続のNICはenx+MACアドレスという名前になる。 |
| LVM(論理ボリュームマネージャ) | 物理ディスクを「ボリュームグループ」としてまとめ、その中に柔軟にサイズ変更できる「論理ボリューム」を作る仕組み。 |
| sshd_config.d/Include | Ubuntuのsshd_configは末尾近くでInclude /etc/ssh/sshd_config.d/*.confを読み込む。同じ設定項目が複数箇所にある場合、先に読み込まれた値が優先される。 |
4. 実証手順
Server版とDesktop版、どちらを選ぶか
本シリーズで作成するガイドは、いずれもCUI(コマンドライン)操作を前提としたServer版で検証しています。GUIを使いたい場合も、まずServer版をインストールしてから、後からsudo apt install ubuntu-desktop(または軽量なxfce4等)でデスクトップ環境を追加する方法をおすすめします。
NOTE:なぜServer版から始めるのか
世の中の多くのサーバー構築ガイドはServer版(CUI)を前提にしています。最初からDesktop版を選ぶと、GUI由来の初期状態の違い(ネットワーク管理方式や起動サービスの違いなど)が原因で、他のガイドの手順と微妙に噛み合わなくなることがあります。
USBブートメディアを作成する(DDモードで生書き込み)
Rufus等のツールでUSBを作成した際に、ファイルがそのまま展開された状態(ISOイメージモード相当)になってしまい、正しく起動できないことがあります。ここではWindows標準機能(PowerShell)だけで、ISOをUSBへ丸ごと生書き込みする方法を紹介します。
# USB接続かつ想定サイズ範囲のディスクだけを対象にする
$candidates = Get-Disk | Where-Object { $_.BusType -eq 'USB' -and $_.Size -gt 10GB -and $_.Size -lt 20GB }
if (@($candidates).Count -ne 1) { throw "USBディスクを一意に特定できません" }
$diskNumber = $candidates.Number
Clear-Disk -Number $diskNumber -RemoveData -RemoveOEM -Confirm:$false
Add-Type -Namespace Win32 -Name RawDisk -MemberDefinition @'
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(
string lpFileName, uint dwDesiredAccess, uint dwShareMode,
IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
'@
$handle = [Win32.RawDisk]::CreateFile("\\.\PhysicalDrive$diskNumber", 0x40000000, 0x3, [IntPtr]::Zero, 3, 0, [IntPtr]::Zero)
$out = New-Object System.IO.FileStream($handle, [System.IO.FileAccess]::Write)
$iso = [System.IO.File]::OpenRead("C:\path\to\ubuntu-26.04-live-server-amd64.iso")
$buffer = New-Object byte[] 4MB
while (($read = $iso.Read($buffer, 0, $buffer.Length)) -gt 0) { $out.Write($buffer, 0, $read) }
$out.Flush(); $iso.Close(); $out.Close(); $handle.Close()
この方式の詳しい経緯(なぜ[System.IO.File]::OpenWriteでは失敗するのか)は次章「トラブルシューティング」参照。
インストーラーでの設定ポイント
- キーボードレイアウト:JIS配列のキーボードなら「Japanese」、US配列なら「English (US)」を選択。あとから
sudo dpkg-reconfigure keyboard-configurationでも変更可能。 - インストールの種類:「Ubuntu Server」(デフォルト)を選択。「Ubuntu Server (minimized)」は人間がログインしない自動化環境向けのため、実際に操作する検証機には不向き。
- ネットワーク設定:DHCPで正常にIPが取得できない場合は、IPv4を「Manual」に切り替え、Subnet/Address/Gateway/Name serversを直接入力する(値の決め方は次のステップ参照)。
- ストレージ(LVM):ガイド付きLVM構成を選んだ場合、デフォルトでは
/用の論理ボリュームにディスクの一部しか割り当てず、残りをボリュームグループの「空き容量」として未使用のまま残すことが多い。既存のubuntu-lvの行を選んでSizeを編集し、空き容量をほぼ使い切るサイズに変更しておく(LVMなので後からの拡張も可能)。 - SSH設定:「Install OpenSSH server」に必ずチェックを入れる。「Allow password authentication」は、鍵認証を設定するまでの間は一時的にチェックを入れたままにしておくと後の作業が楽になる。
インストール後、固定IPが反映されない場合の対処
インストーラーで固定IPを設定したのに、再起動後DHCPで別のIPが割り当てられてしまうことがある。原因は、インストーラーが認識したネットワークインターフェース名と、実際にインストール後起動した際の名前が食い違っているケースが多い。
ip a
# 例:enx+MACアドレス、という名前(USB接続のLANアダプタの場合)
sudo cat /etc/netplan/00-installer-config.yaml
# "ethernets:" の下の名前が実際のインターフェース名と違っていたら書き換える
sudo sed -i 's/(インストーラーが書いた名前):/(実際のインターフェース名):/' /etc/netplan/00-installer-config.yaml
sudo netplan apply
SSH鍵認証を設定し、パスワード認証を無効化する
パスワード認証のままだと、リモートからの総当たり攻撃のリスクが残る。手元のPCで作成済みの公開鍵をこのサーバーに登録し、鍵認証だけでログインできるようにする。
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "(手元のPCの ~/.ssh/id_ed25519.pub の内容)" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config.d/50-cloud-init.conf
sudo sshd -t
sudo systemctl restart ssh
sudo sshd -T | grep -i passwordauth
実機で発生:メインのsshd_configだけ編集しても反映されない
詳細は次章「トラブルシューティング」参照。Ubuntuのインストーラー(subiquity)が生成する/etc/ssh/sshd_config.d/50-cloud-init.confが優先されるため、そちらを直接編集する必要がある。
5. トラブルシューティング
USBから起動すると grub> というプロンプトで止まる
原因:USB作成ツールが「ISOイメージモード」(ファイルを個別展開する方式)で書き込んでおり、GRUBが自分の設定ファイルを見つけられず起動に失敗している。
解決策:手順2の通り、ISOをディスクへ丸ごと転写する「DDモード」で書き込み直す。USB作成ツールを使う場合は、書き込みモードの選択で「DD image」に相当する方を選ぶこと。
PowerShellで [System.IO.File]::OpenWrite("\\.\PhysicalDriveN") が「パラメーターが間違っています」で失敗する
解決策:.NETのFile.OpenWriteは物理ディスクへの生アクセスに対応していない。手順2のようにWin32 APIのCreateFileをP/Invokeで直接呼び出し、そのハンドルをFileStreamでラップして書き込む方式に切り替える。
固定IPを設定したのにDHCPでIPが割り当てられてしまう
解決策:手順4の通り、ip aで実際のインターフェース名を確認し、netplanの設定ファイル内の名前と一致しているか確認する。特にUSB接続のLANアダプタはenx+MACアドレスという名前になり、インストーラーが表示した名前と食い違うことがある。
sshd_configにPasswordAuthentication noを追記しても効果がない
解決策:Ubuntuのインストーラーがネットワーク設定画面の「Allow password authentication」にチェックを入れた場合、/etc/ssh/sshd_config.d/50-cloud-init.confに明示的にPasswordAuthentication yesが書き込まれる。このファイルはメインのsshd_configよりも先に読み込まれるため、メインファイルへの追記より優先されてしまう。sudo sshd -T | grep -i passwordauthで実際に有効な設定を確認しながら、該当のドロップインファイルを直接編集すること。
6. まとめ
今回は、USBブートメディアの作成からOSインストール、ネットワーク・SSHの設定まで、実機ならではのつまずきポイントを一通り解説しました。
このPhaseで確認できれば十分です(学習チェックリスト)
- USBメディアがDDモードで正しく作成され、実機からUbuntuインストーラーが起動することを確認した
- 固定IPでSSH接続できることを確認した
- SSH鍵認証でログインでき、パスワード認証が無効化されていることを確認した
- LVMの論理ボリュームサイズが、想定通りディスクの大部分を使っていることを確認した