1: Introduction
2: ============
3:
4: <table>
5: <tbody>
6: <tr class="odd">
7: <td align="left"><p>This document describes in depth how to prepare your Buffalo LinkStation for installing NetBSD/sandpoint. In this example we use a LinkStation HD-HLAN, which is the same board as a classic KuroBox. The software installation instructions are valid for the whole LinkStation/KuroBox family:</p>
8: <ul>
9: <li>LinkStation HD-HLAN (LS1/PPC)</li>
10: <li>LinkStation HD-HGLAN (Gigabit ethernet)</li>
11: <li>TeraStation HD-HTGL</li>
12: <li>TeraStation Pro TS-TGL</li>
13: <li>KuroBox classic (HD-HLAN board)</li>
14: <li>KuroBox HG (HD-HGLAN board)</li>
15: <li>KuroBox/T4 (TS-TGL board)</li>
16: </ul></td>
17: <td align="left"><img src="http://www.netbsd.org/images/ports/sandpoint/ls1_front.jpg" alt="HD-HLAN front view" /></td>
18: </tr>
19: </tbody>
20: </table>
21:
22: Accessing the serial interface
23: ==============================
24:
25: We need a serial console to get access to the firmware. That includes
26: soldering a four pin header onto the board and building (or buying) a
27: serial adapter from the LinkStation's TTL levels to RS232 levels.
28:
29: Disassemble the HD-HLAN
30: -----------------------
31:
32: Unfortunately the LinkStation was not meant to be opened by customers,
33: so Buffalo didn't make it easy. On the top and bottom of the case there
34: is a small tab besides the grey frame, which you have to press down
35: (e.g. with a screwdriver) to be able to move the frame to the front. On
36: the photo below the location is marked red.
37:
38: <img src="//www.netbsd.org/images/ports/sandpoint/kuro_top.jpg" alt="KuroBox with tab marked" /></td>
39:
40: After a few millimeters the grey piece snaps free and comes up. You need
41: quite some force to do that, because the shiny front bezel is secured by
42: two hidden screws (one in the top and another in the bottom of the
43: bezel). With enough force and skill you may be able to tear the screws
44: out of the case (fortunately the screws are small). They remain in the
45: shiny bezel. You may want to shorten the screws with a file now.
46:
47: <img src="//www.netbsd.org/images/ports/sandpoint/ls1_opened.jpg" alt="HD-HLAN half opened" /></td>
48:
49: Before the case can be opened you have to remove a screw hidden under a
50: sticker, below the fan (marked on the right side of the picture). Then
51: press the four tabs on the top and bottom to remove the upper half of
52: the case. Remove another four screws to be able to lift the board.
53:
54: Locate the serial header
55: ------------------------
56:
57: Look out for a 4-pin header, called `J1`, which is usually unpopulated.
58: The pin assignments are:
59:
60: <table>
61: <tbody>
62: <tr class="odd">
63: <td align="left"><table>
64: <tbody>
65: <tr class="odd">
66: <td align="left"><strong>Pin number</strong></td>
67: <td align="left"><strong>Function</strong></td>
68: </tr>
69: <tr class="even">
70: <td align="left">1</td>
71: <td align="left">TXD</td>
72: </tr>
73: <tr class="odd">
74: <td align="left">2</td>
75: <td align="left">RXD</td>
76: </tr>
77: <tr class="even">
78: <td align="left">3</td>
79: <td align="left">3.3V</td>
80: </tr>
81: <tr class="odd">
82: <td align="left">4</td>
83: <td align="left">GND</td>
84: </tr>
85: </tbody>
86: </table></td>
87: <td align="left"><img src="http://www.netbsd.org/images/ports/sandpoint/ls1_ser_pins.jpg" alt="Header pin assignments" /></td>
88: </tr>
89: </tbody>
90: </table>
91:
92: Solder the missing header and enable write access
93: -------------------------------------------------
94:
95: I would suggest to solder the 4-pin header on the back side of the PCB,
96: because it is better accessible when opening the case. It is advisable
97: to use an angled header to avoid problems closing the case. You also
98: have to bridge `R76`, which is unoccupied. This is needed to enable
99: write-access for the serial console. You may want to mark pin 1 of the
100: header, before installing the board again.
101:
102: <table>
103: <tbody>
104: <tr class="odd">
105: <td align="left"><img src="http://www.netbsd.org/images/ports/sandpoint/ls1_ser_header.jpg" alt="Soldered header" /></td>
106: <td align="left"><img src="http://www.netbsd.org/images/ports/sandpoint/ls1_R76.jpg" alt="Bridging R76" /></td>
107: </tr>
108: </tbody>
109: </table>
110:
111: Connect a serial cable
112: ----------------------
113:
114: The serial port on LinkStation and KuroBox devices is using 3.3V TTL
115: levels, which have to be converted into regular RS232 levels by a level
116: shifter circuit. If you are not anxious using a soldering iron you find
117: detailed instructions how to build such a converter here:
118:
119: - [Serial adapter for 3.3V TTL](http://www.netbsd.org/ports/sandpoint/ttl2rs232.html)
120:
121: Make sure that the layout of the plug fits to the pinout of the
122: LinkStation's serial header, as shown above.
123:
124: Another option is to buy such a converter. There are solutions for a
125: standard RS232 interface and for an USB interface. Look out for:
126:
127: - RS232 level shifter / breakout board (MAX3232 based)
128: - USB to TLL serial level shifter / breakout board (FT232 based)
129:
130: Now you can connect with any terminal program to the LinkStation's
131: serial console. The easiest approach may be to use NetBSD's `tip(1)` command
132: to make a direct console connection at 57600bps.
133:
134: # tip -57600 console
135:
136: Note that when using a serial connection via USB you may have to make an
137: entry for `/dev/ttyU0` in `/etc/remote`.
138:
139: Replace the firmware with U-Boot
140: ================================
141:
142: The LinkStations run with a proprietary firmware, which doesn't give you
143: any control about the boot process. So our next step is to replace it
144: with [U-Boot](http://www.denx.de/wiki/U-Boot/).
145:
146: Getting root access
147: -------------------
148:
149: We need root access on the vendor's Linux installation to be able to
150: flash a new firmware. Without the original disk it will become much more
151: difficult. You would either have to find a way to install the system
152: onto a new disk with the help of a second machine, or use the JTAG port
153: to flash the new firmware directly into the chip (in the last case you
154: can skip all sections until
155: [the section called “First installation”](#install) ).
156:
157: For the KuroBox you can skip this section. The root password is known to
158: be `kuro`. Also telnet access is enabled. The default IP of the KuroBox
159: is `192.168.11.150`.
160:
161: Make a new user over the LinkStation's web interface. We can use it to
162: log in over the serial port.
163:
164: <img src="//www.netbsd.org/images/ports/sandpoint/ls1_new_user.jpg" alt="Add a new user on the GUI" /></td>
165:
166: Log in into the new account and create a CGI file under `/www` which
167: makes `/etc/passwd` writeable for all users.
168:
169: <pre>
170: BUFFALO INC. Link Station series HD-HLAN (HIDETADA)
171:
172: BUFFALO login: <strong>Besucher</strong>
173: Password:
174: Linux (none) 2.4.17_mvl21-sandpoint #990 2004xxxx 13:39:00 JST ppc unknown
175: Besucher@BUFFALO:~$ <strong>mkdir /www/cgi-bin3</strong>
176: Besucher@BUFFALO:~$ <strong>vi /www/cgi-bin3/exploit.cgi</strong>
177: </pre>
178:
179: `exploit.cgi` should look like this:
180:
181: #!/bin/sh
182: chmod 666 /etc/passwd
183:
184: Then enter the URL `http://mylinkstation/cgi-bin3/exploit.cgi` into your
185: browser. When all went well, `/etc/passwd` is writeable now. Edit it
186: with **vi** and copy your user password (`/Jg58Gq9427qY` in this example)
187: over the current root password. Now you can log in with the same
188: password into the root account.
189:
190: root:dwqa1LabM8BgA:0:0:root:/root:/bin/bash
191: bin:*:1:1:bin:/bin:
192: daemon:*:2:2:daemon:/usr/sbin:
193: sys:*:3:3:sys:/dev:
194: adm:*:4:4:adm:/var/adm:
195: sync:*:6:8:sync:/bin:/bin/sync
196: shutdown:*:7:9:shutdown:/sbin:/sbin/shutdown
197: halt:*:8:10:halt:/sbin:/sbin/halt
198: operator:*:12:0:operator:/root:
199: ftp:*:15:14:ftp:/usr/sbin:/bin/false
200: nobody:*:99:99:nobody:/home:/bin/sh
201: Besucher:/Jg58Gq9427qY:101:1000::/home:/bin/bash
202:
203: The CGI exploit, which I described above, probably does not work with
204: all Linkstation firmware releases. It may fail with versions after 1.45.
205: I was able to do it with 1.47 though. An alternative to this method
206: would be to connect the hard disk to a second machine, which can mount
207: the Linux file system, and replace the root password there.
208:
209: Flashing U-Boot
210: ---------------
211:
212: To transfer the new firmware onto the LinkStation we first have to
213: configure FTP access (already enabled for KuroBox). Enable the server
214: and allow write access for registered users to the shared folders (e.g.
215: `share`).
216:
217: <img src="//www.netbsd.org/images/ports/sandpoint/ls1_ftp_enable.jpg" alt="Enable FTP access with the GUI" /></td>
218:
219: Get an appropriate U-Boot firmware image from
220: <http://www.genbako.com/u-boot_loader/> (site is obsolete, use copies below):
221:
222: - [LinkStation HD-HLAN or KuroBox classic](http://www.netbsd.org/~phx/LinkStation/u-boot-hd.flash.bin)
223: - [LinkStation HD-HGLAN or KuroBox HG](http://www.netbsd.org/~phx/LinkStation/u-boot-hg.flash.bin)
224:
225: Transfer the firmware into the `share` folder on the LinkStation.
226:
227: <pre>
228: $ <strong>ftp mylinkstation</strong>
229: Connected to 192.168.0.9.
230: 220 BUFFALO FTP server ready
231: Name (192.168.0.9:user): <strong>Besucher</strong>
232: 331 Password required for Besucher.
233: Password:
234: 230 User Besucher logged in.
235: Remote system type is UNIX.
236: Using binary mode to transfer files.
237: ftp> <strong>cd share</strong>
238: 250 CWD command successful.
239: ftp> <strong>put u-boot-hd.flash.bin</strong>
240: local: u-boot-hd.flash.bin remote: u-boot-hd.flash.bin
241: 229 Entering Extended Passive Mode (|||1045|)
242: 150 Opening BINARY mode data connection for u-boot-hd.flash.bin
243: 100% |***********************************| 170 KiB 6.07 MiB/s 00:00
244: ETA
245: 226 Transfer complete.
246: 174640 bytes sent in 00:00 (4.86 MiB/s)
247: ftp> <strong>quit</strong>
248: </pre>
249:
250: The next step is dangerous. Any fault, like a wrong firmware or an
251: interrupted flashing process, will turn your LinkStation into a brick.
252:
253: The boot loader firmware can be accessed from Linux through `/dev/fl2`.
254: There is no **dd** so we will use **cat**. Log in as root on the serial
255: console, go to the shared folder where we uploaded the new firmware and
256: flash it.
257:
258: <pre>
259: root@BUFFALO:~# <strong>cd /mnt/share</strong>
260: root@BUFFALO:/mnt/share# <strong>ls -l</strong>
261: total 176
262: -rw-rw-rw- 1 Besucher hdusers 174640 May 13 15:43 u-boot-hd.flash.bin
263: root@BUFFALO:/mnt/share# <strong>cat u-boot-hd.flash.bin > /dev/fl2</strong>
264: </pre>
265:
266: The Diag and Disk Full LEDs will flash red during this process. This is
267: normal. After a few seconds the LEDs are off again and the prompt
268: returns. To make sure the process was successful, you should reread the
269: firmware from the flash and compare it with the original. Therefore you
270: have to download the new image, as this Linux installation also got no
271: **cmp**.
272:
273: <pre>
274: root@BUFFALO:/mnt/share# <strong>cat /dev/fl2 > /mnt/share/newfl2</strong>
275: </pre>
276:
277: Here the downloaded image differs at character 174641. But that is ok,
278: because the firmware is only 174640 bytes large and we downloaded the
279: whole flash contents.
280:
281: <pre>
282: $ <strong>cmp -l newfl2 u-boot-hd.flash.bin</strong>
283: cmp: EOF on u-boot-hd.flash.bin: char 174641, line 891
284: </pre>
285:
286: Reboot your LinkStation and cross fingers. When all went well, the
287: following lines will appear on your serial console:
288:
289: U-Boot 1.1.4 LiSt 2.1.0 (Sep 21 2006 - 00:22:56) LinkStation / KuroBox
290:
291: CPU: MPC8245 Revision 1.4 at 196.608 MHz: 16 kB I-Cache 16 kB D-Cache
292: DRAM: 64 MB
293: FLASH: 4 MB
294: *** Warning - bad CRC, using default environment
295:
296: 00 0b 1317 0985 0200 ff
297: 00 0c 1095 0680 0101 ff
298: 00 0e 1033 0035 0c03 ff
299: 00 0e 1033 0035 0c03 ff
300: 00 0e 1033 00e0 0c03 ff
301: Net: COMET#0
302:
303: This precompiled U-Boot defaults to the `netcat` console. So we have to
304: wait about 20 seconds before an error is printed and the console returns
305: to serial.
306:
307: next_cons_choice: Unexpected code: 0x33
308: stdin : serial
309: stdout: serial
310: stderr: serial
311: IDE: Bus 0: OK
312: Device 0: Model: SAMSUNG SP1604N Firm: TM100-30 Ser#: S013J20XC0xxxx
313: Type: Hard Disk
314: Supports 48-bit addressing
315: Capacity: 152627.8 MB = 149.0 GB (312581808 x 512)
316: Boot in 08 seconds ('s' to stop)...
317:
318: Here you should press `s` to stop booting and change some environment
319: variables to make U-Boot default to serial.
320:
321: <pre>
322: => <strong>run ser</strong>
323: => <strong>setenv bootcmd</strong>
324: => <strong>setenv bootdelay -1</strong>
325: => <strong>saveenv</strong>
326: </pre>
327:
328: Enter **reset** to reboot into interactive mode with serial console. At
329: this point we no longer need the original Linux installation and we are
330: ready for NetBSD.
331:
332: First installation
333: ==================
334:
335: The altboot bootloader
336: ----------------------
337:
338: The `altboot(8)` program functions as a bridge between the U-Boot
339: firmware and the NetBSD kernel startup environment. NAS firmware often
340: provides no means to boot a kernel from disk or from the network and
341: doesn't initialize all hardware correctly. We will also use it to pass a
342: bootinfo list to the kernel.
343:
344: The `altboot` boot loader has to be loaded and started using U-Boot. For
345: the first installation we have to load it over the network with TFTP
346: protocol, using the command **tftpboot**. Later we can put `altboot` into
347: the flash memory and copy it from there.
348:
349: When not already done, enable TFTP on your working system in
350: `/etc/inetd.conf` and restart `inetd`. Then copy `altboot.bin` from the
351: sandpoint distribution into `/tftpboot`. On the LinkStation we have to
352: tell U-Boot its client address and the `tftpd` server address. Our
353: working system's server address is `192.168.0.5` in this example, and
354: the LinkStation is at `192.168.0.102`.
355:
356: <pre>
357: => <strong>setenv ipaddr 192.168.0.102</strong>
358: => <strong>setenv serverip 192.168.0.5</strong>
359: => <strong>saveenv</strong>
360: Saving Environment to Flash...
361: Un-Protected 1 sectors
362: Erasing Flash...
363: Flash erase: first = 54 @ 0xfff60000
364: last = 54 @ 0xfff60000
365: Flash erase: Done
366: Erased 1 sectors
367: Writing to Flash... done
368: Protected 1 sectors
369: </pre>
370:
371: Load `altboot.bin` into memory. The binary is relocated at 0x1000000, so
372: type:
373:
374: <pre>
375: => <strong>tftpboot 1000000 altboot.bin</strong>
376: Using COMET#0 device
377: TFTP from server 192.168.0.5; our IP address is 192.168.0.102
378: Filename 'altboot.bin'.
379: Load address: 0x1000000
380: Loading: ##############
381: done
382: Bytes transferred = 70844 (114bc hex)
383: </pre>
384:
385: Boot the INSTALL kernel with altboot
386: ------------------------------------
387:
388: Now you can use `altboot` to launch the `netbsd-INSTALL_KURO` kernel for
389: installing NetBSD. It is important to take `netbsd-INSTALL_KURO` instead of
390: `netbsd-INSTALL`, because LinkStation and KuroBox systems have the UARTs
391: swapped, i.e. they are using the second UART for the serial console. You
392: may choose to load the installation kernel with TFTP or from NFS. TFTP
393: was described above and for NFS there is a documentation at
394: [The Network File System](http://www.NetBSD.org/docs/guide/en/chap-net-services.html#chap-net-services-nfs).
395: But in both cases you have to set up a DHCP server, which is explained
396: in the [DHCP Howto](http://www.NetBSD.org/docs/network/dhcp.html). An
397: appropriate `dhcpd.conf` entry could look like this:
398:
399: host linkstation {
400: hardware ethernet 00:07:40:xx:xx:xx;
401: fixed-address 192.168.0.102;
402: next-server 192.168.0.5;
403: option root-path "/export/linkstation/root";
404: }
405:
406: The `root-path` option is only needed when using NFS and should match
407: your exported NFS directory. Uncompress `netbsd-INSTALL_KURO.gz` from
408: the NetBSD/sandpoint distribution and copy it into the NFS or TFTP
409: directory. Then start the DHCP, NFS or TFTP server and boot the
410: installation kernel from the firmware either with
411:
412: <pre>
413: => <strong>go 1000000 tftp:netbsd-INSTALL_KURO</strong>
414: </pre>
415:
416: or from NFS:
417:
418: <pre>
419: => <strong>go 1000000 nfs:netbsd-INSTALL_KURO</strong>
420: </pre>
421:
422: Our bootloader configures the hardware, determines the IP address, loads
423: the kernel via network and launches it:
424:
425: ## Starting application at 0x01000000 ...
426:
427: >> NetBSD/sandpoint altboot, revision 1.5 (Fri Feb 18 23:21:15 CET 2011)
428: >> KuroBox, cpu 195 MHz, bus 97 MHz, 64MB SDRAM
429: channel 0 present
430: wd0: <SAMSUNG SP1604N> DMA LBA LBA48 152627 MB
431: wd0: no disklabel
432: MAC address 00:07:40:xx:xx:xx
433: 100Mbps-FDX
434: loading "netbsd-INSTALL_KURO" 5142988+110988=0x502f98
435: entry=0x00090000, ssym=0x00592b58, esym=0x00592f98
436: ksyms: Symbol table not found
437: ksyms: String table not found
438: ksyms: Perhaps the kernel is stripped?
439: Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
440: 2006, 2007, 2008, 2009, 2010, 2011
441: The NetBSD Foundation, Inc. All rights reserved.
442: Copyright (c) 1982, 1986, 1989, 1991, 1993
443: The Regents of the University of California. All rights reserved.
444:
445: NetBSD 5.99.45 (INSTALL_KURO) #0: Thu Feb 10 11:36:46 UTC 2011
446: builds@b6.netbsd.org:/home/builds/ab/HEAD/sandpoint/201102100300Z-obj/home/builds/ab/HEAD/src/sys/arch/sandpoint/compile/INSTALL_KURO
447: total memory = 65536 KB
448: avail memory = 57984 KB
449: OpenPIC Version 1.2: Supports 1 CPUs and 26 interrupt sources.
450: mainbus0 (root)
451: cpu0 at mainbus0: 8245 (Revision 0.4), ID 0 (primary)
452: cpu0: HID0 0x90c000<DOZE,DPM,ICE,DCE>, powersave: 1
453: eumb0 at mainbus0
454: com0 at eumb0 unit 1: ns16550a, working fifo
455: com0: console
456: ociic0 at eumb0
457: iic0 at ociic0: I2C bus
458: rs5c372rtc0 at iic0 addr 0x32: RICOH RS5C372[AB] Real-time Clock
459: satmgr0 at eumb0 unit 0: button manager (kurobox)
460: pci0 at mainbus0 bus 0
461: pchb0 at pci0 dev 0 function 0
462: pchb0: vendor 0x1057 product 0x0006 (rev. 0x14)
463: tlp0 at pci0 dev 11 function 0: ADMtek AN985 Ethernet, pass 1.1
464: tlp0: interrupting at irq 16
465: tlp0: Ethernet address 00:07:40:xx:xx:xx
466: ukphy0 at tlp0 phy 1: OUI 0x00e092, model 0x0001, rev. 1
467: ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
468: cmdide0 at pci0 dev 12 function 0: Silicon Image 0680 (rev. 0x02)
469: cmdide0: primary channel wired to native-PCI mode
470: cmdide0: using irq 17 for native-PCI interrupt
471: atabus0 at cmdide0 channel 0
472: cmdide0: secondary channel wired to native-PCI mode
473: atabus1 at cmdide0 channel 1
474: ohci0 at pci0 dev 14 function 0: vendor 0x1033 product 0x0035 (rev. 0x43)
475: ohci0: interrupting at irq 19
476: ohci0: OHCI version 1.0
477: usb0 at ohci0: USB revision 1.0
478: ohci1 at pci0 dev 14 function 1: vendor 0x1033 product 0x0035 (rev. 0x43)
479: ohci1: interrupting at irq 19
480: ohci1: OHCI version 1.0
481: usb1 at ohci1: USB revision 1.0
482: ehci0 at pci0 dev 14 function 2: vendor 0x1033 product 0x00e0 (rev. 0x04)
483: ehci0: interrupting at irq 19
484: ehci0: companion controllers, 3 ports each: ohci0 ohci1
485: usb2 at ehci0: USB revision 2.0
486: biomask 8000038 netmask 8000038 ttymask 8000038
487: uhub0 at usb0: vendor 0x1033 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
488: uhub1 at usb1: vendor 0x1033 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
489: uhub2 at usb2: vendor 0x1033 EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
490: wd0 at atabus0 drive 0: <SAMSUNG SP1604N>
491: wd0: 149 GB, 310101 cyl, 16 head, 63 sec, 512 bytes/sect x 312581808 sectors
492: boot device: tlp0
493: root on md0a dumps on md0b
494: root file system type: ffs
495: erase ^H, werase ^W, kill ^U, intr ^C, status ^T
496: Terminal type? [vt100]
497:
498: Just follow the usual procedure to install a NetBSD system.
499:
500: <img src="//www.netbsd.org/images/ports/sandpoint/install_window.jpg" alt="Sandpoint installation window" /></td>
501:
502: Post installation steps
503: =======================
504:
505: After a successful installation you want to make the system boot
506: standalone when switched on, without the need for a serial console. So
507: you have to modify the `bootcmd` in U-Boot's environment and write the
508: `altboot.bin` binary to the Flash ROM.
509:
510: On the LinkStation and KuroBox the last 128K or the Flash ROM are known
511: to be unused, so we can put `altboot` there. Load `altboot.bin` into
512: memory at `0x1000000` again, as explained above, and execute the
513: following commands to write it to Flash ROM:
514:
515: <pre>
516: => <strong>protect off fffe0000 +20000</strong>
517: Un-Protected 9 sectors
518: => <strong>erase fffe0000 +20000</strong>
519:
520: Flash erase: first = 62 @ 0xfffe0000
521: last = 70 @ 0xffffe000
522: Flash erase: Done
523: Erased 9 sectors
524: => <strong>mw.b 1000000 ff 20000</strong>
525: => <strong>tftp 1000000 altboot.bin</strong>
526: Using COMET#0 device
527: TFTP from server 192.168.0.5; our IP address is 192.168.0.102
528: Filename 'altboot.bin'.
529: Load address: 0x1000000
530: Loading: ##############
531: done
532: Bytes transferred = 70844 (114bc hex)
533: => <strong>cp.b 1000000 fffe0000 20000</strong>
534: Copy to Flash... done
535: => <strong>cmp.b 1000000 fffe0000 20000</strong>
536: Total of 131072 bytes were the same
537: => <strong>protect on fffe0000 +20000</strong>
538: Protected 9 sectors
539: => <strong>reset</strong>
540: </pre>
541:
542: Finally adapt the `bootcmd` environment string to autoboot `altboot` and
543: start the `netbsd` kernel (which is the default name) from `wd0` on each
544: reboot:
545:
546: <pre>
547: => <strong>setenv bootcmd cp.b fffe0000 1000000 20000\; go 1000000 wd0:netbsd</strong>
548: => <strong>setenv bootdelay 3</strong>
549: => <strong>saveenv</strong>
550: </pre>
551:
552: The `\` is important for **setenv** not to misinterpret the `;` as the end
553: of the command.
554:
555: Have fun with your mini NetBSD server!
CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb