飞牛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打印机就识别不到
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
选择已识别的HP1020打印机型号 这一步usb打印机就识别不到
校验提示文案