Introduction ============ This document describes in depth how to prepare your Synology Diskstation for installing NetBSD/sandpoint. The following models are supported:
Model CPU Clock Disk RAM
DS-101g+ MPC8241 266MHz SATA 64MB
DS-106 MPC8241 266MHz SATA 64MB
DS-106e MPC8241 266MHz SATA 32MB
DS-106j MPC8241 200MHz PATA 32MB
DS-106x MPC8241 266MHz SATA 128MB
CS/RS-406 MPC8245 400MHz SATA 128MB
CS-406e MPC8241 266MHz SATA 64MB
DS-107 MPC8241 266MHz SATA 64MB
DS-107e MPC8241 266MHz SATA 32MB
DS-207 MPC8241 266MHz SATA 64/128MB
CS-407e MPC8241 266MHz SATA 64MB
DS-108j MPC8241 200MHz SATA 32MB
DS-109j MPC8241 266MHz SATA 32MB
DS-209j MPC8241 266MHz SATA 64MB
To install NetBSD/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:
 Serial header in a DS-101g+  Serial header in a DS-106j
**Serial header pin assignments:**
Pin number Function
1 3.3V
2 GND
4 TX
6 RX
Header pin assignments
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](http://www.NetBSD.org/ports/sandpoint/ttl2rs232.html) 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 NetBSD'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 NetBSD 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 > setenv ipaddr 192.168.0.106
_MPC824X > setenv serverip 192.168.0.5
_MPC824X > setenv netmask 255.255.255.0
_MPC824X > tftpboot 0x1000000 altboot.bin
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 > loadb 1000000
## 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>send path_to/altboot.bin
Boot the INSTALL kernel with altboot ------------------------------------ Now you can use `altboot` to launch the `netbsd-INSTALL` kernel for installing NetBSD. 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 NetBSD/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 > go 1000000 tftp:netbsd-INSTALL
or from NFS:
_MPC824X > go 1000000 nfs:netbsd-INSTALL
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: 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, 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: 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 NetBSD 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 > protect off all
Un-Protect Flash Bank # 1
_MPC824X > erase ff400000 ff41ffff
Erase Flash from 0xff400000 to 0xff41ffff 
. done
Erased 1 sectors
_MPC824X > cp.b 1000000 ff400000 18000
Copy to Flash... done
_MPC824X > protect on all
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 > setenv bootcmd cp.b ff400000 1000000 18000\; go 1000000 wd0:
_MPC824X > saveenv
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 NetBSD 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 > protect off all
Un-Protect Flash Bank # 1
_MPC824X > erase ffc00000 ffc1ffff
Erase Flash from 0xffc00000 to 0xffc1ffff 
. done
Erased 1 sectors
_MPC824X > cp.b 1000000 ffc00000 18000
Copy to Flash... done
_MPC824X > protect on all
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](http://www.NetBSD.org/~phx/Sandpoint/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 NetBSD server!