拯救死翘翘了的WD MyCloud

WD MyCloud 在通过SSH 进入命令行的时候误操作,导致系统彻底完蛋,查找了很长时间,找到了解决方法。

  • 对于彻底完蛋了的系统,比如,已经无法进入系统了,不管是SSH 还是网页,总之就是系统动不了。 则参考如下操作:(注意本方法会导致数据被彻底删除,使用时候要慎重

1.从http://pan.baidu.com/s/1eQBVbc2 下载3TB 版本的系统恢复镜像。

2.拆开机器,系统出厂自带的是Debian linux系统,重装系统需要将外壳拿掉,将硬盘取出。外壳是通过卡扣连接主体的,拆的时候有可能会折断卡扣,但不会影响重装回去之后的外观。大致方法就是,找几张废旧电话卡或银行卡从机子的后背也就是网卡口的左右两侧的外壳缝隙插进去,稍微撬开一点缝隙,保持卡片不动,然后将外壳用巧力使劲往 前推,慢慢的推出去,即可把外壳拆下。硬盘和壳子通过4个胶垫固定,先抬起硬盘一侧,使得两个胶垫脱离壳子,然后再慢慢向上和向外取出即可,过程没什么技 术含量,只需要小心一点就是了。连接主板和硬盘有4颗螺丝,其中一颗在led灯胶垫下,掰开胶垫可见,一并拧下。

3.把硬盘挂载到一台Linux的机器,推荐使用 Ubuntu ,本机使用的是 Ubuntu 13.10 .挂载的时候,可以使用USB 或者 ESATA接口的移动硬盘盒即可。

4.建议删除原始磁盘上的所有分区

5.使用 如下命令强制还原镜像到硬盘,假定此时硬盘被挂载到了 /dev/sdb上

6.装回硬盘到 WD My Cloud ,(注意此时不要用Linux 自带的gparted 操作硬盘,否则会导致无法启动),然后开启 SSH ,在命令行中执行 parted 命令,此时,会提示分区存在问题,按照提示修复即可。尽量在My Cloud 里面执行脚本命令,外面的Linux 执行命令的话,经常导致无法启动问题,最好在My Cloud 里面执行一下 e2fsck 来检查一下磁盘,尤其是最后的数据分区,恢复的时候一般都会有分区表错误,貌似只有在SSH 里面执行的才是正常的,原因未知。至于下面的分区大小调整,如果能在SSH 中处理的话,是最好的,问题最少。 下面是SSH 处理的SHELL 记录

最好升级一下 usb 接口的程序版本,新版本貌似修正了大文件拷贝会死机的问题

7.再次拆卸硬盘,用Linux 中的 gparted 来根据实际硬盘的大小来调整硬盘,比如,我的是4T 版本的,刷完之后,会有1T 的空白分区,这个时候可以通过gparted 来调整到整个硬盘。 (注意,外面调整分区可能导致不能启动,原因未知,因此恐怕要多尝试几次

8.装回硬盘,重新启动,最好恢复一下出厂设置。

  • 如果分区都还在,又不想损坏数据,可以试试如下方法

1.下载最新的固件版本比如 http://download.wdc.com/nas/WDMyCloud-030104-139-20131028.zip 解压缩数据 从CacheVolume 目录中找到 rootfs.img 文件,大约2G 的样子,解压缩到某个目录即可。

2.按照上文方法拆卸硬盘,并挂载到Ubuntu。

3.在磁盘管理器中打开如下界面,还原到的分区为管理器中现实Raid 的两个分区中,两个分区逐个还原。

original

选择 "Restore Disk Image"

original2

上面的方法有些人可以恢复成功,有些没有办法恢复成功,中间的差别一般在于有些人机器上安装了mdadm。如下图所示,磁盘挂载后会识别出"2.0GB RAID-1阵列",如果下面的挂载位置不是"/dev/md/0",而是显示"/dev/md127"或者"/dev/md126",那么,即使什么都不操作,直接装回去,也可能发现WDMyCloud不能正常启动了。
 这个原因是由于机器上安装的mdadm无意之间修改了部分内容,导致WDMyCloud无法识别。解决办法是在电脑上重建这个"2.0GB RAID-1阵列",以系统会把磁盘挂载到/dev/sdb为例子,方法如下:

重建完成后,挂载位置被修正为"/dev/md/0",然后通过在"2.0GB RAID-1阵列"上点击"对分区映像恢复"(英文应该是"Restore Disk Image")进行镜像的恢复工作。

恢复完成后,先执行

停止阵列,然后点击顶部的"Power Off"按钮,移除磁盘。如下图:

上面的操作完成后,一般会出现磁盘错误,建议进行磁盘检查,具体操作过程如下:

上述操作完成后,如果首页容量部分一直显示0KB,则参考WD MyCloud拆硬盘恢复系统后容量部分显示0KB

参考链接


WD My Book Live 离线升级固件

MBL通电后登录Web管理界面,第一件事就是要求升级固件,点了确定后才发现下载进度堪比蜗牛,一个半小时进度大约50%。升级不完还没办法进一步设置,实在无法忍了,边下边找办法看能不能快速搞定吧。

MBL官网上没找着固件下载链接,只见一行小字写着现在已经不再支持手动升级固件。肯定会有办法的,能自动升级必须可以手动。

用SSH连接上,果然在 /usr/local/sbin 目录下发现了一堆设置相关脚本,其中有两个:

第一个脚本看名字就知道干啥用的,正是下载好固件手动升级用的,等下再细看怎么用;直接看第二个吧,真相来了,第24行代码直接告诉你怎么拿到最新固件的下载地址:

在shell中敲入下面的命令:

下载链接是不是已经出来了(前提是Web管理界面里的自动下载还在进行,如果已经没有执行或已经取消,/tmp/update_url 文件是不存在的,你知道该怎么办)。接下来的事情更加简单了,用迅雷或是QQ旋风等任意工具将固件下载回来,应该是一个.deb文件,然后通过 winscp或是文件共享把它放到MBL的目录里,MBL共享用的 /shares/Public 目录就挺好,最后在 /usr/local/sbin 目录下执行:

你将会惊奇地发现Web管理界面上已经显示出了升级进度,耐心等待……几分钟就好。

参考链接 http://i.migege.com/my-book-live-manual-updating.html

Method类invoke方法的使用

例如:

执行obj的method方法(参数为sql),返回String类型结果

args参数可以为空,就是对应方法没有参数

如:

obj可以为空,但必填null,表示同类中的公用方法,

如:

参数args是个Object数组,即使只有一个参数,也要建object数组

如:

注意:obj必须是实例化的对象,如果有对应的方法名,就可以实例化

部分代码如下:


getClass在下面:

newInstance() 的参数版本与无参数版本详解

通过反射创建新的类示例,有两种方式:

以下对两种调用方式给以比较说明:
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。Class.newInstance() 抛出所有由被调用构造函数抛出的异常。

Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的;

Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。

Class A(被调用的示例):

Class B(调用者):

输出结果如下:

说明方法newInstanceByClassNewInstance调用失败,而newInstanceByConstructorNewInstance则调用成功。如果被调用的类的构造函数为默认的构造函数,采用Class.newInstance()则是比较好的选择,一句代码就OK;如果被调用的类带参构造函数、私有构造函数,就需要采用Constractor.newInstance(),两种情况视使用情况而定。
不过Java Totorial中推荐采用Constractor.newInstance()。

参考 http://xiaohuafyle.iteye.com/blog/1607258

使用Eclipse通过WiFi调试Android程序

通过如下步骤,可以很方便的通过wifi调试Android程序:

1、root手机;

2、到市场下载Android Terminal Emulator应用并安装(Android Terminal Emulator是一款安卓手机上使用的终端模拟器,可以进行linux命令集),或者到从GitHub 下载源代码自己编译,地址为 https://github.com/jackpal/Android-Terminal-Emulator,源代码编译的时候注意要增加NDK支持,底层是需要 C/C++层支持的。

3、安装后打开,输入如下命令:

4、看一下手机的IP,并记下来,比如:192.168.1.111;

5、在电脑上,上运行cmd命令提示符,切换目录至adb文件所对应文件夹,如:D:\Android\android-sdk\platform-tools,键入如下命令:

如果提示连接成功,则说明搞定了。

6、在Eclipse中运行调试应用

Proguard不混淆内部匿名类(keep Inner Anonymous Class)

今天在使用Proguard keep一个 静态内部类的时候,混淆完之后一直找不到那个静态内部类,内心抓狂啊。

最后在stackoverflow上找到了答案:

其中 A$* 表示所有A的内部类都保留下来,也可以如下使用:

这样可以根据需要只保留A的某一个内部类

以下是proguard文件一部分

原文 http://blog.csdn.net/fx_sky/article/details/18225501

Mac Gradle 编译报告Failure initializing default system SSL context

Mac 10.9 版本下使用Gradle 编译 Android 项目,报告错误

使用 -debug 参数,得到的详细输出如下

可以看到,异常信息为

到具体的目录下面去看,这个文件果然是不存在的,有些版本链接到了一个不存在的目录,这种情况一般是经历过系统升级,往往会造成这个现象,另外,就是系统安装的Java 是Apple 提供的 Java 版本,而不是 Orcale 官网下载的独立版本。

解决方法是可以到Orcale 官网下载最新版本的 Java ,安装替换即可解决问题。

使用 Homebrew 安装指定版本的软件

在命令行下使用

就可以安装 FORMULANAME 对应的工具,它会处理好依赖关系,非常方便。默认情况下,安装最新版本。但是现在在使用 Gradle 的时候,最新版本的 Gradle 是1.10,但是编译Android 的项目失败,只能降级成 1.9 版本的才行,解决方法如下

1.查看 brew 支持哪些版本的 gradle

可以看到,支持 1.9 版本的。

2. 进入 brew 所在的git仓库

3.复制粘贴刚才 brew versions gradle 命令的提示,我们需要1.9 版本的,因此执行

此时,本地仓库中的gradle 就被替换成了 1.9 的链接地址信息。

4. 安装

可以看到输出的信息已经是 1.9 的版本了。

java.lang.ClassNotFoundException:org.gradle.api.artifacts.result.ResolvedModuleVersionResult

使用 Gradle 升级到 1.10 版本,编译 Android 项目的时候报告类似如下的异常信息

搜索了一下,找到答案如下

也就是说Gradle 1.9 以上的版本编译 Android 代码目前是存在问题的。