QEMU 및 SANE를 사용하는 Raspberry Pi의 Brother x86 스캐너 드라이버

QEMU 및 SANE를 사용하는 Raspberry Pi의 Brother x86 스캐너 드라이버

저는 Brother 7055 프린터/스캐너와 Raspberry Pi를 가지고 있으며 둘 다 인쇄 및 스캔 서버로 전환하고 싶습니다. 안타깝게도 Brother는 ARM 드라이버를 제공하지 않습니다. 내가 만난이것Raspberry Pi의 QEMU 에뮬레이션에 대한 블로그 게시물에서 실제로 이 방법을 사용하여 x86 프린터 드라이버를 성공적으로 설치했으며 CUPS를 통해 공유했는데 모든 것이 정상이었습니다. 이제 스캐너를 작동시키려고 하는데 Brother 소프트웨어가 오류 없이 설치되었지만 실행하면 스캐너가 표시되지 않습니다.scanimage -L

스캐너가 연결되었습니다:

dporobic@raspberrypi:~ $ lsusb
Bus 001 Device 005: ID 04f9:0248 Brother Industries, Ltd DCP-7055 scanner/printer
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

하지만 스캐너를 볼 수 없습니다:

dporobic@raspberrypi:~ $ scanimage -L

No scanners were identified. If you were expecting something different,
check that the scanner is plugged in, turned on and detected by the
sane-find-scanner tool (if appropriate). Please read the documentation
which came with this software (README, FAQ, manpages).

sane-find-scanner는 뭔가를 보지만 형제가 자신의 sane 드라이버를 사용하기 때문에 작동시킬 수 없습니다.

porobic@raspberrypi:~ $ sudo sane-find-scanner 

  # sane-find-scanner will now attempt to detect your scanner. If the
  # result is different from what you expected, first make sure your
  # scanner is powered up and properly connected to your computer.

  # No SCSI scanners found. If you expected something different, make sure that
  # you have loaded a kernel SCSI driver for your SCSI adapter.
  # Also you need support for SCSI Generic (sg) in your operating system.
  # If using Linux, try "modprobe sg".

found USB scanner (vendor=0x04f9, product=0x0248) at libusb:001:005
found USB scanner (vendor=0x0424, product=0xec00) at libusb:001:003
  # Your USB scanner was (probably) detected. It may or may not be supported by
  # SANE. Try scanimage -L and read the backend's manpage.

  # Not checking for parallel port scanners.

  # Most Scanners connected to the parallel port or other proprietary ports
  # can't be detected by this program.

디버그 스캔 이미지는 다음과 같은 출력을 제공하며 Brother4 lib를 로드할 수 없는 것처럼 보입니다.

dporobic@raspberrypi:~ $ sudo SANE_DEBUG_DLL=255 scanimage -L
[sanei_debug] Setting debug level of dll to 255.
[dll] sane_init: SANE dll backend version 1.0.13 from sane-backends 1.0.24
[dll] sane_init/read_dlld: attempting to open directory `./dll.d'
[dll] sane_init/read_dlld: attempting to open directory `/etc/sane.d/dll.d'
[dll] sane_init/read_dlld: using config directory `/etc/sane.d/dll.d'
[dll] sane_init/read_dlld: considering /etc/sane.d/dll.d/libsane-extras
[dll] sane_init/read_config: reading dll.d/libsane-extras
[dll] sane_init/read_dlld: done.
[dll] sane_init/read_config: reading dll.conf
[dll] add_backend: adding backend `brother4'
[dll] sane_get_devices
[dll] load: searching backend `brother4' in `/usr/lib/arm-linux-gnueabihf/sane:/usr/lib/sane'
[dll] load: trying to load `/usr/lib/arm-linux-gnueabihf/sane/libsane-brother4.so.1'
[dll] load: dlopen()ing `/usr/lib/arm-linux-gnueabihf/sane/libsane-brother4.so.1'
**[dll] load: dlopen() failed (/usr/lib/arm-linux-gnueabihf/sane/libsane-brother4.so.1: cannot open shared object file: No such file or directory)**
[dll] sane_get_devices: found 0 devices

