近期尝试给服务器做外接硬盘的数据传输,期间各个方案依次撞墙,让我想起了几年来与硬件打交道的种种挫折。
多硬盘接入
此次的需求是给一台服务器外接若干硬盘,把数据从外接SSD硬盘送入服务器后拔掉硬盘,换下一个。每天需要接入的硬盘数量和数据量都比较大。所以很容易就撞上各种瓶颈。早期的实现方案是用USB-SATA转换器,但随着接的硬盘越来越多,很快供电就开始出问题,导致硬盘连接变得不稳定。SSD虽然耗电量比机械硬盘要低,但也是有5-10W的功耗。于是紧急的处理方法就是买了一堆12V电源,给USB-SATA转接器接上外部供电。这一点对很多软件工程师来说还可以接受,但很多人不知道的是,5.5mm的电源接口有两种规格,内部的针直径有2.1mm和2.5mm两种。用2.5mm的插头接入2.1mm的插座就会松夸,轻轻碰一下就会断电。而用2.1mm的插头则根本无法接入2.5mm的插座。
随后我开始换用机架服务器的方案,需要设计如何把SSD硬盘接入机架服务器。这个机架服务器的前面板有12个3.5寸SATA硬盘的槽位。于是最直观的想法就是使用其中的4个槽位来接入外部的SSD,反正SATA是支持热插拔的,这样传输带宽还更快。但现实很快挡住了去路。把SSD硬盘热插拔接入这些槽位时,Linux里没有出现新设备,dmesg里无新信息。最终只能基本判断,是前面板这些硬盘槽位的RAID卡挡住了热插拔的去路。所以,SATA有热插拔的能力,但必须要进行确认,中途是可能被RAID卡挡住的。对一些台式机来说,也可能在BIOS里把SATA热插拔禁用了。
在服务器机箱里找其他机会时,发现了一个宽度只有10mm左右的插口,运维确认是SAS硬盘接口。又让我燃起了希望。问题是,SAS接口接入SATA硬盘的方案。靠谱的方法是买硬盘背板,多个SATA硬盘接入背板后,外面一根SAS接入到主板。正当我从另一台服务器上拆硬盘背板打算来做试验时,发现了那个背板上需要一个巨大的电源插口,跟ATX电源接主板那种很宽的插头很像。但服务器上并没有提供第二个插口。这意味着我可以把SAS信号线接入到主板,但主板却没法给硬盘背板供电。而想要给这玩意供电,意味着还要搞一套很高的ATX电源,机柜里根本放不下。于是该方案因为需要外接ATX电源而放弃,虽然不是完全不可用,但优先级已经很低了。
接着我把目光转向了PCIE接口。服务器里有2个PCIE3.0x8的插槽。基于这个插槽有两种方案。一个是买PCIE-SATA转接卡,可以用一个PCIE插槽扩充出来最多24个SATA口。我之前就考虑过此方案,把转接卡接入,发现转接卡是半高的,正好可以放入主板。但坑人的是,转接卡上部的16个SATA口却被机箱顶部挡住了。使得转接卡不被挡住的SATA口只剩下了4个。于是PCIE-SATA方案,卒。使用PCIE延长线将PCIE-SATA转接卡横着放,或引入机箱外部也是个办法。但同样无法解决硬盘供电问题,搞个ATX电源同样让人抓狂。
另一个基于PCIE的方案是PCIE-USB3.0。如果能引出8个USB3.0接口也是不错的。正当我选型时,发现PCIE-USB转接卡需要接入一个SATA电源来方便给外部USB供电。而服务器里根本没有多余的电源接口,一个多余的SATA电源都都没有。而且,外接硬盘的供电也是同样的难题。
继续寻找,主板上有两个SATA口,看标注是给DOM盘用的,但却同样受限于主板上根本就没有提供额外的电源。直到我在SATA口的旁边看到了给DOM盘供电的焊盘,注意是焊盘,不是接插件。我对于电烙铁的使用是很熟悉的,但直接在主板上焊线头还是有些夸张了。
所以最后呢,打算买5盘位的USB硬盘盒,用外接的小电源,只占用插座空间,不占用机柜空间。这个方案还要祭天才能开始测试,希望顺利吧。
模拟视频采集
这些抓狂的精力,与我几年前开发DVR时的痛苦何其的相似,激起了痛苦的回忆。2013年时,公司需要个DVR,硬盘录像机,负责把外部的多路模拟视频信号录制进取,完整mp4的打包后上传给服务器。希望一台机器可以录制4路视频,分辨率压缩到352x288,1fps,每路视频也都要带音频。
我最直观的想法是,买个树莓派,以及USB视频采集卡。通过USB-HUB来接4个采集卡,树莓派里用ffmpeg来定制采集参数和视频压缩打包。最后上传就更简单了。
坎坷从USB采集卡开始。市面上的采集卡我买了20多种。绝大部分采集卡是Windows专用,Linux下根本就没有驱动。于是,大部分买来的采集卡成了废品,堆在一边。这其中唯一一种有Linux驱动的,我费尽艰辛,编译内核把驱动弄进去了。又要研究v4l2驱动来定制采集参数,减低缓存帧数等等。等到我看到采集的第一帧画面时,已经过去了两个月。
下一步是采集4路?想多了。当我试验把2路采集卡,不经过USB-HUB接入树莓派时,树莓派一声不吭的就灭了。遭遇了供电问题。给系统升级了5V4A的电源。开机后继续做采集测试,结果第二个采集卡死活没法开启。而且第一个采集卡的工作也很不稳定。经过朋友的帮助,才知道,树莓派第一代上的多个USB口底层是有USB-HUB的,而这个HUB芯片有问题,导致了USB bulk通信的不稳定。树莓派上位机方案,卒。
赶紧寻找其他嵌入式Linux方案,目光转向了Cubieboard 1。又是一路刷系统,编译驱动,见第一帧画面。等到接入第二个采集卡时,依旧持续报错不让开启。最后确认了,是USB带宽问题。USB2.0带宽480Mbps,而一路采集卡就需要占用超过一半带宽,所以USB控制器就不允许同时开启两个视频采集设备。多路采集卡方案,卒。
下一步如何呢,想到我的电子设计水平可以达到入门级,于是去找模拟开关。打算用Cubieboard 1的GPIO,控制CD4052/74HC4052,使得4路输入视频可以用时分复用的方式进入1个采集卡,反正每一路视频我只需要1fps。就按切换时间最不靠谱的情况,2帧里拿到1帧靠谱的画面也行。等到设计完视频切换电路,板子焊接好接入试验。现实再次是一堵墙。视频采集卡的输入视频在切换输入信号时,并不会重新同步行、场、帧。导致新的画面一片乱。想要看到新的画面,只能关闭视频采集开再重新打开,这样就会触发重新的视频采集同步动作。然后我发现了,基于v4l2的一次关闭和打开需要0.6-0.7秒。这样下来1秒无论如何也无法采集到第2路的画面。
接下来,我甚至考虑过买高速ADC,自己软件解码模拟视频。或者用FPGA来完成采集到信号识别行、场、帧,并把缓存完的帧送入上位机。基于STM32的DCMI来抓取视频,并用USB-HS送入上位机等。但这些都没有继续下来,我就辞职了……
也许的解决办法
跟硬件打交道,总是会出现一大堆的不可预料障碍,很多障碍甚至是无法逾越,只能废掉方案。
所以靠谱的思路是,一开始就不能对任何方案有过高的期望。而应该一开始就尽可能的多列出一些方案。试验的时候,各个方案在经费允许的情况下,并行的采购零配件。三五个方案因为某些限制被废掉都是正常的,万不可对一个方案过于死心眼坚持。很多障碍在做试验之前根本无法预料,比如上面的SATA口被机箱挡住,树莓派自带的USB-HUB芯片有问题等等。
最后祝大家的项目顺利吧。