File:  [NetBSD Developer Wiki] / wikisrc / ports / sandpoint / instsynology.mdwn
Revision 1.1: download - view: text, annotated - select for diffs
Thu Oct 31 21:05:10 2013 UTC (5 months, 3 weeks ago) by mspo
Branches: MAIN
CVS tags: HEAD
fix sandpoint links

Introduction
============

This document describes in depth how to prepare your Synology
Diskstation for installing OS/sandpoint. The following models are
supported:

<table>
<tbody>
<tr class="odd">
<td align="left"><strong>Model</strong></td>
<td align="left"><strong>CPU</strong></td>
<td align="left"><strong>Clock</strong></td>
<td align="left"><strong>Disk</strong></td>
<td align="left"><strong>RAM</strong></td>
</tr>
<tr class="even">
<td align="left">DS-101g+</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">64MB</td>
</tr>
<tr class="odd">
<td align="left">DS-106</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">64MB</td>
</tr>
<tr class="even">
<td align="left">DS-106e</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">32MB</td>
</tr>
<tr class="odd">
<td align="left">DS-106j</td>
<td align="left">MPC8241</td>
<td align="left">200MHz</td>
<td align="left">PATA</td>
<td align="left">32MB</td>
</tr>
<tr class="even">
<td align="left">DS-106x</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">128MB</td>
</tr>
<tr class="odd">
<td align="left">CS/RS-406</td>
<td align="left">MPC8245</td>
<td align="left">400MHz</td>
<td align="left">SATA</td>
<td align="left">128MB</td>
</tr>
<tr class="even">
<td align="left">CS-406e</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">64MB</td>
</tr>
<tr class="odd">
<td align="left">DS-107</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">64MB</td>
</tr>
<tr class="even">
<td align="left">DS-107e</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">32MB</td>
</tr>
<tr class="odd">
<td align="left">DS-207</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">64/128MB</td>
</tr>
<tr class="even">
<td align="left">CS-407e</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">64MB</td>
</tr>
<tr class="odd">
<td align="left">DS-108j</td>
<td align="left">MPC8241</td>
<td align="left">200MHz</td>
<td align="left">SATA</td>
<td align="left">32MB</td>
</tr>
<tr class="even">
<td align="left">DS-109j</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">32MB</td>
</tr>
<tr class="odd">
<td align="left">DS-209j</td>
<td align="left">MPC8241</td>
<td align="left">266MHz</td>
<td align="left">SATA</td>
<td align="left">64MB</td>
</tr>
</tbody>
</table>

To install OS/sandpoint you will have to open the case, to get access to
the serial console, and connect a serial converter from TTL to RS232
signal levels.

Accessing the serial interface
==============================

Locate the serial header
------------------------

Open the case and search for a 6-pin header, which is labeled `COM1` or
`JP2`. The left photo shows a DS-101g+ and the right photo a DS-106j.
Note that the serial header is rotated by 180 degrees between these two
models:

<table>
<tbody>
<tr class="odd">
<td align="left"><img src="../../images/ports/sandpoint/syno_ser_header.jpg" alt=" Serial header in a DS-101g+ " /></td>
<td align="left"><img src="../../images/ports/sandpoint/syno_ser_header106.jpg" alt=" Serial header in a DS-106j " /></td>
</tr>
</tbody>
</table>

**Serial header pin assignments:**

<table>
<tbody>
<tr class="odd">
<td align="left"><table>
<tbody>
<tr class="odd">
<td align="left"><strong>Pin number</strong></td>
<td align="left"><strong>Function</strong></td>
</tr>
<tr class="even">
<td align="left">1</td>
<td align="left">3.3V</td>
</tr>
<tr class="odd">
<td align="left">2</td>
<td align="left">GND</td>
</tr>
<tr class="even">
<td align="left">4</td>
<td align="left">TX</td>
</tr>
<tr class="odd">
<td align="left">6</td>
<td align="left">RX</td>
</tr>
</tbody>
</table></td>
<td align="left"><img src="../../images/ports/sandpoint/syno_ser_pins.jpg" alt="Header pin assignments" /></td>
</tr>
</tbody>
</table>

Watch out for the thick, white angle, which marks pin 1.

Connect a serial cable
----------------------

The serial port on Synology NAS boxes is using 3.3V TTL levels, which
have to be converted into regular RS232 levels by a level shifter
circuit. If you are not anxious using a soldering iron you find detailed
instructions how to build such a converter here:

-   Serial adapter for 3.3V TTL

