Raspberry Pi 3にUbuntu Serverを入れてSSH接続できるようになるまで

# コマンドだけで動かすラズパイ、かっこいいぞ
ガラクタを漁っていたら使っていないRaspberry Pi 3B+が出てきたので...Ubuntu ServerをインストールしてSSH接続するまでのお話です。
一応調べれば各手続きは出てきますが、定期的に躓いたので、どうせ何度も入れなおしたりするし...ってわけで備忘録的な形でまとめたものになります。
似たような達人方の記事の方がいっぱいあり、そちらの方が見やすいと思うので、参考程度にお願いします。

※初心者にもわかりやすく書いたつもりではありますが、本環境はCUI環境なので、本当に触ったことが無い方はまずGUI環境でいろいろ触って慣れてから導入することを勧めます。


# 初めに
用意したハードウェア一覧です。正直ここらへんは割と適当
- Raspberry Pi 3 B+
- micro SD 32GB (酷使されたやつ)
- 5V 3Aの直流を供給できるmicro Bのアダプタ云々
- イメージ書き込む用のmicro SDリーダーとPC


後々に説明するのですが、ラズパイ3B+のメモリ（RAM）は1GBしかないため、swap領域の拡張が必須になります。
自分はGUIより処理量の少ないCUIでも贅沢にswapを使っていたい民であったため、恐ろしいほどにmicro SDカードがお亡くなりです。

# Raspberry Pi のイメージの書き込み
まず[このサイト](https://www.raspberrypi.com/software/)からRaspberry Pi imagerという優れモノを書き込む用のPCにインストールします。（microSDちゃんと挿せないと無駄骨だぞ）そしたらmicroSD挿してimager起動して、イメージを焼きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/725f06ce-ef38-e2e5-0f6f-e8f545001401.png)
私のほうではこのように起動しました。変更の許可はちゃんとYesにしよう。
英語版でも挙動は同じなので焦らずに、同じように動かしましょう。
「ストレージ」と書かれている箇所が、書き込み先の対象です。microSDは一般的に「SDXC」が入っているはずです。間違えた書き込み先を指定しないように、他のUSBといった書き込み可能ストレージがあれば外しておきましょう。
「OS」と呼ばれるところが、書き込みたいイメージになります。ここをポチるとOSの選択画面になります。
（OSについては省略します。WindowsOSとかMacOSとかそういうやつです。（別に本人も詳しいわけじゃない...））
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/deef3365-0117-1334-d1d0-afa8f6beed76.png)
まぁ、このような選択画面が出てきますね。
初心者は一番上の「Raspberry Pi OS(32-bit)」を入れるのが妥当です。
「(other)」には、CUI環境のみのLite、拡張用のパッケージてんこ盛りのFull、使用するアプリケーションの互換性云々のための64bit版と、他種のRaspberry Piのイメージがあります。
今回この記事で選択したのは「Other general-purpose OS」に含まれている「Ubuntu Server 22.2 LTS(64-bit)」です。「Ubuntu Desktop」はGUI環境であり、ServerはCUI環境です。LTSというのは、長期サポート対象のOSです。日々更新するにあたって、みんなからの反応を貰ってバグ云々を解決するので、LTSが付いていないのは、「もちろん動くよ！でも未知なるエラーがあるかもよ」ってやつです。
#### さっきからGUIだのCUIだの...
GUI(Graphical User Interface)とCUI(Character User Interface)があります。GUIは画面で直感的にマウスでポチポチできるOSのことを指します。大衆が一般的に使うWindowsOSのDesktopであったり、MacOSのDesktopがそうです。
CUIはコマンドを入力して動かすタイプのOSです。PCの挙動というのは、コマンドラインがバックグラウンドで処理され、それが見やすく扱いやすいようにGUIが敷かれているので、実際にはCUIでも操作は同じなんです。画面上での内容が減る分、GUIよりもCUIのほうが挙動は軽くなります。
私も無知の部類なので説明は省きますが、要するにCUIだけでカタカタ動かしたほうがかっこいいじゃん？って話で今回はCUI環境のUbuntu Serverをインストールしたってわけであります。

# 動かしてみる
私はRaspberry Pi 3B+かつ、CUI環境なので、HDMI-HDMIと、USBキーボードを接続し、電源を入れます。
Raspberry PI 4の場合は電源端子がType-Cです。幅広く使われている一方で、過電圧、過電流で燃える可能性も無きにしも非ずなので、電圧、電流の規格管理は慎重に行いましょう。
初回の起動はインターネットはもちろん、Bluetoothにも接続されていない赤ちゃん状態なので、仕方なく有線で進めます。USB子機で唯一接続の無線のタイプはちゃんと使えますよ。
Ubuntu Server 22.04.2 LTSの場合、初回ログインは
- ユーザー名：ubuntu
- パスワード：ubuntu
で入れます。初回ログインしたあと、パスワード変更が求められるので、パスワードを変更しなおしましょう。
これにて、とりあえず動いたということで、よかったですね！

