更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)

以前WD MyCloud被捣鼓坏掉了,都是参考拯救死翘翘了的 WD MyCloud来处理的,但是这种处理方式需要拆机,非常的费力。最近看到有人发布了可以不拆机的方式修复的方法。研究了一下,非常可行,推荐使用这种方法。

下面的这些操作都是WD论坛上的一些达人通过分析WD MyCloud的源代码得到的,没有非公开的黑科技,都是一些明确公布的内容。

原理大致讲一下,在WD MyCloud主板上有一块Flash闪存,闪存里面是已经写入的bareboxWD MyCloud启动的时候会把barebox从闪存载入到内存中,并且启动barebox,而barebox启动后,会等待5S的时间,检测是否有人向自己的网卡发送内容为WD-ICMP-BEACONWD-ICMP-BEACONWD-ICMP-BEACONWD-ICMP-ICMP报文(本质就是PING),一旦检测到这个报文,就会连接这个报文的发送方的69号端口(TFTP服务器端口),获取一个名为startup.sh的脚本,并且下载完成后,执行这个脚本。因此我们就可以在这个脚本中拉取一个自己编译好的内核,然后运行这个内核,达到修改系统的目的。

对于使用Ubuntu 16.10以及之后的版本(ubuntu 17.10),可能需要调整一下网卡的命名方式,把网卡命名方式调整为以前Linux版本的命名方式,否则可能导致无法后面的dhcp服务无法绑定网卡。具体的操作如下:

列出当前机器上的网卡,为我们的后续操作指定网卡提供信息

注意上面的有线网卡的名称"eth0",后面我们的DHCP服务需要用到这个参数。

配置DHCP服务绑定的网卡,我们需要有线网卡

指定DHCP服务可以分配的IP地址段

去掉如下部分的注释,我们需要bootp的功能

并且配置IP只能在192.168.0.x这个地址段内分配,其他地址段不能触发主板上的TFTP客户端从目标主机下载,这个是主板固件的限制。

必须手工配置有线网卡的IP地址,否则无法激活网卡进行数据的传输

重启DHCP服务,使得配置生效

注意,上面的配置只是激活了DHCP分配IP的功能,并不能让设备通过我们的电脑代理上网,也不能让我们的设备在修复后与电脑进行数据通信,只是修复系统时候使用的。设备修复完成后,需要插到路由器上才能验证是否成功。为了保证后面方便调试,这里强烈建议参考打开代理上网功能,参考ubuntu 14.04/ubuntu 17.10做主机双网卡共享上网(NAT)进行相关设置。

安装tftp服务端,我们的电脑作为服务端为WD MyCloud提供文件下载服务。

下载编译脚本代码,并构建激活WD MyCloud主板下载启动脚本的应用

如果上面的代码下载不成功。可以从本站下载一份代码拷贝

如果WD MyCloud的源代码下载不成功,可从本站下载一份拷贝。点击这里下载
如果busybox-1.23.2的源代码不能下载,可从本站下载一份代码拷贝。点击这里下载

编译完成后,把需要的文件拷贝到TFTP服务器目录

准备激活WD MyCloud的脚本下载功能。

WD MyCloud外壳底部的贴纸中找到MAC Address信息,类似"00:99:88:xx:xx:xx"的一串数字,下面的操作我们会用到。

上面的准备动作完成后,直接用网线连接电脑跟WD MyCloud连接,先不要通电,然后打开一个Shell,执行

然后不再理会这个Shell,并给WD MyCloud通电。

可能我们需要多次断电才能激活WD MyCloud的下载逻辑,目前测试发现,很多时候,尽管发送了激活报文,但是没有TFTP的下载逻辑,多次尝试就可以了。极端情况下,我要重复断电接近十次才能激活下载,目前的做法是:在Linux主机上打开WireShark然后过滤协议TFTP,如果上电30S之内没有看到TFTP协议,那么断电重试

然后不断调用

直到列表中出现这个"00:99:88:xx:xx:xx"地址的设备获取到了IP

最后,通过

可以获得一个可以操作的Shell,用来执行修复。

通过如下链接增加parted-3.0/parted-2.3mdadm-3.2.6
注意,由于镜像大小的限制(不可超过9MB),我们不可能把这些软件全部放进镜像,因此,这些软件可以独立编译,然后在系统启动后通过TFTPPC上拉取获得)

WD MyCloud编译的busybox-1.23.2中增加parted-3.0/parted-2.3
WD MyCloud编译的busybox-1.23.2中增加mdadm-3.2.6(独立编译uClibc版本)
WD MyCloud编译的busybox-1.23.2中增加e2fsprogs-1.43.7

多次操作后需要重新编译内核

如果官网下载固件有问题,可以从本站下载一份拷贝。点击这里下载sq-040500-315-20170331

重新完整创建磁盘分区(参考/etc/nas/config/disk-param.conf)

补充信息

主板焊接串口(3.3V)接线图

已知,WDMyCloud Gen1版本的网卡跟Linksys WRT1900AC V1版本的路由器不兼容,网线插上后,无法获取到IP地址。

参考链接


发布者

