スティックPCでUbuntuサーバ作成
自宅サーバを作ろうとした動機はテレワークのためでした。15インチの重いノートパソコンを持ち歩いていたのですが、2か月ほど前のある日、バッグから出して蓋を開けたら液晶が割れていて、もう二度と持ち歩くもんか!と心に決めました。
で、モバイルノートを持ち歩いて、メインのノートは家に置きっぱなしにして、リモートデスクトップするために、VPNサーバを立ち上げることを計画しました。とにかくお金はかけたくなかったのと、なるべく小さなPC、という条件で探し、最終的に、ヤフオクでインテルの Compute Stick STK1AW32SC をゲットしました。送料込み5000円弱。Atom x5-Z8330(1.44GHz)、2GB、32GB、Windows10。
その他に、ディスプレイ、USBキーボード、USBマウス、SDカードとUSBメモリを用意しました。
サーバのOSはUbuntu Server 20.04を選択しました。
インテルのCompute StickにはWindows版のほかに、Ubuntu版もあり、Windows版にUbuntuを換装するのはちょっと面倒なのですが、Ubuntu版はメモリが1GBモデルしかないため、2GBモデルのWindows版を選択しました。
Ubuntu をインストールする手順は、おおむね以下のような感じです。
- 念のためWindowsの回復ドライブ作成
- USBメモリにUbuntuインストーラーを書き込み
- USBメモリから起動、インストール
- Wi-Fiを設定
Windowsの回復ドライブ作成
気が変わってWindowsのまま使いたくなった時に、元のWindowsに戻せるように、回復ドライブを作成しました。
ディスプレイ、マウス、キーボードを接続して、スティックPCを起動し、Windowsの初期設定をします。使用可能な状態になったら、フォーマット済みUSBメモリを差し込み、Windowsキー⇒「回復ドライブ」検索、実行。時間がかかりますが、ひたすら待って完了。
回復ドライブを作成したUSBメモリは、インストールで使用するので、別のWindows PCで中身をバックアップしておきます。Win32DiskImager を使いました。
Ubuntuインストール用USBメモリ作成
https://ubuntu.com/download/server から、ubuntu-20.04-live-server-amd64.iso をダウンロードします。
Win32DiskImager で Ubuntu Server のISOファイルをUSBメモリに書き込み、完了。
なお、当初SDカードでインストールしようとしたのですが、ブートローダーが認識してくれませんでしたので、USBメモリに変更しました。
Ubuntuインストール
スティックPCをシャットダウン後、USBメモリを差し込み、電源ONと同時にF2キーを連打し、BIOS設定画面を起動します。
BIOS設定画面で、UEFI を Windows64bit に変更し、再起動と同時にF10キーを連打し、ブートデバイス選択画面を起動します。
ブートデバイスをUSBメモリに変更して、Ubuntuのインストーラを起動します。途中、ネットワークの設定がありますが、without network で最後まで進めます。
USBメモリを抜いて再起動し、インストールした Ubuntu が起動すれば成功です。
Wi-Fi設定
Ubuntuが起動したら、インストール時に作成したアカウントでログインします。普通のテレビをディスプレイにしたら文字が大きすぎたので、
$ sudo dpkg-reconfigure console-setup
で、コンソール画面のフォントサイズを小さくしました。
Ubuntu Server 20.04 でネットワーク設定をするのは netplan というものである、ということを今回初めてしりました。いろいろ調べてみたら、netplan はネットワークの設定ファイルをYAMLで管理し、レンダラーとして指定されたバックエンドに特化した設定ファイルを出力する、というもので、レンダラーに指定できるのは networkd か NetworkManager である、と。
networkd は systemd-networkd というもので、systemd で直接起動する軽量なデーモン。NetworkManager はGUIやCUIが整備されているなど、便利機能を多く備えたツール。
とりあえず、便利そうなので NetworkManager を使うことにしてみました。メモリが圧迫されてきたら netplan のレンダラーを networkd に変更すればよさそうなので。
デフォルトで NetworkManager はインストールされていなかったので、別PCで必要な deb ファイルをかき集めて、SDカードにコピーし、スティックPCに持ってい行きました。
依存関係を調べるのは pkgs.org が便利でした。パッケージのページにある Requires のリストを再帰的にたどって、必要なパッケージを探します。
スティックPCにSDカードを挿入し、dmesg でデバイスファイル名を確認します。だいたい /dev/mmcblk* です。で、マウント後に deb ファイルをコピーして、インストール。
$ sudo mkdir /mnt/sd
$ sudo mount /dev/mmcblk1p1 /mnt/sd
$ cp /mnt/sd/*.deb .
$ sudo apt install *.deb
一発ではできませんでしたので、不足パッケージを追加して、インストールを繰り返します。
インストールがうまくいったら、netplan のYAMLを作ります。/etc/netplan/00-installer-config.yaml がありますが、これはインストーラーが自動生成するファイルなので、別なファイルを作ります。netplan は /etc/netplan/ 以下の yaml ファイルを辞書順に処理していきますので、例えば、99-my-config.yaml とかで作ればOKです。
YAMLに必要な情報は、こんなかんじです。
network:
wifis:
<インターフェース名>:
access-points:
"<SSID>":
password: "<パスワード>"
インターフェース名は lshw で調べられます。「logical name」の項目です。
$ sudo lshw -class network
*-network
description: Wireless interface
product: Wireless 7265
vendor: Intel Corporation
physical id: 0
bus info: pci@0000:01:00.0
logical name: wlp1s0 ←これがインターフェース名
version: 69
:
SSIDは nmcli で確認できます。
$ sudo nmcli device wifi
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
XX:XX:XX:XX:XX:XX my-ssid-1 Infra 11 540 Mbit/s 47 ▂▄__ WPA1 WPA2
XX:XX:XX:XX:XX:XX my-ssid-2 Infra 11 540 Mbit/s 45 ▂▄__ WPA1 WPA2
XX:XX:XX:XX:XX:XX 0007407AE286 Infra 11 11 Mbit/s 27 ▂___ --
DHCPサーバはルータ①なので、そのまま何もしなければデフォルトルートはルータ①になります。今回はIPv6はルータ①、IPv4はルータ②にしたいので、YAMLにルーティング情報を追加します。DHCPでのメトリックスが600だったので、それより小さなメトリックスで設定します。できあがったYAMLはこんなかんじです。
network:
wifis:
wlp1s0:
dhcp4: true
dhcp6: true
access-points:
"my-ssid-2":
password: "xxxxxxxxxx"
"my-ssid-1":
password: "xxxxxxxxxx"
routes:
- to: 0.0.0.0/0
via: 192.168.10.129
metric: 100
version: 2
renderer: NetworkManager
netplan で apply して、NetworkManager を起動します。ip addr で確認し、インターフェース(wlp1s0)がUPしていて、IPアドレスが割り振られていればOK。
$ sudo netplan apply
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 192.168.10.255 scope global noprefixroute wlp1s0
valid_lft forever preferred_lft forever
inet6 2404:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/64 scope global dynamic noprefixroute
valid_lft 268sec preferred_lft 268sec
inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link noprefixroute
valid_lft forever preferred_lft forever
nmcli で確認すると。。。
$ sudo nmcli device wifi
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
* XX:XX:XX:XX:XX:XX my-ssid-1 Infra 11 540 Mbit/s 47 ▂▄__ WPA1 WPA2
XX:XX:XX:XX:XX:XX my-ssid-2 Infra 11 540 Mbit/s 45 ▂▄__ WPA1 WPA2
XX:XX:XX:XX:XX:XX 0007407AE286 Infra 11 11 Mbit/s 27 ▂___ --
my-ssid-2、my-ssid-1の順でアクセスポイントの優先順位を付けたつもりが、「IN-USE」列を見ると my-ssid-1 に接続していることがわかります。
netplan でアクセスポイントの優先順位を指定する方法は調べてもわからなかったので、netplan が出力するファイルを調べてみました。YAMLから生成した設定ファイルは /run に書き込むというのは分かったので、/run/NetworkManager 以下のファイルを見てみると、device/2 に以下の記述が。
[device]
managed=true
connection-uuid=37785b5a-4efd-39ce-bd60-449dfceed9fa
アクセスポイントごとの設定は、system-connections/netplan-<アクセスポイント名>.nmconnection というファイルがありましたが、connection-uuid に相当するものはありませんでした。nmcli でコネクションを表示させると出てきました。
# nmcli connection show
NAME UUID TYPE DEVICE
netplan-wlp1s0-my-ssid-1 37785b5a-4efd-39ce-bd60-449dfceed9fa wifi wlp1s0
netplan-wlp1s0-my-ssid-2 d6d63f96-1ec4-32a1-be37-43e8442e14cb wifi --
ということで、device/2 の「connection-uuid」を my-ssid-2 のUUIDに変更し、netplan apply したらOKでした。
やっつけでしたので、その後調べたところ、nmtui で編集することができたようです。nmcli でもできるのかも。まだまだ勉強不足ですね。
ようやくネットワークの設定まで終わったので、apt upgrade とかして、いったん終了です。