2021年6月6日日曜日

RaspberryPi3 Ubuntu 20.04 で EPSON EW-M752T スキャナドライバ

しばらくRaspberryPI3をほったらかしにしていた。
久しぶりに起動して、apt-get update して、apt-get upgrade した。
ついでに、自宅のプリンタ複合機 EW-M725Tのスキャナドライバも更新した。

EPSONのドライバページでは、Ubuntu armhf用のバイナリパッケージを提供していないので、ソースパッケージからビルドする必要がある。
さらに以前ビルドした時、RaspberryPI3でセルフビルドできなかった。
同時に起動されるJOB数が多すぎて、メモリ不足になるのだ。swapを2GBぐらいにしてもダメだった(スラッシングになってもビルドできるなら待ったのだが、どうにもダメだった)。

結局、ビルドのためにchrootとqemu-user-staticを使った仮想環境でビルドした。
今回も、同じようにPC上に仮想環境を用意してビルドした。
今年のはじめに母艦のストレージをM.2 SSDに載せ替えていたので、以前作った環境は無くなっており、作り直した。
それらを順番に説明していく。

簡単に説明すると、chrootはルートディレクトリを変えて別のファイルツリー環境(chroot監獄)に封じ込めるのに使う。
USB bootable Ubuntu を作って遊んでいた頃に、squashfs圧縮イメージの環境を更新する時に使っていた。

qemu-user-staticは、qemuを使ったユーザ環境のエミュレーションで、システムコールをネイティブのものに置き換えて実行する。
つまり、armhf用のバイナリをamd64上で実行したとき、armhfのシステムコールをamd64カーネルのシステムコールに置き換えて呼び出す。
そのためユーザ空間のみのエミュレーションであり、カーネルやハードウエアのエミュレーションをしないので、性能が落ちにくい。

とても便利なのだが、これらを自力で組み合わせてエミュレーション環境を作るのは、ナニゲにしんどい。
(以前は自力でコツコツやっていた)
しかし、debootstrapとschrootを使うととても簡単にできる。
以下のページでそのやり方が紹介されている。
Introduction to qemu-debootstrap
このページでは、arm64 の xenial の環境を作っているが、私はRaspberryPI3 なので、armhf になり、Ubuntu 20.04 なので、focalになる。
それらを読み直して、実行する必要がある。
例えば、armhf-focalの作成は、
$ sudo qemu-debootstrap --arch=armhf focal armhf-ubuntu
schrootコンフィグレーションの作成は、
$ echo "[armhf-ubuntu]
description=Ubuntu 20.04 Focal (armhf)
directory=$(pwd)/armhf-ubuntu
root-users=$(whoami)
users=$(whoami)
type=directory" | sudo tee /etc/schroot/chroot.d/armhf-ubuntu
上記は例だ。元のページをよく読んで、作業をせよ。
インストールには、ネットワーク接続が必要だ。さらに時間もかかる。

しばらく待つと、armhf focalの環境ができるので、その中に入って作業をする。
$ schroot -c armhf-ubuntu
(armhf-ubuntu)xxx@yyy:$
上記のxxxはユーザ名、yyyはホスト名。
プロンプトの先頭が"(armhf-ubuntu)"になっていれば、エミュレーション環境に入っている。
試しに'uname -m'を実行してみると、
(armhf-ubuntu)xxx@yyy:$ uname -m
armv7l
chroot監獄内の環境だが、ホームディレクトリなどは、ホストと同じものがマウントされている。
便利といえば便利だが、ホスト環境を壊す可能性もあり、注意が必要だ。

armhf実行環境が作れたら、ビルドツールその他必要なものをインストールしなければならないのだが、必要なパッケージの一部がmainリポジトリ内にないので、リポジトリ設定を書き換える必要がある。
やり方はどうでも良いが、/etc/apt/sources.listを以下のような内容に書き換える。
deb http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse
書き換えたら、apt-get updateをしておく。

そうしておいて、必要なパッケージをインストールする。
$ sudo -S apt-get install build-essential devscripts wget debhelper pkg-config liibltdl-dev libudev-dev libusb-1.0-0-dev libgtkmm-2.4-dev libsane-dev libjpeg-dev libtiff-dev graphicsmagick libgraphicsmagick++-dev libboost-filesystem-dev libbooost-iostreams-dev libboost-program-options-dev libboost-regex-dev libboost-test--dev libboost-thread-dev
上記は、build-essential devscript wget と、EPSON EW-M752T用スキャナドライバのソースパッケージが必要とするパッケージを全部指定している。