# キーボードの設定変更
デフォルトで導入した場合、記号あたりのキーボード配列が異なります。変更しましょう。
とりあえずコンソール内で
```
$ sudo dpkg-reconfigure keyboard-configuration
```
と入力
するとなんかGUIチックな選択画面になります。キーボードの矢印とEnterを駆使して
- Generic 105-key PC
    - Japanese
        - Japanese
 
- The default for the keyboard layout
- No compose key
この流れで選択します。そうしますとキーボード情報がインストールされると思いますので、コーヒーを淹れながら待ちましょう(重要)
更新が終わったら、コンソール内で
```
$ sudo reboot
```
を打ち、再起動して設定を反映させます。

# Wifi環境の設定
有線で行う人は飛ばしてOKです。
インターネットに接続できないとただの箱みたいなものです。設定しましょう。
```
$ ip a
```
と打ちます。すると、ネットワークカードの情報が出てきます。一般に有線（イーサネット）のカードは「eth0」、
Wifiの場合は「wlan0」と出ます。勿論ネットワークカードの設定を事前に行っている方は別です。
IPアドレス固定がなんちゃらより先に繋がらないと本末転倒なのでnetplanにwifi情報をぶち込みます。
「/etc/netplan/」配下にネットワーク情報が記載されています。デフォルトでは「50-cloud-init.yaml」に記載されていて、上書きしてもいいのですが、バックアップがない恐怖と、新規ネットワークを構成した際に上書きされる可能性もあることから、別ファイルにコピーし、そのファイルに記入します。「/etc/netplan/」の意味が全くわからない方はディレクトリについて調べてね
ちなみに、/etc/配下は管理者権限が必要なので、sudoさんを付けましょう。
```
$ cd /etc/netplan/
$ ls
```
ここでまず「50-cloud-init.yaml」が存在することを確認してからコピーファイル「54-cloud-init.yaml」に記入します。コピーするのにcpコマンドを、記入するのにviコマンドを使用します。
```
$ sudo cp 50-cloud.init.yaml 54-cloud-init.yaml
$ sudo vi 54-cloud.init.yaml
```
ここで、viエディタが起動します。ざっくりとした初心者のための利用方法です。
- 初回はコマンドモードから始まります
- コマンドモードで「i」キーを押して挿入(insert)モードに入ります。
- 挿入モードからコマンドモードに戻る場合は「Esc」キーを押します。
- ※くれぐれもCtrl-ZやCtrl-Cで強制終了しないように

- コマンドモード
    - 「:」をうってコマンドを記入します
    - 「w」で書き込み(write)
    - 「q」で終了(quit)
    - 「!」で強制終了です
    - 例
        - 書き込んでエディタを終了→「:wq」
        - 間違えたときに書き込まないで強制終了→「:q!」

- 挿入モード
    - ただ書くだけ矢印キーと文字を駆使してコードを書け