Serial adapter installed
This picture shows the installed serial adapter. When the installation
is completed, and the Diskstation is available over the network, you can
remove the serial adapter again. You will only need it in emergency
situations.

Another option is to buy such a converter. There are solutions for a
standard RS232 interface and for an USB interface. Look out for:

-   RS232 level shifter / breakout board (MAX3232 based)
-   USB to TLL serial level shifter / breakout board (FT232 based)

First installation
==================

Accessing the Firmware
----------------------

Provided the serial converter is installed and working correctly you
should be able to connect to the firmware's serial console. Synology is
using [PPCBoot](http://ppcboot.sourceforge.net/). Most models have
version `2.0.0` installed, but the newer ones have network support and
limited functionality ([read below](#post_install)).

Now you can connect with any terminal program to the Diskstation's
serial console. The easiest approach may be to use OS's `tip(1)` command
to make a direct console connection at 115200bps.

    # tip -115200 console

Note that when using a serial connection via USB you may have to make an
entry for `/dev/ttyU0` in `/etc/remote`. Immediately after switching
your Diskstation on it will beep shortly, and you should see the
following messages. Type CTRL-C within one second to avoid autobooting.
In old firmwares (2005) you have three seconds and may press any key.

    PPCBoot 2.0.0 (Jan 30 2007 - 14:27:41)

    CPU:   MPC8245 Revision 1.4 at 199.999 MHz: 16 kB I-Cache 16 kB D-Cache
    I2C:   ready
    DRAM:  DRAM BANK = 1
    MAX_DRAM_SIZE = 2000000
    MCCR1 = 75a80000
    MCCR4 = 35363331
    MSAR1 = 0
    EMSAR1 = 0
    MEAR1 = 1f
    EMEAR1 = 0
    MSAR2 = 0
    EMSAR2 = 0
    MEAR2 = 0
    EMEAR2 = 0
    MBER = 32000001
    PICR1 = 141b98
    PICR2 = 40604
    32 MB
    addr_sp=1f2ff78, id=1f2ff98, addr=1fc0000
    FLASH: flash id = 49
    vendor = 1, flash id = 49 (flash_id:49)
     2 MB
    *** Warning - bad CRC, using default environment

    In:    serial
    Out:   serial
    Err:   serial
    Net:   SK98#0
    Press Ctrl+C to abort autoboot in 1 second

altboot
-------

The `altboot(8)` utility functions as a bridge between the Synology
firmware and the OS kernel startup environment. NAS firmware often
provides no means to boot a kernel from disk or from the network and
doesn't initialize all hardware correctly. We will also use it to pass a
bootinfo list to the kernel.

The `altboot` boot loader has to be loaded into RAM at `0x1000000` and
started using PPCBoot / U-Boot. Usually there are three ways to invoke
it:

-   loadb
    to load a binary file via serial line in
    kermit
    mode
-   tftpboot
    to load a binary file over the network with TFTP protocol
-   start it from the flash memory

The last option is prefered once the installation is completed, but
obviously it is not possible for the first time boot. Newer firmwares
(2007) support the use of the network interface by setting the `ipaddr`
and `serverip` environment variables with `setenv`. Once you have set up
TFTP and DHCP ([read below](#altboot_install)) you can download
`altboot` like this:

    _MPC824X > 
    _MPC824X > 
    _MPC824X > 
    ARP broadcast 1
    TFTP from server 192.168.0.5; our IP address is 192.168.0.106
    Filename 'altboot.bin'.
    Load address: 0x1000000
    Loading: ###############
    done
    Bytes transferred = 74732 (123ec hex)

The old firmware (2005) doesn't activate the network at all, so we have
to download `altboot` into RAM with Kermit protocol over the serial
line.

Install `kermit(1)` from `pkgsrc(7)` or compile and install it yourself.
To set up the file transfer you have to provide the following commands
to `kermit`:

    set line /dev/tty00
    set speed 115200
    set carrier-watch off
    set flow-control none
    robust
    set file type bin

For convenience you can write them into a file which you can pass as an
argument to `kermit`.

Load `altboot` into memory using Kermit protocol. The binary is
relocated at `0x1000000`, so type:

    _MPC824X > 
    ## Ready for binary (kermit) download ...

Now quit your terminal program and launch `kermit cmdfile`. When you are
already running `kermit`, enter the command mode by typing `CTRL-\`
followed by `C`. Then send `altboot.bin`. Reconnect when the transfer is
finished.

    C-Kermit 8.0.211, 10 Apr 2004, for NetBSD 1.6
     Copyright (C) 1985, 2004,
      Trustees of Columbia University in the City of New York.
    Type ? or HELP for help.
    (/tmp/) C-Kermit>

Boot the INSTALL kernel with altboot
------------------------------------

Now you can use `altboot` to launch the `netbsd-INSTALL` kernel for
installing OS. You may choose to load it with TFTP or from NFS. For TFTP
you have to enable `tftpd(8)` in `/etc/inetd.conf`, and for NFS there is
a documentation at [The Network File
System](http://www.NetBSD.org/docs/guide/en/chap-net-services.html#chap-net-services-nfs).
But in both cases you have to set up a DHCP server, which is explained
in the [DHCP Howto](http://www.NetBSD.org/docs/network/dhcp.html). An
appropriate `dhcpd.conf` entry could look like this:

            host ds101g {
                    hardware ethernet 00:11:32:xx:xx:xx;
                    fixed-address 192.168.0.101;
                    next-server 192.168.0.1;
                    option root-path "/export/ds101g/root";
            }

The `root-path` option is only needed when using NFS and should match
your exported NFS directory. Uncompress `netbsd-INSTALL.gz` from the
OS/sandpoint distribution and copy it into the NFS or TFTP directory.
Then start the DHCP, NFS or TFTP server and boot the installation kernel
from the firmware either with

    _MPC824X > 

or from NFS:

    _MPC824X > 

Our bootloader configures the hardware, determines the IP address, loads
the kernel via network and launches it:

    ## Starting application at 0x01000000 ...

    >> NetBSD/sandpoint altboot, revision 1.5 (Fri Feb 18 23:21:15 CET 2011)
    >> Synology DS, cpu 265 MHz, bus 132 MHz, 64MB SDRAM
    channel 0 present
    wd0: <SAMSUNG HD502HI> DMA LBA LBA48 476940 MB
    wd0: no disklabel
    MAC address 00:11:32:xx:xx:xx
    100Mbps-FDX
    loading "netbsd-INSTALL" 5089380+110916=0x4f5d6c
    entry=0x00090000, ssym=0x005859a8, esym=0x00585d6c
    ksyms: Symbol table not found
    ksyms: String table not found
    ksyms: Perhaps the kernel is stripped?
    Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
        2006, 2007, 2008, 2009, 2010, 2011
        The NetBSD Foundation, Inc.  All rights reserved.
    Copyright (c) 1982, 1986, 1989, 1991, 1993
        The Regents of the University of California.  All rights reserved.

    NetBSD 5.99.43 (INSTALL) #5: Mon Jan 10 10:58:12 CET 2011
        frank@compaq.owl.de:/home/frank/netbsd/current/src/sys/arch/sandpoint/compile/obj/INSTALL
    total memory = 65536 KB
    avail memory = 58028 KB
    OpenPIC Version 1.2: Supports 1 CPUs and 26 interrupt sources.
    mainbus0 (root)
    cpu0 at mainbus0: 8245 (Revision 0.4), ID 0 (primary)
    cpu0: HID0 0x90c000<DOZE,DPM,ICE,DCE>, powersave: 1
    eumb0 at mainbus0
    com0 at eumb0 unit 0: ns16550a, working fifo
    com0: console
    ociic0 at eumb0
    iic0 at ociic0: I2C bus
    rs5c372rtc0 at iic0 addr 0x32: RICOH RS5C372[AB] Real-time Clock
    satmgr0 at eumb0 unit 1: button manager (synology)
    pci0 at mainbus0 bus 0
    pchb0 at pci0 dev 0 function 0
    pchb0: vendor 0x1057 product 0x0006 (rev. 0x14)
    satalink0 at pci0 dev 13 function 0: Silicon Image SATALink 3512 (rev. 0x01)
    satalink0: using irq 16 for native-PCI interrupt
    atabus0 at satalink0 channel 0
    atabus1 at satalink0 channel 1
    ohci0 at pci0 dev 14 function 0: vendor 0x1033 product 0x0035 (rev. 0x43)
    ohci0: interrupting at irq 17
    ohci0: OHCI version 1.0
    usb0 at ohci0: USB revision 1.0
    ohci1 at pci0 dev 14 function 1: vendor 0x1033 product 0x0035 (rev. 0x43)
    ohci1: interrupting at irq 17
    ohci1: OHCI version 1.0
    usb1 at ohci1: USB revision 1.0
    ehci0 at pci0 dev 14 function 2: vendor 0x1033 product 0x00e0 (rev. 0x04)
    ehci0: interrupting at irq 17
    ehci0: companion controllers, 3 ports each: ohci0 ohci1
    usb2 at ehci0: USB revision 2.0
    skc0 at pci0 dev 15 function 0: irq 18
    skc0: Marvell Yukon Lite Gigabit Ethernet rev. (0x9)
    sk0 at skc0 port A: Ethernet address 00:11:32:xx:xx:xx
    makphy0 at sk0 phy 0: Marvell 88E1011 Gigabit PHY, rev. 5
    makphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
    biomask 8000038 netmask 8000038 ttymask 8000038
    satalink0: port 0: device present, speed: 1.5Gb/s
    wd0 at atabus0 drive 0: <SAMSUNG HD502HI>
    wd0: 465 GB, 969021 cyl, 16 head, 63 sec, 512 bytes/sect x 976773168 sectors
    uhub0 at usb0: vendor 0x1033 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
    uhub1 at usb1: vendor 0x1033 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
    uhub2 at usb2: vendor 0x1033 EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
    boot device: sk0
    root on md0a dumps on md0b
    root file system type: ffs
    erase ^H, werase ^W, kill ^U, intr ^C, status ^T
    Terminal type? [vt100]

Just follow the usual procedure to install a OS system.

Sandpoint installation window
Post installation steps
=======================

After a successful installation you want to make the system boot
standalone when switched on, without the need for a serial console. So
you have to find a way to make your firmware automatically boot
`altboot` and the kernel.

Note that newer Synology models, especially those from 2007, may have
the `saveenv` command disabled. If you have one of those skip forward to
[this](#new_firmware) section.

Old firmware (2005)
-------------------

When you have an old firmware you just have to modify the `bootcmd`
setting in PPCBoot's environment and write the `altboot.bin` binary to
any free location of the Flash ROM.

To find a suitable place on the flash you can use the `flinfo` command
and look out for empty sectors `(E)`. On my Synology box I have chosen
`0xff400000`. Replace that in all the following commands if you have
chosen a different address.

Load `altboot.bin` into memory at `0x1000000` again, as explained above.
Then execute the following commands to write it to Flash ROM:

    _MPC824X > 
    Un-Protect Flash Bank # 1
    _MPC824X > 
    Erase Flash from 0xff400000 to 0xff41ffff 
    . done
    Erased 1 sectors
    _MPC824X > 
    Copy to Flash... done
    _MPC824X > 
    Protect Flash Bank # 1

Finally adapt the `bootcmd` environment string to auto-boot `altboot`
and start the `netbsd` kernel (which is the default name) from `wd0` on
each reboot:

    _MPC824X > 
    _MPC824X > 
    Saving Environment to Flash...
    unProtect FFF40000 ... FFF5FFFF
    Un-Protected 1 sectors
    Erasing Flash...
    . done
    Erased 1 sectors
    Writing to Flash... done
    Protected 1 sectors

The `\` is important for `setenv` not to misinterpret the `;` as the end
of the command.

New firmware (2007)
-------------------

Without a working `saveenv` command the only way to make your system
automatically boot OS is to replace the Linux kernel on flash by
`altboot.img`, which is our bootloader in PPCBoot image format, faking a
Linux kernel.

When viewing the environment variables with `printenv` you can see that
the `bootcmd` is calling `bootm` to load the Linux kernel. The first
address is the location which we have to overwrite with `altboot.img`.
Here it is `0xffc00000`, which you have to replace in all the following
commands, in case your `bootcmd` differs.

    bootcmd=bootm FFC00000 FFE00000

Load `altboot.img` into memory, for example at `0x1000000` again, as
explained [above](#altboot). You might want to backup the Linux kernel
image first. Then execute the following commands to overwrite it with
`altboot.img`:

    _MPC824X > 
    Un-Protect Flash Bank # 1
    _MPC824X > 
    Erase Flash from 0xffc00000 to 0xffc1ffff 
    . done
    Erased 1 sectors
    _MPC824X > 
    Copy to Flash... done
    _MPC824X > 
    Protect Flash Bank # 1

Optionally you may think about replacing the Linux RAM disk image at the
second address (`0xffe00000` in the example above) by an empty PPCBoot
image, like [this](dummy.img.gz) one (do not forget to uncompress it
with `gunzip(1)`). Or use `mkubootimage` to make your own dummy. Write
it to flash as shown above. This will speed up the boot process, but is
not really required.

Have fun with your mini OS server!

CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb