2009年12月27日星期日

How to Revive Western Digital Mybook World Edition

How to Revive Western Digital Mybook World Edition: "How to Revive Western Digital Mybook World Edition
Mario Pascucci
<mpascucci AT gmail DOT com>

First published on july 25 2007
Revision History
Revision 0.0.4 2007-08-26 MP
Complete check of document. Corrected a lot of errors. Added some steps to quick install to avoid hangs on startup.
Revision 0.0.3 2007-08-24 MP
New root filesystem with Debian ARM
Revision 0.0.2 2007-08-06 MP
Leon chip support, new kernel and new root filesystem
Revision 0.0.1 2007-07-25 MP
First release.

Presentation

Few weeks ago, a friend gave me a couple of little NAS appliances from Western Digital, this model.

Both with broken disk. To recover functionality, the only way is to return it to manufacturer and pay the price of a new one, more or less, if you don't have a valid warranty.

My curious attitude wins, and after a lot of work I recovered basic functions: the MyBook is now a little computer with Debian GNU/Linux inside.

Table of Contents

1. Warnings
2. The initial state.
3. A serial, at least!
4. Software startup.
5. First stage bootloader
6. Second stage bootloader
7. Leon support
8. The kernel
9. The Debian root filesystem
10. Quick install steps
11. References
12. Thanks
13. Tools used
14. Updates
15. License and Copyright

1. Warnings

This is a simple diary of the operations made to recycle a device ready to be discarded. Here you can't find how to restore the original functions of MyBook device. More, all the procedures described here have the result of voids the original warranty, if any.

Procedures are difficult and requires many skills: electronics, programming, Linux/Unix development tools and so on. Without these it's impossible follow the steps described here. In the software building phase I face a lot of troubles, some of them very puzzling, that changes with versions and configuration options. It's really impossible for me to write a step by step procedure. I can only suggest some solutions for some big problems, no more.

At the end you will have a working Linux system, but really minimal: kernel, shell and few other packages. But this would be sufficient to add function and applications without too many troubles.

I'm sorry, but I cannot give any help, to anyone. If you want to try, you can count only on this document. I cannot explain how to format a filesystem or how to mount a disk under Linux: you must know these basic commands. The reason is really simple: I don't have time, so I can't duplicate here all the command and the related manual. There are thousands pages on the Net that already do that.

This is an early alpha software: it is really easy to get no results at all! But, if you try these procedures and you can't get the Mybook revived you can help me to correct errors. So, please double check your steps and, before contact me, please collect all the data that I need to figure why your Mybook isn't working. Useful data are:

*

Files modified by you before booting
*

Partition scheme, filesystems, and so on.
*

System logs (located in /var/log). You can get it from Mybook disk. Very useful are: dmesg, syslog, kern.log, daemon.log and messages.
*

If you have serial console (Section 3, “A serial, at least!”), a log of the boot will be really precious.

This document cover only MyBook World Edition, not World Edition II. The devices seem to be very similar, but the system configuration is quite different. I do not have a WEII, so I cannot try my procedures with it.

At least: I'm not and I will not responsible of anything. If you choose 'surgery' to your MyBook you are on your own. NO warranty of ANY success.
2. The initial state.

The two MyBook were completely disassembled (Figure 1, “The MyBook”). Of course, no disks, which were broken.

Figure 1. The MyBook
The MyBook

Looking at the electronics, searching with Google the signature of the bigger chip, OXE800 took me on manifacturer website and a website of someone that has partially hacked the MyBook, at least on the software side.

From some messages on Western Digital forum I gathered all the information that I need:

*

Processor: ARM 926 class.
*

Architecture: proprietary, with PCI bus.
*

Memory: RAM 32M, ROM unknown.
*

Disk controller: two channel S-ATA, only the first used.
*

Other ports: one USB2 host.
*

Operating System: Linux

From Western Digital support site is available for download a quite large package with GPLed sources and utilities for the MyBook, 400Mbytes, but there aren't inside the proprietary Western Digital applications for the MyBook, so: no way to restore all the original functions.

And again: most configuration files are missing, or in the default state, that is unusable.

To get a working core (kernel, shell, development tools and a terminal) it was a hard work. But here it is.
3. A serial, at least!

It's impossible to made a 'blind' installation without any clue of what happen in the device. The MyBook lack all of the standard human interaction devices, no keyboard, no monitor, no mouse. Try to boot from a pen drive lead no results at all.

From the basic data sheet of main chip, there is a serial port. Looking at the PCB you can see four soldering pads inside a rectangle, with 'Serial' word nearby (Figure 2, “A serial connector... maybe.”, red arrow), near the USB connector.

Figure 2. A serial connector... maybe.
A serial connector... maybe.

To identify the pin function I used a tester. Pin 1 is Vcc (3,3V), pin 2 in GND. To identify pin 3 and 4 I used a cellular phone USB data cable, as suggested here, so pin 3 is RxD (receive data, from computer to MyBook), while pin 4 is TxD (transmit data, form MyBook to computer).

To communicate with MyBook you can use the cu utility, that Fedora Linux contains in the uucp package, not installed by default. The serial is configured as 8 bit, no parity, 115200 bps, so the command will be:

$ cu -l /dev/ttyUSB0 -s 115200

Warning: serial voltage is 3,3V

The MyBook serial don't use standard RS232 voltage levels, but from 0V to 3,3V so you need an adapter. I used an old cell phone data cable, that uses this kind of serial, so all the work was for identify the signals from cable and from MyBook. The cable was for an Ericsson R300/T28, compatible with original Ericsson cable model DCU-10/DCU-11. I found very useful the information at this website.

By the way, powering up the MyBook with serial cable connected has no result, that mean: no ROM monitor, nor advanced BIOS in ROM.
4. Software startup.

Unpacking sources from WD you obtain this directory tree:

$ ls
buildroot-patches
crosstool-patches
gpl-buildroot-archives.tar
gpl-crosstool-archives.tar
gpl-leon-archives.tar
leon
stage1
vendor

These are the various components:

*

buildroot is an environment to build a root filesystem from scratch, with cross-compilation support. We will use it to create the root filesystem with directory tree and development tools, for the ARM processor.
*

crosstool another cross development environment. I didn't use it.
*

leon is an open implementation of a processor with SPARC architecture. Seems to be used as a network coprocessor on some version of MyBook, but I'm not sure. My Mybook work fine without this piece.
*

stage1 is a 'first stage' bootloader. But we need first the GCC cross compiler for ARM processor and main libraries.
*

vendor contains two directories: linux-kernel and u-boot. The first contains full Linux kernel sources version 2.6.17 modified for the MyBook architecture. The latter contains the U-Boot bootloader, suitable for little and embedded systems.

We will use the kernel, the first stage bootloader in stage1, U-Boot bootloader and Buildroot to obtain the cross development tools.

I used Linux Fedora 7 as development system to do all the work.
5. First stage bootloader

We need first the first stage bootloader in stage1. But we need the toolchain for ARM processor. Not only, we also need information about specific MyBook resources: address and peripheral types, memory maps and so on.

From the tarball gpl-buildroot-archives.tar, we get the file buildroot-20060823.tar.bz2, that we unpack where we want.

In the directory buildroot-patches there are some files with the differences for the original MyBook, but, as we already said, it's impossible to restore the original functionality. In this version we do not use any of the original file.

To obtain all the development tools for the ARM, we go in the buildroot directory and launch a make menuconfig, as for kernel sources to configure them. A menu appears and we are able to choose the configuration for development tools and root filesystem we are about to generate. My own configuration is in this page, under 'Buildroot' link.

To short the build process we can copy all the files from buildroot-archives directory to buildroot/dl directory, avoid re-downloading sources we already have.

Development toolchain contains GCC compiler, binutils utility and the uClibc library, a 'light' version of glibc for embedded systems.

When we start building as usual with make command inside buildroot directory, the build script ask for some information about the processor and the architecture to build appropriately the uClibc library. All the answers must be the default, but only one question must be replied differently:

Target CPU has a floating point unit (FPU) (HAS_FPU) [Y/n/?] (NEW)

we reply with n, as for no floating point unit in the processor. After that the build proceeds straight to the end.

Now we have all the toolchain ready. All tools are in the buildroot/build_arm_nofpu/staging_dir/bin directory, and that directory must be added to the PATH environment variable, to made tools available for all the next steps.

Now we go in stage1 directory and start building process with the command:

$ make CROSS_COMPILE=arm-linux-

(pay attention to the final dash) and after few seconds we obtain a file called stage1.bin, while in the stage1/tools directory we have two programs that we will use very soon.

The file is the first stage bootloader, that do some basic configuration on MyBook hardware before it loads the real bootloader (second stage).

My binary version of the first stage is here.

Now we need to install it on a new S-ATA disk. I used an external USB to S-ATA box, with a 250G disk inside. First we connect the disk to the computer where we build all the tools, and we partition it as needed.

The first stage bootloader must be loaded starting from absolute sector 1 of the disk, that is immediately after the MBR. The MBR must contains partition table, and must be modified for the presence of the first stage bootloader.

These are the steps:

1.

First we made the partitions on the disk. For first experiments we can do only two partitions, one for the root filesystem and one for swap space. Pay attention: first partition must start after 1000 sectors from the start of disk, and must be formatted as ext2 or better ext3. For example we can use 2 as start cylinder for the first partition This space is needed for second stage bootloader, that will be on disk from absolute sector 64 for at least 200 sector. It's better do not spare space.
2.

After partitioning, we copy the MBR on a file (we suppose that external disk is /dev/sdb):

# dd if=/dev/sdb of=mbr bs=512 count=1

3.

On the file (a copy of MBR) we use the program stage1/tools/installer, that modifies the MBR to obtain the loading of the first stage bootloader:

# stage1/tools/installer mbr

4.

We copy back the modified MBR:

# dd if=mbr of=/dev/sdb bs=512 count=1

5.

Now we can install first stage bootloader:

# dd if=stage1.bin of=/dev/sdb bs=512 seek=1

Now we can use the serial cable (Section 3, “A serial, at least!”) to do a simple functionality test. After connecting MyBook and computer, we launch the cu utility. Next we power up the MyBook. On the cuscreen must appear something like this: NASOx_0 Looking at the source in stage1/src/stage1.c we can understand what means letters and numbers. For example the 'X' (capital x ) means error accessing disk.
6. Second stage bootloader

Next step is the U-Boot building. We need to change the Makefile in vendor/u-boot/ deleting row 130, from that:

# The 'tools' are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS = tools \
examples \
post \
post/cpu

to that:

# The 'tools' are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS = tools \
post \
post/cpu

to avoid errors in examples building, that we don't need. After, we need to configure the bootloader before building. First we need to modify vendor/u-boot/include/configs/oxnas.h file. I prepared for this a patch. After patching, we can go to see the file. We can focus on lines 243-244:

#define CONFIG_BOOTARGS 'mem=32M console=ttyS0,115200 root=/dev/sda1 netdev=0,0,0x0030e000,0x0001,eth0 elevator=cfq'
#define CONFIG_BOOTCOMMAND 'ext2load ide 0:1 0x48500000 /uImage ; bootm 0x48500000'

First row contains the kernel command line at the boot time, while the second shows the command to load and execute the kernel itself.

The third and fourth parameter in netdev variable are the MAC address we want to assign to ethernet interface. The CONFIG_BOOTCOMMAND can be explained as:

*

ext2load means that a file must be loaded from an ext2/ext3 filesystem. U-Boot act as GRUB, accessing the filesystem that contains kernel image file to load it. This will be a great simplification when we will try different kernel configuration.
*

ide means that loading must be performed from an IDE/S-ATA disk
*

0:1 means disk:partition index, that is first disk, first partition. Of course, in this procedure the kernel image file must reside in the first partition. If we want use a different partition we must change these values accordingly.
*

0x48500000 is the memory address where the kernel image file must be loaded.
*

/uImage is the pathname of kernel image file. Must be a complete path, including a '/' if the file reside in the root. In this procedure it will be a file named uImage in the root directory of filesystem in first disk partition. Note that is case sensitive.

The next command, bootm, means that execution continue from the address where we load the kernel image file. If all operations are correct, at this point we will see the kernel starts its execution. But we must do some more steps before.

Next step, we configure U-Boot for the MyBook machine, using this command:

$ make oxnas_config
Configuring for oxnas board...

Next we can start building with make. Note that if building stop suddenly complaining about missing ARM compiler arm-linux-gcc, we forgot to add it in the PATH, as said previously.

At the end we have a file named u-boot.bin. As we already said, this is second stage bootloader that is in charge to loads and executes the kernel. Now we need to transfer it on disk, but requires one more step before: it needs an header with file checksum that will be verified by first stage bootloader. Without it, the first stage bootloader refuse to execute the second stage bootloader just read from disk. We use a program from stage1, that is stage1/tools/packager, this way:

$ stage1/tools/packager vendor/u-boot/u-boot.bin u-boot.img
Input file - vendor/u-boot/u-boot.bin
Output file - u-boot.img
Input File Size - 95832

that adds the header with checksum and writes a new file named u-boot.img, ready for transfer on disk:

# dd if=u-boot.img of=/dev/sdb bs=512 seek=64

from absolute sector 64.

Once done that, we are ready for a second test, if we have the serial cable. After connecting disk, and powering up the MyBook we see something like this:

NASOx_0800
dom lug 15 00:29:51 CEST 2007


U-Boot 1.1.2 (Jul 15 2007 - 19:41:08)

U-Boot code: 48D00000 -> 48D17658 BSS: -> 48D1B2C8
RAM Configuration:
Bank #0: 48000000 32 MB
*** Warning - bad CRC, using default environment

Boot reached stage -1
In: serial
Out: serial
Err: serial
Initialising disks
No FIS received from device 1
Detecting SATA busses:
Bus 0: Found first device OK
Device 0: Model: Maxtor 6V300F0 Firm: VA111630 Ser#: V60EWCCG
Type: Hard Disk
Supports 48-bit addressing
Capacity: 286188.8 MB = 279.4 GB (586114704 x 512)
Device 1: not available

IDE read: device 0 block # 63, count 1 ... 1 blocks read: OK
Hit any key to stop autoboot: 1

that confirm the right configuration and installation of both bootloader. The U-Boot booting sequence can be interrupted by hitting a key during countdown, as we can do for GRUB: in this case we have a little shell from we can give commands to the bootloader.

My binary version of U-Boot with checksum, ready for use, is here.
7. Leon support

This step is optional, because the Mybook works fine even without it. Unpack gpl-leon-archives.tar file, to obtain a directory named leon-archives. Next we go to directory leon/toolchain/src. In that directory we see four subdirectory, matching names of packages in leon-archives. We can ignore gdb, and work for other three. You must unpack every package in directories with same name, leave it as is. I.e., for binutils, we move in the binutils directory and we unpack binutils-2.16.1.tar.bz2 inside it, obtain a path like this: toolchain/src/binutils/binutils-2.16.1/.

Next we go in toolchain directory and we launch make command, that works for about 20 minutes, terminating with an error caused by the absence of gdb sources, error that we can safely ignore.

Next we add to PATH the absolute path to the directory leon/toolchain/install/gcc-3.4.6/i686-pc-linux/bin/ to have all compile tools available, that this time are for SPARC architecture.

After done, we return in the leon directory and we launch make command, followed by make -f power-button.mk. These commands will build two C language header files, that will be copied in the kernel sources directory. Headers are: leon-program.h and leon-power-button-prog.h. At the kernel build stage, we can leave now enabled the Leon chip support. During compile stage the Leon support will be included in new kernel.
8. The kernel

Now we are ready to build a kernel. Sources are in vendor/linux-kernel, including patches and support for MyBook, that we cannot found in standard kernels. After checking that build tools are in PATH, we need one more utility in vendor/u-boot/tools/ directory, named mkimage that will be used to generate an image U-Boot-compatible. After that, we can launch the basic configuration command:

