2023年 8月にこのブログをWordPressに移行してから、どこでどう記事を書いたり、サイトを編集したらいいんだっていうことに、悩んできました。
Hugo関連のファイルは全てGitで管理しているので、Gitクライアントとエディタさえあれば、最低限の作業はできます。
しかしできれば、ローカル環境でHugoを動かして、どんな感じになるのかを確認してからコミットしたいんですよ。
2023年現在所持しているのは、iPad Pro 12.9 M2と、ThinkPad X280。そりゃThinkPadを持って外出したら、なんだってできます。でも僕は外出先にはiPadしか持って行かないようにしたいんです。
一応、自宅のIPアドレスにドメインを割り当てているので、そこにアクセスしながら作業ということもできなくはありません。しかしそれではネット環境が整っていないとリモートで繋ぐことすらできなくなります。
できればローカル環境でHugoを触りたい。ずっとそう思っていました。
一応アプリでは選択肢があってiSHというアプリが裏でx86の仮想マシンが動いているっぽいターミナルアプリがあります。なかなかの神アプリですが、それでもHugoのような大きなプログラムを動かそうとすると、ランタイムエラーをよく吐きます。とても現実的ではありません。
何かないかなと思って探してみたら、Raspberry PiをUSBでiPadに接続することで、TCP/IPの通信を行う方法を発見しました。
今回は設定方法からHugoを動かすところまでを、まとめたいと思います。
Raspberry Pi側で行う設定
まず、そもそもどういう仕組みで実現するかというと、ラズパイのUSB端子をUSB Ethernet/RNDIS Gadgetとして認識させるように設定します。
iPadとラズパイが同一ネットワーク内にいる環境を作るわけです。iPadに有線LANアダプタでも繋いで、ラズパイのNICとクロスケーブルで接続しているのと実質変わりません。
USB Ethernet/RNDIS Gadgetの何が良いかというと、接続がスマートになります。
対応している機種は
- Raspberry Pi Zero系
- Raspberry Pi 4
です。初代〜3までの独立したUSB端子では動かないようです。4が対応しているのはUSB-Cが電源供給だけじゃなくてホストにも対応しているからだと思います。
これら対応しているラズパイを、iPadのUSB-C端子に繋ぐと、ラズパイ本体の電源をiPadからもらって起動しながらEthernetで接続できるわけです。めちゃくちゃスマートです。
その代わりiPadのバッテリーがゴリゴリ減りますけどね。
2つの設定ファイルを編集する
ラズパイのOSが書き込んであるmicroSDカードの中にある、config.txtとcmdline.txtを編集します。
既に同一ネットワーク内にあったり、直接触れる環境にあるなら、/bootの中にあります。カードリーダーでmicroSDカードを読み込むと、直接編集もできます。
/boot/config.txtに追記
dtoverlay=dwc2
/boot/cmdline.txtのrootwaitの後に追記
modules-load=dwc2,g_ether
この2つのファイルにそれぞれを追記して再起動。その後にifconfigしてみるとusb0というインターフェイスが追加されていると思います。
この状態でiPadとラズパイを接続してみると、自動プライベートIPアドレスが勝手に割り振られているホスト同士で通信できる環境が整います。
こっちがラズパイでifconfigした画像。
そしてこっちがiPadの設定画面です。
どっちかにDHCPサーバがいるわけじゃないので、勝手に自動でプライベートIPを振った結果同一セグメント内にいて、通信が成り立つわけです。
Raspberry Pi OSのインストール後に繋ぐなら
もしも、ラズパイに画面やキーボードなどを接続して設定するのではなく、ラズパイOSのimgを流し込んでから、そのままこの手法で接続するだけで初期設定を完結させたいなら、
OSをmicroSDカードに書き込む際にSSHの設定やユーザの作成をしておく必要があります。
そのあたりは参考になるサイトが既にあるので、PCとSDカードリーダだけでOSのインストールを完結させたいなら参照されると良いと思います。
SDカードリーダーだけでRaspberry PiのインストールとSSH接続をする
Hugoのインストール&起動
iPadにラズパイを接続して、その電力でOSが起動してきたら、iPad向けのターミナル系アプリを使ってSSH接続します。
有料アプリから無料アプリまで様々ですが、僕は「a-Shell」を愛用しています。
ちなみに、ラズパイOSが起動したかどうかは、本体のLEDを見ていてもわかるかもしれませんが、iPadの設定からEthernetの設定を見てもらうと判断できます。
自動プライベートIPが表示されたらラズパイが起動したという合図です。
あとはラズパイにSSH接続するわけですが、iPad側のIPアドレスがわかっても、ラズパイ側のIPアドレスがこのままではわかりません。
今回の手法を紹介しているサイトによりけりですが、僕はホスト名で接続したいと思ったので、特にIPアドレスを調べようとはしませんでした。だってその方が楽だし。
ラズパイのホスト名はデフォルトでは「raspberrypi.local」です。それかOSインストール時に設定項目より変更できます。できれば変更した方が良いですね。
というわけで、a-Shellなどのターミナルから、SSH接続がこれでできるようになります。
$ssh username@raspberrypi.local
これだけ。
あとはラズパイにHugoをインストールしていきます。
$sudo apt-get install Hugo
これだと最新ビルドが入ってこないので、arm64向けのdebパッケージを自分でダウンロードしてインストールしても良いかなと思います。
wget https://github.com/gohugoio/hugo/releases/download/v0.117.0/hugo_extended_0.117.0_linux-arm64.deb
dpkg -i hugo_extended_0.117.0_linux-arm64.deb
※最新バージョンが0.117.0だった場合のコマンド例
あとは適当にサイトでも作って
$hugo new site testsite
そのまま作成されたディレクトリに移動して、サーバーモードでHugoを立ち上げます。でもそのままだとlocalhostからしかアクセスができないので、bindオプションをつけます。
$hugo server -D --bind 0.0.0.0
これでも動きますが、ちゃんとホスト名を指定するなら、こっちでも良いかも。
$hugo server -D --bind raspberrypi.local --baseURL="http://raspberrypi.local"
で、サーバーが起動したらiPadのSafariからラズパイのホスト名に1313番のポート番号を指定してアクセスします。
http://raspberrypi.local:1313
Hugoコマンドで作ったばかりのサイトなので中身は空ですが、curlコマンドでURLを叩いたらpreタグを返してきましたし、Safariからアクセスしたらエラーではなく真っ白なページが表示されたので、これで正常です。
これでiPadとラズパイでのP2Pな関係のネットワークはあるものの、ケーブル1本で繋がっているだけなので、かなりローカルに近い環境で、iPadからHugoが触れるようになりました。
また、ラズパイにVNC接続すれば、iPadから普通にGNOMEなども触れるので、開発環境がかなり良い感じに構築できるんじゃないかと思います。
USB OTG(On The Go)の活用事例
今回のこの手法、実は結構有名らしい。
USB On The Go、略してUSB OTGというらしいです。
USB On-The-Go - Wikipedia
つまり、ラズパイのUSB端子を通して、特定のUSB機器としての役割を持たせるっていう機能です。
特にEthernetとして機能させるUSB Gadget Driverの主な目的が、NICを持たないLinuxコンピュータをPCに接続した時に、ホストが接続しているインターネット回線に接続するためだとか。
USB On-The-Go - Wikipedia
今回調べてみて、この方法を知ることができて、これからのiPadの活用が、自分の望む形で広がりそうです。iPadとラズパイが繋がって、シェルがいつでも触れて、心がぴょんぴょんします。
今回の記事を書くにあたり、参考にしたサイトはこちらです。
Raspberry Pi の USB Ethernet/RNDIS Gadget で 固定 IP アドレスを使う(その1) - HackMD
USB 1本とSDカードライタだけでできるUSB OTGを用いたRapsberry Pi Zero WH のセットアップ - Qiita
HugoをLAN上のiPhoneからプレビューする方法 - Qiita
iPad Pro 2018での開発環境の構築 - Qiita
似たような環境で開発環境を構築されている方も発見しました。趣味が合いそうです。