LOADER(7) | Standards, Environments, and Macros | LOADER(7) |
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
loader
. 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(7). 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
[seconds [prompt]]bcachestat
boot
boot
kernelname [...
]boot
-flag
...
WARNING: The behavior of this builtin is changed if loader.4th(7) is loaded.
chain
deviceecho
[-n
] [⟨message⟩]-n
is specified.
heap
help
[topic [subtopic]]include
file [file ...]load
[-t
type]
file ...
ls
[-l
] [path]-l
is specified, file sizes will be shown too.
lsdev
[-v
]-v
is specified, more details are printed. For ZFS
pools the output resembles zpool
status
output.
lsmod
[-v
]-v
is specified, more
details are shown.
lszfs
filesystemmore
file [file ...]read
[-t
seconds]
[-p
prompt]
[variable]-t
, though it will be canceled at the first
key pressed. A prompt may also be displayed through the
-p
flag.
reboot
[-f
]-f
flag is set, or the
BOOT_TO_FW_UI environment variable exists, and the
firmware supports this feature, the system will automatically enter the
firmware setup after reboot.
set
variableset
variable=valueshow
[variable]unload
unset
variable?
loader
supports the following format for
specifying ZFS filesystems which can be used wherever
loader
refers to a device specification:
zfs:pool/filesystem:
where pool/filesystem is a ZFS filesystem name as described in zfs(8).
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
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.
-a
option.-d
option.-k
option.-r
option.-s
option.-v
option.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.chain
command and will cause chain command menu
entry to appear on loader
main menu. The alternate
method to use chain loader is to add menu entries into
menu.lst(5) file.ok
” if the Forth's
current state is interpreting./platform/i86pc/${ISADIR}
”loader
's prompt. Defaults to
“${interpret}
”. If variable
prompt is unset, the default prompt is
‘>
’.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:
$VARIABLE
or
${VARIABLE}
with the value of the environment
variable VARIABLE.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:
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
catch
or
execute
is processed!: (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
compare
.compile-only
endif
forget-wid
parse-word
sliteral
sliteral
.wid-set-super
w@
w!
x.
empty
cell-
-rot
$
(--)%
(--)catch
exception guard..#
.
but without outputting a trailing
space.fclose
(fd --)fkey
(fd -- char)fload
(fd --)fopen
(addr len mode --
fd)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')heap?
(-- cells)inb
(port -- char)isvirtualized?
(-- addr len flag | flag)true
and string with virtualization engine
name or false
.key
(-- char)key?
(-- flag)true
if there is a character available to
be read from the console.ms
(u --)outb
(port char --)seconds
(-- u)tib>
(-- addr len)fb-bezier
(x1 y1 x2 y2 x3 y3 width --)fb-drawrect
(x1 y1 x2 y2 fill --)true
then the rectangle will be filled in.fb-line
(x1 y1 x2 y2 width --)fb-putimage
(flags x1 y1 x2 y2 addr len -- flag)true
if
the image was able to be written and false
otherwise. Only truecolor PNG images are supported and the path to the
file must be provided through the addr and
len arguments on the stack. The image will be displayed
in the rectangular screen region with the top left at
(x1,y1) and the bottom right at
(x2,y2)
Either x2 or y2 can be set to "0" which causes it to be calculated to maintain the aspect ratio of the image. If both are "0" then the native resolution of the image will be used.
If x1 is "0", then the image will be placed as far over to the right of the screen as possible. Similarly, if y1 is "0", then the image will be placed as far down the screen as possible.
Flags is a bitfield; the following bits are defined:
fb-setpixel
(x y --)term-drawrect
(x1 y1 x2 y2 --)TRUE
if the
architecture is IA32.loader
version.The following values are thrown by
loader
:
loader
configuration files, as described in
loader.conf(5).help
. Contains the help messages.loader
bootstrapping script.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
Set the default device used for loading a kernel from a ZFS filesystem:
set currdev=zfs:rpool/ROOT/knowngood:
Although setting the currdev as shown in the example above is supported, it is advisable to use loader beadm command or boot environment menu instead. The reason is, the beadm or menu selection will also instruct loader to clean up the currently set configuration and load configuration from the new boot environment.
For the purposes of ANS Forth compliance, loader is an
marker
[then]
March 30, 2023 | OmniOS |