Установка saned с помощью systemd (без inetd или xinetd) - saned отказывается от подключения

5487
emk2203

Я настроил Raspberry Pi B v1 с минимальным изображением Джесси и настроил его для печати через чашки и сканирования через saned.

Локальная настройка без проблем;

pi@EMK-RPiBv1:~$ scanimage -L device 'fujitsu:ScanSnap S1500:25959' is a FUJITSU ScanSnap S1500 scanner

Однако сканер не виден в сети. А scanimage -Lна другой машине показывает emk2203@XPS12-9Q33:~$ scanimage -L device 'hpaio:/net/HP_LaserJet_CM1415fn?ip=192.168.1.30' is a Hewlett-Packard HP_LaserJet_CM1415fn all-in-one device 'hpaio:/net/HP_Officejet_Pro_276dw_MFP?ip=192.168.1.40' is a Hewlett-Packard HP_Officejet_Pro_276dw_MFP all-in-one

Итак, scanimage -Lработает - он находит два других сетевых сканера, но не сканер, подключенный к Raspi.

Если я выдаю netstat -tulpnпи и проверяю статус saned.serviceи saned.socket, я получаю

pi@EMK-RPiBv1:~$ netstat -tulpn (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -  tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN -  tcp6 0 0 :::6566 :::* LISTEN -  tcp6 0 0 :::22 :::* LISTEN  tcp6 0 0 :::631 :::* LISTEN  udp 0 0 0.0.0.0:42976 0.0.0.0:*  udp 0 0 0.0.0.0:5353 0.0.0.0:*  udp 0 0 0.0.0.0:29987 0.0.0.0:*  udp 0 0 0.0.0.0:68 0.0.0.0:*  udp 0 0 192.168.1.34:123 0.0.0.0:* -  udp 0 0 127.0.0.1:123 0.0.0.0:*-  udp 0 0 0.0.0.0:123 0.0.0.0:*-  udp6 0 0 :::35810 :::* -  udp6 0 0 :::5353 :::* -  udp6 0 0 :::49009 :::* -  udp6 0 0 fe80::ba27:ebff:fe4:123 :::* -  udp6 0 0 2a02:8070:a182:ce00:123 :::* -  udp6 0 0 ::1:123 :::* -  udp6 0 0 :::123 :::* -   pi@EMK-RPiBv1:~$ systemctl status saned.socket ● saned.socket - saned incoming socket Loaded: loaded (/lib/systemd/system/saned.socket; enabled) Active: active (listening) since Sun 2015-10-11 20:01:52 CEST; 2min 18s ago Listen: [::]:6566 (Stream) Accepted: 0; Connected: 0  pi@EMK-RPiBv1:~$ systemctl status saned.service ● saned.service - LSB: SANE network scanner server Loaded: loaded (/etc/init.d/saned) Active: active (exited) since Sun 2015-10-11 20:01:53 CEST; 2min 26s ago Process: 342 ExecStart=/etc/init.d/saned start (code=exited, status=0/SUCCESS) 

Открытый порт показан только для tcp6, но, как pi@EMK-RPiBv1:~$ sudo sysctl net.ipv6.bindv6onlyя понимаю, net.ipv6.bindv6only = 0это не должно быть проблемой, поскольку ipv6 не связан только с v6, но также включает ipv4.

Но когда я пытаюсь подключиться через telnet к открытому порту на пи, соединение отклоняется :

pi@EMK-RPiBv1:~$ telnet localhost 6566 Trying ::1... Connected to localhost. Escape character is '^]'. Connection closed by foreign host. 

Это указывает на то, что я не могу добраться до своего saned.

Если я убью службу systemd и сокет для saned и попытаюсь отладить, я получу следующее:

root@EMK-RPiBv1:~# systemctl stop saned.service root@EMK-RPiBv1:~# systemctl stop saned.socket root@EMK-RPiBv1:~# lsof -i :6566 

Итак, ничего не слушаю на данный момент - нет выхода.

root@EMK-RPiBv1:~# saned -d128 -a saned [saned] main: starting debug mode (level 128) [saned] read_config: searching for config file [saned] read_config: done reading config [saned] saned (AF-indep+IPv6) from sane-backends 1.0.24 starting up [saned] do_bindings: trying to get port for service "sane-port" (getaddrinfo) [saned] do_bindings: [1] socket () using IPv6 [saned] do_bindings: [1] setsockopt () [saned] do_bindings: [1] bind () to port 6566 [saned] do_bindings: [1] listen () [saned] do_bindings: [0] socket () using IPv4 [saned] do_bindings: [0] setsockopt () [saned] do_bindings: [0] bind () to port 6566 [saned] do_bindings: [0] bind failed: Address already in use [saned] run_standalone: spawning Avahi process [saned] run_standalone: waiting for control connection [saned] saned_avahi_callback: AVAHI_CLIENT_S_RUNNING [saned] saned_create_avahi_services: adding service 'saned' [saned] saned_avahi_group_callback: service 'saned' successfully established 

Что мне нужно сделать, чтобы открыть соединение? Без установки inetd или xinetd, пожалуйста. Это должно работать только с systemd.

2

2 ответа на вопрос

1
grawity

But when I try to telnet into the open port on the pi, the connection is refused:

pi@EMK-RPiBv1:~$ telnet localhost 6566 Trying ::1... Connected to localhost. Escape character is '^]'. Connection closed by foreign host. 

But, um, it's not refused. If it was, you would see "Connection refused". But it clearly says "Connected" here – the connection was accepted, and then closed by the actual service.

Anyway: I can guess at two problems:

  1. With inetd-like socket activation such as this, the saned service isn't running until a connection is attempted. Therefore it cannot appear in scan results either (since it's not running during the scan). So instead you might need to run it as a permanent service, not a socket-activated one.

  2. Your saned.service is not a real systemd service; it was automatically converted from /etc/init.d/saned (as the "LSB:" prefix shows). As the init.d conversion needs to handle many weird edge cases, sometimes it results in services that are barely working – especially when combined with socket activation. Thus you should avoid starting saned's native-systemd units and LSB-converted units at the same time.

