🖊️

ポメラDM250にLinuxを入れて文章データをGitHubで管理する

2022/09/12に公開1

記事の概要

以前から気になっていたキングジム社の執筆特化マシン『ポメラ』の最新型、DM250を縁あって入手しました。

https://www.kingjim.co.jp/pomera/dm250/

購入するにあたっての最大の迷いは、せっかく書いた文章データファイルを整理・公開するためのPCやネットとの連携手段が乏しいこと。

当初はDM250で追加されたポメラSyncを活用することを考えていましたが、購入後になって有志によるポメラLinux化のことを知ることに。

https://www.ekesete.net/log/?p=9504
https://qiita.com/alt-core/items/0467dca2f4b50d3e3003
http://hitoriblog.com/?p=51448

「これを活用すれば、GitHubでドキュメント管理できるのでは?」と思って試行錯誤した結果、紆余曲折ありつつも無事に
ポメラでドキュメントを執筆したのち、そのデータをポメラ単体でGitHub管理させる
ことができたので、その記録をまとめます。

免責事項

試行環境

  • 対象ポメラ型番:DM250
  • Linux(Debian)のバージョン:2022年8月16日時点付で作者@ichinomoto様のサイトにて公開されていたもの

対象読者・記事の前提

  • 通常のPC(MacやWindowsなど)で、ターミナルによるGitコマンドの操作、プライベートGitHubリポジトリを操作するための認証方法、などの知識があること
  • ポメラにLinux(ディストリビューションはDebian。本記事では以下Debianで表記)をインストールし、ターミナルにログインできること
  • DebianのWiFiを設定済みで、apt-getコマンドにより任意のソフトウェアを追加でインストールできる状態になっていること

以降の内容の要約・結論

  • GitコマンドのGitHub認証はSSH方式を使うと、ソフトウェアの追加インストールなどの手間が最小限で楽
  • ポメラ本体のOSとDebianとの間でデータを共有可能なSDカード領域なvfat領域が用意されている(ありがたい)
  • が、記事執筆時のデフォルト設定では、この共有vfat領域でgit cloneができない問題に遭遇
    • 起動時の共有vfat領域マウント時の設定を変更することで解決

Debianのホームディレクトリ上でGitHubのプライベートリポジトリを操作できるようにする

Gitコマンドのインストール

初期状態では必要最低限のソフトウェアしか導入されていないため、まずはGitコマンドそのものをインストールします。
事前にWiFi設定さえ正しく完了していれば、このインストール自体は簡単に終わるはず。

sudo apt-get install git

ターミナル上のGitHub SSH認証

ターミナルで自分のGitHubリポジトリを操作するには、自分のGitHubアカウントで認証が必要です。
この認証方式は下記どちらかを選択可能。

  1. HTTPS方式
  2. SSH方式

以前は3番目の方式としてシンプルなID/PASSWORD認証が利用できましたが、セキュリティレベルが弱いので2021年8月13日をもって廃止されました。

https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/

もし1.HTTPS認証を利用する場合は、次のような手順を踏みます。

  • あらかじめ自分のGitHubページからアクセストークンを発行して控えておく
  • ターミナル上でID/PASSWORD認証をする際、自分のパスワードを直接入力するのではなく、代わりに発行したアクセストークンを入力する

ただしこの場合、GitHub認証が必要になるたびに長くて複雑なアクセストークンをパスワードの代わりに入力しなければなりません。
この認証情報を管理する仕組みを考える必要があります。

ここで普通のPCであれば、標準の何らかのパスワード管理システムを利用する場面ですね。例えばMacならキーチェーンとか。
https://docs.github.com/ja/get-started/getting-started-with-git/updating-credentials-from-the-macos-keychain

Linux環境についてもGitHub推奨のGitHub CLIGit Credential Managerを追加インストールすればHTTPS認証が使えそうです。
https://docs.github.com/ja/get-started/getting-started-with-git/caching-your-github-credentials-in-git

・・・が、各手順を情報を見る限りインストールのコマンドが一筋縄でいかなかったりブラウザ操作が必要だったり(普通のPCでは何でもないことも、ポメラ上ではややこしいのです・・・・)
と、何だか色々、めんどくさそう ^^;