$ make CROSS_COMPILE=arm-linux- oxnas_wd2nc_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/split-include
HOSTCC scripts/basic/docproc
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
...
... a lot of rows
...
*
* Library routines
*
CRC-CCITT functions (CRC_CCITT) [Y/?] y
CRC16 functions (CRC16) [N/m/y/?] n
CRC32 functions (CRC32) [Y/?] y
CRC32c (Castagnoli, et al) Cyclic Redundancy-Check (LIBCRC32C) [N/m/y/?] n

that configure kernel for MyBook platform. The configuration is really minimal, and not includes support for really many features, but if we know what we do, we can use the well-known command to add features:

$ make CROSS_COMPILE=arm-linux- menuconfig

changing options as needed. Anyway, if we don't include Leon chip code (Section 7, “Leon support”) we must uncheck an option in System Type, Oxford Semiconductor NAS Options, Include support for Leon, that prevents successfully kernel build.

Next, we can start building:

$ make CROSS_COMPILE=arm-linux- uImage
...
... a lot of rows
...
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-2.6.17.14
Created: Tue Jul 24 15:24:09 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1215572 Bytes = 1187.08 kB = 1.16 MB
Load Address: 0x48008000
Entry Point: 0x48008000
Image arch/arm/boot/uImage is ready

uImage target needs to generate kernel image compatible with U-Boot. At the end we will have a file named uImage in linux-kernel/arch/arm/boot/ directory.

Next we build modules:

$ make CROSS_COMPILE=arm-linux- modules

Now we are ready to install kernel and modules, but we don't use the Buildroot root filesystem, we need to make a new one in the disk that we will use for the revived Mybook. So we prepare the disk, partitions, filesystems, and after that we can copy the kernel image, the System.map file to the root of the new filesystem, next we can install modules using the command:

# make CROSS_COMPILE=arm-linux- \
> INSTALL_MOD_PATH=/path/to/mounted/root/filesystem modules_install

We almost finished.
9. The Debian root filesystem

Now we have: bootloader (first and second stage), kernel, modules. We need the final root filesystem with minimal functionality.

After three weeks of tests, I finally realize that is impssible for me to obtain an usable system, not using Buildroot. So, I looked to official distributions. Fedora has a porting project for ARM platforms, but there is a problem: only EABI is supported, and EABI requires GCC version 4 or newer. The GCC versio 4.x is affected by a bug with floating point emulation in cross compiling, so it's impossible to generate a kernel for Mybook with EABI support with cross compilation.

The other choice is Debian, that has an extended support for ARM. In three days I generated a complete root filesystem, with apt support.

So I made two packages: one with kernel and modules, one with root filesystem, based on Debian 'lenny'. Packages are here and to install them look at the next paragraph.
10. Quick install steps

For the impatient, and who can't build all binaries, here the quick steps:

*

Get packages from here. You need: the installer utility to modify the MBR, stage 1 bootloader stage1.bin, U-Boot bootloader ready for installation u-boot.img, kernel and root filesystem.
*

Connect the new MyBook disk to your computer and proceed to make all partitions needed. Preferred partition scheme is: a root partition, starting from second cylinder, size 3-5Gbytes, a swap partition, size 100Mbytes, the remaining space to a partition that will be mounted as /home.

My disk (250Gbytes) has this partition table:

/dev/sda1 2 488 3911827+ 83 Linux
/dev/sda2 489 501 104422+ 82 Linux swap / Solaris
/dev/sda3 502 30515 241087455 83 Linux

*

After partitioning, we read the MBR (assuming that external S-ATA disk is /dev/sdb):

# dd if=/dev/sdb of=mbr bs=512 count=1

Next we modify the MBR with installer utility:

# ./installer mbr

Now put back the MBR (assuming that external disk is /dev/sdb again):

# dd if=mbr of=/dev/sdb bs=512 count=1

Now we install the first stage bootloader:

# dd if=stage1.bin of=/dev/sdb bs=512 seek=1

followed by second stage bootloader:

# dd if=u-boot.img of=/dev/sdb bs=512 seek=64

*

Now we can format all three partitions, first and third with:

# mkfs -j /dev/sdb1

and

