Raspberry Pi 4(RPi4)にUbuntu Server 20.10を導入。headless運用のための初期設定。

Posted by 雅楽斎 on Tuesday, December 22, 2020

TOC

LTSを入れるか、現行の最新版を入れるか

Raspberry Piの純正OSとしてRaspberry Pi OS(旧称Raspbian)が提供されていますが、今回使うRPi4はデスクトップ運用する予定が皆無なため、サーバー系の運用ができるOSを選択します。

普段からUbuntuを使っていることから運用やメンテナンスに慣れているという理由でUbuntu Serverをインストールするのは最初から決めているのですが、導入するバージョンについては以前は現在のLTSで最新のUbuntu 20.04にしようと考えていました。

UbuntuのRaspberry Piサポート状況

Linuxディストリビューションの一つであるUbuntuは、20.10からデスクトップ環境のサポートもしていますが、Ubuntu公式としての(非デスクトップ環境の)サポートは概ね以下の通りでした。

  • Ubuntu 14.04からOSイメージを配布(Raspberry Pi 2用)
  • Ubuntu 16.04からPPAで非公式イメージを配布(Raspberry Pi 3用)
  • Ubuntu 19.10.1としてRaspberry Pi専用のイメージが配布される(このあたりから正式サポート感を感じる)
  • Ubuntu 20.10としてデスクトップ版UbuntuがRaspberry Piに正式対応

という形でインストールイメージの配布はかなり前からされていました。

導入するUbuntuのバージョン

Ubuntuではサポート期間で大別すると2種類のバージョンがあります。

  • 偶数年の4月にリリースされるLTS(メンテナンス期間5年)
  • LTS以外のリリース(メンテナンス期間9ヶ月)

サーバー運用の場合、あまり頻繁に更新をしたくないものですが、かといってLTSリリースを選んでしまうとリリース後に使いたいパッケージは基本的に追加されません。

そのため当初は現在の最新LTSである20.04を導入しようと考えていましたが、Podman関連のパッケージが最近追加されたこともあり、今回は導入リリースは20.10、次のLTSリリースになる22.04までは都度更新を行い、LTSへ移行する方向に決めました。

Raspberry Pi用のUbuntu 20.10イメージ

Ubuntuは64bitを含むARMもリリースしていますが、Raspberry Pi用には専用のインストールイメージがあるので、これをMicroSDカードに書き込みます。

Install Ubuntu on a Raspberry Pi 2, 3 or 4 | Ubuntu

Ubuntu is an open-source operating system for cross platform development, there's no better place to get started than with Ubuntu on a Raspberry Pi.

Ubuntu Server 20.10の64bitのボタンを押すと現在のリリースにリダイレクトされます。現時点では以下のURLに転送されます。

https://cdimage.ubuntu.com/releases/20.10/release/ubuntu-20.10-preinstalled-server-arm64+raspi.img.xz

書き込みはEtcherを使いました。MicroSDは32GBのものを使いましたが、データを外に置くのであれば16GBでも問題ないと思います。

書き込んだMicroSDカードをRPi4に挿入してUSB Type-C端子にケーブルを接続して起動すると、DHCPでIPアドレスをもらうので、LAN内の適当なPCからなんとかしてIPアドレスを調べます。

Ubuntu 20.10の初期設定

RPi4にSSHでログインします。ユーザー名: ubuntu パスワード ubuntuです。

