[Raspberry Pi4] Ubuntu Server 21.04 のWiFiのみでヘッドレスインストール (モニタ・キーボードレス) 🐣初級者向け🐣

Linux

ラズパイ4のメモリ4GB版を入手したので、Ubuntu Server 21.04 のヘッドレスインストールをためしてみました。とりあえず OSのインストールとホストPCからSSHでログインするところまでをステップ・バイ・ステップで記録しておきます。

試した環境

Raspberry Pi 4 メモリ4GB

Transcend microSD 128GB

SDカードにUbuntuのイメージを書き込む

ホストPCで環境を準備します。
Windows or Mac or Linux で SDカードにUbuntuを書き込みます。

以下はWindowsで試した手順です。

  1. Raspberry Pi Imager をダウンロードします。

2. Raspberry Pi Imager を起動します。「CHOOSE OS」 をクリック。

3. 「Other general purpose OS」 → 「Ubuntu」 → 「Ubuntu Server 21.04 (RPi 3/4/400) 64-bit」の順にクリック。

4. SDカードをホストPCに差し込み、「CHOOSE STORAGE」をクリックし、ラズパイ用に準備したSDカードをクリックします。

5. SDカードにイメージを書き込みます。「WRITE」をクリックするとSDの消去確認がでるので、「YES」をクリックして実行します。

OSイメージをダウンロードして書き込みまで行ってくれます。完了するまでしばらく待ちましょう。書き込みに10分以上かかる場合は、SDカードのスペックが低すぎるので、新しいものを用意したほうが良いでしょう。今回使用したの Transcend の microSD(UHS-I U3 V30 A1 Class10) では、ベリファイを含めて5分前後で完了しています。A2タイプだともっと速くなるようなのでスピードを求める人はそちらを選択するのもありかもしれません。

ベリファイ(書き込みのチェック)が正常に終わればラズパイ用Ubuntuの入ったSDカードの完成です。

以下のようなメッセージが表示されれば完了です。SDカードをPCから取り出します。

起動前の初期設定をする

今回はヘッドレスインストール(キーボードやモニターを接続しない)なので、Ubuntuが起動したら自動的にネットワークに接続するような初期設定が必要になります。有線でもWIFIでもどちらか利用しやすい方法を選びます。

以下は起動後にWIFIに接続させる手順です。

  1. Ubuntuの書き込まれたSDカードを、もう一度ホストPCに差し込みます。
    system-boot という領域があるので、その中にある「network-config」ファイルをメモ帳などのテキストエディタで開きます。

今回は 起動したらWIFIに接続するように設定します。「wifis:」から下を編集していきます。

WIFIルータの管理画面などで、DHCPでラズパイに割り振られたIPアドレスがわかるのであれば、myhomewifi:の部分を自宅のWIFIのSSIDに、password:の部分にWIFIのパスワードを設定すればOKです。

wifis:
  wlan0:
    dhcp4: true
    optional: true
    access-points:
      homenossid:
        password: "homewifinopassword"

IPアドレスを固定にしたい場合は、下記のようにIPアドレス(adresses)、デフォルトゲートウェイ(gateway4)、DNSサーバ(nameservers)指定します。それぞれネットワーク環境に合わせてセットします。

wifis:
  wlan0:
    dhcp4: false
    optional: true
    addresses:
    - 192.168.68.81/24
    gateway4: 192.168.68.1
    nameservers:
        addresses:
        - 192.168.68.1
        - 8.8.8.8
    access-points:
      homenossid:
        password: "homewifinopassword"

編集したらそのまま保存します。

固定IPにした場合の設定例。

version: 2
ethernets:
  eth0:
    dhcp4: true
    optional: true
wifis:
  wlan0:
    dhcp4: false
    optional: true
    addresses:
    - 192.168.68.81/24
    gateway4: 192.168.68.1
    nameservers:
        addresses:
        - 192.168.68.1
        - 8.8.8.8
    access-points:
      homenossid:
        password: "homewifinopassword"

追加の設定をする

同じフォルダにある「user-data」ファイルを編集すると、いろいろな設定を行うことができます。

これもメモ帳で開いて編集します。

必要に応じて各セクションの設定を編集します。

# 初回ログイン時にubuntuユーザのパスワードを変更するかどうか。初期パスワードの設定。
# On first boot, set the (default) ubuntu user's password to "ubuntu" and
# expire user passwords
chpasswd:
  expire: true
  list:
  - ubuntu:ubuntu
# SSHでパスワード認証を許可するかどうか。許可しない場合は、ssh_import_id や ssh_authorized_keys を設定し、公開鍵をインポートする必要がある。
# Enable password authentication with the SSH daemon
ssh_pwauth: true

## On first boot, use ssh-import-id to give the specific users SSH access to
## the default user
#ssh_import_id:
#- lp:my_launchpad_username
#- gh:my_github_username
#ssh_authorized_keys:
#- <ssh pub key 1>
#- <ssh pub key 2>
# グループを追加したい場合はここで設定する。
## Add users and groups to the system, and import keys with the ssh-import-id
## utility
#groups:
#- robot: [robot]
#- robotics: [robot]
#- pi
#
#
# ユーザーを追加する。- defaultの行をコメントアウトしてユーザを追加すると、ubuntu ユーザを作成しないようにできる。
#users:
#- default
#- name: robot
#  gecos: Mr. Robot
#  primary_group: robot
#  groups: users
#  ssh_import_id: foobar
#  lock_passwd: false
#  passwd: $5$hkui88$nvZgIle31cNpryjRfO9uArF7DYiBcWEnjqq7L1AQNN3
# パッケージのアップデートと起動時に追加したいパッケージを設定する
## Update apt database and upgrade packages on first boot
package_update: true
package_upgrade: true

