aboutsummaryrefslogtreecommitdiffstats
path: root/freedom-maker/README.freedom-maker
blob: 6039861d2700e89574249ff7e9e6b06885438d84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
Freedom-Maker  -  Bdale's building tools for the FreedomBox project

Welcome to the FreedomBox!  This project is the central hub of the FreedomBox
project, it builds and installs the file-system image that turns any computer
into a FreedomBox.

There are a couple ways to use this system:

1. If you just want to use a FreedomBox and don't care about changing how it
   works or mucking about in its insides (if you're like most people), you
   should get a pre-built image from someone and copy it to an SD card or USB
   drive.  If you don't have a JTAG or don't know what one is, make sure to ask
   for the SD card image.

2. If you want to change and build on it, you can use:

   A. A USB stick.  This requires a JTAG, but doesn't require opening up the
      DreamPlug, or,

   B. A microSD card and adapter.  You can use the one from inside the
      DreamPlug.  You won't need a JTAG, but you will need to open the DreamPlug
      and void the warranty.

***
*** Warning!  There are no "training wheels" here .. read the scripts and
***           understand what they're going to do before you run them...
***

# Recent Firmware Necessary!

Modern kernels need a relatively recent version of the u-boot firmware.  If
you still use old firmware (including what Global Scale ships on the units by
default), then you need to update, which requires having the JTAG dongle (to
gain console serial port access).  One way to know you've got old firmware
is if booting a Linux kernel results in errors about corrupt gzip data and
a failure to launch the kernel.

Note that re-flashing firmware will erase all configuration variables.  If
preserving your exising boot config is important, use printenv and make notes
before proceeding.  Also note that any time you're re-flashing boot firmware,
there is a slight chance you could 'brick' your device leaving it unbootable.
If that happens, the JTAG interface can be used to recover.

The instructions for updating firmaware go something like this (thanks to
Ian Campbell for his notes):

  Using 2012.04.01-2 which is current Wheezy. Prep by mounting a USB stick.

	wget http://http.debian.net/debian/pool/main/u/u-boot/u-boot_2012.04.01-2_armel.deb
	dpkg-deb -x u-boot_2012.04.01-2_armel.deb u-boot_2012.04.01-2_armel
	cp u-boot_2012.04.01-2_armel/usr/lib/u-boot/dreamplug/* /media/usbdisk

  Move the USB stick to your DreamPlug.  Flash the new firmare:

	usb start
	fatload usb 2 0x6400000 u-boot.kwb
	sf probe 0
	sf erase 0x0 0x80000
	sf write 0x6400000 0x0 0x${filesize}

  (You must, of course, fill in the size of the file you're loading in hex)

At this point, you should be able to reset the DreamPlug and have it boot to
a serial console prompt.  If that fails, you'll need real JTAG magic to try
again.

Note that if you use the 'make usb' target to create a bootable USB stick
image, we include the required firmware in /boot/dreamplug, so the above
fatload command might be replaced with:

	fatload usb 2 0x6400000 dreamplug/u-boot.kwb

# To Use It

You'll need to copy the image to the memory card or USB stick:

1. Figure out which device your card actually is.

   A. Unplug your card.

   B. Run "df" to show you the list of devices your computer actually knows
      about.

   C. Plug your card in.

   D. Run "df" again, your computer should know about a new device or two: your
      memory card.  It's probably "/dev/sd(someletter)".  It *won't be*
      /dev/sda.

2. Decompress the image:

    $ tar -xjvf freedombox-unstable_*.tar.bz2

3. Copy the image to your card.  Whatever you do, make sure you don't copy it to
   /dev/sda.  That'll break your system.

    # dd bs=1M if=freedombox-unstable_*.img of=/dev/sd(thesameletter)

   When picking a device, use the drive-letter destination, like /dev/sdb, not a
   numbered destination, like /dev/sdb1.  The device-without-a-number refers to
   the entire device, while the device-with-a-number refers to a specific
   partition.  We want to use the whole device.

Now, what you need to do depends on whether you're using the microSD card or USB
stick method:

- USB drive: You'll hook the JTAG up to the DreamPlug before booting and use the
  JTAG to control the boot process, so we can boot from the USB drive.

- microSD card: You'll put the microSD card into the DreamPlug's internal
  microSD card slot and boot the DreamPlug.  It'll restart once to finish the
  install process, then it's ready to use.

## Running from a microSD Card

When DD has finished, take the microSD card out of your computer and plug it
into your DreamPlug.  If you have a JTAG, you can watch it boot.  You'll see it
restart once during the boot process.  If you don't have a JTAG, wait a while (5
minutes or less) and it'll be available over SSH (port 22).  You might need to
use nmap to find it:

    $ nmap -p 22 --open -sV 192.168.0.0/24

    ...
    Interesting ports on 192.168.0.13:
    PORT   STATE SERVICE VERSION
    22/tcp open  ssh     OpenSSH 6.0p1 Debian 2 (protocol 2.0)
    Service Info: OS: Linux
    ...

Once you've found it, SSH into the box:

    $ ssh root@192.168.0.13

## Running from a USB Stick

Move the USB stick to the DreamPlug, obtain a serial console, and hit reset.  A
good way to access the serial console (actually USB serial emulation provided by
the optional JTAG dongle), is to use 'screen', like so:

	screen /dev/ttyUSB0 115200

Interrupt the boot by pressing a key during the autoboot countdown, and type the
following to boot from the USB stick:

	setenv bootcmd '${x_bootcmd_usb}; ${x_bootcmd_kernel}; ${x_bootcmd_initrd}; setenv bootargs ${x_bootargs} ${x_bootargs_root}; bootm 0x6400000 0x6900000;'
	setenv x_bootcmd_kernel fatload usb 2 0x6400000 uImage
	setenv x_bootcmd_initrd fatload usb 2 0x6900000 uInitrd
	setenv x_bootargs_root root=/dev/sdc2 rootdelay=10
	boot

The system should boot to a login prompt, using only the bits on the stick.

The default root password is 'freedom'.  The normal user is "fbx" and the
password is "frdm".

- - - - -

To set things up to boot from the internal microSD card, once you're logged into
the system booted from root on USB stick you can use:

	/sbin/copy2dream

Note that if you don't have a reasonable system date and time set in the
DreamPlug before running this command, you may see a long stream of warnings
from tar about timestamps being in the future.  It is safe to ignore these.

On reboot, you may want to interrupt the boot and type the following to ensure
you boot from the internal microSD by default.  This bootcmd line elides the
time-consuming attempts to boot grom gigE, which makes boot go much faster:

	setenv bootcmd '${x_bootcmd_usb}; ${x_bootcmd_kernel}; ${x_bootcmd_initrd}; setenv bootargs ${x_bootargs} ${x_bootargs_root}; bootm 0x6400000 0x6900000;'
	setenv x_bootcmd_kernel fatload usb 0 0x6400000 uImage
	setenv x_bootcmd_initrd fatload usb 0 0x6900000 uInitrd
	setenv x_bootargs_root root=/dev/sda2 rootdelay=10
	saveenv
	reset

# To Make It

If you want to build your own image yourself, you're more than welcome to.
Whether you're using a USB drive or a microSD card, you'll need to ensure that
it's at least 2 GB in size and that it has two partitons:

1. The stick must start with a 128 MB FAT partition for the boot directory.

2. The rest of the stick is an EXT2 partition, for the main installation.

The rest of the steps you need to follow depend on whether you're using a USB
stick or a microSD card.

## Building on a USB Stick

Partition a USB stick to have a small FAT partition and large ext2 partition,
create a /media/freedom mount point, and add entries to /etc/fstab like:

    /dev/sdb1 /media/freedom/boot vfat user,noauto 0 0
    /dev/sdb2 /media/freedom ext2 user,noauto 0 0

This will allow the Makefile to mount and unmount the stick at will.

If you have a favorite Debian mirror, update the file fbx-base.conf setting the
source= line.

To populate the stick with bits for a DreamPlug, just plug it in to your
computer and type:

	make

This will build a file tree under build/dreamplug, representing the contents of
a root file system, then that content will be copied to the stick.

## Building it on a microSD card.

Changing the image and building your own is a simple 18 step process!  Lots of
thanks to Nick Hardiman for putting these instructions together.

### Get Ready

1. Start your workstation.

2. Use a Debian OS, the version doesn't matter.  A virtual image, such
   as a VirtualBox image, is fine.  Usually.

3. Use the root account.

### Prepare an SD Card

4. Find a microSD card with SD card holder.  It must be at least 2GB
   in size.

5. Insert the card into your workstation.

6. Install a partition editor.  Install parted if you are a masochist.

    # apt-get install parted

7. Create 2 partitions.  Use cfdisk, parted, gparted or similar.

    # cfdisk  /dev/sdb

   a. First partition: 128meg (no smaller or the kernel copy will run
      out of room and make - see below - will end with an error).

   b. Second partition: The rest of the card (anything over 600 MB
      should work).

8. Make a note of the SD card’s device name.  Mine is /dev/sdb (my
   workstation’s layout is simple: one disk called /dev/sda and
   nothing else defined).

9. Format the two partitions.

   a. First partition: FAT

    # mkdosfs /dev/sdb1

   b. Second partition: ext3

    # mkfs.ext3 /dev/sdb2

10. Create the mountpoints on your workstation.

    # mkdir -p /media/freedom/boot

11. Mount the second partition.

    # mount /dev/sdb2 /media/freedom/

12. Mount the first partition.

    # mount /dev/sdb1 /media/freedom/boot/

13. Check your work.

    # mount

    sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
    ...
    /dev/sdb2 on /media/freedom type ext3
    (rw,relatime,errors=continue,barrier=1,data=ordered)
    /dev/sdb1 on /media/freedom/boot type vfat
    (rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=utf8,shortname=mixed,errors=remount-ro)

### Clone the Git Repository

14. Install git.

    # apt-get install git

    Reading package lists... Done
    ...
    After this operation, 15.3 MB of additional disk space will be used.
    Do you want to continue [Y/n]?
    ...

15. Clone Nick Daly’s repository.

    $ git clone https://github.com/NickDaly/freedom-maker.git

    Cloning into 'freedom-maker'...


### Create the Debian OS.

16. Change to the new directory.

    $ cd ~/freedom-maker/

17. Kick off:

    $ make weekly-card

18. Enter your password when asked by "sudo".  If that fails, run:

    $ su -c "make weekly-card"

If you do that, you'll need to enter the root password to build the image.

The next part took about an hour, but required no input from me.  Packages were
downloaded.  Lots of commands were run.  Many harmless errors were ignored:

    sysvinit: restarting...init: timeout opening/writing control channel /run/initctl
    .init: timeout opening/writing control channel /run/initctl
    ...

There was good news:

    Multistrap system installed successfully...
    Copying the source directory to the FreedomBox root.

There was an enormous amount of this:

    bin/bash
          818092 100%    7.07MB/s    0:00:00 (xfer#1, to-check=1102/1123)
    bin/cat
           42736 100%  362.91kB/s    0:00:00 (xfer#2, to-check=1101/1123)
    bin/chgrp
           54996 100%  383.62kB/s    0:00:00 (xfer#3, to-check=1100/1123)
    ...

Finally an image is copied and zipped up for redistribution:

    dd if=/dev/sdb of="freedombox-unstable_`date +%Y.%m%d`.img" bs=1M
    3781+1 records in
    3781+1 records out
    3965190144 bytes (4.0 GB) copied, 266.174 s, 14.9 MB/s
    Image copied.  The microSD card may now be removed.
    tar -cjvf "freedombox-unstable_`date +%Y.%m%d`.tar.bz2"
    "freedombox-unstable_`date +%Y.%m%d`.img"
    freedombox-unstable_2012.0705.img

The end.  Hooray!  The SD card is ready for the DreamPlug.

# To Understand It

Be aware that this is a *very* imcomplete solution for now, suitable only
for developers .. you will want to at least do things like create unique
ssh host keys for your device!

Digging into the code should be fairly straightforward.  There are only six
files you need to be aware of:

- /Makefile: The makefile that describes and builds the system.
- /mk_dreamplug_rootfs: Builds the DreamPlug's root file-system.
- /bin/projects: The place for external projects to hook into and customize
  themselves before they're copied to the image.
- /bin/finalize: Finalizes and prepares the build for booting.
- /source: The root file system.
- /source/install.sh: Pre-boot configuration that needs to be run on the device
  itself (from within a chroot).

## Makefile

There are three major targets to be aware of:

- dreamstick: The default target.  This loads an image to a USB drive that can
  be used to install the FreedomBox without opening up your DreamPlug and
  voiding the warranty.  You'll need a JTAG, though.
- weekly-card: The target used to produce the weekly FreedomBox test release.
  This will copy the image to a card that can be popped directly into the
  microSD card slot in the DreamPlug.  The DreamPlug will boot happily without
  needing a JTAG.
- stamp-dreamplug-rootfs: The root file system itself.  It doesn't get installed
  anywhere (that's done by the other two targets), but is a good way to test
  whether the image will actually build, without waiting for all that pesky
  hardware I/O.

## mk_dreamplug_rootfs

Starts building the system by creating all the destination directories and
installing the base system.

## /bin/projects

Where projects that want to integrate into the FreedomBox should hook into.
Keep in mind, we aren't in a chroot at this point.  The only environment
variables you'll probably need are:

- user: The non-root user's name (uid = 1000).
- homedir: The non-root user's home-directory.

## /bin/finalize

Getting the system ready for boot, doing the things that don't need to be done
inside a chroot.  You probably don't need to change this.

## /source

The root file system on the DreamPlug.  Modify this, and you're modifying what
ends up on the FreedomBox.

## /source/install.sh

This is executed from a chroot during the build process to do configuration that
needs to be done on the device itself.  You shouldn't need to modify this.  If
you're installing a project that needs to change how the system configures
itself, you're probably doing something wrong.