自分用・検証用 Ubuntu22.04.4LTS 作成手順メモ(2024/04/04 版)
以前に以下のメモを書きました。
- 自分用・検証用 Ubuntu22.04LTS Beta 作成手順メモ(2022/03/24 版)
- 自分用・検証用 Ubuntu22.04.1LTS 作成手順メモ(2022/08/30 版)
- 自分用・検証用 Ubuntu22.04.2LTS 作成手順メモ(2023/05/06 版)
- 自分用・検証用 Ubuntu22.04.2LTS 作成手順メモ(2023/06/05 版)
内容は過去メモとほぼ同じですが、以下が異なります。
- Ubuntu のバージョンを更新 (22.04.04LTS ベース)
初期セットアップスクリプト¶
仮想マシン作成後、このメモの 2 章に記載している「初回セットアップ」だけを実行したい場合は、下記を実行することでも実現出来ます (※ 但し、このスクリプトはバージョンアップされている為、「設定値」や「インストールされるソフトウェアのバージョン」などがメモ中に記載したものと異なる可能性があります)。
curl -Ls https://raw.githubusercontent.com/sig9org/init-linux/master/init-ubuntu22.sh | bash -s -- --base
このメモの 2 章 及び 3 章の設定内容をまとめて実行するには下記を実行します。 但し、(このメモでは asdf をインストールしていませんが) このスクリプトでは「asdf を使ってパッケージ管理する」前提になっています。 asdf を利用したくない場合、このスクリプトは利用しないでください。
インストール用の ISO イメージ¶
Ubuntu の ISO イメージは IIJ が公開している Ubuntu 22.04.4 LTS (Jammy Jellyfish) から下記のバイナリをダウンロードして利用しました。
コンソールからインストーラへアクセスする¶
必要になる場合は少ないと思われますが、コンソールからインストーラへアクセスしたい場合は VM の Ubuntu でコンソールからインストーラへ接続する を参考にします。
仮想マシンのスペック¶
今回、作成する仮想マシンのスペックは以下としました。 デフォルトでは LVM が利用されますが、ストレージを 10GB 以上にすると / にマウントされるのが (最大サイズでは無く) 10GB しか割り当てられないようです。 今回は / に最大サイズを割り当てたい為、インストール中に調整します。
| vCPU | メモリ | ストレージ | ネットワークカード |
|---|---|---|---|
| 4 | 4GB | 50GB | 1 (VMXNET3) |
1.インストール¶
1-1.GNU GRUB version 2.06¶
Try or Install Ubuntu Server を選択します。

1-2.Willkommen! Bienvenue! Welcome! Добро пожаловать! Welkom¶
言語を選択します。 English を選択します。

1-3.Keyboard configuration¶
キーボードの設定を行います。 Layout と Variant はデフォルトのまま、English (US) が選択された状態で Done を選択します。

1-4.Choose type of install¶
インストール種別を選択します。 「必要なものは後で追加する」方針なので Ubuntu Server (minimized) を選択しても良いのですが、これは基本的なパッケージもかなり不足してしまい、結局あれこれ追加することになってしまう為、今回は Ubuntu Server のまま Done を選択します。

1-5.Network connections¶
ネットワーク設定を行います。 環境に合わせて設定します。 今回は DHCP 設定を想定しているので、デフォルトのまま Done を選択します。

1-6.Configure proxy¶
Proxy の設定を行います。 Proxy は利用しない想定なので空欄のまま、次へ進みます。

1-7.Configure Ubuntu archive mirror¶
ミラーの URL を指定します。 デフォルトの http://jp.archive.ubuntu.com/ubuntu のまま Done を選択します。

1-8.Guided storage configuration¶
ストレージ領域の設定を行います。 デフォルトで Use an entire disk が選択されているので、このまま Done を選択します。

以下のような画面が表示されます。 LVM の LV (Logical Volume) サイズを調整するので ubuntu-lv を選択します。

Edit を選択します。

LV の情報が表示されます。 仮想マシン自体のストレージサイズは 50GB で作成していますが、LV に割り当てられたサイズは半分の 23.996GB になっており、残りの半分である 24GB は未割り当て領域です。