《更优雅的(不拆硬盘)拯救死翘翘了的WD MyCloud(Ubuntu 17.10)》上有36条评论

  1. 现在我有个问题,设置完以后,显示eth0是未托管状态。然后一直都无法连接,但是Windows下的Recovery是可以连上的,也能变绿灯,就是俄罗斯大神的镜像不知道为什么一直无法挂载sd5,所以我才想到这个教程,这个教程可以自定义恢复镜像。但是很奇怪,虚拟机里就无法Telent。宿主是Windows 10。我想我的虚拟机设置应该有问题,有关于虚拟机设置的教程么?

      1. 哦,这个我倒是知道,我极少用NAT,一般我都是桥接,连链路状态都不带。路由器里识别虚拟机为完全独立的客户端。但是现在我在宿主机上一下就通了,在虚拟机里等了十多分钟了,重启也有五六次了,每次等至少十分钟,就是不通...有没有单独的制作Recovery镜像的教程,实在不行我做好镜像拿出来上传。或者你知道俄罗斯大神的Recovery镜像上传后为什么无法挂载sda4。

          1. 一般建议直连设备,原因在于设备上电之后,交换的数据极少,甚至没有数据交换,导致交换机也不知道报文应该如何中转,因此会造成额外的丢包,尤其是一些高级功能的交换机,有时反倒不如一些傻瓜交换机好用。

        1. 他制作的镜像代码偏古老,MyCloud系统升级后,一部分格式有更改,导致他的镜像有时候连启动都会失败的,因此建议是自己编译镜像。

          1. 谢谢指导,我现在重新安装了一下虚拟机。把网线直接插在了宿主计算机上。使用了一个USB WLAN网卡。这样环境应该就跟教程里一样了,我会从头再来一次。

  2. 您好!
    我在操作到telnet的时候无法连接了。
    在宿主机上获取到的都是192.168.0.4。但是在这里是192.168.0.101。这正常么?而且telnet连不上。
    telnet: Unable to connect to remote host: No route to host

    1. 设备的IP会变的,不一定是192.168.0.4了,另外这个地址是设备发送原始的DHCP请求给你的PC,然后你的PC分配给设备的,用WireShark抓包看一下哪个地址在请求数据

    2. 如果严格按照我给出的配置,没有修改过的话,设备应该拿到192.168.0.100-192.168.0.110之间的一个地址才对

      1. 对的,就是这样子的,有TFTP包抓到。但是设备没有亮绿灯。telnet 192.168.0.x 这一步的时候也连不上去。请问是不是要先做下面的?还是说这一步的时候应该连上去才对?

        1. TFTP包收到,说明已经在加载了,你可以从WireShark中看到TFTP传输结束,传输是需要时间的,估计几十秒是要的,当传输结束之后,差不多需要10-20S的时间,设备会运行起来,如果你没有关闭rawping窗口的话,应该会周期性的看到网卡等闪闪,差不多每秒闪烁一次的样子。如果你开着wireshark的话,应该会看到DHCP REQUEST报文,并且PC必须响应了DHCP OFFER,从DHCP OFFER中应该能看到分配的IP地址。

          如果设备长时间不请求DHCP,请检查一下是不是写错了启动脚本,就是那个startup.sh,如果没有,请检查镜像是不是超过9MB了,如果超过,就启动不起来。

          1. 那个脚本存在,看了下内容,看不懂。但是复制过来的应该跟源目录是一个东西。我再看一下DHCP响应。镜像大小符合限制。这个跟俄罗斯大神的那个应该是一样的吧,都是要变绿灯的吧。我的一直没变过绿灯......囧

          2. 不要看灯,灯永远不会变绿灯的,因为代码里没有设置灯的部分,这部分被丢弃了,只有正式的系统才会管灯。 你只要能telnet登录进去即可。整个启动过程非常快,因为不涉及到硬盘操作,只要TFTP拉取镜像完成,初始化过程不会超过20S

          3. 已经核对,LED控制部分应该是内嵌在主板上的,我把里面的镜像拿出来后用俄罗斯大神的脚本上传上去了,一直黄灯,根据WD的手册,黄灯是软件故障。所以基本确认镜像有问题。脚本核对过了,没什么问题,现在唯一的问题就是镜像。要是红灯就是硬盘坏了,基本没救了......囧

          4. 那个灯的颜色控制,我记得是写在系统的启动脚本里面的,仅仅是发送了一个颜色命令而已,没有其他功能,只有系统完整的情况下,才有参考意义,如果是系统恢复,这个指示灯没有任何意义。

          5. 参照俄罗斯大神的那个脚本,黄灯10S左右,然后就会变蓝灯,之后就可以telent了,脚本我打开看了下,没有发现LED控制代码,可能是我看不懂吧。

          6. 套路就是这些,没有更深的东西了,你只要尝试自己编译内核,基本上就可以为所欲为了

  3. 我现在用俄罗斯大神的镜像进入telent了,请问有什么教程可以把那些工具独立编译完成?上传方法已掌握。那些工具对镜像版本的依赖性强么?

    1. 纯静态编译,只依赖内核,但是由于没有libc的支持,很多应用实际上是没办法编译运行的,因此才会有自己编译的镜像。

        1. 另外需要反复确认startup.sh这个脚本,我记得我们编译的跟俄罗斯的那个版本的启动地址是有差异的,两个脚本是不能通用的。

    2. 我有个想法,因为那个镜像一直无法挂载磁盘,但是可以识别磁盘,所以我想用那个镜像引导至telent环境,然后把独立工具上传,试了下,可用空间大约150-160MB的样子,应该能载入不少工具了

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注