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