LV のサイズを最大に変更します。 今回は 47.996GB にしました。 変更が完了したら Save を選択します。

これで LV のサイズ変更は完了し、未割り当て領域は無くなりました。 Done を選択します。

続行の確認を求められます。 Continue を選択します。

1-9.Profile setup¶
追加するユーザのプロファイル情報を入力します。 スキップ出来ず、しかも全項目入力必須なようです。

今回は以下のように入力しました。 入力が完了したら Done を選択します。
| 項目 | 値 |
|---|---|
| Your name | user |
| Your server's name | localhost |
| Pick a username | user |
| Choose a password | password |
| Confirm your password | (同上) |

1-10.Upgrade to Ubuntu Pro¶
Ubuntu Pro へアップグレードするか、確認されます。 デフォルトのまま Skip for now が選択された状態で Continue を選択します。

1-11.SSH Setup¶
OpenSSH サーバをインストールするか、選択を要求されます。

デフォルトでは「インストールしない」状態になっていますので、Install OpenSSH server にチェックを入れ、Done を選択します。

1-12.Featured Server Snaps¶
インストールするソフトウェアを選択します。 必要なものは後からインストールしますので、ここでは何もせず、デフォルトのまま Done を選択します。

1-13.Installing system¶
インストールが開始されます。

インストールが完了したら Reboot Now を選択します。

仮想マシンの状態としてはメディアが Disconnect 状態になりますが、ゲスト OS 側は以下の表示になり、再起動プロセスが止まってしまいます。 そのまま ENTER を押すと再起動されます。

尚、インストール直後でストレージの使用状態は以下のようになっていました。
user@localhost:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 392M 1.2M 390M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 47G 6.8G 38G 16% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 2.0G 129M 1.7G 8% /boot
tmpfs 392M 4.0K 392M 1% /run/user/1000
2.初期セットアップ¶
2-1.標準ユーザで SSH ログインする¶
追加パッケージをインストールしなくても open-vm-tools がインストールされる為、DHCP サーバから IP アドレスを取得していれば ESXi / vCenter 上から IP アドレスを確認出来ます。

