这篇内容应该于去年搬家后发出,但是不曾想一直忙碌,所以文档一直安静的躺在草稿箱。

这款产品有一个比较有意思的地方,使用规格不高的硬件提供了不错的应用服务,但是使用了一些特殊的方法,限制了用户自行改造硬盘容量,网上也有不少网友针对这款产品进行了研究和实践。

恰逢最近在折腾硬件,整理发出,方便后续计划折腾的同学,也算是对之前的折腾有个交代。

写在前面

我在 2013 / 2014 年分别入手了两台 WD MyCloud ,恰好是第一代(Gen1)和第二代(Gen2),这两代硬件规格如下:

  • WD MyCloud Gen1
    • CPU: Mindspeed Comcerto C2200 (2x800MHz)
    • RAM: 256 MB DDR3
    • Nand: 1MB (Barebox)
  • WD MyCloud Gen2
    • CPU: Marvell Armada 375 (2x1.0 GHz)
    • RAM: 512 MB DDR3
    • Nand: 1MB (U-Boot)

从规格可以看出第二代属于“加量不加价”,规格明显高了一档,可玩性也自然高出一头。

WD MyCloud 两代外观基本一致

这款产品虽然看起来简简单单,就是一个网络硬盘盒,但是实际上它并不能做到换盘如换衣服一样简单。

原因在于它将实际运行系统安装到了用户使用的“数据硬盘”中,并设计了一套看似安全的分区模式,如果更换磁盘未和原磁盘分区和引导文件保持一致,则会“红灯常亮”提示用户“产品已变砖头”。

本文主要介绍 Gen2 的折腾记录,Gen1 限于篇幅和折腾意义,略,至于它的刷机也很简单,网上找到对应容量版本的固件,直接使用 dd 命令写盘即可。

就决定拆你了,WD MyCloud

如何刷机:修复“砖头”

相信许多用户和我一样,在购买 WD 产品后不久便会使用“杀机取盘”的方法,将磁盘移动至更合适的设备中使用。这台机器也是如此,所以在换用其他磁盘后,自然机器变成了砖头,无法继续使用,所以第一步便是将设备救活。(unbirck/debrick)

WD MyCloud Gen1/2 拆解

救砖第一步:准备替换磁盘

首先访问官方产品支持中心下载一会儿要刷入的官方固件:这里固件版本无所谓,我选择 2019 年末更新的 2.x 版本。

https://downloads.wdc.com/nas/My_Cloud_GLCR_2.31.204.bin

接着准备一张计划替换的磁盘,我这里计划将该设备变为一个简单的网络质量监控设备,所以找了一张替换下来的小容量 SSD ,一个硬盘盒,组装为一张 2.5 寸 SATA 硬盘。

磁盘就绪,可以开始折腾啦

将新磁盘插到设备上,继续下一步。

救砖第二步:制作引导盘

国外的网友收集了海外 WD 社区的相关软件,我们需要先下载网友整理的 USB 恢复引导工具。

https://anionix.ddns.net/WDMyCloud/WDMyCloud-Gen2/usbrecovery.tar.gz

然后将一张U盘格式化为 FAT 32 格式,将下载好的 usbrecovery.tar.gz 解压缩到U盘根目录,确认盘根存在解压缩后的 boot 目录,目录内包含四个文件。

接着将磁盘插到设备唯一的USB接口上,给系统上电,启动设备即可。

不出意外,设备LED会显示红灯/黄灯闪烁,耐心等待片刻,使用路由器管理界面或者 ARP 大法看看设备是否进入了恢复模式,是否有一个崭新的设备加入了网络,比如这样:

arp -a
...
? (192.168.123.197) at 0:50:43:x:x:x on en7 ifscope [ethernet]
...

救砖第三步:登陆机器,终端分区,安装恢复镜像

当网络中出现了这台处于恢复模式的设备后,我们需要登陆终端,不过此刻终端未启动 SSH 服务,我们只能通过 Telnet 模式进行登陆。

安装 Telnet 工具

如果你本机有支持 Telnet 的终端可以忽略,因为 Mac OSX 在新版本系统中不再提供 telnet 命令,所以如果是 Mac 用户,需要使用 brew 进行安装。

国内用户如果下载安装软件比较慢,可以访问并使用 清华源 进行软件安装下载:

依次执行 brew updatebrew install telnet 即可。

