以前WD MyCloud
被捣鼓坏掉了,都是参考拯救死翘翘了的 WD MyCloud来处理的,但是这种处理方式需要拆机,非常的费力。最近看到有人发布了可以不拆机的方式修复的方法。研究了一下,非常可行,推荐使用这种方法。
下面的这些操作都是WD论坛上的一些达人通过分析WD MyCloud
的源代码得到的,没有非公开的黑科技,都是一些明确公布的内容。
原理大致讲一下,在WD MyCloud
主板上有一块Flash
闪存,闪存里面是已经写入的barebox
。WD 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
服务无法绑定网卡。具体的操作如下:
1 2 3 4 5 6 7 |
$ 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 |
列出当前机器上的网卡,为我们的后续操作指定网卡提供信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ 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
服务需要用到这个参数。
1 2 3 4 |
#安装dhcp服务 $ sudo apt-get install isc-dhcp-server $ sudo apt-get install vim |
配置DHCP
服务绑定的网卡,我们需要有线网卡
1 |
$ sudo sed -i 's/^INTERFACESv4=""/INTERFACESv4="eth0"/g' /etc/default/isc-dhcp-server |
指定DHCP
服务可以分配的IP
地址段
1 |
$ sudo vim /etc/dhcp/dhcpd.conf |
去掉如下部分的注释,我们需要bootp
的功能
1 2 3 4 5 6 7 8 |
# 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
客户端从目标主机下载,这个是主板固件的限制。
1 2 3 4 5 6 7 8 9 |
# 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
地址,否则无法激活网卡进行数据的传输
1 2 3 4 5 6 7 8 |
$ 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
服务,使得配置生效
1 |
$ sudo service isc-dhcp-server restart |
注意,上面的配置只是激活了DHCP
分配IP
的功能,并不能让设备通过我们的电脑代理上网,也不能让我们的设备在修复后与电脑进行数据通信,只是修复系统时候使用的。设备修复完成后,需要插到路由器上才能验证是否成功。为了保证后面方便调试,这里强烈建议参考打开代理上网功能,参考ubuntu 14.04/ubuntu 17.10做主机双网卡共享上网(NAT)进行相关设置。
安装tftp
服务端,我们的电脑作为服务端为WD MyCloud
提供文件下载服务。
1 2 3 4 |
$ sudo apt-get install tftp-hpa tftpd-hpa #配置文件位于"/etc/default/tftpd-hpa" $ sudo service tftpd-hpa restart |
下载编译脚本代码,并构建激活WD MyCloud
主板下载启动脚本的应用
1 2 3 4 5 6 7 8 9 |
$ sudo apt-get install git $ cd ~ $ git clone https://github.com/utessel/mycloud.git $ cd mycloud $ gcc -o rawping rawping.c |
如果上面的代码下载不成功。可以从本站下载一份代码拷贝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
$ 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
服务器目录
1 2 3 4 5 6 7 8 9 10 |
$ 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
,执行
1 2 3 4 5 |
$ 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协议,那么断电重试。
然后不断调用
1 2 3 |
#理论上 sudo dhcp-lease-list 是最好的获取列表方式,但是这个接口更新非常缓慢,往往得不到刚刚分配的IP地址,因此我们使用ARP查询的方式来查找设备地址 $ arp | grep 00:99:88:xx:xx:xx |
直到列表中出现这个"00:99:88:xx:xx:xx
"地址的设备获取到了IP
。
最后,通过
1 |
$ telnet 192.168.0.x |
可以获得一个可以操作的Shell
,用来执行修复。
通过如下链接增加parted-3.0/parted-2.3
,mdadm-3.2.6
注意,由于镜像大小的限制(不可超过9MB
),我们不可能把这些软件全部放进镜像,因此,这些软件可以独立编译,然后在系统启动后通过TFTP
从PC
上拉取获得)
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
多次操作后需要重新编译内核
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
$ 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 https://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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
/ # 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 |
补充信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/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
地址。
参考链接
- ubuntu16.04,如何修改网卡名称为eth0,wlan0?
- ubuntu 14.04系统DHCP服务器搭建
- How to set static IP address?
- 在 Debian Linux 上安装配置 ISC DHCP 服务器
- 在Ubuntu 64位环境下编译Liunx内核出现 Can't use 'defined(@array)' 错误的解决办法
- arch/arm/kernel/return_address.c:66:7: error: redefinition of ‘return_address’
- SED匹配替换多行的问题请教
- 编译内核提示mkimage command not found – U-Boot images will not be built
- utessel/mycloud
- 放心折腾MYCLOUD吧!!My cloud 不拆机解砖方法
- Ubuntu 16.04中安装tftp
- Unbricking without opening
- Hardware hacking
- 使用udhcpc能获取到DHCP自动分配的IP,但是该IP却没有设置到网卡上
- Android: Unknown symbol _GLOBAL_OFFSET_TABLE_
- 制作initramfs根文件系统内核并用其启动最终文件系统
- How to unbrick a totally dead My Cloud?
- How to unbrick a totally dead WD My Cloud ?
- Ubuntu Ext3 cannot change data mode on remount
- Adding data=writeback to a ext4 fstab entry, results in read-only filesystem
您好,请问这个方法在虚拟机中可行么?
可以在虚拟机中处理的,网络配置成桥接模式后,根实际的机器差别不大,但是要会设置
请问有联系方式提供吗?
我这里有一些问题需要请教
有问题请发送邮件
您好,我未能寻获您的联系方式。
517268628@qq.com
这个是我的邮箱,如果可以,我更希望通过QQ联系,因为我现在正在处理,有一些问题需要请教。
不胜感激!
邮件请发wangqiang1588@sina.com,有空的话,我会回复邮件!
谢谢!现在我卡在了sudo rawping eth0这里,提示没有rawping命令。我查看了目录下存在这个文件。现在应该怎么做呢?
$ chmod +x rawping
$ sudo ./rawping eth0
谢谢,我想到了权限问题,但是方向错了,一直在UI里改权限...菜鸟一枚。见笑了
现在我有个问题,设置完以后,显示eth0是未托管状态。然后一直都无法连接,但是Windows下的Recovery是可以连上的,也能变绿灯,就是俄罗斯大神的镜像不知道为什么一直无法挂载sd5,所以我才想到这个教程,这个教程可以自定义恢复镜像。但是很奇怪,虚拟机里就无法Telent。宿主是Windows 10。我想我的虚拟机设置应该有问题,有关于虚拟机设置的教程么?
虚拟机网卡默认是NAT模式,外部连接无法呼入,需要调整成桥接模式。
哦,这个我倒是知道,我极少用NAT,一般我都是桥接,连链路状态都不带。路由器里识别虚拟机为完全独立的客户端。但是现在我在宿主机上一下就通了,在虚拟机里等了十多分钟了,重启也有五六次了,每次等至少十分钟,就是不通...有没有单独的制作Recovery镜像的教程,实在不行我做好镜像拿出来上传。或者你知道俄罗斯大神的Recovery镜像上传后为什么无法挂载sda4。
顺带说一下,我没有直连主机,我是接在交换机上的,而且连通的时候,为了防止DHCP服务冲突,路由也关掉了。
一般建议直连设备,原因在于设备上电之后,交换的数据极少,甚至没有数据交换,导致交换机也不知道报文应该如何中转,因此会造成额外的丢包,尤其是一些高级功能的交换机,有时反倒不如一些傻瓜交换机好用。
他制作的镜像代码偏古老,MyCloud系统升级后,一部分格式有更改,导致他的镜像有时候连启动都会失败的,因此建议是自己编译镜像。
谢谢指导,我现在重新安装了一下虚拟机。把网线直接插在了宿主计算机上。使用了一个USB WLAN网卡。这样环境应该就跟教程里一样了,我会从头再来一次。
您好!
我在操作到telnet的时候无法连接了。
在宿主机上获取到的都是192.168.0.4。但是在这里是192.168.0.101。这正常么?而且telnet连不上。
telnet: Unable to connect to remote host: No route to host
设备的IP会变的,不一定是192.168.0.4了,另外这个地址是设备发送原始的DHCP请求给你的PC,然后你的PC分配给设备的,用WireShark抓包看一下哪个地址在请求数据
如果严格按照我给出的配置,没有修改过的话,设备应该拿到192.168.0.100-192.168.0.110之间的一个地址才对
对的,就是这样子的,有TFTP包抓到。但是设备没有亮绿灯。telnet 192.168.0.x 这一步的时候也连不上去。请问是不是要先做下面的?还是说这一步的时候应该连上去才对?
TFTP包收到,说明已经在加载了,你可以从WireShark中看到TFTP传输结束,传输是需要时间的,估计几十秒是要的,当传输结束之后,差不多需要10-20S的时间,设备会运行起来,如果你没有关闭rawping窗口的话,应该会周期性的看到网卡等闪闪,差不多每秒闪烁一次的样子。如果你开着wireshark的话,应该会看到DHCP REQUEST报文,并且PC必须响应了DHCP OFFER,从DHCP OFFER中应该能看到分配的IP地址。
如果设备长时间不请求DHCP,请检查一下是不是写错了启动脚本,就是那个startup.sh,如果没有,请检查镜像是不是超过9MB了,如果超过,就启动不起来。
那个脚本存在,看了下内容,看不懂。但是复制过来的应该跟源目录是一个东西。我再看一下DHCP响应。镜像大小符合限制。这个跟俄罗斯大神的那个应该是一样的吧,都是要变绿灯的吧。我的一直没变过绿灯......囧
不要看灯,灯永远不会变绿灯的,因为代码里没有设置灯的部分,这部分被丢弃了,只有正式的系统才会管灯。 你只要能telnet登录进去即可。整个启动过程非常快,因为不涉及到硬盘操作,只要TFTP拉取镜像完成,初始化过程不会超过20S
已经核对,LED控制部分应该是内嵌在主板上的,我把里面的镜像拿出来后用俄罗斯大神的脚本上传上去了,一直黄灯,根据WD的手册,黄灯是软件故障。所以基本确认镜像有问题。脚本核对过了,没什么问题,现在唯一的问题就是镜像。要是红灯就是硬盘坏了,基本没救了......囧
那个灯的颜色控制,我记得是写在系统的启动脚本里面的,仅仅是发送了一个颜色命令而已,没有其他功能,只有系统完整的情况下,才有参考意义,如果是系统恢复,这个指示灯没有任何意义。
参照俄罗斯大神的那个脚本,黄灯10S左右,然后就会变蓝灯,之后就可以telent了,脚本我打开看了下,没有发现LED控制代码,可能是我看不懂吧。
套路就是这些,没有更深的东西了,你只要尝试自己编译内核,基本上就可以为所欲为了
我现在用俄罗斯大神的镜像进入telent了,请问有什么教程可以把那些工具独立编译完成?上传方法已掌握。那些工具对镜像版本的依赖性强么?
纯静态编译,只依赖内核,但是由于没有libc的支持,很多应用实际上是没办法编译运行的,因此才会有自己编译的镜像。
谢谢解释,但是手工编译出来的镜像,貌似无法引导,我都是按照教程来的,现在正在研究是哪里出了问题
另外需要反复确认startup.sh这个脚本,我记得我们编译的跟俄罗斯的那个版本的启动地址是有差异的,两个脚本是不能通用的。
谢谢指导
我有个想法,因为那个镜像一直无法挂载磁盘,但是可以识别磁盘,所以我想用那个镜像引导至telent环境,然后把独立工具上传,试了下,可用空间大约150-160MB的样子,应该能载入不少工具了
这些你可以试一下,不做任何保证
我还是不明白,按照教程生成了好几个镜像了,为什么都不能引导呢?
ls -l ,命令查看一下镜像大小