No scanners were identified. If you were expecting something different,
check that the scanner is plugged in, turned on and detected by the
sane-find-scanner tool (if appropriate). Please read the documentation
which came with this software (README, FAQ, manpages).
[dll] sane_exit: exiting
[dll] sane_exit: finished

lib 파일이 있지만 열거나 액세스할 수 없는 것 같습니다.

dporobic@raspberrypi:~ $ ls -l /usr/lib/arm-linux-gnueabihf/sane/ | grep brother
-rwxr-xr-x 1 root root 129696 Jan  8 11:08 libsane-brother4.so
-rwxr-xr-x 1 root root 129696 Jan  8 11:08 libsane-brother4.so.1
-rwxr-xr-x 1 root root 129696 Jan  8 11:08 libsane-brother4.so.1.0.7

libsane-brother4.so 라이브러리의 일부 종속성이 누락되었을 수 있지만 objdump -x를 실행하고 동적 섹션을 보면 다음과 같은 출력이 표시됩니다. (저는 objdump에 익숙하지 않으므로 이를 올바르게 설명할 수 있기를 바랍니다.)

dporobic@raspberrypi:~ $ objdump -x /usr/lib/arm-linux-gnueabihf/sane/libsane-brother4.so | grep NEEDED
  NEEDED               libpthread.so.0
  NEEDED               libnsl.so.1
  NEEDED               libusb-0.1.so.4
  NEEDED               libm.so.6
  NEEDED               libdl.so.2
  NEEDED               libc.so.6

내 Pi에는 다음 라이브러리가 있는 것 같습니다. 그 중 하나만 ARM 버전으로만 사용할 수 있고 i386 버전으로는 사용할 수 없으며 다른 모든 라이브러리는 두 버전 모두에 포함되어 있습니다.

dporobic@raspberrypi:~ $ sudo ldconfig -p | grep -E 'libpthread.so.0|libnsl.so.1|libusb-0.1.so.4|libm.so.6|libdl.so.2|libc.so.6'
        libusb-0.1.so.4 (libc6,hard-float) => /lib/arm-linux-gnueabihf/libusb-0.1.so.4
        libusb-0.1.so.4 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libusb-0.1.so.4
        libpthread.so.0 (libc6,hard-float, OS ABI: Linux 2.6.32) => /lib/arm-linux-gnueabihf/libpthread.so.0
        libpthread.so.0 (libc6, OS ABI: Linux 2.6.32) => /lib/i386-linux-gnu/libpthread.so.0
        libnsl.so.1 (libc6,hard-float, OS ABI: Linux 2.6.32) => /lib/arm-linux-gnueabihf/libnsl.so.1
        libnsl.so.1 (libc6, OS ABI: Linux 2.6.32) => /lib/i386-linux-gnu/libnsl.so.1
        libm.so.6 (libc6,hard-float, OS ABI: Linux 2.6.32) => /lib/arm-linux-gnueabihf/libm.so.6
        libm.so.6 (libc6, OS ABI: Linux 2.6.32) => /lib/i386-linux-gnu/libm.so.6
        libdl.so.2 (libc6,hard-float, OS ABI: Linux 2.6.32) => /lib/arm-linux-gnueabihf/libdl.so.2
        libdl.so.2 (libc6, OS ABI: Linux 2.6.32) => /lib/i386-linux-gnu/libdl.so.2
        libc.so.6 (libc6,hard-float, OS ABI: Linux 2.6.32) => /lib/arm-linux-gnueabihf/libc.so.6
        libc.so.6 (ELF, OS ABI: Linux 2.6.32) => /lib/i386-linux-gnu/libc.so.6

하지만 필요한 라이브러리가 목록에 없으므로 로드되지 않는 것일 수 있습니다.

dporobic@raspberrypi:~ $ sudo ldconfig -p | grep libsane-brother4.so
dporobic@raspberrypi:~ $

처음에 Borrowr4 lib가 있습니다 /usr/lib/sane. 이 경로를 추가 /etc/ld.so.conf.d/libsane-brother.conf하고 실행했지만 체크인할 때만 sudo ldconfig이 라이브러리를 얻습니다.libsane.so.1ldconfig -v

dporobic@raspberrypi:~ $ sudo ldconfig -v 2>/dev/null | grep brother -B1
/usr/lib/sane:
        libsane.so.1 -> libsane-brother4.so.1.0.7

