]> rtime.felk.cvut.cz Git - novaboot.git/blob - README.md
Add --make option
[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     The name of qemu binary to use. The default is 'qemu'.
329
330 - \--qemu-append=_flags_
331
332     Append _flags_ to the default qemu flags (QEMU\_FLAGS variable or
333     `-cpu coreduo -smp 2`).
334
335 - \-q, --qemu-flags=_flags_
336
337     Replace the default qemu flags (QEMU\_FLAGS variable or `-cpu coreduo
338     -smp 2`) with _flags_ specified here.
339
340 - \--reset-cmd=_cmd_
341
342     Command that resets the target.
343
344 ## Interaction with the bootloader on the target
345
346 - \--uboot
347
348     Interact with uBoot bootloader to boot the thing described in the
349     novaboot script. Implementation of this option is currently tied to a
350     particular board that we use. It may be subject to changes in the
351     future!
352
353 - \--uboot-init
354
355     Command(s) to send the uBoot bootloader before loading the images and
356     botting them.
357
358 ## Target interaction phase
359
360 In this phase, target's serial output is passed to `novaboot` stdout.
361 If `novaboot`'s stdin is on TTY, the stdin is passed to the target
362 allowing interactive work with the target.
363
364 This phase end when the target hangs up or when Ctrl-C is pressed.
365
366 # NOVABOOT SCRIPT SYNTAX
367
368 The syntax tries to mimic POSIX shell syntax. The syntax is defined with the following rules.
369
370 Lines starting with "\#" are ignored.
371
372 Lines that end with "\\" are concatenated with the following line after
373 removal of the final "\\" and leading whitespace of the following line.
374
375 Lines in the form _VARIABLE=..._ (i.e. matching '^\[A-Z\_\]+=' regular
376 expression) assign values to internal variables. See VARIABLES
377 section.
378
379 Otherwise, the first word on the line represents the filename
380 (relative to the build directory (see __\--build-dir__) of the module to
381 load and the remaining words are passed as the command line
382 parameters.
383
384 When the line ends with "<<WORD" then the subsequent lines until the
385 line containing only WORD are copied literally to the file named on
386 that line.
387
388 When the line ends with "< CMD" the command CMD is executed with
389 `/bin/sh` and its standard output is stored in the file named on that
390 line. The SRCDIR variable in CMD's environment is set to the absolute
391 path of the directory containing the interpreted novaboot script.
392
393 Example:
394   \#!/usr/bin/env novaboot
395   WVDESC=Example program
396   bin/apps/sigma0.nul S0\_DEFAULT script\_start:1,1 \\
397     verbose hostkeyb:0,0x60,1,12,2
398   bin/apps/hello.nul
399   hello.nulconfig <<EOF
400   sigma0::mem:16 name::/s0/log name::/s0/timer name::/s0/fs/rom ||
401   rom://bin/apps/hello.nul
402   EOF
403
404 This example will load three modules: sigma0.nul, hello.nul and
405 hello.nulconfig. sigma0 gets some command line parameters and
406 hello.nulconfig file is generated on the fly from the lines between
407 <<EOF and EOF.
408
409 ## VARIABLES
410
411 The following variables are interpreted in the novaboot script:
412
413 - BUILDDIR
414
415     Novaboot chdir()s to this directory before file generation phase. The
416     directory name specified here is relative to the build directory
417     specified by other means (see ["--build-dir"](#--build-dir)).
418
419 - WVDESC
420
421     Description of the wvtest-compliant program.
422
423 - WVTEST\_TIMEOUT
424
425     The timeout in seconds for WvTest harness. If no complete line appears
426     in the test output within the time specified here, the test fails. It
427     is necessary to specify this for long running tests that produce no
428     intermediate output.
429
430 - QEMU
431
432     Use a specific qemu binary (can be overriden with __\-Q__) and flags
433     when booting this script under qemu. If QEMU\_FLAGS variable is also
434     specified flags specified in QEMU variable are replaced by those in
435     QEMU\_FLAGS.
436
437 - QEMU\_FLAGS
438
439     Use specific qemu flags (can be overriden with __\-q__).
440
441 - HYPERVISOR\_PARAMS
442
443     Parameters passed to hypervisor. The default value is "serial", unless
444     overriden in configuration file.
445
446 - KERNEL
447
448     The kernel to use instead of NOVA hypervisor specified in the
449     configuration file. The value should contain the name of the kernel
450     image as well as its command line parameters. If this variable is
451     defined and non-empty, the variable HYPERVISOR\_PARAMS is not used.
452
453 # CONFIGURATION FILE
454
455 Novaboot can read its configuration from a file. Configuration file
456 was necessary in early days of novaboot. Nowadays, an attempt is made
457 to not use the configuration file because it makes certain novaboot
458 scripts unusable on systems without (or with different) configuration
459 file. The only recommended use of the configuration file is to specify
460 custom\_options (see bellow).
461
462 If you decide to use the configuration file, it is looked up, by
463 default, in files named `.novaboot` as described in ["Configuration reading phase"](#Configuration reading phase). Alternatively, its location can be specified with the
464 __\-c__ switch or with the NOVABOOT\_CONFIG environment variable. The
465 configuration file has perl syntax and should set values of certain
466 Perl variables. The current configuration can be dumped with the
467 __\--dump-config__ switch. Some configuration variables can be overriden
468 by environment variables (see below) or by command line switches.
469
470 Documentation of some configuration variables follows:
471
472 - $builddir
473
474     Build directory location relative to the location of the configuration
475     file.
476
477 - %targets
478
479     Hash of shortcuts to be used with the __\--target__ option. If the hash
480     contains, for instance, the following pair of values
481
482         'mybox' => '--server=boot:/tftproot --serial=/dev/ttyUSB0 --grub',
483
484     then the following two commands are equivalent:
485
486         ./script --server=boot:/tftproot --serial=/dev/ttyUSB0 --grub
487         ./script -t mybox
488
489 # ENVIRONMENT VARIABLES
490
491 Some options can be specified not only via config file or command line
492 but also through environment variables. Environment variables override
493 the values from configuration file and command line parameters
494 override the environment variables.
495
496 - NOVABOOT\_CONFIG
497
498     Name of the novaboot configuration file to use instead of the default
499     one(s).
500
501 - NOVABOOT\_BENDER
502
503     Defining this variable has the same meaning as __\--bender__ option.
504
505 # AUTHORS
506
507 Michal Sojka <sojka@os.inf.tu-dresden.de>