飞牛NAS系统Docker搭建HP LaserJet 1020打印服务器(支持手机直连)
最近更换了一台HP LaserJet 1020激光打印机。实在无法忍受之前那台喷墨打印机——每次需要打印时,不是喷头堵塞就是墨水干了。最终在海鲜市场淘到这台HP经典款1020打印机来解决问题。原本计划通过USB将打印机接入NAS实现网络共享,但实际操作后发现自己还是太天真,遭遇了各种问题。现在基本解决完毕,特此记录踩坑经验。
基础环境搭建
首先需要在飞牛系统上安装CUPS打印机服务。经过测试,驱动支持最全面的镜像是anujdatar/cups
,可通过SSH一键部署:
docker run -d --name cups --restart unless-stopped -p 631:631 -v /dev/:/dev/ -v /var/run/dbus:/var/run/dbus -e CUPSADMIN=admin -e CUPSPASSWORD=adminadmin -e TZ="Asia/Shanghai" anujdatar/cups
访问http://NAS-IP:631
进入管理界面(用户名/密码为预设的admin/adminadmin
):
- 点击【Administration】添加打印机
- 选择已识别的HP1020打印机型号
- 务必勾选"共享打印机"选项
- 必须选择"HP LaserJet 1020 Foomatic/foo2zjs-z1"驱动(其他驱动均有兼容性问题)
- 添加完成后记录打印机URL(后续步骤需要)
疑难问题排查
看似顺利的流程背后暗藏玄机,主要遇到三大问题:
- 设备识别异常:Docker内的CUPS服务在打印机重启后丢失设备连接
- 间歇性打印失败:测试页时好时坏,CUPS日志无报错
- 网络发现失效:必须手动输入URL添加打印机(导致iOS设备无法使用)
根本原因分析
经查证发现HP1020存在两个特殊设计:
- 专为Windows设计的驱动架构,Linux支持不完善
- 无内置闪存,每次开机需通过
/dev/usb/lp0
接口写入固件
飞牛系统的额外问题:
USB接口会不定期释放/dev/usb/lp0
设备节点
解决方案
通过监控脚本实现自动化处理(需提前下载固件文件sihp1020.dl
):
#!/bin/bash
# 打印机数据文件路径
PRINTER_DATA_FILE="/vol3/1000/docker/cups/sihp1020.dl"
# 监控检查间隔时间(秒)
CHECK_INTERVAL=30
# 设置日志文件路径
LOG_FILE="/var/log/printer_monitor.log"
# 创建日志函数
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# 检查日志文件是否存在,不存在则创建
if [ ! -f "$LOG_FILE" ]; then
touch "$LOG_FILE"
log_message "日志文件已创建"
fi
log_message "打印机监控服务启动"
# 记录上一次设备状态
LAST_DEVICE_STATUS=0
while true; do
# 检查打印机设备文件是否存在
if [ -c "/dev/usb/lp0" ]; then
# 如果是设备首次出现(状态从不存在变为存在)
if [ "$LAST_DEVICE_STATUS" -eq 0 ]; then
log_message "检测到打印机设备连接"
# 重启cups容器
if docker restart cups >> "$LOG_FILE" 2>&1; then
log_message "cups容器重启成功"
else
log_message "cups容器重启失败"
fi
# 检查源文件是否存在
if [ -f "$PRINTER_DATA_FILE" ]; then
log_message "开始执行打印任务"
# 尝试执行打印命令
if cat "$PRINTER_DATA_FILE" > "/dev/usb/lp0" 2>> "$LOG_FILE"; then
log_message "打印任务执行成功"
else
log_message "打印任务执行失败"
fi
else
log_message "错误:源文件不存在 ($PRINTER_DATA_FILE)"
fi
# 更新设备状态
LAST_DEVICE_STATUS=1
fi
else
# 如果设备刚刚消失(状态从存在变为不存在)
if [ "$LAST_DEVICE_STATUS" -eq 1 ]; then
log_message "打印机设备已断开连接"
LAST_DEVICE_STATUS=0
fi
fi
# 等待指定的检查间隔时间
sleep $CHECK_INTERVAL
done
部署步骤:
将脚本和固件上传至NAS,并记录下实际位置(如
/vol3/1000/docker/cups/
)直接在飞牛系统里面双击编辑printer_monitor.sh脚本
创建systemd服务
/etc/systemd/system/printer_monitor.service
:ssh下直接
vim /etc/systemd/system/printer_monitor.service
[Unit]
Description=Printer monitoring service
After=network.target
[Service]
Type=simple
ExecStartPre=/bin/sleep 10
ExecStart=/vol3/1000/docker/cups/printer_monitor.sh
User=root
Restart=always
[Install]
WantedBy=multi-user.target
- 执行以下命令激活服务:
systemctl daemon-reload
systemctl enable printer_monitor
chmod +x /vol3/1000/docker/cups/printer_monitor.sh
遗留问题
目前仍存在网络打印机自动发现失效的情况,需通过以下方式手动添加:
- Android/iOS:通过IPP协议手动输入
http://NAS-IP:631/printers/HP_LaserJet_1020
- Windows/macOS:添加网络打印机时指定上述地址
评论0
暂时没有评论