前言
家里的打印机是惠普M1005 MFP这款非常经典的激光一体机,皮实耐造并且耗材非常便宜。而这台机器似乎确实已经老了,只支持USB有线连接使得其无法方便的与其他设备共享,最早是用USB连接到主力台式机上,用Windows自带的打印机共享将其分享给家里其他电脑,但这样做必须保证电脑开着,只能分享给其他Windows电脑,而不支持苹果和安卓设备,并且Windows的共享功能也不是非常稳定。于是我一直在寻找一个真正适合我的打印机共享方案:
- 多平台兼容:支持Windows、Linux、Android以及Apple AirPrint;
- 多功能:同时支持打印和扫描功能的共享;
- 低成本:学生党,便宜是必须的;
- 始终在线:不需要特意打开设备就可访问打印机,并且功耗要低;
- 高可玩性:支持功能扩展。
然后我尝试用我的树莓派成功搭建了打印和扫描共享,但这学期做毕设需要用到它,于是我看上了CM311-1a
这款电视盒子。它搭载Amlogic S905L3a这款SoC,大概是去年从某些渠道流出了大量全新库存机,可以刷入Armbian等操作系统,因此具有很多玩法。这款盒子只有百兆网口,不适合做软路由,所以价格也一直较低,但当做打印服务器是非常足够了。因此在咸鱼60块钱入手了这个盒子的2+8版本(之前这个价格能拿下2+16的,但8G容量刷Armbian也够了)。
硬件配置
- SoC:晶晨 S905L3a,四核Cortex-A53 @ 1.8GHz;
- RAM:2GB 32bit LPDDR4;
- ROM:8GB eMMC 5.1;
- 接口:HDMI 2.0 * 1、模拟音视频 * 1、USB 2.0 * 2、12V 1A电源输入 * 1。
设备上手
HDMI连上采集卡,插上网线,插电、开机,屏幕轻松点亮!
CM311系列作为运营商的IPTV盒子,原厂系统功能是极为受限的,咸鱼上的CM311系列大都由卖家破解好了,安装当贝桌面,买来可以当作普通的电视盒子使用。但我们很快就要干掉内置的安卓系统。
为了方便折腾,刷入Armbian、CoreELEC或者EmuELEC等第三方系统,卖家也安装好了外置启动和ADB开启入口。
这个机器内置了两个系统设置,一个是运营商版本的设置菜单,和各地IPTV或者有线的安卓盒子的设置项别无二致,密码是10086
;另一个是安卓系统的原生设置。
插上网线能够自动通过DHCP获取局域网IP。这时先不要在路由器绑定盒子的IP和MAC,进入Armbian后MAC地址会变成另一个。
刷入Armbian
所需材料
- CM311-1a一台
- 8G以上的U盘
- USB键盘
- 有线网络连接
- HDMI接口的显示设备
下载固件
首先下载适用于CM311-1a的Armbian固件:https://github.com/ophub/amlogic-s9xxx-armbian/tags
选择最新的,点进去应该有很多img.gz格式的镜像文件,如果没有就换另一个。
Jammy
版本采用Ubuntu 22.04 LTS底层,Bullseye
版本采用Debian 11底层,一般来说Ubuntu底层能用的软件包会更多,Debian底层的依赖关系会更精简,占用更低。这里我选的是Jammy
。
进入镜像列表,下载Armbian_23.02.0_amlogic_s905l3a_jammy_5.15.98
开头的文件。如果你的盒子是其他的SoC,则选择对应的就可以。这里还有6.1内核的镜像,但目前新内核在CM311-1a上还有很多bug,5.15内核会更稳定。
制作安装U盘
需要一个软件:BalenaEtcher
插入U盘,打开Etcher,加载镜像(不需要解压),然后点击Flash!
等待镜像写入完成即可。
注意:U盘里的所有数据将被清除。
U盘启动到Armbian
盒子开机,进入安卓系统,并插入U盘。卖家在我的机器上安装了外置启动
,打开这个应用并确认就能自动从U盘启动。
如果你的盒子没有这个选项,可以用开心电视助手
进行U盘引导。
稍等一会就能进入U盘上的Armbian系统。首先会提示创建你的root密码,这里可以直接 Ctrl + C 取消:
U盘系统的用户名默认为root
,密码为armbian
。
安装Armbian到eMMC
执行armbian-install
。
稍后会提示Start selecting device...
,需要选择正确的Device tree使硬件都能正常工作。这里输入305
并回车,即CM311-1a-YST
,而2+8版本CM311-1a-CH
与YST版本只是容量和代工厂不同,极少数安卓固件会有不兼容的问题,但Armbian这些基于GNU/Linux的固件是完美兼容的。之前的教程会建议选择304
,最新版本给CM311系列增加了单独的Device tree,兼容性会更好。
接下来会询问文件系统类型,可以选择ext4
或btrfs
,实际上在盒子上这两种文件系统的区别并不大,这里选择了ext4
,输入序号1并回车。
如果要放弃安装,这是最后的机会,这一步之后eMMC会被清空!
接下来安装脚本会刷入Armbian专用的bootloader,重新分区并写入新的系统文件。
看到绿色的SUCCESS
即代表安装成功,此时关掉电源,拔下U盘并重新打开电源以进入新的Armbian系统。
按下电源键会花屏几秒钟,然后开始跑码:
配置Armbian系统
上一节安装好了Armbian,接下来进行一些必要的安装后设置。
修改Root密码
系统默认用户名为root
,密码为armbian
。要改成自己的密码,在登录后执行
# passwd root
输入两遍新密码。
配置网络
Armbian默认同时开启了NetworkManager
和系统内置的/etc/network/interfaces
进行网络配置,这两个配置会起冲突,导致开机时卡在Raise network interfaces
,一分半之后会报FAILED
,非常影响开机速度。
解决方法也很简单,注释掉/etc/network/interfaces
里面所有设置项即可,然后让NetworkManager
管理系统网络连接,比较智能。
# nano /etc/network/interfaces
以下是文件的默认内容,这里需要把所有行都注释掉。
然后 Ctrl + O 再按回车保存, Ctrl + X 退出编辑器。
此时可以配置固定IP:运行一下ifconfig
,找到盒子在Armbian下的MAC地址(和安卓系统下面和机器底壳上的MAC不同),再到路由器后台绑定自己需要的IP。
重启一下盒子并登录,可以在欢迎页面看到盒子的IP地址,这时就可以拔下显示器和键盘,使用你喜欢的SSH终端访问盒子命令行了。
更改软件源
Armbian默认使用国外软件源,访问速度可能会很慢,因此建议更改为国内镜像源。
以下命令是将Armbian改为使用中科大软件源,比较稳定,如果希望使用其他软件源可参考更改。
# sed -i 's@//.*ports.ubuntu.com@//mirrors.ustc.edu.cn\/ubuntu-ports@g' /etc/apt/sources.list # Ubuntu底层
# sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list # Debian底层
# sed -i 's@//.*apt.armbian.com@//mirrors.ustc.edu.cn\/armbian@g' /etc/apt/sources.list.d/armbian.list
然后刷新软件源缓存,验证软件源更改是否成功:
# apt update
屏蔽内核更新
ophub版本的Armbian使用自定义的flippy内核,而系统默认会在执行apt upgrade
时替换成最新官方内核,导致无法引导,因此需要单独屏蔽内核相关软件包的更新,同时不影响其他软件和安全更新的安装。
# apt-mark hold armbian-config armbian-firmware linux-dtb-current-meson64 linux-image-current-meson64
# apt update && apt upgrade # 此时可以放心更新系统
配置打印共享
Armbian进行打印机共享,需要三个组件:
cups
:Common Unix Printing System,可以理解成系统管理打印机和打印任务的框架;avahi
:能让客户端发现打印机;hplip
:惠普打印机的驱动,其他品牌的打印机可能有它们自己的驱动。
安装cups
和avahi
# apt install cups cups-client cups-filters cups-ipp-utils cups-browsed colord
# systemctl enable cups
# systemctl start cups
# apt install avahi-daemon
# systemctl enable avahi-daemon
# systemctl start avahi-daemon
安装hplip
并配置打印机
# apt install hplip
打印机通过数据线连接到盒子,然后执行打印机配置:
# hp-setup -i
首先会询问连接类型,这里使用USB,直接回车,几秒钟后会检测到设备,记住hp:/usb/
开头的设备名:
然后会询问下载插件,直接回车即可:
许可协议,太长不看系列,输入y并回车以同意:
配置打印队列,里面的几个默认即可:
配置结束,建议打印测试页,当然是轻松打印成功了:
配置cups
cups
默认是禁止打印机共享的,我们需要更改一些设置。编辑配置文件:
# nano /etc/cups/cupsd.conf
使用 Ctrl + W 查找设置项并修改:
- `Browsing`改为`On`;
- `Listen localhost:631`改为`Port 631`;
- 搜索`Restrict access to the`,将以下两个代码块修改为:
# Restrict access to the server...
<Location />
Order allow,deny
Allow @LOCAL
</Location>
# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow @LOCAL
</Location>
- 最后一行加上`ServerAlias * Port 631 Listen /var/run/cups/cups.sock`
Ctrl + O 、回车、Ctrl + X 保存并退出;最后重启cups
:
# systemctl restart cups
接下来添加打印机到cups
:浏览器打开http://IP地址:631
,首先进入Administration
选项卡,再点击Add Printer
。
如果提示“需要升级”,则输入你的root用户名和密码:
选择Local Printers
里面有HPLIP
的一项,只有这个能够调用惠普驱动,点击Continue
继续:
这里设置打印机的名称等属性,保持默认即可,确保勾选了Share This Printer
:
最后一步,保持默认即可,点击Add Printer
完成打印机的添加。
回到Administration
选项卡,勾选这两个选项,并点击Change Settings
:
同样是在Administration
选项卡,选择Manage Printers - 打印机名称 - 第一行第二个下拉框 - Set Default Options
,然后将Media Size
设置成A4,否则在AirPrint下将无法按照A4尺寸打印。。
Windows端配置
浏览器打开http://IP地址:631
,首先进入Printers
选项卡,在Queue Name
一栏中找到打印机,右键选择复制链接。
以Windows 11系统为例,先安装好惠普的Windows端驱动(下载安装包或者从Windows Update获取),打开设置 - 蓝牙和其他设备 - 添加设备
,此时应该能搜索到打印机,但这个在Windows下是无法添加的,几秒钟后点击手动添加
:
选择按名称选择共享打印机
,粘贴刚才复制的链接,点击下一页
:
选择对应打印机型号的驱动,例如这里是HP LaserJet M1005 Class Driver
,点击确定
:
添加完成,根据需求可以勾选设置为默认打印机
,然后打印测试页:
这样就可以在Word、Chrome等应用下面访问打印机了,然后依次在其他电脑上添加打印机,经测试XP及以上版本都支持,2000系统虽然支持IPP协议但是无法连接到打印机。
iOS端配置
几乎不需要配置,只要与盒子连入同一个局域网,各个应用的打印选项内就可以找到共享的打印机。只是需要注意一下纸张大小,否则打印尺寸会很奇怪。
配置扫描共享
使用sane
(Scanner Access Now Easy) 进行扫描仪的共享。
安装sane
并编辑配置
# apt install sane sane-utils xsane sane-airscan
编辑配置文件:
# nano /etc/sane.d/saned.conf
增加或取消注释需要由saned
监听的网段,例如局域网网段为192.168.0.1/24:
#192.168.0.1
192.168.0.1/24
#[2001:db8:185e::42:12]
#[2001:db8:185e::42:12]/64
保存退出。
# nano /etc/sane.d/net.conf
加入一行localhost
。
启动sane
服务:
# systemctl enable saned.socket
# systemctl restart saned.socket
让sane
查找可用的扫描仪:
# scanimage -L
对于惠普一体机则是查找hpaio:/usb/
开头的设备,记下地址:
device `hpaio:/usb/HP_LaserJet_M1005?serial=KJ2NFMB' is a Hewlett-Packard HP_LaserJet_M1005 all-in-one
Windows端配置
需要一个软件:WiaSane,通过虚拟扫描仪设备,让基于WIA接口的应用(例如Windows传真与扫描)连接到sane
共享的扫描仪。接下来以Win7虚拟机为例,实际上其他版本也能完美支持。
安装时可能会提示驱动程序没有签名,选择始终安装此驱动程序软件
:
接下来开始配置扫描仪,首先重新插拔一下打印机(这样才能识别到),输入盒子的IP地址,端口保持默认的6566,点击下一步
:
在Available scanner devices
中选择hpaio:/usb/
开头的设备,用户名密码默认为空:
完成扫描仪的安装。
测试一下:
存在两个bug:无法调整纸张大小、调整亮度无作用,不过不是很影响使用。
参考资料
$ EOF.
咱家用的是惠普1020同款机芯的佳能2900,Linux下好像没有办法驱动佳能专有的CAPT (Canon Advanced Printing Technology) 打印接口,折腾了半天最后放弃了,换了台爱普生的墨仓式(
机芯一样驱动板不一样是吧(
其实现在新的打印机基本上都内置局域网功能,也就没必要折腾这个了(
Linux方案好评,咱想玩玩用路由器的OpenWrt方案,有建议嘛(
打印机是brotherMFC7360,这玩意插在HUB上电脑闪来闪去,有点担心兼容问题(
OpenWrt支持p910nd和cups,但是p910nd我记得好像只支持惠普还是佳能的机子来着,cups的话你必须有持久存储(比如overlay分区)才好用,并且编译固件的时候最好直接就带上,总体来说还是不如正常Linux来得方便