ラズパイで自宅サーバを立てた時の備忘録。
ラズパイにUbuntuのインストールとPCからSSHでログインするところまで。
追記:ラズパイ4で試したときの備忘録はこちらに書いておく。[Raspberry pi4] Ubuntu 20.10 のヘッドレスインストール。 キーボード、ディスプレイなしでインストールする方法

↑ラズパイ4↑でやった方法のほうが楽なのでそちらをオヌヌメします。
試した環境
Raspberry Pi 3
Ubuntu 18.04.04 LTS 32bit
MicroSDカード 16GB Transcend製
Ubuntu のダウンロードとインストール
https://ubuntu.com/download/raspberry-pi から OS image をダウンロード。Raspberry Pi 3 はメモリが少ないので、64bit を選択するメリットは限定的とのこと。今回は32bitをダウンロード。

ダウンロードした ubuntu-18.04.4-preinstalled-server-armhf+raspi3.img.xz ファイルを解凍(Windowsの場合は7Zip、MacOSの場合はgunzipで解凍)し、SDカードに書き込みます。
公式サイトでは、Ubuntu、Windows、MacOS それぞれの環境での書き込み方法が書いてあります。diskutil や dd コマンドを使う手順は少し大変なので、私の場合は 解凍した img の拡張子を bin に変更して Chromebook リカバリ ユーティリティ を使ってSDカードに書き込んでいます。
$ gunzip ubuntu-18.04.4-preinstalled-server-armhf+raspi3.img.xz $ mv ubuntu-18.04.4-preinstalled-server-armhf+raspi3.img ubuntu-18.04.4-preinstalled-server-armhf+raspi3.bin
右上の⚙ボタンからローカルイメージを選択できるので、解凍&リネームしたラズパイ用のイメージを選択します。

書き込み対象のSDカードスロットを選択。

「今すぐ作成」のボタンを押すと、書き込みが始まります。(管理者権限が必要)

3分ぐらいで完成。


SDカードへの書き込みは、MacもWinも Chromebook リカバリ ユーティリティ を使うと楽やね。ラズパイには電源だけしか付けないから、もう少しPC側で設定をおこなうのじゃ。
SDカードを取り出して、Raspberry Pi にセットすれば Ubuntuが起動します。
ただ、今回はラズパイ側にキーボードとディスプレイが無いため、ブート直後からSSH接続ができるように、Ubuntuの起動前にWIFIの設定(IP固定)を入れておきます。
ブート前にネットワークの設定を行う
SDカードの system-boot というパーティションに network-config というファイルがあり、起動時のネットワーク設定がおこなえます。
エディタで開いて、WIFIの設定(SSID、パスワード、固定IP、デフォルトゲートウェイ)をしておきます。有線LANを使う場合は、eth0を固定IPにすれば良いかと思います。
# This file contains a netplan-compatible configuration which cloud-init
# will apply on first-boot. Please refer to the cloud-init documentation and
# the netplan reference for full details:
#
# https://cloudinit.readthedocs.io/
# https://netplan.io/reference
#
# Some additional examples are commented out below
version: 2
ethernets:
eth0:
dhcp4: true
optional: true
wifis:
wlan0:
dhcp4: false
gateway4: 192.168.11.254
nameservers:
addresses:
- 192.168.11.254
addresses:
- 192.168.11.3/24
optional: false
access-points:
HomeSSID-012345:
password: “HomePassword012345”
#wifis:
wlan0:
dhcp4: true
optional: true
access-points:
homessid:
password: “S3kr1t”
myotherlan:
password: “correct battery horse staple”
workssid:
auth:
key-management: eap
method: peap
identity: “me@example.com”
password: “passw0rd”
ca-certificate: /etc/my_ca.pem
メモ:
wlan0 は optional: false にしておかないとWIFIにつながってくれなかった。タイミング的なもの?
ユーザの設定
SDカード上で、user-data というファイルをいじれば、ユーザなどの設定が行えます。ubuntu ユーザを削除して別のユーザIDにしたかったのですが、ここではできなそうです。まずは ubuntu ユーザでログインし、その後 ubuntu ユーザをリネームすることにします。試してはいないのですが、users: セクションでユーザの追加、packages: セクションでパッケージの追加ができそうです。
#cloud-config
This is the user-data configuration file for cloud-init. By default this sets
up an initial user called “ubuntu” with password “ubuntu”, which must be
changed at first login. However, many additional actions can be initiated on
first boot from this file. The cloud-init documentation has more details:
https://cloudinit.readthedocs.io/
Some additional examples are provided in comments below the default
configuration.
Enable password authentication with the SSH daemon
ssh_pwauth: true
On first boot, set the (default) ubuntu user’s password to “ubuntu” and
expire user passwords
どうせ後で変えるから初回ログイン時のパスワード変更はしない
chpasswd:
expire: false
list:
- ubuntu:ubuntu
Add users and groups to the system, and import keys with the ssh-import-id
utility
#groups:
#- robot: [robot]
#- robotics: [robot]
#- pi
#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 ]
設定を保存してラズパイを起動すれば、SSHで接続できます。PC側でpingでも打ちながら起動するのを待ちましょう。PuTTY等で接続できればOKです。
ラズパイは電源につないで起動するだけ。そのあとの設定はPCから操作したほうがいろいろ楽です。


ユーザIDを ubuntu のままで、外部に公開したらクラックの標的にされること間違いなし。公開前にユーザIDの変更、パスワードログインの停止、fail2ban などを設定するべし。