Skip to content

自分用・検証用 Ubuntu22.04.4LTS 作成手順メモ(2024/04/04 版)

以前に以下のメモを書きました。

内容は過去メモとほぼ同じですが、以下が異なります。

  • Ubuntu のバージョンを更新 (22.04.04LTS ベース)

初期セットアップスクリプト

仮想マシン作成後、このメモの 2 章に記載している「初回セットアップ」だけを実行したい場合は、下記を実行することでも実現出来ます (※ 但し、このスクリプトはバージョンアップされている為、「設定値」や「インストールされるソフトウェアのバージョン」などがメモ中に記載したものと異なる可能性があります)。

1
curl -Ls https://raw.githubusercontent.com/sig9org/init-linux/master/init-ubuntu22.sh | bash -s -- --base

このメモの 2 章 及び 3 章の設定内容をまとめて実行するには下記を実行します。 但し、(このメモでは asdf をインストールしていませんが) このスクリプトでは「asdf を使ってパッケージ管理する」前提になっています。 asdf を利用したくない場合、このスクリプトは利用しないでください。

1
curl -Ls https://raw.githubusercontent.com/sig9org/init-linux/master/init-ubuntu22.sh | bash -s

インストール用の 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 を選択します。

file

1-2.Willkommen! Bienvenue! Welcome! Добро пожаловать! Welkom

言語を選択します。 English を選択します。

file

1-3.Keyboard configuration

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

file

1-4.Choose type of install

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

file

1-5.Network connections

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

file

1-6.Configure proxy

Proxy の設定を行います。 Proxy は利用しない想定なので空欄のまま、次へ進みます。

file

1-7.Configure Ubuntu archive mirror

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

file

1-8.Guided storage configuration

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

file

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

file

Edit を選択します。

file

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

file

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

file

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

file

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

file

1-9.Profile setup

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

file

今回は以下のように入力しました。 入力が完了したら Done を選択します。

項目
Your name user
Your server's name localhost
Pick a username user
Choose a password password
Confirm your password (同上)

file

1-10.Upgrade to Ubuntu Pro

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

file

1-11.SSH Setup

OpenSSH サーバをインストールするか、選択を要求されます。

file

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

file

1-12.Featured Server Snaps

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

file

1-13.Installing system

インストールが開始されます。

file

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

file

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

file

尚、インストール直後でストレージの使用状態は以下のようになっていました。

1
2
3
4
5
6
7
8
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 アドレスを確認出来ます。

file

確認したアドレスに対して、インストーラで作成したユーザ (user) で SSH ログインします。

1
2
3
4
5
6
$ 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 ユーザに昇格しておきます。

1
2
3
user@localhost:~$ sudo su -
[sudo] password for user:
root@localhost:~#

2-2.root のパスワードを設定する

root ユーザのパスワードを変更しておきます。 パスワードは自身の環境に合わせて任意で設定します。

echo root:'PASSWORD' | /usr/sbin/chpasswd

パスワード変更後は root ユーザを指定し、パスワード認証による SSH ログインが出来ることを確認しておきます。 以降の作業は (標準ユーザはログアウトし) root ユーザで継続します。

2-3.root ユーザの公開鍵を登録する

root ユーザへ鍵を使って SSH ログイン出来るよう、公開鍵を登録しておきます。 鍵の登録が終わったら、実際に鍵を使って (パスワードを入力せずに) SSH ログイン出来ることを確認します。

1
2
3
4
cat << 'EOS' >> ~/.ssh/authorized_keys
(公開鍵)
EOS
chmod 600 ~/.ssh/authorized_keys

2-4.標準ユーザを削除する

一般的にはセキュリティの観点から推奨されませんが「検証環境なので全て root で作業する」「標準ユーザは不要」と割り切れるのであれば、インストール中に作成した標準ユーザを削除します。

userdel -r user

2-5.タイムゾーンを Asia/Tokyo に設定する

タイムゾーンを Asia/Tokyo に設定しておきます。 設定が完了したら datetimedatectl status でタイムゾーンが Asia/Tokyo へ変更されたことを確認しておきます。

timedatectl set-timezone Asia/Tokyo

2-6.NTP の時刻同期先サーバを設定する

NTP サーバは time.cloudflare.com のご紹介 で言及されている CloudFlare の NTP サーバを設定します。

1
2
3
4
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 で確認出来ます。

timedatectl timesync-status

2-7.sshd の設定変更 (自動切断の防止 / root ログインの許可)

sshd で自動切断されるのを防ぐ為、ClientAliveInterval や ClientAliveCountMax を設定します。 これらの値は以下の意味を持ちます。

項目 意味 デフォルト値
ClientAliveInterval 指定した秒数ごとに応答確認を行う間隔 (※ 0 の場合は何もしない) 0
ClientAliveCountMax 応答確認を行う回数 3

