2020年9月22日火曜日

Ubuntu 20.04 で Raspberry Pi 3B のUSBブートを有効にする

以前買った Raspberry Pi 3B で時々遊んでいる。
最初はRaspbianを入れていたが、途中でLubuntuにしていたが、最近では、Ubuntu20.04を使っている。PCでもUbuntuなので、統一しておいたほうが便利だからだ(とはいえ、PCはbionic、RaspberryPiはfocal)。

以前、PCでUSB Bootable Ubuntuを、普通に使っていたことがある。8GBのUSBメモリだったが、毎日使っていると1ヶ月ぐらいでUSBメモリでエラーが出るようになっていた。
リムーバブルメディアの寿命は、基本的にそんなものだ。MicroSDだったとしても、大して変わらない。
しかしながら、SSDは多少事情が異なる。
SSDは頻繁に読み書きする事を前提で設計されているので、寿命が長い。
最近のUSB接続のSSDの容量が、512MBではなく480MBなど少なめの中途半端な容量になっているのは、おそらく代替え領域などを多めに確保しているためだろう(未確認。詳細不明)。
RaspberryPiもUSBポートがあるので、USB接続のSSDが使える。
本格的に使うなら1ヶ月で壊れるものは使いにくい。SSDの方がMicroSDよりもいい。
以前、どこかでRaspberryPi3BでもUSBブートできるという記事を読んでいたので、それをやってみようと思った。

もう一度調べ直すと、おおよそ
  • OTP(One Time Programable)領域の特定のビットをセットする。
  • セットするには、/boot/config.txtの末尾に、"program_usb_boot_mode=1"を書き込んでリブートする。
  • 確認には、vcgencmdコマンドを使う。
ということだ。難しそうな所はない。
過去に調べた時、そのような操作をしたような気もするが、不可逆的なので躊躇していたようにも思う。Raspbianを使っていた頃のことなので、もうだいぶ時間が経っている。記憶があやふやだ。

確認しようとして、Ubuntu20.04で、vcgencmdを起動しようとしたら、動かない。
focal(Ubuntu20.04)には、vcgencmdが入っていないのだ。
ネットで調べると、PPAを設定して入れる方法が見つかったが、focalでは動かない。focal用のものが用意されていないようだ。
OTPの物理アドレスが解ればアクセスできるかと思ってそれを調べたが、この記事の中ぐらいに、以下のような書き込みを見つけた。
That's impossible to do because of the closed source GPU code. 
There's no user API to access any OTP memory.
自分なりに訳すと、
それを行うのは不可能だ。なぜならクローズドソースのGPUコードだからだ。
あらゆるOTPメモリをアクセスするユーザAPIは無い。
直接アクセス可能な物理メモリ空間にあるのではなく、GPU経由でアクセスするメモリに存在しているようだ。これでは読めない。

やはり、なんとしてもvcgencmdを動かさないといけない。
色々調べると、githubでuserlandのソースが管理されている事がわかった。
以下のようにして、gitリポジトリをクローンする。
git clone https://github.com/raspberrypi/userland.git
サブディレクトリ userland/ ができている。
スクリプトのbuildmeを読むと、uname -mの戻り値によっては、セルフビルドするようになっている。ただし、cmakeをインストールする必要がある。
ビルドツール類をまだ入れていないなら、それらもまとめてinstallしてしまおう。
以下のようにする。
sudo apt install cmake build-essential
後はビルドするだけだ。

git cloneでできたサブディレクトリuserland/へ移動して、buildmeを実行する。
cd userland
./buildme
なんだかんだ色々表示されてビルドが終わる。終了後、/opt/vc/以下に様々な生成物がinstallされている。
もちろん念願のvcgencmdも/opt/vc/bin/の下にある。

ビルドはできたが、このままでは、ライブラリパスも実行パスも通っていない。
まずは、ライブラリパスを通す。
ファイル /etc/ld.so.conf.d/00-vmcs.conf を以下の内容で作成する。
/opt/vc/lib
この状態で、"sudo ldconfig"を実行し、ライブラリパスをキャッシュする。
sudo ldconfig
これで、ライブラリパスの設定はおわり。