$ ssh ubuntu@192.168.1.103
(snip)
ubuntu@192.168.1.103's password: 
You are required to change your password immediately (administrator enforced)
Welcome to Ubuntu 20.10 (GNU/Linux 5.8.0-1006-raspi aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Dec 20 05:42:34 UTC 2020

  System load:  0.21              Temperature:           31.6 C
  Usage of /:   6.9% of 28.95GB   Processes:             138
  Memory usage: 3%                Users logged in:       0
  Swap usage:   0%                IPv4 address for eth0: 192.168.1.103

0 updates can be installed immediately.
0 of these updates are security updates.


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

WARNING: Your password has expired.
You must change your password now and login again!
Changing password for ubuntu.
Current password: 

Current password:が表示されたら、現在使用しているubuntuユーザーのパスワード(ubuntu)を入力した後、実際に使用するubuntuユーザーのパスワードを2回入力すると一旦切断されるので、再度変更したパスワードでsshログインします。

ハードウェアのリビジョンを確認する(USB PDの問題が発生しないことを確認)

$ cat /proc/cpuinfo | grep -e Hardware -e Revision -e Model
Hardware	: BCM2835
Revision	: d03114
Model		: Raspberry Pi 4 Model B Rev 1.4

E-Markerを内蔵するまともなUSB Type-Cケーブルで通電しないバグはa03111(1GB) b03111(2GB) c03111(4GB)のそれぞれの初期ロットらしいので、そもそも8GBモデルは発生するロットがなさそうです。

Pi 4 - How to be sure to order a model with usb fixed?

I discovered that some initial lots of the Raspberry Pi 4 may have a sort of hw/sw bug that may be related to USB 3, and maybe also to thermal management and throttling. I would like to understand ...

rootユーザーで作業できるようにするため、rootユーザーのパスワードを設定する

管理系コマンド全てにsudoを付けるのは現実的ではないので、rootユーザーのパスワードを設定します。(sudo -iでもできることはできますが一般ユーザーのパスワードを使うのが不自然なので)

$ sudo passwd root
New password: 
Retype new password: 
passwd: password updated successfully

以降は管理系のコマンドはsu -でrootユーザーになってから実行します。

作業用の一般ユーザーを作成する

Raspberry Pi用のUbuntu Serverのイメージは固定でubuntuユーザーが作られているので、作業用にhogehogeユーザーを作成します。

RHEL系のディストロではuseraddコマンドとadduserコマンドは同じものですが、Debian系では異なるので、対話形式でユーザーを作成するadduserを使います。

# adduser hogehoge
Adding user `hogehoge' ...
Adding new group `hogehoge' (1001) ...
Adding new user `hogehoge' (1001) with group `hogehoge' ...
Creating home directory `/home/hogehoge' ...
Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for hogehoge
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] 

パッケージの更新

LAN内のapt-cacher-ngサーバーを使うようにする(/etc/apt/apt.conf.d/02cacher-ngを作成)

私の場合、LAN内にapt-cacher-ngサーバーがある1ので、aptの実行時に参照するようにします。

LAN内に設置するAPTのPull through proxyでAPTパッケージの重複ダウンロードを回避

/etc/apt/apt.conf.d/02cacher-ngを以下の内容で作成します。IPアドレスはapt-cacher-ngが動作しているサーバーです。

Acquire::http::Proxy "http://192.168.1.210:3142/";

インストール済みパッケージを更新する

# apt-get update
# apt-get upgrade
# apt-get dist-upgrade # apt-get upgradeの実行時に保留パッケージがある場合

neofetchをインストールする

基本的にSSHログインで作業する端末の場合はneofetchをインストールしています。

どんなdistroか一目瞭然!現在使っているdistroを確認するならneofetchを使おう!

# apt-get install neofetch

neofetchの実行結果はこんな感じになりました。

$ neofetch
            .-/+oossssoo+/-.               ubuntu@ubuntu 
        `:+ssssssssssssssssss+:`           ------------- 
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 20.10 aarch64 
    .ossssssssssssssssssdMMMNysssso.       Host: Raspberry Pi 4 Model B Rev 1.4 
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Kernel: 5.8.0-1010-raspi 
  +ssssssssshmydMMMMMMMNddddyssssssss+     Uptime: 12 mins 
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Packages: 609 (dpkg), 4 (snap) 
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Shell: bash 5.0.17 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Terminal: /dev/pts/0 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   CPU: BCM2835 (4) @ 1.500GHz 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   Memory: 198MiB / 7811MiB 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+
.ssssssssdMMMNhsssssssssshNMMMdssssssss.                           
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/                            
  +sssssssssdmydMMMMMMMMddddyssssssss+
   /ssssssssssshdmNNNNmyNMMMMhssssss/
    .ossssssssssssssssssdMMMNysssso.
      -+sssssssssssssssssyyyssss+-
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.

EEPROM管理パッケージをインストールする

Raspberry Pi 4 boot EEPROM - Raspberry Pi Documentation

# apt-get install rpi-eeprom

現在のEEPROMを表示する

# rpi-eeprom-update 
BCM2711 detected
VL805 firmware in bootloader EEPROM
*** UPDATE AVAILABLE ***
BOOTLOADER: update available
CURRENT: 2020年  3月 19日 木曜日 14:27:25 UTC (1584628045)
 LATEST: 2020年  9月  3日 木曜日 12:11:43 UTC (1599135103)
 FW DIR: /lib/firmware/raspberrypi/bootloader/critical
VL805: up-to-date
CURRENT: 000137ad
 LATEST: 000137ad

NanoPi M4V2でもやっていた設定をつらつらとしていきます。

NanoPi M4V2をArmbianで使う(初期セットアップ)

タイムゾーンを設定する

# timedatectl
               Local time: Sun 2020-12-20 06:21:27 UTC
           Universal time: Sun 2020-12-20 06:21:27 UTC
                 RTC time: n/a                        
                Time zone: Etc/UTC (UTC, +0000)       
System clock synchronized: yes                        
              NTP service: active                     
          RTC in local TZ: no                         
# timedatectl list-timezones | grep -i tokyo
Asia/Tokyo
# timedatectl set-timezone Asia/Tokyo
# timedatectl
               Local time: Sun 2020-12-20 15:22:03 JST
           Universal time: Sun 2020-12-20 06:22:03 UTC
                 RTC time: n/a                        
                Time zone: Asia/Tokyo (JST, +0900)    
System clock synchronized: yes                        
              NTP service: active                     
          RTC in local TZ: no             

ロケールを設定する

$ locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
# apt-get install language-pack-ja
# update-locale LANG=ja_JP.UTF-8
(OS再起動)
$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

IPアドレスを固定する(NetPlan)

バックエンドとして使用するNetwork Managerをインストールします(入ってないので…)。これをしないとnetplan applyを実行したタイミングでスタックします。正直、これに気付かずに2日くらい潰してます。

# apt-get install network-manager

デバイス名を確認します。

$ lshw -class network -short
WARNING: you should run this program as super-user.
H/W path  Device  Class      Description
========================================
/1        eth0    network    Ethernet interface
/2        wlan0   network    Wireless interface
WARNING: output may be incomplete or inaccurate, you should run this program as super-user.

有線LANがeth0、無線LANがwlan0になっています。

パッケージはインストールされているので、/etc/netplan/99-manual.yamlというファイルを以下の内容で作成します。設定内容は以下の通りです。

デバイス有線LAN無線LAN
デバイス名eth0wlan0
IPv4アドレス192.168.1.210192.168.1.220
IPv4サブネットマスク255.255.255.0255.255.255.0
デフォルトゲートウェイ(IPv4)192.168.1.1192.168.1.1
IPv6アドレスfd00:dead:beef::210fd00:dead:beef::220
IPv6プレフィックス64bit64bit
デフォルトゲートウェイ(IPv6)fd00:dead:beef::1fd00:dead:beef::1
DNSサーバー192.168.1.1192.168.1.1
接続SSIDBuffalo-A-xxxx
PSKxxxxxxxx

今回は設定ファイルを分けます。

有線LAN設定

/etc/netplan/99-manual-eth0.yamlを以下の内容で作成します。

network:
  ethernets:
    eth0:
      dhcp4: false
      dhcp6: false
      addresses:
      - 192.168.1.210/24
      - "fd00:dead:beef::210/64"
      gateway4: 192.168.1.1
      gateway6: "fd00:dead:beef::1"
      nameservers:
        addresses:
        - 192.168.1.1
  version: 2
  renderer: NetworkManager

無線LAN設定

/etc/netplan/99-manual-wlan0.yamlを以下の内容で作成します。

network:
  wifis:
    wlan0:
      access-points:
        "Buffalo-A-xxxx":
          password: "xxxxxxxx"
      dhcp4: false
      dhcp6: false
      addresses:
      - 192.168.1.220/24
      - "fd00:dead:beef::220/64"
      gateway4: 192.168.1.1
      gateway6: "fd00:dead:beef::1"
      nameservers:
        addresses:
        - 192.168.1.1
  version: 2
  renderer: NetworkManager

設定を反映します。

# netplan apply

スポンサーリンク


  1. 作業が一段落したらRPi4をサーバーにします [return]

comments powered by Disqus