## Install additional packages on first boot
#packages:
#- pwgen
#- pastebinit
#- [libpython2.7, 2.7.3-0ubuntu3.1]
# 作成したいファイルがある場合はこのような感じで記載しておく。
## Write arbitrary files to the file-system (including binaries!)
#write_files:
#- path: /etc/default/keyboard
#  content: |
#    # KEYBOARD configuration file
#    # Consult the keyboard(5) manual page.
#    XKBMODEL="pc105"
#    XKBLAYOUT="gb"
#    XKBVARIANT=""
#    XKBOPTIONS="ctrl: nocaps"
#  permissions: '0644'
#  owner: root:root
#- encoding: gzip
#  path: /usr/bin/hello
#  content: !!binary |
#    H4sIAIDb/U8C/1NW1E/KzNMvzuBKTc7IV8hIzcnJVyjPL8pJ4QIA6N+MVxsAAAA=
#  owner: root:root
#  permissions: '0755'
# 起動時に実行したいコマンドがあれば書いておく
## Run arbitrary commands at rc.local like time
#runcmd:
#- [ ls, -l, / ]
#- [ sh, -xc, "echo $(date) ': hello world!'" ]
#- [ wget, "http://ubuntu.com", -O, /run/mydir/index.html ]

自分なりの設定も加えていきます。

# ホスト名(※再起動後に有効になる。初回起動時にはセットされない。)
hostname: ubuntuserver

# タイムゾーン、ロケールの設定
timezone: "Asia/Tokyo"
locale: "ja_JP.UTF-8"

## サーバー用途ではSDカードがすぐ壊れるので、RAMDISKを使って対策をする
## /tmp,/var/tmp,/var/logをRAMDISK化する
mounts:
- [ tmpfs, /tmp, tmpfs, "defaults,size=256m", "0", "0" ]
- [ tmpfs, /var/tmp, tmpfs, "defaults,size=256m", "0", "0" ]
- [ tmpfs, /var/log, tmpfs, "defaults,size=128m", "0", "0" ]

他にも設定したい項目があれば、cloud-iniのドキュメントサイトから探してみるのが良いです。

Cloud config examples - cloud-init 24.1.3 documentation

今回はシンプルに設定しました。

#cloud-config の設定例

# On first boot, set the (default) ubuntu user's password to "ubuntu" and
# expire user passwords
chpasswd:
  expire: false
  list:
  - ubuntu:ubuntu

# Enable password authentication with the SSH daemon
ssh_pwauth: true

## Update apt database and upgrade packages on first boot
package_update: true
package_upgrade: true

## Install additional packages on first boot
packages:
- avahi-daemon

# ホスト名の設定
hostname: ubuntuserver

# タイムゾーン、ロケールの設定
timezone: "Asia/Tokyo"
locale: "ja_JP.UTF-8"

## サーバー用途ではSDカードがすぐ壊れるので、RAMDISKを使って対策をする
## /tmp,/var/tmp,/var/logをRAMDISK化する
mounts:
- [ tmpfs, /tmp, tmpfs, "defaults,size=256m", "0", "0" ]
- [ tmpfs, /var/tmp, tmpfs, "defaults,size=256m", "0", "0" ]
- [ tmpfs, /var/log, tmpfs, "defaults,size=128m", "0", "0" ]

設定が終わったらファイルを保存してSDカードをホストPCから取り出します。

ラズパイを起動する

設定済みのSDカードをセットして、ラズパイの電源を入れます。(もっとカッコいいケースがほしい・・・。)

ようやくラズパイの登場

pingなどで確認しながら、ラズパイがネットワークに接続されるのを待ちます。

ルータの設定画面からも接続を確認することができました。

ホストPCからラズパイにSSHで接続します。最近のWindows10にはsshコマンドがデフォルトではいっているので、コマンドプロンプトからラズパイに接続してみます。

c:\>ssh -V
OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
c:\>ssh ubuntu@UBUNTU_NO_IPADDR

ロケールやTEMP領域のRAMディスク化の設定も自動で行われています。

起動時にリスタートの要求が表示されていたので、リブートもしておきましょう。

ubuntu@ubuntu:~$ sudo reboot
Connection to 192.168.68.81 closed by remote host.
Connection to 192.168.68.81 closed.

リブート後は、設定したホスト名でアクセスできるようになっていました。

c:\>ping -4 ubuntuserver.local

Pinging ubuntuserver.local [192.168.68.81] with 32 bytes of data:
Reply from 192.168.68.81: bytes=32 time=3ms TTL=64
Reply from 192.168.68.81: bytes=32 time=4ms TTL=64
Reply from 192.168.68.81: bytes=32 time=4ms TTL=64
Reply from 192.168.68.81: bytes=32 time=4ms TTL=64
わし
わし

公式の Pi OS は 32bit なので、最新のコンテナイメージやパッケージが使えなかったり、微妙に不便なことがありました。なので最近は使い勝手の良い ubuntu 64bit を使うようにしております。🐩

追記: Pi OS には 64bit版もあるみたいなので試してみたいと思います。

わし
わし

デスクトップ用途に使うのでなければ、キーボードやディスプレイは不要ですね。🍣🐟🐤

コメント