brew update
Already up-to-date.
➜  ~ brew install telnet
==> Downloading https://homebrew.bintray.com/bottles/telnet-63.catalina.bottle.tar.gz
######################################################################## 100.0%
==> Pouring telnet-63.catalina.bottle.tar.gz
🍺  /usr/local/Cellar/telnet/63: 4 files, 138.1KB
==> `brew cleanup` has not been run in 30 days, running now...
Removing: /Users/soulteary/Library/Caches/Homebrew/gettext--0.20.2_1.catalina.bottle.tar.gz... (8.4MB)
Removing: /Users/soulteary/Library/Caches/Homebrew/libmaxminddb--1.4.2.catalina.bottle.tar.gz... (52.8KB)
Removing: /Users/soulteary/Library/Logs/Homebrew/tokyo-cabinet... (64B)
Removing: /Users/soulteary/Library/Logs/Homebrew/libmaxminddb... (64B)
Removing: /Users/soulteary/Library/Logs/Homebrew/gettext... (64B)
Removing: /Users/soulteary/Library/Logs/Homebrew/switch-lan-play... (64B)
Removing: /Users/soulteary/Library/Logs/Homebrew/goaccess... (64B)
...

登陆设备

登陆设备同样很简单,执行 telnet 刚刚获取的IP 即可。

➜  ~ telnet 192.168.123.197
Trying 192.168.123.197...
Connected to 192.168.123.197.
Escape character is '^]'.

初始化磁盘分区

关于对磁盘进行分区,国内一些社区介绍了一些图形化的方法和方案,繁琐且容易出错,还依赖一堆可能捆绑恶意软件的“特别版”软件,所以这里我们完全使用命令行就足够了。

新插入的磁盘可能之前存在数据和分区,比如这样:

/ # fdisk -l
Found valid GPT with protective MBR; using GPT

Disk /dev/sda: 234441648 sectors, 3881M
Logical sector size: 512
Disk identifier (GUID): 072077e3-0b20-4f5a-92bc-0aa7579d96cc
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 234441614

Number  Start (sector)    End (sector)  Size       Code  Name
   1           30720         1032191        489M   0700  primary
   2         1032192         5031935       1953M   0700  primary
   3         5031936         9031679       1953M   0700  primary
   4         9031680       234440703        107G   0700  Linux data partition

Disk /dev/sdb: 31.6 GB, 31675383808 bytes
255 heads, 63 sectors/track, 3850 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks  Id System
/dev/sdb1               1        3851    30931968   c Win95 FAT32 (LBA)

所以我们在使用前要让他恢复成一张“白板”,减少接下来的麻烦事:

mkfs.ext4 /dev/sda

执行完毕后,结果会类似下面这样:

/ # fdisk -l

Disk /dev/sdb: 31.6 GB, 31675383808 bytes
255 heads, 63 sectors/track, 3850 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks  Id System
/dev/sdb1               1        3851    30931968   c Win95 FAT32 (LBA)
Found valid GPT with protective MBR; using GPT

Disk /dev/sda: 234441648 sectors, 3881M
Logical sector size: 512
Disk identifier (GUID): 8da41292-eea3-495b-8c89-b58c98ea51c4
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 234441614

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       234440703        111G   0700  Linux data partition

接着使用 ** parted** 在交互式终端中依次执行下面的命令,如果遇到确认和询问内容,一律回复 “Yes/Ignore”即可。

parted /dev/sda
mklabel gpt
mkpart primary 1049kB 2149MB
mkpart primary 8591MB -1MB
mkpart primary 7517MB 8591MB
mkpart primary 2149MB 3222MB
mkpart primary 3222MB 4296MB
mkpart primary 4296MB 6443MB
mkpart primary 6443MB 7517MB
q

分区完毕后,我们还需要对磁盘进行格式化。

mkswap /dev/sda1
mkfs.ext4 /dev/sda2
mkfs.ext4 /dev/sda3

命令执行完毕后,会得到类似下面的日志反馈:

/ # mkswap /dev/sda1
Setting up swapspace version 1, size = 2147479552 bytes
UUID=cbae6b36-3134-4bad-a1b7-d95cf90951fd
/ # mkfs.ext4 /dev/sda2
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: done                            
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: c92a4074-a2b2-475a-bc3a-ad481b70028c
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
...

安装恢复镜像

安装镜像也很简单,本质就是将U盘中我们准备好的内容放置到上一步格式化好的磁盘中,依次执行下面的命令。

mkdir -p /mnt/usb /mnt/root
mount /dev/sda3 /mnt/root
mount /dev/sdb1 /mnt/usb
cp -r /mnt/usb/boot /mnt/root/
cd /mnt/root/boot
rm uImage uRamdisk
mv uImage-wdrecovery uImage
mv uRamdisk-wdrecovery uRamdisk
cd /
umount /mnt/root /mnt/usb
sync

执行过程中会得到类似下面的日志:

