unraid设置airprint并固定打印机端口号

2023-01-18 15:14:27 2点赞 24收藏 9评论

前言

家里的老古董mp288联不了网,不舍得买新的。所以把它接入到nas中共享出来给家里人用。第一篇文章,文笔粗硬,笔记也是用md起草的,懒得搞图片,见笑了,哈哈。(zdm怎么没有代码框的,居然还必须要图片)

安装airprint

在app市场搜索,因为还需要配置,后面讲

unraid设置airprint并固定打印机端口号

相关信息准备

打印机热插拔或者重启后,会在unraid重新分配一个端口号,此时airprint如果依然使用比如/dev/bus/usb/001/003,就无法识别到新的端口号,故打印机无法使用。

# 查看id

lsusb

Bus 001 Device 003 Port 1-8 ID 04a9:1746 Canon, Inc. PIXMA MP280


# 查看相关属性

udevadm info -a /dev/bus/usb/001/003


udevadm info -a -n /dev/bus/usb/001/003 | grep '{serial}' | head -n1

223E3D

打印机热插拔或重启时,分配一个固定设备号

# 编辑udev rules

touch /etc/udev/rules.d/90-usb.rules

vim /etc/udev/rules.d/90-usb.rules

90-usb.rules

# 这是为了给打印机分配一个固定的设备号,分配给docker的airprint一个设备device

SUBSYSTEM=="usb", ATTRS{idVendor}=="04a9", ATTRS{idProduct}=="1746", ATTRS{serial}=="223E3D", SYMLINK+="printer"


# 这是热插拔时会触发的脚本,待会讲

SUBSYSTEM=="usb", ATTRS{idVendor}=="04a9", ATTRS{idProduct}=="1746", ATTRS{serial}=="223E3D", ACTION=="add", RUN+="/bin/bash /root/scripts/printer.sh"

  • SUBSYSTEM=="usb",固定这样写,其他系统应该可以根据上面的信息修改,自己摸索

  • ATTRS{idVendor}=="04a9", ATTRS{idProduct}=="1746",根据上面的信息修改ID 04a9:1746

  • ATTRS{serial}=="223E3D",也是根据上面的信息修改

  • SYMLINK+="printer",这个会在/dev目录下生成/dev/bus/usb/003的一个软链接。用于分配给docker容器

在app市场搜索airprint安装

挂载/dev目录和刚才建的设备软链接

docker run

-d

--name='Cups-Airprint'

--net='host'

-e 'CUPSADMIN'='admin'

-e 'CUPSPASSWORD'='admin'

-v '/mnt/user/appdata/Cups-Airprint/services/':'/services':'rw'

-v '/mnt/user/appdata/Cups-Airprint/config':'/config':'rw'

-v '/mnt/user/appdata/Cups-Airprint/log/':'/var/log/cups':'rw'

-v '/dev':'/dev':'rw'

--device='/dev/printer'

--restart unless-stopped 'chuckcharlie/cups-avahi-airprint:latest'

-v '/dev':'/dev':'rw'

--device='/dev/printer'

因为未知原因,airprint可以通过/dev/printer识别到打印机,但是需要通过真实路径/dev/bus/usb/001/003连接打印机。所以要挂载两个东西。可以单独挂载试一下。

如果失败了,可以插拔一下打印机。或者手动触发一下udevadm trigger --attr-match=subsystem=usb

热插拔或重启后,自动运行重启docker容器的命令

因为端口号改变后,原容器无法使用打印机,所以要重启容器。

mkdir -p /root/scripts

touch /root/scripts/printer.sh

vim /root/scripts/printer.sh


printer.sh

#!/bin/bash

docker stop Cups-Airprint

docker start Cups-Airprint


SUBSYSTEM=="usb", ATTRS{idVendor}=="04a9", ATTRS{idProduct}=="1746", ATTRS{serial}=="223E3D", ACTION=="add", RUN+="/bin/bash /root/scripts/printer.sh"

回到这里

ACTION=="add",插打印机会触发add事件(拔触发remove,但是没用)

RUN+="/bin/bash /root/scripts/printer.sh",运行脚本。注意这里要加上/bin/bash,脚本最好也加上#!/bin/bash


姿势骚的也可以把两条rule合在一起,但是个人喜欢不同功能分开写。

重启unraid后自动复制脚本到unraid上