つづいて、実行パスも通すのだが、vcgencmdはsudo経由で実行しなければならないため、/etc/sudoersファイル内の、Default secure="..."に、"/opt/vc/bin/"を追加する。
また、このファイルは、直接編集できない。"sudo -e /etc/sudoers" で編集する。
結果的にその行はウチでは以下のようになった。
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/opt/vc/bin"
これで、vcgencmdが実行できるはずだ。 以下のようにして、vcgencmdを実行してみたら、
$ sudo vcgencmd otp_dump | grep '^17:'
17:1020000a
うーん。これではUSBブートできない。3020000aでないといけない。
不可逆な変更なので、躊躇していたようだ。
それにしても、たった1bit確認するだけで、細かく色々、どんだけ手間がかかるんだ。

USBブートがセットされてないことが解ったので、セットしよう。
セットするには、/boot/config.txtの末尾に、"program_usb_boot_mode=1"を書き込んでリブートするらしいのだが、Focalでは/boot/config.txtが存在しない。
Raspbianのイメージをダウンロードして調べてみると、MicroSDの第一パーティション(FATフォーマット)のconfig.txtだ。
Focalでそれは/boot/firmware/config.txt だ。
そのため、以下のようにして書き込む。
echo program_usb_boot_mode=1 | sudo tee -a /boot/firmware/config.txt
これで、再起動してOTP領域を確認すると、
$ sudo vcgencmd otp_dump | grep '^17:'
17:3020000a
よしよし。やっとUSBブートのセットができた。

これで全てではない。
ダウンロードしてきたイメージをUSBでブートできるようになったのだが、実際に使うにはもう少し手間がかかる。
1ビット確認して、1ビット書き換えただけで、妙に長くなってしまったので、とりあえず今回はここまで。

つづく。

2020年9月13日日曜日

新しいプリンタを買った

昔から使っているCANON LBP-1310は未だに健在だ。しかしながら、白黒だし、スキャナも欲しかったので、インクジェットを新たに買った。
今回は、EPSON EW-M752T にした。EPSONのプリンタは20年ぶりぐらいだろうか。
エコタンク対応で、ランニングコストが安価になる。古い機械を長く使う人にしてみれば、効果的だし、コンビニのビニール袋すら問題視する時代に合っていると言えよう。

急激なテレワーク化のため、プリンタもまたバカ売れ品薄状態で、先月の末に店頭で注文したのに、届いたのは昨日だった。

届いてから、おもむろにLinuxドライバを探した。
MacのおかげでCUPSが発展し、最近ではLinuxでも簡単にプリンタが使えるようになっていたので、ほとんど気にしていなかったのだが、検索して出てきた「Linuxドライバーダウンロード可能機種一覧」のページをみて愕然とした。

購入したEW-M752Tが、その一覧には無いのだ。

「…やってしまった。」と思ったが、一応ドライバダウンロードへ移動して、ダメ元で検索してみた。
すると、以下のような結果が表示された。

あるじゃん!
しかも、ARM用のパッケージまである。armhf用なので、RaspberryPi 3系で使える。4でもLinuxが32bit版なら使えるだろう。

まずは、PC(amd64)のプリンタドライバセットアップをする。
epson-inkjet-printer-escpr2_1.1.17-1lsb3.2_amd64.deb をダウンロードしてくる。
ダウンロードページの下の方(上記画面の"ESC/P-R Driver 2 (generic driver)"の行の「ダウンロード」をクリックした後で、ソフトウエア使用許諾に同意した後で表示される)に、以下のような事が書いてある。
[Notice]
In order to install these drivers, you need to install LSB package (version 3.2 or later) beforehand.

Ubuntu:
# apt-get install lsb

Fedora:
# yum install lsb

