飞牛NAS系统搭建HP LaserJet 1020打印服务器(支持手机直连)
飞牛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):
CUPS管理界面点击【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_1020Windows/macOS:添加网络打印机时指定上述地址
---------------------------------上面问题已经解决,来更新一下---------------------------------
首先是不需要用到循环检测脚本,直接用USB设备触发脚本来运行就可以了!
1. 修改 udev 规则(适配 HP1020)
(1) 创建或修改 udev 规则文件
路径:
/etc/udev/rules.d/10-usb-hp1020.rules(推荐)
(文件名可以自定义,但建议以数字开头,如 10-)
内容调整为 HP1020 的 USB ID:
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2b17", RUN+="/vol3/1000/Docker/hp1020/hp1020.sh"
说明:
ATTRS{idVendor}=="03f0"(HP 的 USB 厂商 ID)
ATTRS{idProduct}=="2b17"(HP1020 的产品 ID)
RUN+="/vol1/1000/Docker/hp1020/hp1020.sh"(您的脚本路径,请确保存在)
(2) 设置正确权限
sudo chmod 644 /etc/udev/rules.d/10-usb-hp1020.rules
sudo chown root:root /etc/udev/rules.d/10-usb-hp1020.rules
(3) 重新加载 udev 规则
sudo udevadm control --reload-rules
sudo udevadm trigger
2. 修改脚本 hp1020.sh(适配 HP1020)
(1) 创建或修改脚本
路径:
/vol1/1000/Docker/hp1020/hp1020.sh
(确保路径正确)
脚本内容(HP1020 需要用 sihp1020.dl):
#!/bin/bash
logger "HP LaserJet 1020: Triggering firmware upload..."
sleep 3 # 等待 USB 设备初始化(3秒足够)
cat /vol1/1000/Docker/hp1020/sihp1020.dl > /dev/usb/lp0 # 上传 HP1020 固件
sleep 1
docker restart cups # 重启 CUPS 服务
logger "HP LaserJet 1020: Firmware uploaded and CUPS restarted."
⚠️ 注意:
固件文件名 必须是 sihp1020.dl(HP1020 专用,与 1008 的不同)。
设备节点 可能是 /dev/usb/lp0 或 /dev/usblp0,可以用 ls /dev/usb* 检查。
(2) 设置可执行权限
sudo chmod +x /vol1/1000/Docker/hp1020/hp1020.sh
3. 检查 USB 设备信息
找到 HP1020 的 USB ID
运行:
lsusb
输出应该包含类似:
Bus 001 Device 003: ID 03f0:2b17 Hewlett-Packard LaserJet 1020
03f0 是 idVendor
2b17`` 是 idProduct`
如果不同,需修改 udev 规则!
检查设备节点
插入打印机后,运行:
ls /dev/usb*
确认打印机挂载为 /dev/usb/lp0 或 /dev/usblp0(需在脚本中使用正确的路径)。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

不辣的啤特
校验提示文案
金刚鹦鹉
选择已识别的HP1020打印机型号 这一步usb打印机就识别不到
校验提示文案
值友1990071064
校验提示文案
值友8318976368
校验提示文案
cxd44
校验提示文案
随丰漂流
校验提示文案
灵魂深处的手
校验提示文案
成日卜嘢
校验提示文案
值友8318976368
校验提示文案
值友8318976368
校验提示文案
值友8318976368
校验提示文案
成日卜嘢
校验提示文案
灵魂深处的手
校验提示文案
cxd44
校验提示文案
不辣的啤特
校验提示文案
随丰漂流
校验提示文案
值友1990071064
校验提示文案
金刚鹦鹉
选择已识别的HP1020打印机型号 这一步usb打印机就识别不到
校验提示文案