頭に入りましたか？では「54-cloud-init.yaml」に以下を追記しましょう。
```:54-cloud-init.yaml
wifis:
    wlan0:
        dhcp4: true
        optional: true
    access-points:
        "SSID":
        password: "PASS"
```
ここで、"SSID"には自分のWifiのSSIDを、"PASS"にはそのWifiに接続するためのパスワードを記入しましょう。
そうしましたら先ほど述べた方法で保存してエディタを終了し、コンソールで
```
$ sudo netplan apply
```
でネットワーク情報を確立します。ここでエラーが吐かれた場合、50-cloud-init.yamlに同じ情報が書かれていないか、:の後に半角スペースは入っているか、tabのインデントは正しいか、正しいSSID、パスワードを記入できているか等確認しましょう。ちなみに、情報が被っている場合、SSIDが見つからないとエラーを吐きます。
※自分は発生しませんでしたが、[このようなパターン](https://qiita.com/hk220/items/b342d02865b2668f0268)もあるらしいので、引っかかった方は参考までにお願いします。
何もエラーが吐かれずに次のコンソールが生えたら問題無しです。一応
```
$ ip a
```
を入力してwifiが接続できているか確認します。

# パッケージのアップデート
ネットに繋がったので暴れましょう。みんな大好き
```
$ sudo apt update
$ sudo apt upgrade -y
```
そしたらしばらく読み込むので、先ほど淹れたコーヒーを飲みながらアニメ鑑賞をしましょう(重要)
この後のインストールは自身の路線なので任意ですが
```
$ sudo apt install htop vim 
```
こんな感じで
- htop：メモリの使用量を確認する
- vim：viエディタみたいなやつ、使っている人はモテるらしい

# Swap領域の拡張
正直CUI環境ではあまり用は無いと思います。Raspberry Pi 4の場合はRAMが4GBあるのでswap領域は正直必要ないです。
swap領域はRAMで演算処理を扱うにあたり、必要なく溢れたメモリを一部預けることで、RAMの高速化が図れます。しかしこの方法はSDカードの寿命を縮めることになるので最低限にしましょう。
資源はふんだんに使う派の贅沢思考な私はよくswapを拡張しているため、SDカードを再書き込みするとよくブルスクに...(戒め)

Ubuntu Serverは、通常ではswapは0byteになっているはずです。
```
$ free -h
```
で確認してみましょう。
では、私は3B+を使っていて、1GBのRAMは寂しいかなと思うので、4GBのswapを追加します。
```
$ cd
$ sudo fallocate -l 4G /swapfile
$ sudo chmod 600 /swapfile
```
一番最初のcdは、最初のホームディレクトリに戻る動作です。正直あまり意味はない。
```
$ sudo ls -lh /swapfile
```
これでswapファイルが作成されているかどうかを確認します。
そしてswapファイルを有効化します。
```
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
```
これで4GBのswapが作成されました。再起動後にも4GBのswapが適用されるようにvimを使って/etc/fstabに追記します。
```
$ sudo vim /etc/fstab
```
以下を追記
```
/swapfile none swap sw 0 0
```

# IPアドレスの固定
ネットにも繋がり、swapファイルも作成し、vimも入れたので、IPアドレスを固定しようと思います。
IPアドレスとは、ネットワーク世界の住所のようなものです。
グローバルIP、プライベートIP、ゲートウェイ、DNS...自分もよく理解できていないです...
ラズパイにキーボードやディスプレイをケーブルで接続しなくても操作することができるSSH接続をするのが本稿のゴールなのですが、ここでのIPアドレスの固定はSSH接続において重要な内容になります。
まず、接続されているIPアドレスを確認しましょう。
```
$ ip a
```
この中でwlan0の情報内で192.168みたいな情報があると思います192.168.2.63とか192.168.0.37とかいろいろあるよ
では固定しましょう。
```
$ cd /etc/netplan/
$ sudo vi 54-cloud.init.yaml
```
ここで先ほど接続したIPアドレスを固定します
※他のファイルで同じインターネット情報(SSID、パスワード)を記入していると、接続エラーが起きるので、上書きしましょう。
ここでは、IPアドレスを192.168.3.34として書きます
```:54-cloud-init.yaml
wifis:
    wlan0:
        dhcp4: false
        optional: true
        addresses: [192.168.3.34/24]
        routes:
            - to: default
              via: 192.168.3.1
        nameservers:
            addresses: [192.168.3.1]
    access-points:
        "SSID":
        password: "PASS"
```
これで保存して
```
$ sudo netplan apply
```
これでエラーが吐かれなければ問題ないです。ip aで確認してみてね
routes:で書かれているvia:のアドレスは、ゲートウェイのアドレスになります。デフォルトゲートウェイは一番最後の.34のところを.1に変えてあげる形になります。それまでは同じだよ

# 自動ログインの有効化
Raspberry Piの電源を起動した際、最初にユーザーログインが求められたかと思います。
電源を付けたり切ったりする動作がある場合、ログイン画面で止まるため、SSH接続ができなくなります。
なので、起動直後は自動でログインできるように設定しましょう。
```
$ sudo systemctl edit getty@tty1
```
ここで、以下を追記します。これはvimではなく、nanoエディタなのでそのまま記入できます。
```:getty@tty1
[Service]
ExecStart=
ExecStart=-/sbin/agetty --noissue --autologin <NAME> %I $TERM
Type=idle
```
<NAME>のところをユーザー名(ここではubuntu)に変更しましょう。
Ctrl + X押してy押してEnter押して、書き込みが終了します。
私はvimmerであれどnanoに詳しい人ではないので、割愛します。
これで自動起動の準備はOKなはずです。

### もし自動ログインが反映されない場合...
これは上の内容の備忘録です。
再現した際にここで躓きました。nanoで編集したらファイルがなんたらで保存がキャンセルされましたって...
なので以下にvimを利用した力業解決策を書いておきます。
```
$ sudo cd /etc/systemd/system/getty@tty1.service.d
$ sudo vim override.conf
```
ここにあるoverride.confに上の内容を記述します。力業ですのであくまでも自己責任です。私はここらへん何度も躓いて地獄を見ました。
```:override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --noissue --autologin <NAME> %I $TERM
Type=idle
```
空欄のExecStartも意味あるので、記述省かないようにね。

# SSH接続してみる
[Tera Term](https://ja.osdn.net/projects/ttssh2/releases/)をガイドに従ってインストールしましょう。ポチポチ次へを押して問題ないです。
Tera Termを起動したら次のような画面になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/485484d4-36a6-efac-9075-5ac7b97c8d1c.png)
そうしたら、ホストってところに先ほど固定したIPアドレス(ここでは192.168.3.34)を記入します。このTeraTermを開いているPCも同じSSIDに接続していないとSSH接続できないので、気を付けましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/df66be3a-94e6-9338-65f6-f7f92a4c87ea.png)
(この前になんかキラキラした何かが出てきた気もするけど、OKで問題ないよ)
そしたらユーザ名にユーザー名（ここではubuntu）を、パスフレーズにパスワードを記入します。
するとSSH接続できるはずです。

よきLinuxライフを