私としては自分のリポジトリ管理がDebian上のgitコマンドからできればOK
過去の経験上、2.SSH接続であれば特別なソフトウェアのインストールは不要と判断し、下記のページに沿ってSSH接続設定を行いました。

https://zenn.dev/schnell/articles/0e1c2e9db5c08d

ポメラ上ならではのセットアップのコツは

  • ポメラ側でSSH接続用の鍵を生成
  • GitHub側に登録する用の鍵データをcpコマンドで/mnt/sd/配下にコピー
  • SDカードを取り出してPCに接続し、SDカード上の当該コピーデータをGitHub側に登録する
    です。

これでポメラDebianのホームディレクトリで適当に自分のプライベートリポジトリをgit cloneし、無事にデータがポメラ上にダウンロードできれば成功です。

ポメラ共有SDカード上でGitHubリポジトリを管理できるようにする

GitHub認証をクリアしたことで、これで晴れてポメラによるドキュメントのGitHub管理が開始できるかと思いきや、もう一つの問題が。

ポメラ本体とDebianのデータ共有領域である/mnt/sd/で、git cloneコマンドが動かないのです・・・。

ポメラ本体とDebianのデータ共有領域の仕様

上項のSSH設定時にも触れた/mnt/sd領域は、ポメラ本体のOSからもDebianからも(そしてMacやWindowsなどほかのPCからも)アクセスできる共有領域。
デフォルトで2GB確保されており、デバイス名は/dev/mmcblk1p1です。

