更优雅的(不拆硬盘)拯救死翘翘了的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服务无法绑定网卡。具体的操作如下:

$ sudo cp /etc/default/grub /etc/default/grub.old

$ sudo sed -i 's/^GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"/g' /etc/default/grub

$ sudo update-grub

$ sudo reboot

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

$ sudo apt-get install net-tools

$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fexx::7axx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (以太网)
        RX packets 13  bytes 4431 (4.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 30  bytes 4586 (4.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 20  memory 0xf3600000-f3620000  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (本地环回)
        RX packets 91  bytes 6745 (6.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 91  bytes 6745 (6.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (以太网)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions

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

#安装dhcp服务
$ sudo apt-get install isc-dhcp-server

$ sudo apt-get install vim

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

$ sudo sed -i 's/^INTERFACESv4=""/INTERFACESv4="eth0"/g' /etc/default/isc-dhcp-server

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

$ sudo vim /etc/dhcp/dhcpd.conf

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

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

#subnet 10.254.239.32 netmask 255.255.255.224 {
# range dynamic-bootp 10.254.239.40 10.254.239.60;
# option broadcast-address 10.254.239.31;
# option routers rtr-239-32-1.example.org;
#}

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

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

subnet 192.168.0.0 netmask 255.255.255.0 {
 range dynamic-bootp 192.168.0.100 192.168.0.110;
 option broadcast-address 255.255.255.255;
 option routers 192.168.0.1;
 option domain-name-servers 8.8.8.8;  #DNS
}

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

$ echo -e "\n
auto eth0
iface eth0 inet static
\t netmask 255.255.255.0
\t address 192.168.0.1 
\n" | sudo tee -a /etc/network/interfaces

$ sudo /etc/init.d/networking restart

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

$ sudo service isc-dhcp-server restart

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

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

$ sudo apt-get install tftp-hpa tftpd-hpa
#配置文件位于"/etc/default/tftpd-hpa"

$ sudo service tftpd-hpa restart

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

$ sudo apt-get install git 

$ cd ~

$ git clone https://github.com/utessel/mycloud.git

$ cd mycloud

$ gcc -o rawping rawping.c

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

$ sudo apt-get -y install g++-arm-linux-gnueabihf

$ sudo apt-get install u-boot-tools

$ cd ~

$ cd mycloud

$ wget http://downloads.wdc.com/gpl/gpl-source-wd_my_cloud-04.04.03-113.zip

$ unzip -d wd gpl-source-wd_my_cloud-04.04.03-113.zip 

#下面是修正几个WD的源代码在GCC-7.x版本的编译错误
$ ln ./wd/packages/kernel_3.2/linux/include/linux/compiler-gcc4.h ./wd/packages/kernel_3.2/linux/include/linux/compiler-gcc`arm-linux-gnueabihf-gcc --version | grep ^arm-linux | sed 's/^.* //g' | cut -d "." -f1`.h

$ sed -i '/extern inline void \*return_address(unsigned int level)/{:n;N;/\}/!bn};s/^extern inline void[ \t]* \*return_address(unsigned int level)\n{\n[ \t]*return NULL;\n}/\/\*extern inline void \*return_address(unsigned int level)\n\{\n\treturn NULL;\n}\*\/\nextern void *return_address(unsigned int);/' ./wd/packages/kernel_3.2/linux/arch/arm/include/asm/ftrace.h

$ sed -i 's/if (!defined(@val))/if (!@val)/g' ./wd/packages/kernel_3.2/linux/kernel/timeconst.pl

#禁用-fpic,否则我们编译出的代码在执行的时候会报告  pfe: Unknown symbol _GLOBAL_OFFSET_TABLE_ (err 0) 
$ sed -i '1i\EXTRA_CFLAGS += -fno-pic \n' ./wd/packages/kernel_3.2/kmodules/mspd-c2k/pfe/pfe_ctrl/Makefile

#接下来修正几处mycloud代码中的脚本问题
$ sed -i 's/telnetd -l\/bin\/sh/telnetd -l \/bin\/sh \&/g' create_install.sh

#修正ifconfig的路径错误
$ sed -i 's/\/sbin\/ifconfig/ifconfig/g' create_install.sh

#调整一下busybox版本,更新版本有一些小BUG的修复
$ sed -i 's/busybox-1.23.0/busybox-1.23.2/g' build-sys.sh

#这部分适当解释一下,编译出的initramfs.cpio.gz会在生成uImage的时候被打包进入,这部分的配置参考 CONFIG_INITRAMFS_SOURCE="../../../../initramfs.cpio.gz"
#需要添加新功能,新软件的时候,直接修改BusyBox的配置文件即可。
$ ./build-sys.sh

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

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

$ cd ~/mycloud
 
$ sudo rm -rf /var/lib/tftpboot/uImage

$ sudo cp uImage /var/lib/tftpboot/

$ sudo cp startup-uImage.sh /var/lib/tftpboot/startup.sh

#目前测试发现,如果镜像大小超过9MB就不能正常引导系统了
$ sudo sed -i 's/8M@0x3008000/9M@0x3008000/g' /var/lib/tftpboot/startup.sh

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

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

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

$ cd ~/mycloud

$ chmod +x rawping

$ sudo ./rawping eth0 <mac of device> (00:99:88:xx:xx:xx)

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

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

然后不断调用

#理论上 sudo dhcp-lease-list 是最好的获取列表方式,但是这个接口更新非常缓慢,往往得不到刚刚分配的IP地址,因此我们使用ARP查询的方式来查找设备地址

$ arp | grep 00:99:88:xx:xx:xx

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

最后,通过

$ telnet 192.168.0.x

可以获得一个可以操作的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

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

$ rm -rf ~/mycloud/busybox-1.23.2/_install

$ rm -rf /mycloud/wd/packages/kernel_3.2/_bin

$ rm -rf /mycloud/wd/packages/kernel_3.2/_bld

$ cd ~/mycloud

$ rm -rf uImage

#目前测试发现,如果镜像大小超过8MB就不能正常引导系统了,因此,我们在系统运行完成后,通过tftp下载下来
$ rm -rf ~/mycloud/extrafiles/sbin/mkfs.ext3

$ rm -rf ~/mycloud/extrafiles/sbin/mkfs.ext4

#打包成压缩包,稍后我们的脚本会在找到这个压缩包后,打包进入镜像 
$ cd ~/mycloud/extrafiles 
$ tar -cvzf extrafiles.tar.gz * 
$ mv extrafiles.tar.gz .. 

$ sudo cp ~/e2fsprogs-1.43.7/e2fsprogs_arm/sbin/mkfs.ext3 /var/lib/tftpboot/

$ sudo cp ~/e2fsprogs-1.43.7/e2fsprogs_arm/sbin/mkfs.ext4 /var/lib/tftpboot/

$ sudo cp ~/e2fsprogs-1.43.7/e2fsprogs_arm/sbin/tune2fs /var/lib/tftpboot/ 

$ ./build-sys.sh

$ cd ~/mycloud 

$ sudo rm -rf /var/lib/tftpboot/uImage 

$ sudo cp uImage /var/lib/tftpboot/ 

$ sudo cp startup-uImage.sh /var/lib/tftpboot/startup.sh

#目前测试发现,如果镜像大小超过9MB就不能正常引导系统了
$ sudo sed -i 's/8M@0x3008000/9M@0x3008000/g' /var/lib/tftpboot/startup.sh

$ cd ~

$ mkdir sq-040500-320-20171027

$ cd sq-040500-320-20171027

$ wget http://download.wdc.com/nas/sq-040500-320-20171027.deb

$ ar -vx sq-040500-320-20171027.deb

$ lzma -dv data.tar.lzma

$ tar -xvf data.tar

$ sudo cp CacheVolume/upgrade/rootfs.img /var/lib/tftpboot/

#从本站下载配置分区里面的数据,分区格式是barebox自己实现的envfs分区格式,具体内容参考后面的补充信息
$ wget http://www.mobibrw.com/wp-content/uploads/2017/12/config.tar.xz

$ tar -xvf config.tar.xz

$ sudo cp config.img /var/lib/tftpboot/

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

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

/ # tftp -g -r mkfs.ext3 192.168.0.1
/ # chmod +x mkfs.ext3

/ # tftp -g -r mkfs.ext4 192.168.0.1 
/ # chmod +x mkfs.ext4

/ # tftp -g -r tune2fs 192.168.0.1
/ # chmod +x tune2fs
 
/ # parted 
GNU Parted 3.0
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print list                                                       
print list
Error: /dev/sda: unrecognised disk label                                  
Model: ATA WDC WD10PURX-64E (scsi)
Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown

(parted) select /dev/sda                                                  
select /dev/sda
Using /dev/sda
(parted) mklabel gpt                                                      
mklabel gpt
(parted) mkpart primary ext3 528M 2576M
 mkpart primary ext3 528M 2576M
(parted) mkpart primary ext3 2576M 4624M                                         
mkpart primary ext3 2576M 4624M
(parted) mkpart primary linux-swap 16M 528M                                          
mkpart primary linux-swap 16M 528M
(parted) mkpart primary ext4 4828M -1M                                         
mkpart primary ext4 4828M -1M
(parted) mkpart primary 4624M 4724M
mkpart primary 4624M 4724M 
(parted) mkpart primary 4724M 4824M
mkpart primary 4724M 4824M
(parted) mkpart primary 4824M 4826M
mkpart primary 4824M 4826M
(parted) mkpart primary 4826M 4828M
mkpart primary 4826M 4828M
(parted) set 1 raid on                                                    
set 1 raid on
(parted) set 2 raid on                                                    
set 2 raid on
(parted) quit                                                             
quit
Information: You may need to update /etc/fstab.

#消除后续操作的一个警告
# ext2fs_check_if_mount: Can't check if filesystem is mounted due to missing mtab file while determining whether /dev/sdaX is mounted. 
/ #  touch /etc/mtab 

/ # ./mkfs.ext3 /dev/sda1

/ # ./mkfs.ext3 /dev/sda2

/ # ./mkfs.ext4 /dev/sda4

/ # mkswap /dev/sda3

/ # mkdir mnt

/ # mount /dev/sda4 /mnt

/ # cd mnt

#拉取系统镜像,这个拉取过程要40分钟以上,如果为了加快,可以格式化一个超过2GB的ext2格式的U盘
#插在USB接口上,然后挂载,从U盘上拷贝镜像数据
/ # tftp -g -r rootfs.img 192.168.0.1

#停止阵列,并且清除数据,如果是新硬盘,下面两个步骤可以跳过,
#即使执行失败也可以无视,因为新硬盘上还没有阵列存在,直接操作阵列自然提示失败
/ # mdadm -S /dev/md*
/ # mdadm --zero-superblock --force --verbose /dev/sda1
/ # mdadm --zero-superblock --force --verbose /dev/sda2

#创建新的阵列,此处需要等待“md: md1: resync done. ”这句话出现
#注意这里的阵列名(/dev/md1)要与/dev/sda7,/etc/fstab中记录的一致
/ # mdadm --create /dev/md1 --verbose --metadata=0.90 --raid-devices=2 --level=raid1 --run /dev/sda1 /dev/sda2

#格式化阵列,mdadm --create破坏了分区信息,这里我们需要重新格式化整个阵列
/ # ./mkfs.ext3 -j /dev/md1
/ # touch /etc/mtab 
/ # ./tune2fs -O has_journal /dev/md1
/ # ./tune2fs -o journal_data /dev/md1
/ # ./tune2fs -o journal_data_writeback /dev/md1

#恢复系统镜像
/ # dd if=rootfs.img of=/dev/md1

/ # mdadm -D /dev/md1
#最好等待显示的 “Resync Status : x% complete”显示到100%结束,或者不存在这个显示项都可以
#不等待也可以。

/ # mdadm -S /dev/md* 

/ # cd /

#参考kernel-mindspeed-sequoia.postinst把内核镜像写入/dev/sda5 /dev/sda6
#这两个分区内容相同,/dev/sda6是/dev/sda5分区的一个备份,
#出现问题的时候,可以用来还原/dev/sda5,正常启动的时候,没有用到这个分区中的数据
#这个分区中的数据是我们刚刚刷入的rootfs.img里面的镜像,之所以这么操作,原因是闪存中的
#barebox系统无法正常引导ext3分区里的数据,分区识别不了,只能把镜像直接写入一个独立分区,
#在启动的时候,原封不动的拷贝整个分区到内存,然后执行分区里的代码,
#相当于我们上面的TFTP中拉取一份内核并执行,是一样的流程
/ # mkdir sda1
/ # mount /dev/sda1 /sda1
/ # dd if=/sda1/boot/uImage of=/dev/sda5
/ # dd if=/sda1/boot/uImage of=/dev/sda6
/ # umount /sda1

#接下来的关键是/dev/sda7 /dev/sda8两个分区了,这两个分区中的数据是启动参数,
#分区格式是barebox自己实现的envfs分区格式,
#参考~/mycloud/wd/packages/barebox-2011.06.0/include/envfs.h的定义,
#具体调用在~/mycloud/wd/packages/barebox-2011.06.0/commands/sataenv.c
#中的static int sata_load_environment(char* prog_name, u32 part_nbr, u32 start_sec, char* dir),
#分区格式非常简单,但没有编译好的直接写磁盘的工具,具体信息,请看后面的补充介绍
#这里我们简单的使用已经做好的镜像即可
/ # cd /
/ # tftp -g -r config.img 192.168.0.1
/ # dd if=config.img of=/dev/sda7
/ # dd if=config.img of=/dev/sda8

/ # cd /

/ # umount /mnt

#重新格式化/dev/sda4,否则会触发第一次系统启动的时候的磁盘空间检查,导致无法成功初始化
/ # ./mkfs.ext4 /dev/sda4

/ # sync

/ # reboot

补充信息

kernel_copy ()
{
    kernelFile=${upgradePath}/boot/uImage
    if [ -e "${kernelFile}" ]; then
        ## TBD: Add multi drive support
        #dd if=${kernelFile}  of=${kernelPart1}
        #dd if=${kernelFile}  of=${kernelPart2}
        ##
        dd if=${kernelFile}  of=/dev/sda${kernelPart1}
        dd if=${kernelFile}  of=/dev/sda${kernelPart2}
    fi
    echo "Done kernel partition copy."
}
 
_install ()
{
    # perform copy and configure only when installing on a real target
    [ ! -f /tmp/nas_build ] && kernel_copy
    [ ! -f /tmp/nas_build ] && control_copy
    configure
}
#!/bin/sh
## Button initial state
btn_status=0
get_button_status
sata
satapart 0x3008000 5 0x5000
sata stop
# This is customized for each environment variable script
bootargs="console=ttyS0,115200n8, init=/sbin/init"
bootargs="$bootargs root=/dev/md1 raid=autodetect"
bootargs="$bootargs rootfstype=ext3 rw noinitrd debug initcall_debug swapaccount=1 panic=3"
bootargs="$bootargs mac_addr=$eth0.ethaddr"
bootargs="$bootargs model=$model serial=$serial board_test=$board_test btn_status=$btn_status"
bootm /dev/mem.uImage

主板焊接串口(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的样子,应该能载入不少工具了

回复 张子荆 取消回复

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