通过 Proxmox VE 上的 Debian Cloud 虚拟机与 CUPS 共享打印机
· 技术最近入手了一台兄弟的 HL-1118 黑白激光打印机。这台打印机仅支持有线连接,但不要紧、我有着 7x24 小时开机的「家里云」,所以我将打印机连接到了「家里云」主机、在 Proxmox VE 上将其直通到专门跑服务用的 Debian Cloud 虚拟机,并通过 CUPS 共享到局域网、让局域网的设备轻松使用这一台打印机打印资料。
基底的 Debian Cloud 变体再选择:genericcloud
与 generic
2 月 22 号,SukkaW 发布了 为 Proxmox VE 定制 Debian Cloud 系统镜像与创建虚拟机模板 这一篇文章。作为这篇文章发表后立马就注意到的 Proxmox VE 用户,我火速将原本使用了 Debian 完整镜像的虚拟机全部换成了 Debian Cloud——你知道的,Debian Cloud 少了很多根本在虚拟机中用不到的驱动和软件包,有着 Cloud-init 支持,从这两个方面看总要比为个人电脑安装 Debian 而设计的完整镜像 / Netinst ISO 要好很多。
但是,直到我这次想把打印机直通到 Debian Cloud 虚拟机、并通过 CUPS 共享到局域网,我才发现:SukkaW 在他的文章中使用了 Debian Cloud 的 genericcloud
变体定制镜像、并且细心地提到了「genericcloud
只包含 VirtIO 等虚拟机需要的驱动」,意味着 genericcloud
很可能识别不到 USB 设备。同时,两三个月前的我还没有入手打印机的考虑,也就一直没有注意到这个问题、直到这次才发现它识别不出我的打印机。
道理其实很简单:无论从哪一点来看,除非是使用 Proxmox VE, Hyper-V, VMware ESXi 这类虚拟化平台的用户创建虚拟机给自己使用,否则用户 根本没有可能 给虚拟机接入一个外置设备。但我偏偏为什么没注意呢.jpg
好在,SukkaW 在文中提到了另一个 Debian Cloud 变体:generic
。相较于 genericcloud
变体,generic
变体需要部署到裸金属物理机上、额外增加了一些驱动,也意味着它能正确识别 USB 设备。打印机入手的当日,我就把专门跑服务的虚拟机从 Debian Cloud genericcloud
搬到了 Debian Cloud generic
,可算是过了打印机识别这一关(
如果你也有相似的、需要将外置设备直通到虚拟机的需求,并且你正在考虑使用 Linux 发行版的 Cloud Image,那么我强烈推荐用于裸金属物理机部署的 Cloud Image 变体。由于各家对变体命名的方式不同,这里就不详细说明了。
直通 USB 打印机至虚拟机
由于我是 GUI lover,因此我的做法是:
- 在总侧边栏找到你要直通 USB 打印机的虚拟机;
- 在虚拟机设置的侧边栏找到「Hardware」,点击左上角的「Add」,选择「USB Device」;
- 选中「Use USB Vendor/Device ID」选项,随后选择列表中识别出的 USB 打印机;
- 点击「Add」,此时直通完成、虚拟机理论应识别到打印机。
Debian Cloud 附带的工具较少,包括 USB 设备相关的 usbutils
。你可以先安装 usbutils
,再使用它查看虚拟机是否已正确识别打印机:
sudo apt update && sudo apt install usbutils -y
lsusb
如果输出列表里出现了你的打印机的相关信息,证明直通无误。
设置 CUPS 服务器
CUPS 是一个 Unix-like System 的组合式打印系统,允许电脑作为打印服务器、接受进程并送到打印机,目前除了 macOS, iOS 和 iPadOS 之外的 CUPS 版本由 OpenPrinting 维护(创始人迈克尔·斯维特也在内)。由于我们的基底系统是 Linux,所以需要 CUPS 来让我们的虚拟机变成「打印服务器」。
首先安装 CUPS 相关软件包:
sudo apt install cups cups-bsd
注意:要在 Debian 上使用
lpr
命令必须要安装cups-bsd
,因为该命令隶属于这个包而不是cups
,具体原因是什么我也不太清楚。
安装后,编辑 /etc/cups/cupsd.conf
文件,找到下述代码并进行修改:
Listen 0.0.0.0:631 # 此处原本是 localhost:631,需要改成 0.0.0.0、监听所有请求
# 以下修改让我们有操作 Web 端的权限
<Location />
Order allow,deny
Allow all # 添加这一行
</Location>
<Location /admin>
Order allow,deny
Allow all # 添加这一行
</Location>
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow all # 添加这一行
</Location>
<Location /admin/log>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow all # 添加这一行
</Location>
保存并退出,使用 sudo systemctl restart cupsd
重启 CUPS 服务。
浏览器访问 https://[ip]:631,转到 Administration 页。由于我是家里使用,因此我将右侧的「Server Settings」选项全部勾上(包括 Kerberos 验证,这个看起来好像有用)。你可以根据自己的需要、衡量勾哪些选项。此时点击保存,CUPS 有很大几率要求你使用 HTTPS 访问管理页、并在稍后强制启用 HTTPS,当作无事发生、重复上述操作即可。
安装打印机驱动
此处以安装兄弟 HL-1118 驱动为例。
方便起见,我选择在兄弟的官方网站 下载 Linux 安装工具(Driver Install Tool)。注意要在电脑端提前下载好、并使用 SCP 传到虚拟机上,而不是用 wget
或 curl
。至少写这篇文章的时候,兄弟给他们的资源链接上了人机校验,不论是用 wget
还是 curl
都会被拦下。
下载下来的文件是一个 .gz
后缀的压缩包。可以先在电脑上解压缩、再将解压缩后的文件(没有任何后缀)上传到虚拟机。随后执行下述命令执行驱动安装:
sudo bash ./{文件名称}
该安装向导会询问你打印机型号(可在上述指令后跟一个型号,比如 sudo bash ./{文件名称} HL-1118
),随后安装相应的驱动软件(需要同意兄弟相关的许可协议,但解释一下为什么是 i386
啊喂!!),接着会询问你是否指定设备 URI(选是,并在接下来选最后一个 Auto 就行、它会自动选中 USB 打印机),最后询问你是否打印测试页(建议试试)。安装向导结束后,如果打印机成功吐出 Debian × CUPS 的打印测试页,证明打印机驱动安装完成。
兄弟的打印机驱动安装向导会同时帮你配置好 CUPS,这也是我为什么直接推了安装工具的链接给你、并且将打印机驱动放在了最后。不过,不同品牌的打印机的驱动安装方法都有所不同,建议是走一步看一步(
至此,你应该可以搜索到这台打印机,并使用它打印内容了。Cheers!