(parted) mklabel gpt                                                      
mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? Yes                                                               
Yes
(parted) mkpart primary 1049kB 2149MB                                     
mkpart primary 1049kB 2149MB
(parted) mkpart primary 8591MB -1MB                                       
mkpart primary 8591MB -1MB
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I                                                          
I
(parted) mkpart primary 7517MB 8591MB                                     
mkpart primary 7517MB 8591MB
(parted) mkpart primary 2149MB 3222MB                                     
mkpart primary 2149MB 3222MB
(parted) mkpart primary 3222MB 4296MB                                     
mkpart primary 3222MB 4296MB
(parted) mkpart primary 4296MB 6443MB                                     
mkpart primary 4296MB 6443MB
(parted) mkpart primary 6443MB 7517MB                                     
mkpart primary 6443MB 7517MB
(parted) q                                                                
q
Information: You may need to update /etc/fstab.
...

当一切就绪后,再次查看磁盘分区结构,结果类似下面:

/ # fdisk -l

Disk /dev/sdb: 31.6 GB, 31675383808 bytes
255 heads, 63 sectors/track, 3850 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks  Id System
/dev/sdb1               1        3851    30931968   c Win95 FAT32 (LBA)
Found valid GPT with protective MBR; using GPT

Disk /dev/sda: 234441648 sectors, 3881M
Logical sector size: 512
Disk identifier (GUID): 554736af-f4fc-4d30-9bcc-c0f9816d94fe
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 234441614

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351       2048M   0700  primary
   2        16779296       234439695        103G   0700  primary
   3        14682112        16779263       1024M   0700  primary
   4         4196352         6293503       1024M   0700  primary
   5         6293504         8390655       1024M   0700  primary
   6         8390656        12584959       2048M   0700  primary
   7        12584960        14682111       1024M   0700  primary

一切就绪后,将 U盘拔下来,终端执行最后一个命令:reboot -f,接着耐心等待设备重启完毕。

救砖第四步:使用 Web 界面刷入固件

设备重启之后,会进入恢复模式,这里设备的IP可能和刚刚使用终端登陆的IP不同,所以可以再次使用路由器管理界面或者 ARP 方式进行查看。

arp -a
...
wdmycloud (192.168.123.150) at 0:90:a9:x:x:x on en7 ifscope [ethernet]
...

使用浏览器打开这个“新来的IP”,可以看到官方恢复工具界面。

官方恢复工具界面

选择第一步下载的官方固件,点击“Apply”,等待固件刷写。过程中设备蓝灯会连续闪烁。

固件刷写中

继续耐心等待

虽然上传和刷写都很快,会在两分钟内完成,但是不要着急手动重启,因为设备还需要做一些额外的“内部工作”。

固件刷机完毕,等待重启

直到看到这个界面,救砖操作就基本完成了。

救砖第四步:登陆管理后台进行设置

设备重启后,再次使用路由器或者 ARP 大法获取可能变化的设备IP,并使用浏览器打开这个IP,会看到一个崭新的界面:设备管理界面。

设备管理界面

设备第一次启动会稍微慢一些,需要耐心等待初始化完毕。

配置储存位置

当设备启动完毕,登陆后台,会看到这个界面,如果不进行配置,设备将会没有可用的储存空间,像是下面这样:

系统提示没有磁盘

再次刷新界面,系统会返回设置储存位置的界面,因为是单盘,所以一路下一步即可。

选择配置 JBOD 模式

等待磁盘快速自检

切换RAID模式

切换到 JBOD 模式完毕

磁盘最后一次格式化

一切就绪之后,设备管理界面就可以正常的看到设备的储存容量空间了。

一切就绪

如何判断你的设备的版本

除了从前文中比对主板上芯片型号外,在设备外壳底部会包含一串 P/N 代码,单盘的 Gen1 / Gen2 结尾会有两种情况:“-00” 和 “-10”。

前者是第一代产品,后者是第二代产品。

如何定制固件

如果你想定制自己的固件,可以使用下面的代码仓库,跟着说明文档,可以轻松搞定第二步使用的固件。

https://github.com/Johns-Q/wdmc-gen2

如何安装三方应用

打开管理界面,在浏览器地址栏手动输入下面的 JS 代码:

javascript:APP_INSTALL_FUNCTION=1; APPS_EULA=1; check_app_eula();

或者在开发者工具中输入:

APP_INSTALL_FUNCTION=1; APPS_EULA=1; check_app_eula();

接着打开“应用”界面,就可以安装应用了,如果要连续安装应用,需要刷新页面后,重新执行上述步骤。

应用下载,可以使用下面的地址:

https://anionix.ddns.net/WDMyCloud/WDMyCloud-Gen2/Apps/

如何更进一步的玩耍

进入设置页面关闭一切你不需要的服务,降低系统负载和资源消耗,比如 FTP、iTunes、Time Machine等,打开 SSH 服务,开始自由发挥。

最后

WD MyCloud 算是除了 Windows Server 外我入坑NAS的开始,虽然现在已经全面使用群晖替换了它。但是WDMC产品稳定可靠,功耗低、声音小,简直是居家旅行良品。如果你只需要简单的网络储存,不妨以买盘送硬件的价格,入手一台试试。

–EOF