Open3

Raspberry Pi 上に Ubuntu のサーバーを起動するまでのメモ

yukiyuki

最近 RaspberryPi 上に ubuntu をセットアップしてみたが、その際に何をやったかを残しておこうと思う。ネットに転がっている情報をかき集めても十分動作するのだけど、まとまっていた方が嬉しいと思うため。あと自分のため。

想定している構成は、

  • ubuntu 22.10 を立ち上げたい。
  • 用途
    • 自宅 LAN 内でのみ閲覧できるサイトを用意したい。
  • 目論見としては
    • 上に載せるアプリケーションのデプロイやリリースは GitHub Actions 経由で行えるようにしたい。
    • サーバーの構成管理は IaC 化しておきたい。Ansible がいいかなと思っている。
    • 将来的には Kubernetes とかを上に立ち上げたいかも。そういう根本的な構成が変わっても入れ替えが容易になるようにしておきたい。
    • データベースとか立ち上げたいかも。
    • IoT 機器のメトリクスを集めて Grafana とかでダッシュボードとして表示させたい。

そもそももうちょっと楽な方法あるでしょ、と思うかもしれないが、裏の大目的として Linux サーバーの運用をしつつ Linux の勉強をしたいというのがある。

yukiyuki

RaspberryPi に ubuntu を焼くには

Raspberry Pi Imager というツールを使う。マイクロ SD カードに焼くことになる。

macOS ユーザーなら下記が使える。
https://formulae.brew.sh/cask/raspberry-pi-imager

Ubuntu Desktop と Ubuntu Server の2つがある。名前の通りだが、Desktop の方は GUI が用意されており、一般的な「パソコンを使いたい」という用途を満たせる。Server の方は GUI がなく、サーバーとして Ubuntu を利用したい場合に利用できる。ファイル容量が Ubuntu Server の方が小さいので、SD カードのように容量が限られる&サーバーとして使用したい場合は Server 側を選ぶのがよいと思われる。もちろん、Desktop を選んだとしてもサーバーとして使用することはできる。

https://jp.ubuntu.com/download

最初からいくつか設定をしておくのがおすすめ

私も焼いたあとに知ったのだが、この Imager には Advanced Options を設定できる。Wifi の設定や ssh の設定などを行なった状態で焼き出すことができるらしい。次回こうした作業を行う際にはぜひやってから RaspberryPi 本体に SD カードを挿したいと思う。

https://www.tomshardware.com/news/raspberry-pi-imager-now-comes-with-advanced-options

以降はこうした Advanced Options を何も設定せずに起動することを想定して話を進める。ネットワーク周りの設定は手作業で行う。

yukiyuki

起動後最初にやること

さて、OS を焼いて RaspberryPi に Micro SD を挿入する。その後電源ボタンを入れると中の Ubuntu が起動する。

注意点だが、HDMI ケーブルを挿した状態で起動しないと HDMI が反応しない。画面に何も映らない。この記事で知ったのだが、HDMI ケーブルを挿した状態で起動しないと、いわゆるコンポジット接続というものに切り替えられるためらしい。なお、/boot/config.txt の所定の箇所をいじるとそうならないようにできるらしい(が、とくに試していない)。

https://raspida.com/rpi4b-config-hdmi#index_id4

初回ログイン

まずログインが必要になるのでログインをする。ID: ubuntu、Password: ubuntu が初期設定になる。初回ログイン後、パスワードの変更を要求されるので変更しておく。

Wifi の設定

まず行いたいのは Wifi の設定だと思うので Wifi の設定を確認する。ここは以前とは違う設定の仕方になっていてびっくりしたが、最近の Ubuntu に netplan と呼ばれるツールが入った。

https://netplan.io/

詳しそうな記事は下記だろうか。

というわけで Ubuntu はこのファイルをいじることでネットワーク周りの設定を yaml で記述できる。

Google で設定方法を検索すると、 50-cloud-init.yml というファイルをいじるような指示が書かれているものがあるが、このファイルの冒頭には下記のような文言が書かれている。

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    version: 2

このファイル自体はそもそも cloud-init というツールによって自動生成される物で、リセットされる可能性がある。したがって、このファイルをいじって Wi-Fi の設定等を記述するのは、将来の安定性を考えると控えた方がよいかもしれない。実際、そのような主張をする記事が Qiita にも上がっている。もっとも、個人サーバーの規模で記事のようなシチュエーションが発生することは稀だろうが…

https://qiita.com/yas-nyan/items/9033fb1d1037dcf9dba5

cloud init が何者かは下記が詳しい。元々は Amazon EC2 専用のツールだったものが輸入されたと言うことなのかな。

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0561

というわけで、私は手元では 99-custom.yaml のような名前のファイルを作って Wi-Fi 向けの設定を書いておいた。

$ cat /etc/netplan/99-custom.yaml 
network:
    version: 2
    wifis:
        wlan0:
            addresses: 
              - XXX.XXX.X.XXX/XX
            routes:
              - to: default
                via: XXX.XXX.X.XXX
            access-points:
                "<SSID>":
                     password: "<PASSWORD>"
            dhcp4: no 
            optional: true
            nameservers:
              addresses:
                - 8.8.8.8

Wi-Fi の設定についてだが、

  • IP アドレスの固定: これは ssh 接続する際に楽をするために必要そう。
  • DNS の設定: Ubuntu の場合 netplan に書いてすべて解決するみたい。/etc/resolv.conf をいじらせる記事もあったが、リブートすると設定が消えた。そもそも直接触るファイルではないため。

余談だが、Google でこの手の話を検索すると意外と「お手手で編集するなよ」とファイル内のコメントに書いてあるファイルを編集している記事が見つかる。そういうものはたとえば、リブートするとリセットされたりするので、ファイルについているコメントは必ず読むようにした方がよいと思った。それで何度かハマった。そもそも全体像を理解していないので、どのファイルがどういうツールによって管理されているかわかっていないのが根本の原因だと思う。

ssh 接続

最初はパスワード付きでログインしておいた。たとえば下記。

# XXX.XXX.X.XXX は↑で指定した IP アドレスが入る。先に Raspberry Pi の端末側で `ip a` で調べると、自分が今どの IP アドレスを使っているかわかる。
$ ssh ubuntu@XXX.XXX.X.XXX
# パスワードを求められるので、このユーザーのログイン用に設定したパスワードを入力する。

次に鍵の登録をして、パスワードレスに変更した。自身の Mac で、

$ cd ~/.ssh
$ ssh-keygen -t ed25519