libsane-brother.so.1ld 캐시에 lib를 표시 할 수 없습니다 ...

고쳐 쓰다

dlconfig와 관련이 없는 것 같습니다. 내 opensuse 컴퓨터에서는 스캐너가 작동하고 있으며 libsane-brother.so.1 libPi에서처럼 ldconfig 캐시에 표시되지 않지만 lib는 문제 없이 로드됩니다.

dporobic@latitude:~> sudo ldconfig -v 2>/dev/null | grep -E 'sane|brother'
        libksane.so.0 -> libksane.so.0.2.0
        libsane.so.1 -> libsane.so.1.0.24

올바르게 로드되고 오류가 없습니다.

dporobic@latitude:~> sudo SANE_DEBUG_DLL=255 scanimage -L
[sanei_debug] Setting debug level of dll to 255.
[dll] sane_init: SANE dll backend version 1.0.13 from sane-backends 1.0.24
[dll] sane_init/read_dlld: attempting to open directory `./dll.d'
[dll] sane_init/read_dlld: attempting to open directory `/etc/sane.d/dll.d'
[dll] sane_init/read_dlld: opendir failed: No such file or directory
[dll] sane_init/read_config: reading dll.conf
[dll] add_backend: adding backend `brother4'
[dll] sane_get_devices
[dll] load: searching backend `brother4' in `/usr/lib64/sane'
[dll] load: trying to load `/usr/lib64/sane/libsane-brother4.so.1'
**[dll] load: dlopen()ing `/usr/lib64/sane/libsane-brother4.so.1'**
[dll] init: initializing backend `brother4'
[dll] init: backend `brother4' is version 1.0.1
[dll] sane_get_devices: found 1 devices
device `brother4:bus2;dev1' is a Brother DCP-7055 USB scanner
[dll] sane_exit: exiting
[dll] sane_exit: calling backend `brother4's exit function
[dll] sane_exit: finished

libsane-brother.so.1 lib이제 질문은 올바른 경로에서도 Sane이 열리지 않는 이유입니다.

참고: 이것을 실행하면 내 OpenSuse 시스템에 직접 연결되고 동일한 드라이버가 설치된 동일한 스캐너가 나타나므로 scanimage -L작동해야 합니다. 여기서 유일한 용의자는 Pi입니다.

답변1

작년에도 비슷한 문제를 해결했습니다. 팔에(Arbian, Raspian과 동일) 처음에는 이 컴퓨터(mfc 795cw)에 qemu 인쇄의 도움을 받아 설치했습니다. 스캐너가 작동하지 않지만 스캔에 실패한 드라이버를 해당 arm Linux에 설치해야 합니다. 스캔을 위해 chroot 환경을 설정했습니다. Brother Linux 드라이버와 관련된 최신 버전의 Linux가 필요합니다. 따라서 저는 Lubuntu 10.04를 사용합니다. lpr을 제거하지 않도록 주의하세요!. 이 chroot 환경에서 Brother Linux 설치 프로그램을 실행해야 합니다. 그런 다음 arm-Linux에서 인쇄하고 chroot i368 Linux에서 스캔합니다. scanimage를 사용하여 chroot를 시작하기 위한 스캔 스크립트를 설정했습니다(install -o bin, qemu, ....).

답변2

이는 i383 아키텍처 대신 정상적인(armhf) 아키텍처가 사용되기 때문입니다. 아키텍처 i386용 sane을 설치하면 libsane-brother4.so.1 드라이버가 로드됩니다. 그런데 이때 sane(i386)을 libusb(armhf)와 함께 사용할 수 없다는 문제가 발생했습니다. 이것은 사용자 수준이 아닌 커널 모듈입니다. 이 문제를 해결하는 방법을 이해하지 못합니다.

답변3

이를 위해서는 qemu 시스템 에뮬레이션이 필요하므로 예를 들어 컵이 있는 DSL 게스트를 실행하고 나머지 세계(또는 로컬 네트워크)와 다시 공유되는 호스트 raspbian이 있는 공유 USB 프린터/스캐너를 실행할 수 있습니다. 이것은 단지 아이디어일 뿐이고, 실용적인지는 모르겠습니다.

관련 정보