]> rtime.felk.cvut.cz Git - novaboot.git/blob - README.md
Add one second sleep to powerpc configurations to wait for establishing Ethernet...
[novaboot.git] / README.md
1 # NAME
2
3 novaboot - A tool for booting various operating systems on various hardware or in qemu
4
5 # SYNOPSIS
6
7 __novaboot__ \[ options \] \[--\] script...
8
9 __./script__ \[ options \]
10
11 # DESCRIPTION
12
13 This program makes it easier to boot NOVA or other operating system
14 (OS) on different targets (machines or emulators). It reads a so
15 called novaboot script, that specifies the boot configuration, and
16 setups the target to boot that configuration. Setting up the target
17 means to generate the bootloader configuration files, deploy the
18 binaries and other needed files to proper locations, perhaps on a
19 remote boot server and reset the target. Then, target's serial output
20 is redirected to standard output if that is possible.
21
22 A typical way of using novaboot is to make the novaboot script
23 executable and set its first line to _\#!/usr/bin/env novaboot_. Then,
24 booting a particular OS configuration becomes the same as executing a
25 local program - the novaboot script.
26
27 For example, with `novaboot` you can:
28
29 1. Run an OS in Qemu. This is the default action when no other action is
30 specified by command line switches. Thus running `novaboot ./script`
31 (or `./script` as described above) will run Qemu and make it boot the
32 configuration specified in the _script_.
33 2. Create a bootloader configuration file (currently supported
34 bootloaders are GRUB, GRUB2, Pulsar and uBoot) and copy it with all
35 other files needed for booting to another, perhaps remote, location.
36
37         ./script --server --iprelay=192.168.1.2
38
39     This command copies files to a TFTP server specified in the
40     configuration file and uses TCP/IP-controlled relay to reset the test
41     box and receive its serial output.
42
43 3. Run DHCP and TFTP server on developer's machine to PXE-boot the OS
44 from it. E.g.
45
46         ./script --dhcp-tftp
47
48     When a PXE-bootable machine is connected via Ethernet to developer's
49     machine, it will boot the configuration described in _script_.
50
51 4. Create bootable ISO images. E.g.
52
53         novaboot --iso -- script1 script2
54
55     The created ISO image will have GRUB bootloader installed on it and
56     the boot menu will allow selecting between _script1_ and _script2_
57     configurations.
58
59 # PHASES AND OPTIONS
60
61 Novaboot performs its work in several phases. Each phase can be
62 influenced by several options, certain phases can be skipped. The list
63 of phases (in the execution order) and the corresponding options
64 follows.
65
66 ## Configuration reading phase
67
68 After starting, novaboot reads configuration files. By default, it
69 searches for files named `.novaboot` starting from the directory of
70 the novaboot script (or working directory, see bellow) and continuing
71 upwards up to the root directory. The configuration files are read in
72 order from the root directory downwards with latter files overriding
73 settings from the former ones.
74
75 In certain cases, the location of the novaboot script cannot be
76 determined in this early phase. This happens either when the script is
77 read from the standard input or when novaboot is invoked explicitly
78 and options precede the script name, as in the example ["4."](#4.) above.
79 In this case the current working directory is used as a starting point
80 for configuration file search.
81
82 - \-c, --config=_filename_
83
84     Use the specified configuration file instead of the default one(s).
85
86 ## Command line processing phase
87
88 - \--dump-config
89
90     Dump the current configuration to stdout end exits. Useful as an
91     initial template for a configuration file.
92
93 - \-h, --help
94
95     Print short (__\-h__) or long (__\--help__) help.
96
97 - \-t, --target=_target_
98
99     This option serves as a user configurable shortcut for other novaboot
100     options. The effect of this option is the same as the options stored
101     in the `%targets` configuration variable under key _target_. See
102     also ["CONFIGURATION FILE"](#CONFIGURATION FILE).
103
104 ## Script preprocessing phase
105
106 This phases allows to modify the parsed novaboot script before it is
107 used in the later phases.
108
109 - \-a, --append=_parameters_
110
111     Appends a string to the first "filename" line in the novaboot script.
112     This can be used to append parameters to the kernel's or root task's
113     command line.
114
115 - \-b, --bender
116
117     Use `bender` chainloader. Bender scans the PCI bus for PCI serial
118     ports and stores the information about them in the BIOS data area for
119     use by the kernel.
120
121 - \--chainloader=_chainloader_
122
123     Chainloader that is loaded before the kernel and other files specified
124     in the novaboot script. E.g. 'bin/boot/bender promisc'.
125
126 - \--dump
127
128     Prints the content of the novaboot script after removing comments and
129     evaluating all _\--scriptmod_ expressions. Exit after reading (and
130     dumping) the script.
131
132 - \--scriptmod=_perl expression_
133
134     When novaboot script is read, _perl expression_ is executed for every
135     line (in $\_ variable). For example, `novaboot
136     --scriptmod=s/sigma0/omega6/g` replaces every occurrence of _sigma0_
137     in the script with _omega6_.
138
139     When this option is present, it overrides _$script\_modifier_ variable
140     from the configuration file, which has the same effect. If this option
141     is given multiple times all expressions are evaluated in the command
142     line order.
143
144 - \--strip-rom
145
146     Strip _rom://_ prefix from command lines and generated config files.
147     The _rom://_ prefix is used by NUL. For NRE, it has to be stripped.
148
149 ## File generation phase
150
151 In this phase, files needed for booting are generated in a so called
152 _build directory_ (see TODO). In most cases configuration for a
153 bootloader is generated automatically by novaboot. It is also possible
154 to generate other files using _heredoc_ or _"<"_ syntax in novaboot
155 scripts. Finally, binaries can be generated in this phases by running
156 `scons` or `make`.
157
158 - \--build-dir=_directory_
159
160     Overrides the default build directory location.
161
162     The default build directory location is determined as follows: If the
163     configuration file defines the `$builddir` variable, its value is
164     used. Otherwise, it is the directory that contains the first processed
165     novaboot script.
166
167 - \-g, --grub\[=_filename_\]
168
169     Generates grub bootloader menu file. If the _filename_ is not
170     specified, `menu.lst` is used. The _filename_ is relative to the
171     build directory (see __\--build-dir__).
172
173 - \--grub-preamble=_prefix_
174
175     Specifies the _preable_ that is at the beginning of the generated
176     GRUB or GRUB2 config files. This is useful for specifying GRUB's
177     timeout.
178
179 - \--grub-prefix=_prefix_
180
181     Specifies _prefix_ that is put in front of every file name in GRUB's
182     `menu.lst`. The default value is the absolute path to the build directory.
183
184     If the _prefix_ contains string $NAME, it will be replaced with the
185     name of the novaboot script (see also __\--name__).
186
187 - \--grub2\[=_filename_\]
188
189     Generate GRUB2 menuentry in _filename_. If _filename_ is not
190     specified `grub.cfg` is used. The content of the menuentry can be
191     customized with __\--grub-preable__, __\--grub2-prolog__ or
192     __\--grub\_prefix__ options.
193
194     In order to use the the generated menuentry on your development
195     machine that uses GRUB2, append the following snippet to
196     `/etc/grub.d/40\_custom` file and regenerate your grub configuration,
197     i.e. run update-grub on Debian/Ubuntu.
198
199         if [ -f /path/to/nul/build/grub.cfg ]; then
200           source /path/to/nul/build/grub.cfg
201         fi
202
203 - \--grub2-prolog=_prolog_
204
205     Specifies text _preable_ that is put at the begiging of the entry
206     GRUB2 entry.
207
208 - \-m, --make\[=make command\]
209
210     Runs `make` to build files that are not generated by novaboot itself.
211
212 - \--name=_string_
213
214     Use the name _string_ instead of the name of the novaboot script.
215     This name is used for things like a title of grub menu or for the
216     server directory where the boot files are copied to.
217
218 - \--no-file-gen
219
220     Do not generate files on the fly (i.e. "<" syntax) except for the
221     files generated via "<<WORD" syntax.
222
223 - \-p, --pulsar\[=mac\]
224
225     Generates pulsar bootloader configuration file named `config-_mac_`
226     The _mac_ string is typically a MAC address and defaults to
227     _novaboot_.
228
229 - \--scons\[=scons command\]
230
231     Runs `scons` to build files that are not generated by novaboot
232     itself.
233
234 - \--gen-only
235
236     Exit novaboot after file generation phase.
237
238 ## Target connection check
239
240 If supported by the target, the connection to it is made and it is
241 checked whether the target is not occupied by another novaboot
242 user/instance.
243
244 - \--iprelay=_addr\[:port\]_
245
246     Use TCP/IP relay and serial port to access the target's serial port
247     and powercycle it. The IP address of the relay is given by _addr_
248     parameter. If _port_ is not specified, it default to 23.
249
250     Note: This option is supposed to work with HWG-ER02a IP relays.
251
252 - \-s, --serial\[=device\]
253
254     Target's serial line is connected to host's serial line (device). The
255     default value for device is `/dev/ttyUSB0`.
256
257     The value of this option is exported in NB\_NOVABOOT environment
258     variable to all subprocesses run by `novaboot`.
259
260 - \--stty=_settings_
261
262     Specifies settings passed to `stty` invoked on the serial line
263     specified with __\--serial__ option. If this option is not given,
264     `stty` is called with `raw -crtscts -onlcr 115200` settings.
265
266 - \--remote-cmd=_cmd_
267
268     Command that mediates connection to the target's serial line. For
269     example `ssh server 'cu -l /dev/ttyS0'`.
270
271 - \--remote-expect=_string_
272
273     Wait for reception of _string_ on the remote connection before
274     continuing.
275
276 ## File deployment phase
277
278 In some setups, it is necessary to copy the files needed for booting
279 to a particular location, e.g. to a TFTP boot server or to the
280 `/boot` partition.
281
282 - \-d, --dhcp-tftp
283
284     Turns your workstation into a DHCP and TFTP server so that the OS can
285     be booted via PXE BIOS (or similar mechanism) on the test machine
286     directly connected by a plain Ethernet cable to your workstation.
287
288     The DHCP and TFTP servers require root privileges and `novaboot`
289     uses `sudo` command to obtain those. You can put the following to
290     _/etc/sudoers_ to allow running the necessary commands without
291     asking for password.
292
293         Cmnd_Alias NOVABOOT = /bin/ip a add 10.23.23.1/24 dev eth0, /bin/ip l set dev eth0 up, /usr/sbin/dhcpd -d -cf dhcpd.conf -lf dhcpd.leases -pf dhcpd.pid, /usr/sbin/in.tftpd --foreground --secure -v -v -v --pidfile tftpd.pid *, /usr/bin/touch dhcpd.leases, /usr/bin/pkill --pidfile=dhcpd.pid, /usr/bin/pkill --pidfile=tftpd.pid
294         your_login ALL=NOPASSWD: NOVABOOT
295
296 - \-i, --iso\[=filename\]
297
298     Generates the ISO image that boots NOVA system via GRUB. If no filename
299     is given, the image is stored under _NAME_.iso, where _NAME_ is the name
300     of the novaboot script (see also __\--name__).
301
302 - \--server\[=\[\[user@\]server:\]path\]
303
304     Copy all files needed for booting to another location (implies __\-g__
305     unless __\--grub2__ is given). The files will be copied (by __rsync__
306     tool) to the directory _path_. If the _path_ contains string $NAME,
307     it will be replaced with the name of the novaboot script (see also
308     __\--name__).
309
310 - \--concat
311
312     If __\--server__ is used and its value ends with $NAME, then after
313     copying the files, a new bootloader configuration file (e.g. menu.lst)
314     is created at _path-wo-name_, i.e. the path specified by __\--server__
315     with $NAME part removed. The content of the file is created by
316     concatenating all files of the same name from all subdirectories of
317     _path-wo-name_ found on the "server".
318
319 - \--rsync-flags=_flags_
320
321     Specifies which _flags_ are appended to `rsync` command line when
322     copying files as a result of _\--server_ option.
323
324 ## Target power-on and reset phase
325
326 - \--on, --off
327
328     Switch on/off the target machine. Currently works only with
329     __\--iprelay__.
330
331 - \-Q, --qemu\[=_qemu-binary_\]
332
333     Boot the configuration in qemu. Optionally, the name of qemu binary
334     can be specified as a parameter.
335
336 - \--qemu-append=_flags_
337
338     Append _flags_ to the default qemu flags (QEMU\_FLAGS variable or
339     `-cpu coreduo -smp 2`).
340
341 - \-q, --qemu-flags=_flags_
342
343     Replace the default qemu flags (QEMU\_FLAGS variable or `-cpu coreduo
344     -smp 2`) with _flags_ specified here.
345
346 - \--reset-cmd=_cmd_
347
348     Command that resets the target.
349
350 ## Interaction with the bootloader on the target
351
352 - \--uboot
353
354     Interact with uBoot bootloader to boot the thing described in the
355     novaboot script. Implementation of this option is currently tied to a
356     particular board that we use. It may be subject to changes in the
357     future!
358
359 - \--uboot-init
360
361     Command(s) to send the uBoot bootloader before loading the images and
362     botting them.
363
364 ## Target interaction phase
365
366 In this phase, target's serial output is passed to `novaboot` stdout.
367 If `novaboot`'s stdin is on TTY, the stdin is passed to the target
368 allowing interactive work with the target.
369
370 This phase end when the target hangs up or when Ctrl-C is pressed.
371
372 # NOVABOOT SCRIPT SYNTAX
373
374 The syntax tries to mimic POSIX shell syntax. The syntax is defined with the following rules.
375
376 Lines starting with "\#" are ignored.
377
378 Lines that end with "\\" are concatenated with the following line after
379 removal of the final "\\" and leading whitespace of the following line.
380
381 Lines in the form _VARIABLE=..._ (i.e. matching '^\[A-Z\_\]+=' regular
382 expression) assign values to internal variables. See VARIABLES
383 section.
384
385 Otherwise, the first word on the line represents the filename
386 (relative to the build directory (see __\--build-dir__) of the module to
387 load and the remaining words are passed as the command line
388 parameters.
389
390 When the line ends with "<<WORD" then the subsequent lines until the
391 line containing only WORD are copied literally to the file named on
392 that line.
393
394 When the line ends with "< CMD" the command CMD is executed with
395 `/bin/sh` and its standard output is stored in the file named on that
396 line. The SRCDIR variable in CMD's environment is set to the absolute
397 path of the directory containing the interpreted novaboot script.
398
399 Example:
400   \#!/usr/bin/env novaboot
401   WVDESC=Example program
402   bin/apps/sigma0.nul S0\_DEFAULT script\_start:1,1 \\
403     verbose hostkeyb:0,0x60,1,12,2
404   bin/apps/hello.nul
405   hello.nulconfig <<EOF
406   sigma0::mem:16 name::/s0/log name::/s0/timer name::/s0/fs/rom ||
407   rom://bin/apps/hello.nul
408   EOF
409
410 This example will load three modules: sigma0.nul, hello.nul and
411 hello.nulconfig. sigma0 gets some command line parameters and
412 hello.nulconfig file is generated on the fly from the lines between
413 <<EOF and EOF.
414
415 ## VARIABLES
416
417 The following variables are interpreted in the novaboot script:
418
419 - BUILDDIR
420
421     Novaboot chdir()s to this directory before file generation phase. The
422     directory name specified here is relative to the build directory
423     specified by other means (see ["--build-dir"](#--build-dir)).
424
425 - WVDESC
426
427     Description of the wvtest-compliant program.
428
429 - WVTEST\_TIMEOUT
430
431     The timeout in seconds for WvTest harness. If no complete line appears
432     in the test output within the time specified here, the test fails. It
433     is necessary to specify this for long running tests that produce no
434     intermediate output.
435
436 - QEMU
437
438     Use a specific qemu binary (can be overriden with __\-Q__) and flags
439     when booting this script under qemu. If QEMU\_FLAGS variable is also
440     specified flags specified in QEMU variable are replaced by those in
441     QEMU\_FLAGS.
442
443 - QEMU\_FLAGS
444
445     Use specific qemu flags (can be overriden with __\-q__).
446
447 - HYPERVISOR\_PARAMS
448
449     Parameters passed to hypervisor. The default value is "serial", unless
450     overriden in configuration file.
451
452 - KERNEL
453
454     The kernel to use instead of NOVA hypervisor specified in the
455     configuration file. The value should contain the name of the kernel
456     image as well as its command line parameters. If this variable is
457     defined and non-empty, the variable HYPERVISOR\_PARAMS is not used.
458
459 # CONFIGURATION FILE
460
461 Novaboot can read its configuration from one or more files. By
462 default, novaboot looks for files named `.novaboot` as described in
463 ["Configuration reading phase"](#Configuration reading phase). Alternatively, its location can be
464 specified with the __\-c__ switch or with the NOVABOOT\_CONFIG
465 environment variable. The configuration file has perl syntax and
466 should set values of certain Perl variables. The current configuration
467 can be dumped with the __\--dump-config__ switch. Some configuration
468 variables can be overriden by environment variables (see below) or by
469 command line switches.
470
471 Supporte configuration variables include:
472
473 - $builddir
474
475     Build directory location relative to the location of the configuration
476     file.
477
478 - $default\_target
479
480     Default target (see below) to use when no target is explicitely
481     specified on command line with the __\--target__ option.
482
483 - %targets
484
485     Hash of shortcuts to be used with the __\--target__ option. If the hash
486     contains, for instance, the following pair of values
487
488         'mybox' => '--server=boot:/tftproot --serial=/dev/ttyUSB0 --grub',
489
490     then the following two commands are equivalent:
491
492         ./script --server=boot:/tftproot --serial=/dev/ttyUSB0 --grub
493         ./script -t mybox
494
495 # ENVIRONMENT VARIABLES
496
497 Some options can be specified not only via config file or command line
498 but also through environment variables. Environment variables override
499 the values from configuration file and command line parameters
500 override the environment variables.
501
502 - NOVABOOT\_CONFIG
503
504     Name of the novaboot configuration file to use instead of the default
505     one(s).
506
507 - NOVABOOT\_BENDER
508
509     Defining this variable has the same meaning as __\--bender__ option.
510
511 # AUTHORS
512
513 Michal Sojka <sojka@os.inf.tu-dresden.de>