loader —
kernel bootstrapping final stage
The
loader is the final stage of
illumos's kernel bootstrapping process. The
actual name for the stage depends on the platform. On IA32 (i386)
architectures with BIOS firmware, it is a
BTX client and named
zfsloader. It is linked statically to
libstand and usually located in the directory
/boot.
loader supports booting from
ZFS,
UFS,
PCFS,
HSFS and
NFS file systems. Additionally,
loader can load files from the
TFTP file service. The NFS and TFTP based
boot is enabled via
pxeboot(5). The
loader also does support uncompressing gzip
files while reading. The uncompression will happen automatically if the
compressed file is stored without .gz suffix or if the file is accessed by
leaving out the .gz suffix from the name. If the file is referred by full
name, including .gz suffix, then the file content is read as is and the
uncompression is not performed.
loader provides a scripting language that can
be used to automate tasks, do pre-configuration or assist in recovery
procedures. This scripting language is roughly divided in two main components.
The smaller one is a set of commands designed for direct use by the casual
user, called "builtin commands" for historical reasons. The main
drive behind these commands is user-friendliness. The bigger component is an
ANS Forth compatible Forth interpreter based on FICL, by
John Sadler.
During initialization,
loader will probe for
a console and set the
console variable, or
set it to serial console (“
ttya” -
“
ttyd”) if the previous boot stage used
that. If multiple consoles are selected, they will be listed separated by
commas. Then, devices are probed,
currdev and
loaddev are set, and
screen-#cols,
screen-#rows, and
ISADIR are set. Next, FICL is initialized,
the builtin words are added to its vocabulary. The inner interpreter
loader will use with FICL is then set to
interpret, which is FICL's default. After
that,
/boot/loader.rc is processed if
available. These files are processed through the
include command, which reads all of them
into memory before processing them, making disk changes possible.
At this point, if an
autoboot has not been
tried, and if
autoboot_delay is not set to
“
NO” (not case sensitive), then an
autoboot will be tried. If the system gets
past this point,
prompt will be set and
loader will engage interactive mode. Please
note that historically even when
autoboot_delay is set to
“
0” user will be able to interrupt
autoboot process by pressing some key on the console while kernel and modules
are being loaded. In some cases such behaviour may be undesirable, to prevent
it set
autoboot_delay to
“
-1”, in this case
loader will engage interactive mode only if
autoboot has failed.
In
loader, builtin commands take parameters
from the command line. If an error condition occurs, an exception will be
generated, which can be intercepted using ANS Forth exception handling words.
If not intercepted, an error message will be displayed and the interpreter's
state will be reset, emptying the stack and restoring interpreting mode.
The builtin commands available are:
autoboot
[]
- Proceeds to bootstrap the system after a number of seconds, if not
interrupted by the user. Displays a countdown prompt warning the user the
system is about to be booted, unless interrupted by a key press. The
kernel will be loaded first if necessary. Defaults to 10 seconds.
bcachestat
- Displays statistics about disk cache usage. For debugging only.
boot
-
boot
kernelname
[...
]
-
boot
-flag
...
- Immediately proceeds to bootstrap the system, loading the kernel if
necessary. Any flags or arguments are passed to the kernel, but they must
precede the kernel name, if a kernel name is provided.
WARNING: The behavior of this builtin is
changed if loader.4th(5) is loaded.
chain
device
- Chain load another boot loader from the specified device. Device can be
either disk name or partition.
echo
[-n
]
[⟨message⟩
]
- Displays text on the screen. A new line will be printed unless
-n is specified.
heap
- Displays memory usage statistics. For debugging purposes only.
help
[]
- Shows help messages read from
/boot/loader.help. The special topic
index will list the topics available.
include
file
[file ...
]
- Process script files. Each file, in turn, is completely read into memory,
and then each of its lines is passed to the command line interpreter. If
any error is returned by the interpreter, the include command aborts
immediately, without reading any other files, and returns an error itself
(see ERRORS).
load
[-t
type
]
file
...
- Loads a kernel or file of opaque contents tagged as being of the type
type. Kernel and modules can be either in
a.out or ELF format. Any arguments passed after the name of the file to be
loaded will be passed as arguments to that file.
ls
[-l
]
[path
]
- Displays a listing of files in the directory
path, or the root directory if
path is not specified. If
-l is specified, file sizes will be
shown too.
lsdev
[-v
]
- Lists all of the devices from which it may be possible to load modules. If
-v is specified, more details are
printed.
lsmod
[-v
]
- Displays loaded modules. If
-v is
specified, more details are shown.
more
file
[file ...
]
- Display the files specified, with a pause at each
screen-#rows displayed.
read
[-t
seconds
]
[-p
prompt
]
[variable
]
- Reads a line of input from the terminal, storing it in
variable if specified. A timeout can be
specified with
-t, though it will be
canceled at the first key pressed. A prompt may also be displayed through
the -p flag.
reboot
- Immediately reboots the system.
set
variable
-
set
variable=value
- Set loader's environment variables.
show
[variable
]
- Displays the specified variable's value, or all variables and their values
if variable is not specified.
unload
- Remove all modules from memory.
unset
variable
- Removes variable from the environment.
?
- Lists available commands.
The
loader has actually two different kinds
of ‘environment’ variables. There are ANS Forth's
environmental queries, and a separate space of
environment variables used by builtins, which are not directly available to
Forth words. It is the latter type that this section covers.
Environment variables can be set and unset through the
set and
unset builtins, and can have their values
interactively examined through the use of the
show builtin. Their values can also be
accessed as described in
BUILTIN PARSER.
Notice that these environment variables are not inherited by any shell after the
system has been booted.
A few variables are set automatically by
loader. Others can affect the behavior of
either
loader or the kernel at boot. Some
options may require a value, while others define behavior just by being set.
Both types of builtin variables are described below.
-
-
- autoboot_delay
- Number of seconds
autoboot will wait
before booting. If this variable is not defined,
autoboot will default to 10 seconds.
If set to “NO”, no
autoboot will be automatically
attempted after processing
/boot/loader.rc, though explicit
autoboot's will be processed normally,
defaulting to 10 seconds delay.
If set to “0”, no delay will be
inserted, but user still will be able to interrupt
autoboot process and escape into the
interactive mode by pressing some key on the console while kernel and
modules are being loaded.
If set to “-1”, no delay will be
inserted and loader will engage
interactive mode only if autoboot has
failed for some reason.
-
-
- boot_ask
- Will set kernel(1M)
-a option.
-
-
- boot_debug
- Will set kernel(1M)
-d option.
-
-
- boot_kmdb
- Will set kernel(1M)
-k option.
-
-
- boot_reconfigure
- Will set kernel(1M)
-r option.
-
-
- boot_single
- Will set kernel(1M)
-s option.
-
-
- boot_verbose
- Will set kernel(1M)
-v option.
-
-
- boot-args
- Will set custom arguments for the kernel. If set in
loader configuration, the
loader startup will parse the
boot-args value to set boot prefixed
variables listed above, any unrecognized options are added to kernel
command line verbatim.
-
-
- bootfile
- The name of the kernel.
-
-
- console
- Defines the current console or consoles. Multiple consoles may be
specified. In that case, the first listed console will become the default
console for the kernel(1M).
-
-
- currdev
- Selects the default device. Syntax for devices is odd.
-
-
- interpret
- Has the value “
ok” if the Forth's
current state is interpreting.
-
-
- screen-#rows
- Define the number of lines on the screen, to be used by the pager.
-
-
- module_path
- Sets the list of directories which will be searched for modules named in a
load command or implicitly required by a dependency. The default value for
this variable is
“
/platform/i86pc/${ISADIR}”
-
-
- prompt
- Value of
loader's prompt. Defaults to
“${interpret}”. If variable
prompt is unset, the default prompt is
‘>’.
-
-
- os_console
- If set, the value is used to set kernel(1M)
console property.
Other variables are used for loader or to set kernel properties or for
informational purposes.
When a builtin command is executed, the rest of the line is taken by it as
arguments, and it is processed by a special parser which is not used for
regular Forth commands.
This special parser applies the following rules to the parsed text:
- All backslash characters are preprocessed.
- \b , \f , \r , \n and \t are processed as in C.
- \s is converted to a space.
- \v is converted to ASCII 11.
- \z is just skipped. Useful for things like
“\0xf\z\0xf”.
- \0xN and \0xNN are replaced by the hex N or NN.
- \NNN is replaced by the octal NNN ASCII character.
- \" , \' and \$ will escape these characters, preventing them from
receiving special treatment in Step 2, described below.
- \\ will be replaced with a single \ .
- In any other occurrence, backslash will just be removed.
- Every string between non-escaped quotes or double-quotes will be treated
as a single word for the purposes of the remaining steps.
- Replace any
$VARIABLE or
${VARIABLE} with the value of the environment
variable VARIABLE.
- Space-delimited arguments are passed to the called builtin command. Spaces
can also be escaped through the use of \\ .
An exception to this parsing rule exists, and is described in
Builtins And FORTH.
All builtin words are state-smart, immediate words. If interpreted, they behave
exactly as described previously. If they are compiled, though, they extract
their arguments from the stack instead of the command line.
If compiled, the builtin words expect to find, at execution time, the following
parameters on the stack:
addrN lenN ... addr2 len2
addr1 len1 N
where
addrX lenX are strings which will compose
the command line that will be parsed into the builtin's arguments. Internally,
these strings are concatenated in from 1 to N, with a space put between each
one.
If no arguments are passed, a 0
must be passed,
even if the builtin accepts no arguments.
While this behavior has benefits, it has its trade-offs. If the execution token
of a builtin is acquired (through
' or
[']), and then passed to
catch or
execute, the builtin behavior will depend
on the system state
at the time catch or
execute is processed!
This is particularly annoying for programs that want or need to handle
exceptions. In this case, the use of a proxy is recommended. For example:
: (boot) boot;
FICL is a Forth interpreter written in C, in the form of a forth virtual machine
library that can be called by C functions and vice versa.
In
loader, each line read interactively is
then fed to FICL, which may call
loader
back to execute the builtin words. The builtin
include will also feed FICL, one line at a
time.
The words available to FICL can be classified into four groups. The ANS Forth
standard words, extra FICL words, extra
FreeBSD words,
and the builtin commands; the latter were already described. The ANS Forth
standard words are listed in the
STANDARDS section. The words
falling in the two other groups are described in the following subsections.
-
-
.env
-
.ver
-
-roll
-
2constant
-
>name
-
body>
-
compare
- This is the STRING word set's
compare.
-
-
compile-only
-
endif
-
forget-wid
-
parse-word
-
sliteral
- This is the STRING word set's
sliteral.
-
-
wid-set-super
-
w@
-
w!
-
x.
-
empty
-
cell-
-
-rot
-
-
-
$
(--)
- Evaluates the remainder of the input buffer, after having printed it
first.
-
-
%
(--)
- Evaluates the remainder of the input buffer under a
catch exception guard.
-
-
.#
- Works like
. but without outputting a
trailing space.
-
-
fclose
(fd --)
- Closes a file.
-
-
fkey
(fd -- char)
- Reads a single character from a file.
-
-
fload
(fd --)
- Processes a file fd.
-
-
fopen
(addr len mode --
fd)
- Opens a file. Returns a file descriptor, or -1 in case of failure. The
mode parameter selects whether the file
is to be opened for read access, write access, or both. The constants
O_RDONLY,
O_WRONLY, and
O_RDWR are defined in
/boot/forth/support.4th, indicating
read only, write only, and read-write access, respectively.
-
-
fread
(fd addr len -- len')
- Tries to read len bytes from file
fd into buffer
addr. Returns the actual number of bytes
read, or -1 in case of error or end of file.
-
-
heap?
(-- cells)
- Return the space remaining in the dictionary heap, in cells. This is not
related to the heap used by dynamic memory allocation words.
-
-
inb
(port -- char)
- Reads a byte from a port.
-
-
key
(-- char)
- Reads a single character from the console.
-
-
key?
(-- flag)
- Returns
true if there is a character
available to be read from the console.
-
-
ms
(u --)
- Waits u microseconds.
-
-
outb
(port char --)
- Writes a byte to a port.
-
-
seconds
(-- u)
- Returns the number of seconds since midnight.
-
-
tib>
(-- addr len)
- Returns the remainder of the input buffer as a string on the stack.
-
-
- arch-i386
TRUE
if the architecture is IA32.
-
-
- loader_version
loader version.
The following values are thrown by
loader:
-
-
- 100
- Any type of error in the processing of a builtin.
-
-
- -1
Abort
executed.
-
-
- -2
Abort"
executed.
-
-
- -56
Quit
executed.
-
-
- -256
- Out of interpreting text.
-
-
- -257
- Need more text to succeed -- will finish on next run.
-
-
- -258
Bye
executed.
-
-
- -259
- Unspecified error.
- /boot/defaults/loader.conf
-
- /boot/conf.d/*
-
- /boot/loader.conf
-
- /boot/loader.conf.local
loader configuration files, as
described in loader.conf(4).
- /boot/loader.help
- Loaded by
help. Contains the help
messages.
- /boot/loader.rc
loader bootstrapping script.
- /boot/forth/loader.4th
- Extra builtin-like words.
- /boot/forth/support.4th
- loader.conf processing words.
- /boot/zfsloader
loader itself.
Boot in single user mode:
boot -s
Load the kernel, a boot_archive, and then autoboot in five seconds. Notice that
a kernel must be loaded before any other
load command is attempted.
load /platform/i86pc/kernel/amd64/unix
load -t rootfs /platform/i86pc/amd64/boot_archive
autoboot 5
boot(1M),
btxld(1onbld),
loader.conf(4)
For the purposes of ANS Forth compliance, loader is an
ANS Forth System with Environmental Restrictions,
Providing
.(, :noname,
?do, parse, pick, roll, refill, to, value, \, false,
true, <>, 0<>,
compile, , erase, nip, tuck
and marker
from the Core Extensions word set, Providing the Exception
Extensions word set, Providing the Locals Extensions word set, Providing the
Memory-Allocation Extensions word set, Providing
.s, bye, forget, see, words, [if], [else]
and [then]
from the Programming-Tools extension word set, Providing the
Search-Order extensions word set.