unraid每次重启后都会清空根目录下所有东西,所以要把需要的东西放到u盘,也就是/boot目录下

# /boot是u盘根目录,自行选择目录


mkdir -p /boot/startup/rules.d

mkdir -p /boot/startup/scripts


touch /boot/startup/rules.d/90-usb.rules

vim /boot/startup/rules.d/90-usb.rules


SUBSYSTEM=="usb", ATTRS{idVendor}=="04a9", ATTRS{idProduct}=="1746", ATTRS{serial}=="223E3D", SYMLINK+="printer"

SUBSYSTEM=="usb", ATTRS{idVendor}=="04a9", ATTRS{idProduct}=="1746", ATTRS{serial}=="223E3D", ACTION=="add", RUN+="/bin/bash /root/scripts/printer.sh"



touch /boot/startup/scripts/printer.sh

vim /boot/startup/scripts/printer.sh


#!/bin/bash

docker stop Cups-Airprint

docker start Cups-Airprint

user script添加脚本

先在app市场安装userscript

在settings->user scripts中添加新脚本

随便起个名字,我写了printer

时间选at startup of array

#!/bin/bash

#persistent printer port

cp /boot/startup/rules.d/90-usb.rules /etc/udev/rules.d/

cp -R /boot/startup/scripts /root

chmod -R 777 /root/scripts

sleep 30 &

process_id=$!

echo "PID: $process_id"

wait $process_id

echo "Exit status: $?"

udevadm trigger --attr-match=subsystem=usb

docker start Cups-Airprint

sleep 30 &,因为docker服务启动需要时间,所以要sleep等待30s

process_id=$!,$!是内部Bash变量,用于在后台存储上一次运行的作业的PID

wait $process_id,等待这个pid下的任务完成,然后才运行下一条命令

echo "Exit status: $?",打印等待命令的退出状态,$?是内部Bash变量,用于保存最后执行的命令的退出状态。这里应该是0,但我不知道啥意思

udevadm trigger --attr-match=subsystem=usb,触发subsystem=usb的udev规则,这里只会触发第一条SYMLINK+="printer"。可能因为没有产生add事件

docker start Cups-Airprint,因为docker启动时/dev/printer没有生成,所以容器会启动失败,这里要启动一下

参考链接

https://blog.csdn.net/weixin_39704374/article/details/116765519

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
9评论

  • 精彩
  • 最新
  • 我的是爱普生LQ-630KII,经过多次测试,包括unraid重启,都没有任何问题,且没有这个教程这么复杂,给大家参考一下。

    1、应用中拉取Cups-Airprint模版。

    2、打开高级视图,在额外参数添加了“--device=/dev/bus --device=/dev/usb”参数。

    3、如果安装后不能启动,提示找不到usb,就重启一下打印机(好像6.12.2需要重启一下系统)就应该就可以启动了,在该应用操作界面就会发现该打印机,按提示安装即可。

    4、将打印机ID + unidir添加到镜像的/usr/share/cups/usb/org.cups.usb-quirks文件中。
    如我的打印ID是04b8:006a,添加后的是
    # Epson Corp. LQ-630KII
    0x04b8 0x006a unidir
    :wq! #保存退出

    5、如果中途关闭打印机,需要在打开打印机后重新启动一下该镜像才能使用。

    校验提示文案

    提交
    原来如此,多谢这位兄弟分享

    校验提示文案

    提交
    我的unraid是6.12.13,/usr/share/目录下没有cups文件,我搜索到6个org.cups.usb-quirks文件,我把我的爱普生me10打印机的ID + unidir给这6个文件都添加了,断电后重启后还是不行,还得从启一下docker才能正常打印。

    校验提示文案

    提交
    收起所有回复
  • 太专业了,看不懂,我的打印机在cups里没驱动用不了 [喜极而泣]

    校验提示文案

    提交
    试试别的版本?我这个兄弟2140在新版就没驱动,换了旧版就有了

    校验提示文案

    提交
    佳能的好像比较特殊 [喜极而泣]

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 我是用模板安装的,在额外参数中添加了--device /dev/bus --device /dev/usb这两个参数后就自动识别了,没有后面的那些设置。我的是爱普生LQ-630KII。大家可以试一下。

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章

干脆面racon

Ta还没有介绍自己

关注 打赏
最新文章 热门文章
24
扫一下,分享更方便,购买更轻松