# mkfs -j -m0 /dev/sdb3

and the swap partition with the command:

# mkswap /dev/sdb2

It can happen that in the boot phase, the system stops after checking filesystems, complaining about needed fsck (for maximal mount count or too time from last check), but the system is without console, so the system waits indefinitely for a command that we cannot give. So the solution is to use ext3 filesystem with check interval and maximal mount count set to disabled, using this command:

# tune2fs -c -1 -i 0 /dev/sdb1

for root filesystem and:

# tune2fs -c -1 -i 0 /dev/sdb3

for /home filesystem. after that we check in the /etc/fstab that all rows ends with 0 0, to avoid requests for deep checking in boot phase.

There is no need to repeat these steps (to here) if we do not touch partitions and MBR. We must only delete files in the root partition before proceed to next step.
*

Now we can mount MyBook root partition to unpack the new filesystem. Command is:

# tar xjf mybook-rootfs-debian-DATE.tar.bz2

from the main directory where the disk is mounted, that is if disk is mounted in /media/mybook the command must be given in that directory. The filesystem contains init scripts and some applications. Similar command to install kernel and modules:

# tar xzf kernel-VERSION.tar.gz

Note that both commands must be given from root account, because we need to preserve permissions, file owner and type.
*

Check the file /etc/network/interfaces: ethernet interface is configured for DHCP. If you want a static IP address, you must change this file accordingly.
*

Check the file /etc/apt/sources.list to choose the Debian mirror next to you. At the moment the Debian generic FTP site is configured.
*

Done. Now we can unmount the disk, and connect it to the MyBook. After a couple of minute, we should see the blue leds in the external ring lights on. After that we can logon via SSH.

After logon you can do some other tasks:

*

Optional, but suggested: delete SSH keys in /etc/ssh and generate new keys. Delete ssh_host_dsa_key, ssh_host_dsa_key.pub, ssh_host_rsa_key and ssh_host_rsa_key.pub files from /etc/ssh directory and give the command:

# dpkg-reconfigure openssh-server

that proceed to generate new keys. Do not delete keys without generate new pairs: you cannot anymore access to Mybook via SSH.
*

Add to /etc/fstab the swap partition. I.e. if your swap partition is /dev/sda2, you can add this line to /etc/fstab:

/dev/sda2 swap swap defaults 0 0

*

Add to /etc/fstab other partition, if any. Remember to ends lines with 0 0 to avoid filesystem checks requests on boot. I.e, if your /home partition is /dev/sda3 add a line like this:

/dev/sda3 /home ext3 defaults 0 0

to your /etc/fstab.
*

Now you can proceed to installation and configuration of desired packages. For choice and configuration you can refer to Debian guides that you can found on the Net.

The filesystem image contains only root account with password mybook, and you can logon only via SSH.
11. References

*

Western Digital MyBook official page.
*

U-Boot bootloader website.
*

Oxford Semiconductor website.
*

Martin Hinner website.
*

Western Digital Users Forum.
*

Support download on WD website for MyBook GPLed sources.
*

Similar project, with serial port adapter hints.
*

Buildroot software website.
*

uClibc Glibc “light version” website.
*

The great Debian Reference Manual.

12. Thanks

A really big thanks to my wife, that tolerate the time I spent on computers, and fortunately she don't work with then.

Without the great work of Fedora Peoples (http://fedoraproject.org/wiki/), my favorite Lunix distribution, and Debian Peoples (http://www.debian.org/), this work cannot be made. Same gratitude go to countless people that contributes to Open Source software, the core of Linux, its applications, goods for any needings.

A thank, to say, to TV programming: now I have more and more time to spend in really pleasant and useful manner.
13. Tools used

To generate this document I used the default documentation environment available on Fedora, that is compliant with DocBook XML standard, details on website http://www.docbook.org/tdg/en/html/docbook.html. I create the XML source file of this document with VIM, using a configuration file for speeding up writing most frequently used tags.
14. Updates

You can find new versions of this document on my website: http://ismprofessional.net/pascucci, and some more things.
15. License and Copyright

This document is released under Creative Commons license."

没有评论:

发表评论