確認したアドレスに対して、インストーラで作成したユーザ (user) で SSH ログインします。
$ ssh user@10.0.0.100
Warning: Permanently added '10.0.0.100' (ECDSA) to the list of known hosts.
user@10.0.0.100's password:
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-101-generic x86_64)
(snip)
user@localhost:~$
以降の作業を実施する為に root ユーザに昇格しておきます。
2-2.root のパスワードを設定する¶
root ユーザのパスワードを変更しておきます。 パスワードは自身の環境に合わせて任意で設定します。
パスワード変更後は root ユーザを指定し、パスワード認証による SSH ログインが出来ることを確認しておきます。 以降の作業は (標準ユーザはログアウトし) root ユーザで継続します。
2-3.root ユーザの公開鍵を登録する¶
root ユーザへ鍵を使って SSH ログイン出来るよう、公開鍵を登録しておきます。 鍵の登録が終わったら、実際に鍵を使って (パスワードを入力せずに) SSH ログイン出来ることを確認します。
2-4.標準ユーザを削除する¶
一般的にはセキュリティの観点から推奨されませんが「検証環境なので全て root で作業する」「標準ユーザは不要」と割り切れるのであれば、インストール中に作成した標準ユーザを削除します。
2-5.タイムゾーンを Asia/Tokyo に設定する¶
タイムゾーンを Asia/Tokyo に設定しておきます。 設定が完了したら date や timedatectl status でタイムゾーンが Asia/Tokyo へ変更されたことを確認しておきます。
2-6.NTP の時刻同期先サーバを設定する¶
NTP サーバは time.cloudflare.com のご紹介 で言及されている CloudFlare の NTP サーバを設定します。
cat << EOF >> /etc/systemd/timesyncd.conf
NTP=162.159.200.123 162.159.200.1
EOF
systemctl restart systemd-timesyncd.service
NTP サーバとの時刻同期状態は timedatectl timesync-status で確認出来ます。
2-7.sshd の設定変更 (自動切断の防止 / root ログインの許可)¶
sshd で自動切断されるのを防ぐ為、ClientAliveInterval や ClientAliveCountMax を設定します。 これらの値は以下の意味を持ちます。
| 項目 | 意味 | デフォルト値 |
|---|---|---|
| ClientAliveInterval | 指定した秒数ごとに応答確認を行う間隔 (※ 0 の場合は何もしない) | 0 |
| ClientAliveCountMax | 応答確認を行う回数 | 3 |
これらの値をチューニングしつつ、root ユーザでの SSH ログインを許可しておきます。 設定が完了したら sshd を再起動しておきます。
sed -i -e "s/#ClientAliveInterval 0/ClientAliveInterval 60/g" /etc/ssh/sshd_config && \
sed -i -e "s/#ClientAliveCountMax 3/ClientAliveCountMax 5/g" /etc/ssh/sshd_config && \
sed -i -e "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config && \
systemctl restart sshd.service
sshd の設定確認には sshd -T を実行します。
2-8.SSH 接続時の警告時を表示しない¶
別のホストへ SSH 接続する際、警告が表示されないように設定しておきます。 また Unable to negotiate with 192.168.1.1 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1 等のエラーを回避する為に、必要な鍵交換アルゴリズムを追加しておきます。
cat << EOF > /etc/ssh/ssh_config.d/99_lab.conf
Ciphers aes128-cbc,aes256-ctr
HostkeyAlgorithms +ssh-rsa
KexAlgorithms +diffie-hellman-group1-sha1
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
EOF
2-9.AppArmor を無効化する¶
AppArmor は RedHat 系で言うところの SELinux に近いセキュリティ機構です。 デフォルトでは有効化されている為、無効化しておきます。
2-10.プロンプト表示をカスタマイズする¶
RedHat / Ubuntu でシェルのプロンプト表示をカスタマイズする や macOS でプロンプトをカスタマイズする というメモを書きましたが、root ユーザのプロンプト表示と今後、新規作成されるユーザ用の設定を実施しておきます。
cat << 'EOF' >> ~/.bashrc
# Modify the prompt.
if [ `id -u` = 0 ]; then
PS1="\[\e[1;31m\]\u@\h \W\\$ \[\e[m\]"
else
PS1="\[\e[1;36m\]\u@\h \W\\$ \[\e[m\]"
fi
EOF
cat << 'EOF' >> /etc/skel/.bashrc
# Modify the prompt.
if [ `id -u` = 0 ]; then
PS1="\[\e[1;31m\]\u@\h \W\\$ \[\e[m\]"
else
PS1="\[\e[1;36m\]\u@\h \W\\$ \[\e[m\]"
fi
EOF
2-11.Welcome メッセージを表示しない¶
Ubuntu 21.04 で Welcome メッセージを表示しない というメモを書きましたが、Ubuntu へ SSH ログインした際に表示される Welcome メッセージを表示されないように設定しておきます。
2-12.再起動確認を表示しない¶
Ubuntu 22.04 Server 以降はデフォルトで needrestat パッケージがインストールされるようです。 needrestart が有効な場合、ライブラリなどをアップデートした際に「デーモンの再起動をして良いか?」を確認メッセージが表示されるようになります。 検証環境ではこの確認は不要なので、無効にしてしまいます。
cat << 'EOF' > /etc/needrestart/conf.d/99_restart.conf
$nrconf{kernelhints} = '0';
$nrconf{restart} = 'a';
EOF
2-13.基本的なパッケージのインストール¶
基本的なパッケージをインストールしておきます。
apt update && \
apt -y install \
fping \
git \
neovim \
nmap \
ripgrep \
tree \
tshark \
unzip \
zip
2-14.NeoVim 用の設定¶
vi または vim と入力された場合も NeoVim が起動されるよう、alias を設定しておきます。
2-15.コンソールの有効化¶
検証上、必要であればコンソールを有効化します。 /etc/default/grub を以下のように変更します。
変更前 (コメント除外版)¶
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""
変更後¶
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0,115200n8"
GRUB_CMDLINE_LINUX=""
変更が完了したら update-grub を実行して GRUB を更新しておきます。
2-16.アドレス変更用スクリプトを配置する¶
固定アドレス化する手順を省力化する為、IP アドレスとゲートウェイ設定を変更するスクリプトを /usr/local/bin/chaddr へ配置します。
cat << EOF > /usr/local/bin/chaddr
#!/usr/bin/env python3
import argparse
import subprocess
import textwrap
parser = argparse.ArgumentParser()
parser.add_argument('-a', '--address', required=True)
parser.add_argument('-g', '--gateway', required=True)
args = parser.parse_args()
hostname = args.address.replace('.', '-')
subprocess.call('hostnamectl set-hostname ' + hostname, shell=True)
netplan = textwrap.dedent('''
network:
ethernets:
ens160:
dhcp4: false
dhcp6: false
addresses: [{arg1}/24]
gateway4: {arg2}
nameservers:
addresses: [1.1.1.1, 1.0.0.1]
version: 2
''').format(arg1=args.address, arg2=args.gateway).strip()
with open('/etc/netplan/99_config.yaml', 'w') as f:
f.write(netplan)
hosts = textwrap.dedent('''
127.0.0.1 localhost {arg1}
127.0.1.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet {arg1}
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
''').format(arg1=hostname).strip()
with open('/etc/hosts', 'w') as f:
f.write(hosts)
EOF
chmod 755 /usr/local/bin/chaddr
2-17.uncmnt のインストール¶
コメントを除外することが出来るツールをインストールしておきます。 GitHub の sig9org/uncmnt からインストールしておきます。
curl -L https://github.com/sig9org/uncmnt/releases/download/v0.0.2/uncmnt_v0.0.2_linux_amd64 -o /usr/local/bin/uncmnt && \
chmod 755 /usr/local/bin/uncmnt
2-18.システム全体のアップデートと OS 再起動¶
最後にシステム全体のアップデートを実行します。 カーネルの更新などがある場合を考慮し、アップデート後は OS を再起動します。
2-19.キャッシュ / コマンド実行履歴を削除して仮想マシンを停止する¶
apt のキャッシュとコマンド実行履歴を削除しておきます。 ここまで完了したら仮想マシンを電源オフします。
2-20.VM から DVD メディアを取り出しておく¶
通常であればインストーラ終了時に光学ドライブからメディアは取り出されているはずですが、万一メディアが残っているようであればテンプレート化する前に取り出しておきます。
2-21.テンプレート化する¶
ここまで用意が出来たら仮想マシンをテンプレート化します。 以降、検証用の仮想マシンを作成したい場合はこのテンプレートから複製します。
3.追加パッケージのインストール¶
必要であればパッケージを追加します。 尚、asdf を利用する場合は下記のメモなどを参考にします。
3-1.direnv¶
Python の venv 環境を direnv で自動的に有効/無効化する というメモを書きましたが、Python で venv を利用しているのであれば direnv が便利です。
curl -L https://github.com/direnv/direnv/releases/download/v2.34.0/direnv.linux-amd64 -o /usr/local/bin/direnv && \
chmod 755 /usr/local/bin/direnv
~/.bashrc に direnv を起動する設定を追加しておきます。
3-2.pip と venv¶
Ubuntu 22.04.4LST には現時点で python が無く、python3 として Python 3.10.12 がインストールされていました。
# python --version
Command 'python' not found, did you mean:
command 'python3' from deb python3
command 'python' from deb python-is-python3
# python3 --version
Python 3.10.12
しかし、pip と venv が無い為、インストールしておきます。
3-3.docker¶
docker インストール後は「停止している」ものの「自動起動する」設定になっていました。 念の為、「起動」「自動起動」両方の設定を実施しておきます。
apt-get -y remove docker docker-engine docker.io containerd runc
apt-get update
apt-get -y install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3-4.docker compose¶
Docker Compose v2 をインストールするには以下を実行します。
mkdir -p /usr/local/lib/docker/cli-plugins/ && \
curl -SL https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose && \
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
3-5.docker purge¶
全コンテナを停止・削除する docker サブコマンド「docker purge」 や 全コンテナを停止・削除する「docker purge」アップデート (v0.0.2) というメモを書きました。 docker コンテナを一度に停止することが出来るので GitHub の sig9org/docker-purge からインストールしておきます。