]> rtime.felk.cvut.cz Git - novaboot.git/blob - README.md
Run qemu only when --qemu option is present
[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 ## File deployment phase
272
273 In some setups, it is necessary to copy the files needed for booting
274 to a particular location, e.g. to a TFTP boot server or to the
275 `/boot` partition.
276
277 - \-d, --dhcp-tftp
278
279     Turns your workstation into a DHCP and TFTP server so that the OS can
280     be booted via PXE BIOS (or similar mechanism) on the test machine
281     directly connected by a plain Ethernet cable to your workstation.
282
283     The DHCP and TFTP servers require root privileges and `novaboot`
284     uses `sudo` command to obtain those. You can put the following to
285     _/etc/sudoers_ to allow running the necessary commands without
286     asking for password.
287
288         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
289         your_login ALL=NOPASSWD: NOVABOOT
290
291 - \-i, --iso\[=filename\]
292
293     Generates the ISO image that boots NOVA system via GRUB. If no filename
294     is given, the image is stored under _NAME_.iso, where _NAME_ is the name
295     of the novaboot script (see also __\--name__).
296
297 - \--server\[=\[\[user@\]server:\]path\]
298
299     Copy all files needed for booting to another location (implies __\-g__
300     unless __\--grub2__ is given). The files will be copied (by __rsync__
301     tool) to the directory _path_. If the _path_ contains string $NAME,
302     it will be replaced with the name of the novaboot script (see also
303     __\--name__).
304
305 - \--concat
306
307     If __\--server__ is used and its value ends with $NAME, then after
308     copying the files, a new bootloader configuration file (e.g. menu.lst)
309     is created at _path-wo-name_, i.e. the path specified by __\--server__
310     with $NAME part removed. The content of the file is created by
311     concatenating all files of the same name from all subdirectories of
312     _path-wo-name_ found on the "server".
313
314 - \--rsync-flags=_flags_
315
316     Specifies which _flags_ are appended to `rsync` command line when
317     copying files as a result of _\--server_ option.
318
319 ## Target power-on and reset phase
320
321 - \--on, --off
322
323     Switch on/off the target machine. Currently works only with
324     __\--iprelay__.
325
326 - \-Q, --qemu\[=_qemu-binary_\]
327
328     Boot the configuration in qemu. Optionally, the name of qemu binary
329     can be specified as a parameter.
330
331 - \--qemu-append=_flags_
332
333     Append _flags_ to the default qemu flags (QEMU\_FLAGS variable or
334     `-cpu coreduo -smp 2`).
335
336 - \-q, --qemu-flags=_flags_
337
338     Replace the default qemu flags (QEMU\_FLAGS variable or `-cpu coreduo
339     -smp 2`) with _flags_ specified here.
340
341 - \--reset-cmd=_cmd_
342
343     Command that resets the target.
344
345 ## Interaction with the bootloader on the target
346
347 - \--uboot
348
349     Interact with uBoot bootloader to boot the thing described in the
350     novaboot script. Implementation of this option is currently tied to a
351     particular board that we use. It may be subject to changes in the
352     future!
353
354 - \--uboot-init
355
356     Command(s) to send the uBoot bootloader before loading the images and
357     botting them.
358
359 ## Target interaction phase
360
361 In this phase, target's serial output is passed to `novaboot` stdout.
362 If `novaboot`'s stdin is on TTY, the stdin is passed to the target
363 allowing interactive work with the target.
364
365 This phase end when the target hangs up or when Ctrl-C is pressed.
366
367 # NOVABOOT SCRIPT SYNTAX
368
369 The syntax tries to mimic POSIX shell syntax. The syntax is defined with the following rules.
370
371 Lines starting with "\#" are ignored.
372
373 Lines that end with "\\" are concatenated with the following line after
374 removal of the final "\\" and leading whitespace of the following line.
375
376 Lines in the form _VARIABLE=..._ (i.e. matching '^\[A-Z\_\]+=' regular
377 expression) assign values to internal variables. See VARIABLES
378 section.
379
380 Otherwise, the first word on the line represents the filename
381 (relative to the build directory (see __\--build-dir__) of the module to
382 load and the remaining words are passed as the command line
383 parameters.
384
385 When the line ends with "<<WORD" then the subsequent lines until the
386 line containing only WORD are copied literally to the file named on
387 that line.
388
389 When the line ends with "< CMD" the command CMD is executed with
390 `/bin/sh` and its standard output is stored in the file named on that
391 line. The SRCDIR variable in CMD's environment is set to the absolute
392 path of the directory containing the interpreted novaboot script.
393
394 Example:
395   \#!/usr/bin/env novaboot
396   WVDESC=Example program
397   bin/apps/sigma0.nul S0\_DEFAULT script\_start:1,1 \\
398     verbose hostkeyb:0,0x60,1,12,2
399   bin/apps/hello.nul
400   hello.nulconfig <<EOF
401   sigma0::mem:16 name::/s0/log name::/s0/timer name::/s0/fs/rom ||
402   rom://bin/apps/hello.nul
403   EOF
404
405 This example will load three modules: sigma0.nul, hello.nul and
406 hello.nulconfig. sigma0 gets some command line parameters and
407 hello.nulconfig file is generated on the fly from the lines between
408 <<EOF and EOF.
409
410 ## VARIABLES
411
412 The following variables are interpreted in the novaboot script:
413
414 - BUILDDIR
415
416     Novaboot chdir()s to this directory before file generation phase. The
417     directory name specified here is relative to the build directory
418     specified by other means (see ["--build-dir"](#--build-dir)).
419
420 - WVDESC
421
422     Description of the wvtest-compliant program.
423
424 - WVTEST\_TIMEOUT
425
426     The timeout in seconds for WvTest harness. If no complete line appears
427     in the test output within the time specified here, the test fails. It
428     is necessary to specify this for long running tests that produce no
429     intermediate output.
430
431 - QEMU
432
433     Use a specific qemu binary (can be overriden with __\-Q__) and flags
434     when booting this script under qemu. If QEMU\_FLAGS variable is also
435     specified flags specified in QEMU variable are replaced by those in
436     QEMU\_FLAGS.
437
438 - QEMU\_FLAGS
439
440     Use specific qemu flags (can be overriden with __\-q__).
441
442 - HYPERVISOR\_PARAMS
443
444     Parameters passed to hypervisor. The default value is "serial", unless
445     overriden in configuration file.
446
447 - KERNEL
448
449     The kernel to use instead of NOVA hypervisor specified in the
450     configuration file. The value should contain the name of the kernel
451     image as well as its command line parameters. If this variable is
452     defined and non-empty, the variable HYPERVISOR\_PARAMS is not used.
453
454 # CONFIGURATION FILE
455
456 Novaboot can read its configuration from a file. Configuration file
457 was necessary in early days of novaboot. Nowadays, an attempt is made
458 to not use the configuration file because it makes certain novaboot
459 scripts unusable on systems without (or with different) configuration
460 file. The only recommended use of the configuration file is to specify
461 custom\_options (see bellow).
462
463 If you decide to use the configuration file, it is looked up, by
464 default, in files named `.novaboot` as described in ["Configuration reading phase"](#Configuration reading phase). Alternatively, its location can be specified with the
465 __\-c__ switch or with the NOVABOOT\_CONFIG environment variable. The
466 configuration file has perl syntax and should set values of certain
467 Perl variables. The current configuration can be dumped with the
468 __\--dump-config__ switch. Some configuration variables can be overriden
469 by environment variables (see below) or by command line switches.
470
471 Documentation of some configuration variables follows:
472
473 - $builddir
474
475     Build directory location relative to the location of the configuration
476     file.
477
478 - %targets
479
480     Hash of shortcuts to be used with the __\--target__ option. If the hash
481     contains, for instance, the following pair of values
482
483         'mybox' => '--server=boot:/tftproot --serial=/dev/ttyUSB0 --grub',
484
485     then the following two commands are equivalent:
486
487         ./script --server=boot:/tftproot --serial=/dev/ttyUSB0 --grub
488         ./script -t mybox
489
490 # ENVIRONMENT VARIABLES
491
492 Some options can be specified not only via config file or command line
493 but also through environment variables. Environment variables override
494 the values from configuration file and command line parameters
495 override the environment variables.
496
497 - NOVABOOT\_CONFIG
498
499     Name of the novaboot configuration file to use instead of the default
500     one(s).
501
502 - NOVABOOT\_BENDER
503
504     Defining this variable has the same meaning as __\--bender__ option.
505
506 # AUTHORS
507
508 Michal Sojka <sojka@os.inf.tu-dresden.de>