ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

银河麒麟V10上HP P1106驱动安装与CUPS配置全攻略

银河麒麟V10上HP P1106驱动安装与CUPS配置全攻略 1. 为什么银河麒麟V10装HP P1106总翻车HP P1106这台机器有点特殊。它属于惠普的主机型打印机Host-Based Printer也就是所谓的GDI打印机——打印机本身没有完整的页面描述语言解析能力页面渲染工作要靠电脑端的驱动来完成。这跟那些支持PCL、PostScript的中高端机型完全不是一个路子。带来的直接后果就是驱动装不对打印任务发出去要么石沉大海要么打出一堆乱码要么干脆卡在队列里一动不动。银河麒麟V10桌面版基于Linux内核打印子系统用的是CUPSCommon Unix Printing System。CUPS本身是个很成熟的架构但它的工作方式是调度器后端过滤器的组合任何一个环节缺东西都会导致打印失败。HP P1106在Linux下的驱动支持主要靠HPLIPHP Linux Imaging and Printing这个开源项目而HPLIP对P1106的支持又依赖一个叫foo2zjs的固件加载机制——因为P1106需要往打印机里上传一段固件才能正常工作。这就是为什么很多人插上USB线系统能识别到设备但就是打不出东西。我在实际处理这类问题时见过太多人卡在几个典型环节一是系统自带的打印管理器里能看到P1106选了默认驱动结果打印报错二是从惠普官网下了个Linux驱动包装完发现依赖缺失三是HPLIP装上了但版本太老不认识P1106的固件文件。这些问题的根子都在于没有理清CUPS→HPLIP→foo2zjs→固件这条链路。这篇文章面向的是需要在银河麒麟V10上把HP P1106跑起来的运维人员、信创环境适配工程师以及日常办公中遇到这个问题的普通用户。我会把整条链路的原理讲清楚然后给出经过实测的完整操作步骤包括在线和离线两种场景。你跟着做基本能一次搞定。提示银河麒麟V10有多个版本分支桌面版、服务器版、国防版等不同版本的软件源和预装包有差异。本文以桌面版V10 SP1为基准服务器版的操作逻辑一致只是图形界面部分需要换成命令行操作。2. 动手之前先把CUPS和HPLIP的关系捋顺2.1 CUPS在中间到底干了什么很多人以为装了驱动就能打印其实CUPS才是整个打印流程的总调度。当你点击打印时应用程序把文档交给CUPSCUPS根据打印机的PPD文件PostScript Printer Description决定用什么过滤器把文档转换成打印机认识的格式然后通过后端backend把数据送到USB口或者网络端口。对于HP P1106这种GDI打印机CUPS需要一条特定的过滤器链文档→foomatic-rip或hpcups→foo2zjs→USB后端。其中foo2zjs负责把光栅数据转换成P1106能理解的ZJS指令流同时还要负责加载固件。如果这条链上任何一个环节缺失CUPS的日志里就会出现Filter failed的错误。你可以用下面这个命令快速检查CUPS当前的状态和已配置的打印机# 查看CUPS服务状态 systemctl status cups # 列出当前已配置的打印机 lpstat -p -d # 查看打印队列中的任务 lpq -a如果systemctl status cups显示inactive或者failed那第一步就是先把CUPS服务拉起来sudo systemctl enable cups sudo systemctl start cups2.2 HPLIP和foo2zjs各自负责什么HPLIP是惠普官方维护的Linux打印驱动集合它提供了hpcups过滤器、hpijs过滤器以及一堆工具比如hp-setup、hp-plugin。对于P1106HPLIP的PPD文件里会指定使用hpcups过滤器而hpcups在处理P1106时会调用foo2zjs来完成ZJS编码和固件上传。foo2zjs是一个独立的开源项目专门处理ZJS系列打印机包括P1106、P1108、P1007等。它包含两个关键组件foo2zjs转换程序和foo2zjs-loadfw固件加载脚本。固件文件通常叫sihpP1106.img或者类似的名字需要放在/usr/share/foo2zjs/firmware/目录下。这里有个容易忽略的点银河麒麟V10的软件源里HPLIP和foo2zjs的版本可能不是最新的。如果HPLIP版本低于3.18可能不包含P1106的PPD如果foo2zjs版本太老可能缺少P1106的固件文件。所以装完之后要验证版本和文件是否存在。# 检查HPLIP版本 hp-check -t | head -20 # 检查foo2zjs是否安装 dpkg -l | grep foo2zjs # 检查固件文件是否存在 ls -la /usr/share/foo2zjs/firmware/ | grep -i p11062.3 银河麒麟V10的软件源特殊性银河麒麟V10用的是apt包管理基于Debian体系但它的软件源跟标准的Ubuntu或Debian不完全一样。有些包在官方源里有有些需要从麒麟的专用源获取。如果你直接apt install hplip装不上可能是源里没有或者版本不匹配。先确认你的系统架构和源配置# 查看系统架构 uname -m # 查看软件源配置 cat /etc/apt/sources.list银河麒麟V10桌面版通常是x86_64或aarch64ARM64架构。x86_64的包兼容性最好aarch64的包相对少一些但HPLIP和foo2zjs在麒麟的源里一般都有。如果源里确实没有可以考虑从Debian的对应架构源手动下载deb包安装但要注意依赖关系。注意不要随便往sources.list里加外部的Ubuntu源银河麒麟V10的底层库版本跟Ubuntu不一定兼容混用源可能导致系统包冲突。优先用麒麟自带的源实在没有再考虑手动下载deb包。3. 在线安装从零到打印的完整链路3.1 更新源并安装核心组件第一步永远是更新源索引确保你拿到的是最新的包信息sudo apt update然后安装HPLIP、foo2zjs和CUPS的相关组件。这里我建议一次性把可能用到的包都装上避免后面缺东西再回头补sudo apt install -y hplip hplip-gui printer-driver-foo2zjs foo2zjs cups cups-client cups-filters这几个包的分工是这样的包名作用hplipHP打印机核心驱动和工具hplip-gui图形化配置工具hp-setup、hp-toolboxprinter-driver-foo2zjsfoo2zjs驱动包Debian/Ubuntu体系叫这个名字foo2zjs部分源里单独提供的foo2zjs工具集cups打印服务核心cups-clientlp、lpstat等命令行工具cups-filtersCUPS过滤器集合包含foomatic-rip等装完之后验证一下关键文件# 确认hpcups过滤器存在 ls -la /usr/lib/cups/filter/hpcups # 确认foo2zjs转换程序存在 which foo2zjs # 确认P1106的PPD文件存在 find /usr/share/ppd -iname *p1106* 2/dev/null find /usr/share/cups/model -iname *p1106* 2/dev/null如果PPD文件找不到说明HPLIP版本可能不包含P1106的支持。这时候可以尝试从HPLIP官网下载最新的.run安装包或者手动下载PPD文件放到/usr/share/cups/model/目录下。3.2 用hp-setup图形化工具配置打印机HPLIP提供了一个图形化的配置工具hp-setup对于不熟悉命令行的用户来说比较友好。在终端里直接运行sudo hp-setup -i-i参数表示交互模式会在终端里一步步引导你选择连接方式USB/网络、选择打印机型号、下载固件如果需要。如果你有图形桌面也可以直接运行hp-setup不带参数会弹出图形界面。在交互模式下大致流程是选择连接类型USB系统扫描到HP P1106后选择它选择PPD文件通常选HP LaserJet Professional P1106对应的PPD如果需要固件hp-setup会提示你下载或指定固件文件路径这里有个坑hp-setup在下载固件时可能会因为网络问题失败。如果卡在固件下载这一步可以跳过后面手动处理固件。配置完成后用lpstat确认打印机已经添加lpstat -p -d你应该能看到类似这样的输出printer HP-P1106 is idle. enabled since ... system default destination: HP-P11063.3 手动添加打印机当hp-setup不灵时hp-setup有时候会因为权限问题或者USB识别问题失败。这时候可以用CUPS的命令行工具手动添加。先找到打印机的USB URI# 列出USB设备找到HP P1106的URI lpinfo -v | grep -i hp输出通常类似direct hp:/usb/HP_LaserJet_Professional_P1106?serial000000000Q80XXXX记下这个URI然后用lpadmin添加打印机# 添加打印机指定PPD文件 sudo lpadmin -p HP-P1106 -E -v hp:/usb/HP_LaserJet_Professional_P1106?serial你的序列号 -m drv:///hpcups.drv/hp-laserjet_professional_p1106.ppd # 设置默认打印机 sudo lpadmin -d HP-P1106 # 启用并接受打印任务 sudo cupsenable HP-P1106 sudo cupsaccept HP-P1106如果drv:///hpcups.drv/...这个PPD路径不对可以用lpinfo -m | grep -i p1106查找正确的PPD名称。3.4 固件加载P1106能不能打印的关键一步P1106每次断电后固件都会丢失需要在每次打印前重新上传。foo2zjs提供了一个foo2zjs-loadfw脚本来处理这件事但CUPS在调用过滤器时会自动触发固件加载。前提是固件文件必须在正确的位置。检查固件文件ls -la /usr/share/foo2zjs/firmware/如果里面没有sihpP1106.img或类似文件需要手动获取。foo2zjs的源码包里包含了这些固件文件可以从项目的源码仓库下载。拿到固件文件后复制到固件目录sudo cp sihpP1106.img /usr/share/foo2zjs/firmware/ sudo chmod 644 /usr/share/foo2zjs/firmware/sihpP1106.img然后手动测试固件加载sudo foo2zjs-loadfw all /usr/share/foo2zjs/firmware/sihpP1106.img如果这条命令没有报错说明固件加载成功。接下来可以打一张测试页验证# 打印测试页 lp -d HP-P1106 /usr/share/cups/data/testprint3.5 验证打印并排查常见报错打印测试页后观察打印机是否有反应。如果没反应按以下顺序排查# 查看CUPS错误日志 sudo tail -50 /var/log/cups/error_log # 查看打印队列状态 lpq -P HP-P1106 # 查看最近的打印任务 lpstat -W completed -o常见的错误和对应原因错误信息原因解决方向Filter failed过滤器链断裂检查foo2zjs和hpcups是否安装No such file or directory固件文件缺失手动放置固件文件Permission denied权限问题检查/usr/lib/cups/filter/权限Printer not respondingUSB通信问题换USB口或检查线缆我在实际排查中发现大部分Filter failed都是因为/usr/lib/cups/filter/foo2zjs这个文件不存在或者没有执行权限。可以用以下命令修复sudo chmod 755 /usr/lib/cups/filter/foo2zjs sudo chmod 755 /usr/lib/cups/filter/hpcups4. 离线环境怎么办无网络下的驱动部署4.1 离线包的准备思路信创环境里很多机器是不连外网的这时候就需要提前在有网的机器上把依赖包下载好然后拷贝到目标机器上安装。核心思路是用apt-get download把deb包及其依赖全部下载下来形成一个本地仓库。在有网的银河麒麟V10机器上架构要和目标机器一致执行# 创建存放目录 mkdir -p ~/offline-packages cd ~/offline-packages # 下载hplip及其依赖 apt-get download hplip hplip-gui printer-driver-foo2zjs foo2zjs cups cups-client cups-filters # 下载依赖用apt-rdepends递归获取 sudo apt install -y apt-rdepends apt-rdepends hplip printer-driver-foo2zjs cups-filters | grep -v ^ | sort -u | xargs -I{} apt-get download {} 2/dev/null这样会把所有相关的deb包下载到当前目录。然后把整个目录打包拷贝到目标机器tar czvf offline-packages.tar.gz ~/offline-packages4.2 在目标机器上建立本地源并安装把包拷贝到目标机器后解压并建立本地apt源# 解压 tar xzvf offline-packages.tar.gz -C /tmp/ # 创建本地源目录 sudo mkdir -p /opt/local-repo sudo cp /tmp/offline-packages/*.deb /opt/local-repo/ # 生成Packages索引 cd /opt/local-repo sudo dpkg-scanpackages . /dev/null | gzip -9c Packages.gz然后把本地源加到sources.list里echo deb [trustedyes] file:///opt/local-repo ./ | sudo tee /etc/apt/sources.list.d/local-repo.list sudo apt update接下来就可以像在线一样安装了sudo apt install -y hplip printer-driver-foo2zjs cups cups-filters4.3 固件文件的离线处理固件文件不在deb包里需要单独处理。你可以在有网的机器上从foo2zjs的源码仓库下载固件文件或者从已经配置好的机器上直接拷贝/usr/share/foo2zjs/firmware/目录下的所有文件。# 在有网的机器上打包固件 tar czvf foo2zjs-firmware.tar.gz /usr/share/foo2zjs/firmware/ # 在目标机器上解压 sudo tar xzvf foo2zjs-firmware.tar.gz -C /确保固件文件的权限正确sudo chmod 644 /usr/share/foo2zjs/firmware/*4.4 离线环境下的PPD文件处理PPD文件通常在HPLIP的deb包里但如果你用的HPLIP版本不包含P1106的PPD就需要手动准备。可以从HPLIP官网下载PPD文件或者从其他已经配置好的机器上拷贝。PPD文件一般放在两个位置/usr/share/ppd/HP/— HPLIP的PPD存放目录/usr/share/cups/model/— CUPS的模型目录把PPD文件放到这两个目录中的任意一个CUPS就能识别到。然后手动添加打印机时指定这个PPDsudo lpadmin -p HP-P1106 -E -v hp:/usb/HP_LaserJet_Professional_P1106?serialxxx -P /usr/share/ppd/HP/hp-laserjet_professional_p1106.ppd5. 那些文档里不会写的踩坑记录5.1 USB权限问题导致打印机时好时坏银河麒麟V10默认的USB设备权限规则可能不允许普通用户直接访问打印机。表现就是用root账户能打印普通用户不行或者重启后打印机突然找不到了。解决办法是添加一个udev规则让USB打印机设备对lp用户组可访问# 创建udev规则文件 sudo tee /etc/udev/rules.d/99-hp-printer.rules EOF SUBSYSTEMusb, ATTRS{idVendor}03f0, MODE0664, GROUPlp EOF # 重新加载udev规则 sudo udevadm control --reload-rules sudo udevadm trigger03f0是惠普的USB厂商ID。这个规则会让所有惠普USB设备对lp用户组可读写。然后把你的用户加到lp组sudo usermod -aG lp $USER改完之后需要重新登录才能生效。5.2 打印队列卡死后的清理方法有时候打印任务发出去后卡住了后续任务全部堵在队列里。这时候需要先取消所有任务再重启CUPS# 取消指定打印机的所有任务 cancel -a HP-P1106 # 如果cancel不生效直接清理队列文件 sudo systemctl stop cups sudo rm -rf /var/spool/cups/* sudo systemctl start cups注意/var/spool/cups/目录下有一些CUPS的配置文件比如cups-files.conf不要全删只删c00001这类任务文件。更安全的做法是sudo find /var/spool/cups/ -name c[0-9]* -delete5.3 固件每次都要重新加载的问题P1106的设计就是断电丢固件这是硬件层面的限制没法绕过。但你可以通过配置让CUPS在每次打印前自动加载固件。foo2zjs的CUPS过滤器默认就会做这件事前提是固件文件路径正确。如果你发现每次重启后第一张打印总是失败第二张才成功那说明固件加载有延迟。可以在PPD文件里调整Foo2zjsLoadFW参数或者在/etc/cups/ppd/HP-P1106.ppd里确认以下行存在*cupsFilter: application/vnd.cups-raster 0 foo2zjs这行确保CUPS使用foo2zjs作为过滤器而foo2zjs会自动处理固件加载。5.4 银河麒麟V10 SP1的CUPS版本兼容性银河麒麟V10 SP1自带的CUPS版本可能是2.2.x或2.3.x这两个版本对foo2zjs的兼容性都还可以。但如果你从外部源装了更高版本的CUPS比如2.4.x可能会遇到过滤器接口变化的问题。检查CUPS版本cups-config --version如果版本高于2.3且打印时报Filter failed可以尝试降级CUPS到系统自带的版本sudo apt install --reinstall cups系统源里的版本号用apt-cache policy cups可以查看可用版本。5.5 hp-setup插件下载失败的替代方案HPLIP的某些功能需要下载一个专有插件hp-plugin这个插件在离线环境或者网络受限的环境下经常下载失败。对于P1106来说其实不需要这个插件——P1106用的是foo2zjs的固件机制跟hp-plugin无关。所以如果hp-setup卡在插件下载这一步直接跳过手动配置打印机即可。6. 让P1106在麒麟V10上稳定跑起来的几个习惯6.1 固定USB端口和URIUSB设备在Linux下的设备节点比如/dev/usb/lp0可能会因为插拔顺序变化而改变。如果你用的是hp:/usb/...这种URICUPS会通过序列号来识别设备相对稳定。但如果用的是usb://HP/...这种URI可能会因为设备节点变化而失效。建议在添加打印机时使用带序列号的URIlpinfo -v | grep -i p1106从输出中复制完整的hp:/usb/...?serialxxx作为URI。6.2 定期检查CUPS日志CUPS的日志文件/var/log/cups/error_log是排查问题的第一手资料。建议在打印出问题时第一时间看日志sudo tail -100 /var/log/cups/error_log日志里会显示每个打印任务的完整处理流程包括用了哪个过滤器、固件加载是否成功、USB通信是否正常。看懂这个日志大部分问题都能自己解决。6.3 备份可用的配置一旦打印机配置成功建议把关键配置文件备份下来# 备份PPD文件 sudo cp /etc/cups/ppd/HP-P1106.ppd ~/backup/ # 备份打印机配置 sudo cp /etc/cups/printers.conf ~/backup/ # 备份固件文件 sudo cp -r /usr/share/foo2zjs/firmware/ ~/backup/这样下次重装系统或者换机器时直接把这些文件拷回去能省很多事。6.4 关于打印质量的调整P1106支持的分辨率是600x600dpi和1200x600dpi。在CUPS的PPD文件里可以调整默认分辨率。如果你觉得打印出来的文字不够清晰可以修改PPD里的Resolution参数*DefaultResolution: 1200x600dpi或者在打印时通过命令行指定lp -d HP-P1106 -o Resolution1200x600dpi 文件名不过要注意1200x600dpi模式下打印速度会慢一些而且对固件加载的稳定性要求更高。如果经常出现打印中断建议还是用600x600dpi。6.5 多用户环境下的权限管理如果这台机器有多个用户需要打印确保所有用户都在lp组里并且CUPS的配置允许所有用户提交打印任务。检查/etc/cups/cupsd.conf里的Location /段Location / Order allow,deny Allow LOCAL /LocationAllow LOCAL表示允许本地所有用户访问。如果这里配置的是Allow localhost那只有本机通过localhost访问才行USB打印不受影响但网络打印会受限。我在多个信创项目里部署P1106的经验是只要把HPLIP、foo2zjs、固件文件这三样东西准备齐CUPS配置正确P1106在银河麒麟V10上的表现是相当稳定的。它不像某些国产打印机那样需要额外的闭源驱动整个链路都是开源的可控性强。唯一需要接受的就是每次断电后首次打印会有一个短暂的固件加载过程大概多等两三秒习惯了就好。
返回列表