これらの値をチューニングしつつ、root ユーザでの SSH ログインを許可しておきます。 設定が完了したら sshd を再起動しておきます。

1
2
3
4
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 を実行します。

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 等のエラーを回避する為に、必要な鍵交換アルゴリズムを追加しておきます。

1
2
3
4
5
6
7
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 に近いセキュリティ機構です。 デフォルトでは有効化されている為、無効化しておきます。

1
2
systemctl stop apparmor.service && \
systemctl disable apparmor.service

2-10.プロンプト表示をカスタマイズする

RedHat / Ubuntu でシェルのプロンプト表示をカスタマイズするmacOS でプロンプトをカスタマイズする というメモを書きましたが、root ユーザのプロンプト表示と今後、新規作成されるユーザ用の設定を実施しておきます。

1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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 メッセージを表示されないように設定しておきます。

1
2
3
cat << EOF > ~/.hushlogin
exit
EOF

2-12.再起動確認を表示しない

Ubuntu 22.04 Server 以降はデフォルトで needrestat パッケージがインストールされるようです。 needrestart が有効な場合、ライブラリなどをアップデートした際に「デーモンの再起動をして良いか?」を確認メッセージが表示されるようになります。 検証環境ではこの確認は不要なので、無効にしてしまいます。

1
2
3
4
cat << 'EOF' > /etc/needrestart/conf.d/99_restart.conf
$nrconf{kernelhints} = '0';
$nrconf{restart} = 'a';
EOF

2-13.基本的なパッケージのインストール

基本的なパッケージをインストールしておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apt update && \
apt -y install \
    fping \
    git \
    neovim \
    nmap \
    ripgrep \
    tree \
    tshark \
    unzip \
    zip

2-14.NeoVim 用の設定

vi または vim と入力された場合も NeoVim が起動されるよう、alias を設定しておきます。

1
2
3
4
5
6
cat << 'EOF' >> ~/.bashrc

# NeoVim settings
alias vi="nvim"
alias vim="nvim"
EOF

2-15.コンソールの有効化

検証上、必要であればコンソールを有効化します。 /etc/default/grub を以下のように変更します。


変更前 (コメント除外版)

1
2
3
4
5
6
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=""

変更後

1
2
3
4
5
6
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 を更新しておきます。

update-grub

2-16.アドレス変更用スクリプトを配置する

固定アドレス化する手順を省力化する為、IP アドレスとゲートウェイ設定を変更するスクリプトを /usr/local/bin/chaddr へ配置します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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 からインストールしておきます。

1
2
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 を再起動します。

1
2
3
apt -y update && \
apt -y upgrade && \
reboot

2-19.キャッシュ / コマンド実行履歴を削除して仮想マシンを停止する

apt のキャッシュとコマンド実行履歴を削除しておきます。 ここまで完了したら仮想マシンを電源オフします。

1
2
3
4
apt -y autoremove && \
apt clean all && \
history -c && \
poweroff

2-20.VM から DVD メディアを取り出しておく

通常であればインストーラ終了時に光学ドライブからメディアは取り出されているはずですが、万一メディアが残っているようであればテンプレート化する前に取り出しておきます。

2-21.テンプレート化する

ここまで用意が出来たら仮想マシンをテンプレート化します。 以降、検証用の仮想マシンを作成したい場合はこのテンプレートから複製します。

3.追加パッケージのインストール

必要であればパッケージを追加します。 尚、asdf を利用する場合は下記のメモなどを参考にします。

3-1.direnv

Python の venv 環境を direnv で自動的に有効/無効化する というメモを書きましたが、Python で venv を利用しているのであれば direnv が便利です。

1
2
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 を起動する設定を追加しておきます。

1
2
3
4
5
cat << 'EOF' >> ~/.bashrc
# direnv
export EDITOR=vim
eval "$(direnv hook bash)"
EOF

3-2.pip と venv

Ubuntu 22.04.4LST には現時点で python が無く、python3 として Python 3.10.12 がインストールされていました。

1
2
3
4
5
6
# 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 が無い為、インストールしておきます。

apt -y install python3-pip python3.10-venv

3-3.docker

docker インストール後は「停止している」ものの「自動起動する」設定になっていました。 念の為、「起動」「自動起動」両方の設定を実施しておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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 をインストールするには以下を実行します。

1
2
3
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 からインストールしておきます。

1
2
3
4
5
mkdir -p /usr/local/lib/docker/cli-plugins/ && \
curl -SL \
  https://github.com/sig9org/docker-purge/releases/download/v0.0.2/docker-purge_v0.0.2_linux_amd64 \
  -o /usr/local/lib/docker/cli-plugins/docker-purge && \
chmod +x /usr/local/lib/docker/cli-plugins/docker-purge