OpenSUSE:
# yast --install lsb
最初の部分には、「これらドライバをインストールするためには、LSBパッケージ(バージョン3.2またはそれ以降)を事前にインストールする必要がある。」と書いてある。このlsbは、"Linux Standard Base"と呼ばれる機能のパッケージらしい。最新のUbuntuでは、これは全機能を提供していないようで、サードパーティプリンタドライバとの互換性のためだけに提供されているもののようだ。
ウチは、Ubuntu 18.04なので、以下のようにしてインストールした。
sudo apt-get install lsb
その後、ダウンロードした epson-inkjet-printer-escpr2_1.1.17-1lsb3.2_amd64.deb を以下のようにインストールする。
sudo dpkg -i epson-inkjet-printer-escpr2_1.1.17-1lsb3.2_amd64.deb
あっさりと終わってしまった。次は何をすれば良いんだ?
よくわからないので、とりあえずcupsのWebI/F(http://localhost:631)で見てみる。
上の方の「管理」をクリックして、「プリンタの追加」ボタンを押すと、「発見されたネットワークプリンター」の中に「EPSON EW-M752T Series (EPSON EW-M752T Series)」がある。

注意:上記画面は、プリンタ登録後にキャプチャしたので、すでに上にプリンタが見えている

ここに見えていれば、後は普通に設定すればプリンタは使えるようになる。

次にスキャナも使えるようにする。
ダウンロードページの一番下の行の"Scanner Driver"、"All-in-one package"と書かれているところの「ダウンロード」をクリックする。
使用許諾が求められ、同意すると、PDFファイルのダウンロードとその下に、"Package Download"リンクが表示される。
PDFファイルは、スキャナドライバのインストール方法が書かれている。
"Package Download"をクリックすると、各ディストリビューション、アーキテクチャ用のtarファイルのダウンロードページが表示される。

うちのUbuntuは18.04のamd64なので、imagescan-bundle-ubuntu-18.04-3.63.0.x64.deb.tar.gz ダウンロードした。
インストールは基本的には、tar.gzファイルを展開して、 展開後にできるディレクトリ内のinstall.shを実行すればいい。
$ tar -xf imagescan-bundle-ubuntu-18.04-3.63.0.x64.deb.tar.gz 

$ cd imagescan-bundle-ubuntu-18.04-3.63.0.x64.deb/

$ sudo ./install.sh
install.shはよくできており、足りないパッケージを自動的に apt-get install するようになっている。

ドライバのインストールはできたが、スキャナは自動検出&認識ではない。
/etc/imagescan/imagescan.conf でIPアドレスを指定する必要がある。
各ネットワーク環境毎にやり方は様々だと思うが、とにかくEW-M752TのIPアドレスを固定化して、そのアドレスを得ておく。
そうして、以下のように /etc/imagescan/imagescan.conf を書き換える。
# /etc/imagescan/imagescan.conf -- Image Scan configuration
# Refer to the documentation for details on the configuration options
# for the software.  Plugins should come with their own documentation
# if they have configuration options.
#
# Lines starting with a # or a ; are comments.  Comments must be on a
# line of their own.  End-of-line comments are not supported.

[devices]

myscanner.udi    = esci:networkscan://192.168.xxx.xxx:1865
myscanner.vendor = Epson
myscanner.model  = EW-M752T
注意:上記 "192.168.xxx.xxx"には、EW-M752T のIPアドレスを指定する。

この状態で、Terminalからimagescanと入力するか、メニューから「グラフィック」-> 「Image Scan」(ウチはGnome session flashback環境)をクリックすると、imagescanというアプリが起動する。
「更新」ボタンをクリックすると、プレビューが表示される。以下は、プリンタについていた「インクボトルガイド」をプレビューした様子。

一瞬、未対応かと冷や汗をかいたが、バッチリじゃん。
最近のLinux環境は良くなったものだ。

さらにarmhfアーキテクチャのドライバまである(まだ試しいていない。将来記事にするかも)。CANONには無かったと思う(最近見てないので詳細不明)が、CANONとEPSONはお互い切磋琢磨しているので、徐々に良くなるだろう。
RaspberryPiも、PCの代わりに使えるぐらいの性能になった。しかし、実際にPCの代わりに使うには、プリンタやスキャナも普通に使える必要がある。
残念なことに、arm64のドライバはまだ提供されて無いようだ。RaspberryPiでも64bitを必要とするようになったのは最近のことだし、MacもARMに移行するらしいので、arm64の環境も徐々に充実するだろう。
期待して待とう。

2020年9月6日日曜日

雲のタイムラプス

台風10号が九州に接近している。
かなり強力な台風なので、関東にも影響が出ている。
晴れたかと思えば、突然雨が降ったり、雷が鳴ったり、不安定だ。

雲が流れていくのを見て、タイムラプスで見てみたいと思って撮影した。

2020年9月6日 12:50頃から、15:38頃までの2時間48分、さいたま市で撮影。
x60倍速再生のため、1分で1時間に相当する。
撮影時に雷も光っていたが、とびとびなので動画では見えない。