記事のバージョンではDebian起動時にデフォルトで/mnt/sd/が利用できましたが、過去の資料を見る限りこの領域の扱いには変遷があり

  • 手動でDebian側にマウントする必要がある
  • 自動的にDebian側へマウントしてくれるが、マウント先パスが違う(/mnt/vfat/

などだった模様。
(ポメラLinuxインストールで先人による過去記事を参考にする場合は、このあたりを頭に入れて適時読み替えると良さそうですね)

そしてこのうち、どうやら自動マウントの仕様とGitコマンドの相性が悪かったようでして・・・。

共有SDカード領域でgit cloneするとパーミッションエラー

まずは、実際にデフォルトのマウント設定でgit cloneするとどのような問題に遭遇したかを紹介します。

最初に、SDカード上にGitHubリポジトリ展開用のフォルダを作って移動します。

pomera@pomera:~$ mkdir /mnt/sd/github
pomera@pomera:~$ cd /mnt/sd/github

そしてまずはgit cloneで既存リポジトリの内容をポメラに取得してみます。
テストとして、UberによるGoスタイルガイドの公開リポジトリをcloneしてみましょう。

pomera@pomera:/mnt/sd/github$ git clone git@github.com:uber-go/guide.git

Cloning into 'guide'...
error: chmod on /mnt/sd/github/guide/.git/config.lock failed: Operation not permitted
fatal: could not set 'core.filemode' to 'false'

config.lockに対するchmod操作が権限不足か何かで失敗してる?みたいなメッセージに見えます。
というわけで/mnt/sd配下のパーミッション関係を確認。

pomera@pomera:/mnt/sd/github$ ls -la /mnt/sd
drwxrwxrwx 6 root root 4096 Jan  1  1970 .
drwxr-xr-x 3 root root 4096 Aug 16 21:22 ..
drwxrwxrwx 4 root root 4096 Sep 11 22:29 github
drwxrwxrwx 2 root root 4096 Sep 10 15:41 settings

どうやらマウント先フォルダ・ファイルの所有権が一式rootになっていますね。
記事では割愛しますが、検証したところgit cloneコマンドは操作ユーザーが所有権を持っているフォルダでないと動かないことが判明。

つまり今回、rootに昇格すれば(かつGitHub認証していれば)/mnt/sd/github上でgit cloneできますが、デフォルトの操作ユーザー(例えばpomera)ではgit cloneできない状態。
かといってたかだかgit cloneのためだけにrootを利用するのも、あんまりイケてるやり方な気がしません。

この問題、Debian側のホームディレクトリでGitHubのドキュメント管理する場合は影響ないんだと思います。
ただ、すると今後はそれらのGitHub管理下ドキュメントははポメラ本体側のOSからアクセス&読み書きできません。
ポメラ本体のOSは使わないよ、完全にLinux専用機として使うよってユーザーなら影響はないかと思います。
が、私としては日本語の文章を打つときはポメラ本体のOSを使いたいので、SDカード上のドキュメントがGitHub管理できないのは困る、死ぬほど困る。

というわけで、解決方法を調査しました。

手動による解決をテストする

てっきり所有権の変更といえばchownコマンドか何かを打てばいいのかと思ったのですが、上手くいきませんでした。
どうやらマウント上ドライブの所有権につ亭は、マウント時の設定で事前指定する必要があるようです。
(このときの調査でLinuxポメラ環境を一台死なせてしまったのはまた別の話・・・)

デフォルトでは起動時に共有SDカード領域/mnt/sd/が自動でマウントされてしまうので、いったんアンマウントで取り外します。これにはroot権限が必要なのでsudoを付けましょう。

pomera@pomera:/mnt/sd/github$ sudo umount /mnt/sd/

もしこのときtarget is busyなどエラーメッセージが表示されてアンマウントに失敗した場合は、端末を再起動して起動した直後にumountコマンドを打つとだいたい上手くいきました。

マウント時のオプション情報として必要になるので、先にidコマンドでgit cloneを使いたいユーザーで実行してID情報を確認します。

pomera@pomera:/mnt/sd/github$ id

uid=1000(pomera) gid=1000(pomera) groups=1000(pomera),7(lp),27(sudo),44(video)

記事の例だと、どうやらpomeraアカウントのユーザーID、グループIDはそれぞれ1000だそう。
ではこのID指定付きで、改めて共有SDカード領域をDebianにマウントしてみましょう。

pomera@pomera:/mnt/sd/github$ sudo mount -o uid=1000,gid=1000 /dev/mmcblk1p1

lsコマンドで所有者をチェックしてみます。

pomera@pomera:/mnt/sd/github$ ls -la /mnt/sd/

drwxrwxrwx 6 pomera pomera 4096 Jan  1  1970 .
drwxr-xr-x 3 root   root   4096 Aug 16 21:22 ..
drwxrwxrwx 4 pomera pomera 4096 Sep 11 22:29 github
drwxrwxrwx 2 pomera pomera 4096 Sep 10 15:41 settings

共有SDカード領域上にあるgithubフォルダの所有者がpomeraへと変更されていますね!
ではこの場所でgit cloneに再チャレンジしてみましょう。

pomera@pomera:/mnt/sd/github$ git clone git@github.com:uber-go/guide.git

Cloning into 'guide'...
(ログ中略)done.

pomera@pomera:/mnt/sd/github$ ls -la guide/

drwxrwxrwx 3 pomera pomera  4096 Sep 11 22:34 .
drwxrwxrwx 6 pomera pomera  4096 Sep 11 22:33 ..
drwxrwxrwx 8 pomera pomera  4096 Sep 11 22:34 .git
-rwxrwxrwx 1 pomera pomera   393 Sep 11 22:34 .golangci.yml
-rwxrwxrwx 1 pomera pomera  1449 Sep 11 22:34 CHANGELOG.md
-rwxrwxrwx 1 pomera pomera  3352 Sep 11 22:34 CODE_OF_CONDUCT.md
-rwxrwxrwx 1 pomera pomera 10173 Sep 11 22:34 LICENSE
-rwxrwxrwx 1 pomera pomera  1560 Sep 11 22:34 README.md
-rwxrwxrwx 1 pomera pomera 75779 Sep 11 22:34 style.md

無事にgit cloneができました🎉
先のGitHub認証が正しく行われていれば、同じ要領で自分のプライベートリポジトリも共有SDカード上に展開できます。
そうすればポメラ側のOSによる文章編集とDebianによるGitHub管理が併用可能に!

ただ、このままだと所有権が必要なgitの操作は毎回Debianを立ち上げる度に再マウントが必要になってしまい、まだ少し面倒ですね。
立ち上げ時の自動マウント設定を変更して、この所有権設定をデフォルト化してみましょう。

解決方法の自動化:起動時マウント設定の変更

起動時の自動マウントはfstab機能にて行われており、その設定内容は/etc/fstabを開くことで確認可能です。

pomera@pomera:/mnt/sd/github$ cat /etc/fstab

今回の対象ドライブに関する設定行はこのように記載されていました。

/etc/fstab
(中略)
/dev/mmcblk1p1  /mnt/sd         vfat    rw,sync,dirsync,noatime,umask=0000,utf8     0   0
(中略)

umask=0000など、すでにマウント時の設定としていくつか引数が渡されていることが確認できますね。
ここに先ほどの手動マウント動作確認時に使った引数(uid, gid)を追記してみます。

pomera@pomera:/mnt/sd/github$ sudo vi /etc/fstab

(中略)
/dev/mmcblk1p1  /mnt/sd         vfat    rw,sync,dirsync,noatime,umask=0000,uid=1000,gid=1000,utf8     0   0
(中略)

起動時のデフォルトマウント設定がこの指定通りに動作するか確認するため、一度端末を再起動しましょう。

再起動直後、共有SDカード領域の所有者を確認して、最初から操作ユーザーになっていれば成功。

pomera@pomera:~$ ls -la /mnt/sd/

drwxrwxrwx 6 pomera pomera 4096 Jan  1  1970 .
drwxr-xr-x 3 root   root   4096 Aug 16 21:22 ..
drwxrwxrwx 6 pomera pomera 4096 Sep 11 22:33 github
drwxrwxrwx 2 pomera pomera 4096 Sep 10 15:41 settings

おぉ、最初からgithubフォルダの所有権が操作ユーザー(pomera)になりました!

これで夢のGitHubドキュメント管理機能付きポメラの完成です!!!
めでたし、めでたし。

おわりに

実際にこの記事は

  • ポメラ本体側のOSで概要を作成
  • ポメラDebian側で実際の操作・エラーログファイルを作成
  • 記事下書きとDebianのログをGitHubにアップロード
  • PCからGitHub経由で上記ファイルを取得、記事微校正(操作ログを記事中に展開する・参考リンクを貼り付ける等)
  • 公開

というフローで作りました。

もっというならzennも記事をGitHubリポジトリ管理しているので、理論上ポメラ一台でzennの記事作成から公開まで可能なのでは???と思っています。夢が広がりますね。
(といいつつ本記事執筆段階ではZenn CLIのインストールに躓いたので、また改めて検証が必要そう😇)

あらためてポメラLinux化ソースの作者であるichinomoto氏をはじめ、先人の方々による情報に感謝申し上げます。

なおこちらから御本を買うと作者様に寄付できるので、私のようにポメラLinux化のお世話になった人はぜひぜひ。
https://ekesete.booth.pm/items/616812

Discussion

yukari-n-erbyukari-n-erb

ポメラ二台目をセットアップしようとしたところ、本記事の前提となるwifiの設定でつまづいたので備忘。

事象

正しくSSID情報を/mnt/sd/settings/wpa_supplicant.confに設定しても、
sudo /opt/bin/wifi_switch onを実行した際にwlan0: Failed to initialize driver interfaceなどのエラーが出てwifi接続ができない。

発生条件

ポメラファームウェアがVer.1.1.0.0の時に発生?
(少なくとも自分の環境では初期ポメラファームウェアでは同問題に遭遇せず。初期ポメラセットアップ時に使ったLinux化ファイルをファームVer.1.1.0.0に適用したら起きたので、ここが怪しそう)

解決方法

下記コメント欄の作者様の回答を元に、
https://www.ekesete.net/log/?p=8940

  • sudo vi /etc/init.d/dm200_wirelessで設定ファイルを開く
  • 下記のように機種判定ロジックを修正してファイル保存
- if [ `cat /proc/meminfo | awk 'NR==1 {print $2}'` -eq 1026076 ]; then
+ if [ -b /dev/mmcblk0p27 ]; then
  • 端末再起動

で解決しました。

コメント欄曰く、この正しく動かない機種判定ロジックが/etc/init.d/firstboot/opt/bin/bt_switchにもあるようなので、念の為同様に修正した方がいいかもしれません
https://github.com/ichinomoto/dm200_tools/commit/939c3ee71ba0c1b930afc00d1741b94482c85017