Beagle Bone Black + Ubuntu 18.04 + dnsmasq セットアップ手順


自宅にセカンダリDNSを作った話

社長が言う。

東京都知事も言ってるし、明日から基本テレワークな!

そうと決まればさっさと家に帰る。
しばらく自宅作業なので、ネームサーバーが家に必要(嘘)だよね・・・ってことで、この間作ったセカンダリDNSを作った手順をまとめる。

  • 知識の薄い自分でも色んな方が公開している情報を参考に Ubuntu + dnsmasq のセットアップできたから自分もその情報を公開(還元)しないとな・・・と思ったし。
  • Ubuntu の話だから Raspbian(Raspberry Pi)にも応用できるし。
  • 本音は自分用のメモ。
  • そもそも、Beagle Bone Black 持ってる人ってどれだけいるんだろ?

以降、Beagle Bone Black は BBBと略。

事前準備

Ubuntu 18.04 LTS を BBB にインストール

イメージファイルの入手

以下のサイトをブラウザで開き、eMMC に書き込むための OS イメージを取得。

上記のサイトを開いた後で、 任意の日付/flasher/ とたどるとイメージの一覧が表示される。

今回ダウンロードしたのはこれ。
https://rcn-ee.com/rootfs/2020-03-12/flasher/bone-eMMC-flasher-ubuntu-18.04.4-console-armhf-2020-03-12-2gb.img.xz

イメージファイルをマイクロSDに書き込む

詳細は割愛。
自分は、『balenaEtcher』というソフトウェアを使用。

マイクロSDの内容を書き込む

BBBにマイクロSDを差し込み、通電。
(「マイクロSD裏面のボタン押しながら」って記事も散見するけど、押さなくてもマイクロSDからブートした。)

しばらくすると青色LEDが点滅し始め、インストールが終わると電源が自動で切れる。
この時点で、Ubuntu のインストールは終了。
(LEDが消えない時は、インストールに失敗している時とか。BBBとディスプレイをマイクロHDMIでつないで確認すれば、エラーログとか見えるかも。)

セットアップ

IPアドレス固定

参考URL https://linuxpropaganda.wordpress.com/2018/07/02/static-ip-address-in-ubuntu-18-04-on-beaglebone-black/

BBB起動時は、DHCPサーバからIPを自動取得する。
以下の方法で、IPアドレスを固定化。

まずは、どうにかして BBB の IP アドレスを調査。(DHCPサーバのリース情報とか。)