ビルドに必要なものは用意できた。次にソースパッケージを入手する。
EPSONのドライバダウンロードページに行って、"EW-M752T"を入力、OSに"Linux"を選んで、虫眼鏡アイコンをクリックすると、以下のようなページになる。
一番下の行「EW-M752T Scanner Driver Linux 3.65.0 All-in-one package All language 01-05-2021」の[Download]ボタンをクリックする。
以下のようなページになる。
ここで、[Accept]ボタンをクリックする。
ページが下に延長されて、以下のようになる。
一番下の、"Source File Download Page"をクリックすると、以下のようなページになる。
ここで"Ubuntu"をクリックする。
やっと、ソースパッケージが現れた(なんと説明が面倒なのだろう)。
この中で、以下の3つをダウンロードする。
さっき、armhf-ubuntu環境にもwgetをインストールしておいたので、それでダウンロードすればいい。
適当なディレクトリを作って、そこに3つのファイルをダウンロードせよ。

ダウンロード後、早速ビルドしたい所だが、このままではfakerootでエラーになる。
以下のようにして、fakerootをfakeroot-tcpにする。
$ cd /etc/alternatives

$ sudo rm fakeroot

$ sudo ln -s /usr/bin/fakeroot-tcp fakeroot

やっと、ビルドするための準備が全て整った。
3つのファイルをダウンロードしたディレクトリへ移動して、以下のようにして、ソースパッケージを展開せよ。
$ dpkg-source -x imagescan_3.65.0-1epson4ubuntu20.04.dsc
ふつうのやり方だ。サブディレクトリ"imagescan-3.65.0/"ができているので、その中に入って、バイナリパッケージをビルドする。
$ dpkg-buildpackage -us -uc -b
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
qemu: Unsupported syscall: 403
dpkg-buildpackage: warning:     debian/changelog(l7): badly formatted trailer line
LINE:  -- Seiko Epson <linux-printer@epson.jp>  Thu, 22 Dec 2020 11:01: +0900
dpkg-buildpackage: warning:     debian/changelog(l7): found end of file where expected more change data or trailer
dpkg-buildpackage: info: source package imagescan
dpkg-buildpackage: info: source version 3.65.0-1epson4ubuntu20.04
dpkg-buildpackage: info: source distribution RELEASED
dpkg-buildpackage: info: source changed by 
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
 :
 : (省略)
 :
dpkg-genchanges: info: binary-only upload (no source code included)
 dpkg-source --after-build .
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
qemu: Unsupported syscall: 403
dpkg-source: warning: imagescan-3.65.0/debian/changelog(l7): badly formatted trailer line
LINE:  -- Seiko Epson <linux-printer@epson.jp>  Thu, 22 Dec 2020 11:01: +0900
dpkg-source: warning: imagescan-3.65.0/debian/changelog(l7): found end of file where expected more change data or trailer
dpkg-buildpackage: info: binary-only upload (no source included)
$
およそ6年前のcore-i7だからか、なんだかんだ時間がかかる。
1つ上のディレクトリに戻ってみると、バイナリパッケージができている。
$ ls
imagescan-3.65.0
imagescan-dbg_3.65.0-1epson4ubuntu20.04_armhf.deb
imagescan_3.65.0-1epson4ubuntu20.04.debian.tar.xz
imagescan_3.65.0-1epson4ubuntu20.04.dsc
imagescan_3.65.0-1epson4ubuntu20.04_armhf.buildinfo
imagescan_3.65.0-1epson4ubuntu20.04_armhf.changes
imagescan_3.65.0-1epson4ubuntu20.04_armhf.deb
imagescan_3.65.0.orig.tar.gz
上記ファイルのうち、2つの.debファイルをRaspberryPI3(Ubuntu20.04が動いている)にコピーして、dpkg -i でインストールする。
なんか依存物があったようにも思うが、最初にインストールした時に足りないものはインストールしていて、もうエラーにならない。

PCの場合と同様に、/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://XXX.XXX.XXX.XXX:1865
myscanner.vendor = EPSON
myscanner.model  = EW-M752T
XXX.XXX.XXX.XXXは、プリンタのIPアドレス。適切に置き換えよ。
うちでは、プリンタを固定IP(ルータで固定IP化している)で運用しているので、これだけでいい。

imagescanを実行すると、見慣れたイメージスキャンアプリが立ち上がる。使い方はもちろんPCと同じだ。
RaspberryPIでも、スキャンができる。
便利になったもんだ。

なるべくわかりやすく、短く書くつもりが、妙に長くなった。

0 件のコメント:

コメントを投稿