Ваше наблюдение за поведением telnet в сочетании с 2. было правильным и помогло мне точно определить проблему. Правильное взаимодействие с systemd находится в SANE 1.0.25, в SANE 1.0.24 остались проблемы. Подробнее о [SANE bug tracker] (https://alioth.debian.org/tracker/index.php?func=detail&aid=314883). Вкратце, для работы systemd glue необходимо установить `libsystemd-dev`, а` saned.service` отредактировать в соответствии с предложением man-страницы для 1.0.25: [1.0.25 man page] (https: // bugzilla.redhat.com/attachment.cgi?id=1076042). Кроме того, `/ etc / default / saned` должен содержать` RUN = no`, иначе служба не работает. emk2203 8 лет назад 1
То, что остается неизменным, это то, что адрес или полное доменное имя сервера SANE должно быть явно указано в `/ etc / sane.d / net.conf` на клиенте. emk2203 8 лет назад 0
1
emk2203

Правильное взаимодействие с systemd находится в SANE 1.0.25, в SANE 1.0.24 остались проблемы. Больше на трекере ошибок SANE . Чтобы настроить saned для работы с systemd, нужно либо использовать версию sane-utils 1.0.25 (не в Raspbian Jessie), либо внести коррективы в версию 1.0.24.

Короче говоря, libsystemd-devдолжен быть установлен для работы клея systemd и saned.serviceотредактирован в соответствии с предложением man-страницы для 1.0.25: 1.0.25 man-страницы .

Страница человека для 1.0.25

Конфигурация Systemd, когда saned скомпилирован без поддержки systemd

Эта конфигурация также будет работать, когда Saned скомпилирован с поддержкой интеграции systemd, но не позволяет регистрировать отладочную информацию.

saned.socket (Без изменений)

[Unit] Description=saned incoming socket  [Socket] ListenStream=6566 Accept=yes MaxConnections=1  [Install] WantedBy=sockets.target 

saned@.service(изменено, работает также, если systemdподдержка компилируется, но не позволяет вести запись отладочной информации)

[Unit] Description=Scanner Service Requires=saned.socket  [Service] ExecStart=/usr/sbin/saned User=saned Group=saned StandardInput=socket  Environment=SANE_CONFIG_DIR=/etc/sane.d  [Install] Also=saned.socket 

Вы также можете войти Alias=saned.serviceв последний Also=saned.socketраздел установки после того, как обе отшлифованные ссылки начинаются с одинаковой отшлифованной. *

Кроме того, /etc/default/sanedдолжен содержать, RUN=noили служба не работает, и в качестве напоминания, адрес saned сервера или полное доменное имя (не только имя сервера) должны быть установлены /etc/sane.d/net.confна всех клиентских компьютерах.