判明したら、ssh [email protected] で接続。(パスワードはtemppwd
接続後、以下を実行。(例:IPアドレス=192.168.0.100、サブネットマスク=255.255.255.0、デフォルトゲートウェイ=192.168.0.1)

$ sudo connmanctl
connmanctl> services
*AO Wired                ethernet_d0c5bd5144db_cable
connmanctl> config ethernet_d0c5bd5144db_cable ipv4 manual 192.168.0.100 255.255.255.0 192.168.0.1

ここで切断されるので、再接続(ssh [email protected])後、以下を実行。

$ sudo connmanctl
connmanctl> config ethernet_9059af5cc6c4_cable --nameservers 8.8.8.8 8.8.4.4
connmanctl> quit

以下で確認。

$ cat /etc/resolv.conf 
# Generated by Connection Manager
nameserver 8.8.8.8
nameserver 8.8.4.4

後で dnsmasq 入れるからこの段階では上のでよいけど、このまま Google パブリック DNS で行く&IPv6も使うなら、ネームサーバ指定のコマンドは以下で良いかも。(未検証)

$ sudo connmanctl
connmanctl> config ethernet_9059af5cc6c4_cable --nameservers 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844
connmanctl> quit

デフォルトユーザーの名前変更

デフォルトユーザー&パスワードのままだと、セキュリティ的にどうなの?って思うので、変更。

参考URL https://jyn.jp/raspberrypi-username-change/
(参考というか、ほぼそのままです。)

# 仮のユーザ(tmp)を作成する
sudo useradd -M tmp
# tmpユーザをsudoグループに追加(そうしないとsudoが使えない)
sudo gpasswd -a tmp sudo
# tmpユーザのパスワードを設定
sudo passwd tmp
# ログアウトする
exit

tmpユーザーで再接続後、以下。

# usermod -lでユーザ名をubuntuからoreに変更
sudo usermod -l ore ubuntu
# usermod -dでホームディレクトリを/home/ubuntuから/home/oreに変更
sudo usermod -d /home/ore -m ore
# groupmod -nでubuntuグループをoreグループに変更
sudo groupmod -n ore ubuntu
# ログアウト
exit

newpiユーザーで再接続後、以下。

# 仮ユーザを削除(警告的なのが出るかと思いますが、構わず削除して下さい)
sudo userdel tmp
# oreユーザのパスワードを変更
sudo passwd ore

ソフトウェアアップデート

参考URL https://jyn.jp/raspbian-setup/

$ sudo apt update && sudo apt -y dist-upgrade && sudo apt -y autoremove && sudo apt autoclean

※日本国内のサーバに接続だと、BBB用のパッケージが無い?感じなので、ミラーサーバ設定はしない。

sudoedit エディタ変更

この後、設定ファイルを変更する操作が多いので、自分の使いやすいエディタでsudoeditできるようにする。
nano好きな方は、デフォルトの sudoedit で nano 起動するから、何も変える必要なし。
Emacs派の方は、vim 個所を emacs に読み替えれば、たぶん大丈夫。(未検証)

Vim インストール

$ sudo apt -y install vim

sudoedit エディタを Vim に変更

参考URL https://linuxfan.info/sudoedit

$ sudo update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 3 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /bin/nano            40        自動モード
  1            /bin/nano            40        手動モード
  2            /usr/bin/vim.basic   30        手動モード
  3            /usr/bin/vim.tiny    15        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 2

自動更新

参考URL https://jyn.jp/raspbian-setup/

$ sudo apt install -y unattended-upgrades

日本語化

参考URL https://www.atmarkit.co.jp/ait/articles/1806/28/news043.html

# 日本語言語パックのインストール
$ sudo apt -y install language-pack-ja
# ロケールを日本語に設定
$ sudo update-locale LANG=ja_JP.UTF8
# タイムゾーンをJSTに設定
$ sudo dpkg-reconfigure tzdata
# 日本語マニュアルのインストール
$ sudo apt -y install manpages-ja manpages-ja-dev
# 再起動
$ sudo reboot now

時計同期

参考URL https://qiita.com/tukiyo3/items/c847d443a6d977083de9

$ sudoedit /etc/systemd/timesyncd.conf

以下を入力。

[Time]
NTP=ntp.nict.jp
FallbackNTP=ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp

入力後、サービス再起動。

$ sudo systemctl restart systemd-timesyncd

その他ソフトインストール

仕事で使うものとか、念のため入れておく。

dig インストール

$ sudo apt -y install dnsutils

他にも使うものあるだろうけど、思い出したら追加しよう。
(BBB の内臓 eMMC の容量に余裕ないから、たぶん何も足さないけど。)

dnsmasq インストール

既にインストール済みなので、使用可能な状態に設定変更。

SoftAp0 の自動生成を停止

BBBは、USBでPC(macも?)に接続すると、USBにIPアドレスを割り当てる。
この辺の設定が /etc/dnsmasq.d/SoftAp0 にあるけれど、邪魔だから無効化する。

参考URL https://groups.google.com/forum/#!topic/beagleboard/H1rFzlj6rV0

# /etc/dnsmasq.dREADME に書いてあるけど、特定の拡張子だと dnsmasq は無視する。
$ sudo mv /etc/dnsmasq.d/SoftAp0 /etc/dnsmasq.d/SoftAp0.dpkg-dist
# 上だけだと、再起動時に SoftAp0 が再生成されるので、以下ファイルを修正する。
$ vim /opt/scripts/boot/am335x_evm.sh

以下(732行目付近のIF文内)を全てコメント化

wfile="/etc/dnsmasq.d/SoftAp0"
echo "interface=usb0" > ${wfile}

if [ "x${USB1_ENABLE}" = "xenable" ] ; then
        echo "interface=usb1" >> ${wfile}
fi

echo "port=53" >> ${wfile}
echo "dhcp-authoritative" >> ${wfile}
echo "domain-needed" >> ${wfile}
echo "bogus-priv" >> ${wfile}
echo "expand-hosts" >> ${wfile}
echo "cache-size=2048" >> ${wfile}
echo "dhcp-range=usb0,${USB0_SUBNET}.1,${USB0_SUBNET}.1,2m" >> ${wfile}

if [ "x${USB1_ENABLE}" = "xenable" ] ; then
        echo "dhcp-range=usb1,${USB1_SUBNET}.1,${USB1_SUBNET}.1,2m" >> ${wfile}
fi

echo "listen-address=127.0.0.1" >> ${wfile}
echo "listen-address=${USB0_ADDRESS}" >> ${wfile}

if [ "x${USB1_ENABLE}" = "xenable" ] ; then
        echo "listen-address=${USB1_ADDRESS}" >> ${wfile}
fi

echo "dhcp-option=usb0,3" >> ${wfile}
echo "dhcp-option=usb0,6" >> ${wfile}

if [ "x${USB1_ENABLE}" = "xenable" ] ; then
        echo "dhcp-option=usb1,3" >> ${wfile}
        echo "dhcp-option=usb1,6" >> ${wfile}
fi

echo "dhcp-leasefile=/var/run/dnsmasq.leases" >> ${wfile}

上記変更後、再起動。

$ sudo reboot now

再起動後、自動生成されていないことを確認。

$ ls -l /etc/dnsmasq.d/
合計 8
-rw-r--r-- 1 root root 211  2月 17  2018 README
-rw-r--r-- 1 root root 391  3月 26 20:42 SoftAp0.dpkg-dist

systemd-resolvedのスタブDNS使用を停止

これをやらないと、dnsmasq がDNSサーバとして外部からの問い合わせに応答しないので、設定変更。

参考URL http://moguno.hatenablog.jp/entry/2018/06/17/155921

$ sudoedit /etc/systemd/resolved.conf

以下に変更。

#DNSStubListener=yes
DNSStubListener=no

修正後、サービス再起動。

$ sudo systemctl restart systemd-resolved

hostsファイル作成

dnsmasq 用に hosts ファイルを作成。

$ sudoedit /etc/hosts.dnsmasq

以下を入力。

192.168.0.1     server1
192.168.0.2     server2
192.168.0.3     server3

dnsmasq設定

*.confファイルのみを設定ファイルと定義

$ sudoedit /etc/dnsmasq.conf

最終行の以下を有効化

# Include all files in a directory which end in .conf
conf-dir=/etc/dnsmasq.d/,*.conf

設定ファイル作成

sudoedit /etc/dnsmasq.d/custom.conf

以下を入力。

interface=eth0
domain-needed
bogus-priv
strict-order
no-resolv
no-poll
server=/jitaku.local/192.168.0.99
server=8.8.8.8
server=8.8.4.4
server=2001:4860:4860::8888
server=2001:4860:4860::8844
local=/jitaku.local/
no-hosts
addn-hosts=/etc/hosts.dnsmasq
listen-address=127.0.0.1
listen-address=192.168.0.100
expand-hosts
domain=jitaku.local
cache-size=1024

以前に作ったプライマリDNSのIPアドレスは 192.168.0.99 で、そいつがDHCPサーバも兼ねているから、ローカルの名前解決はそっちに向けてる。

設定確認

$ sudo dnsmasq --test
dnsmasq: syntax check OK.

サービス再起動

$ sudo systemctl restart dnsmasq

ネームサーバ変更

ローカルの名前解決できるように&自分自身のDNS参照するように、設定変更。

$ sudo connmanctl
connmanctl> services
*AO Wired                ethernet_d0c5bd5144db_cable
connmanctl> config ethernet_9059af5cc6c4_cable --nameservers 127.0.0.1
connmanctl> quit

ホスト名変更

タイミング的にここじゃない気もするけど、ホスト名の変更。

参考URL https://linuxpropaganda.wordpress.com/2018/10/10/beaglebone-black-rename-server-in-ubuntu-server/

hostname 変更

$ sudoedit /etc/hostname

ホスト名を入力する。

dns2

hosts 変更

$ sudoedit /etc/hosts

ホスト名を入力する。

127.0.0.1       localhost
127.0.0.1       dns2 dns2.jitaku.local

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

再起動。

$ sudo reboot now

最後に

BBB は、青色LED x4 が派手で夜中うるさいから、起動時に消えるように細工。

参考URL https://www.limemo.net/blog/2013/11/%E3%83%93%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%9C%E3%83%BC%E3%83%B3%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6.html

エディタを開いて

$ sudoesit /etc/rc.local

「LEDを消す」内容を追加して

#!/bin/sh -e

echo none > /sys/class/leds/beaglebone:green:usr0/trigger
echo none > /sys/class/leds/beaglebone:green:usr1/trigger
echo none > /sys/class/leds/beaglebone:green:usr2/trigger
echo none > /sys/class/leds/beaglebone:green:usr3/trigger

exit 0

実行権限付けて再起動!

$ sudo chmod +x /etc/rc.local
$ sudo reboot now

以上で、今回のお話終わり。