xref: /freebsd/usr.sbin/bsdinstall/bsdinstall.8 (revision b670c9bafc0e31c7609969bf374b2e80bdc00211)
1.\"-
2.\" Copyright (c) 2011-2013 Nathan Whitehorn <nwhitehorn@FreeBSD.org> All rights reserved.
3.\" Copyright (c) 2018 Roberto Fernandez Cueto <roberfern@gmail.com>
4.\" Copyright (c) 2024 The FreeBSD Foundation
5.\"
6.\" Portions of this documentation were written by Björn Zeeb
7.\" under sponsorship from the FreeBSD Foundation.
8.\"
9.\" Redistribution and use in source and binary forms, with or without
10.\" modification, are permitted provided that the following conditions
11.\" are met:
12.\" 1. Redistributions of source code must retain the above copyright
13.\"    notice, this list of conditions and the following disclaimer.
14.\" 2. Redistributions in binary form must reproduce the above copyright
15.\"    notice, this list of conditions and the following disclaimer in the
16.\"    documentation and/or other materials provided with the distribution.
17.\"
18.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21.\" DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
22.\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28.\" POSSIBILITY OF SUCH DAMAGE.
29.\"
30.Dd November 4, 2024
31.Dt BSDINSTALL 8
32.Os
33.Sh NAME
34.Nm bsdinstall
35.Nd system installer
36.Sh SYNOPSIS
37.Nm
38.Op Ar options
39.Op Ar target
40.Op Ar ...
41.Sh DESCRIPTION
42.Nm
43is used for installation of new systems, both for system setup from
44installation media, e.g., CD-ROMs, and for use on live systems to prepare
45VM images and jails.
46.Pp
47Much like
48.Xr make 1 , Nm
49takes a target and possible parameters of the target as arguments.
50If invoked with no arguments, it will invoke the
51.Cm auto
52target, which provides a standard interactive installation, invoking the
53others in sequence.
54To perform a scripted installation,
55these subtargets can be invoked separately by an installation script.
56.Sh OPTIONS
57.Nm
58supports the following options, global to all targets:
59.Bl -tag -width indent+
60.It Fl D Ar file
61Provide a path for the installation log file
62.Pq overrides Ev BSDINSTALL_LOG .
63See
64.Sx ENVIRONMENT VARIABLES
65for more information on
66.Ev BSDINSTALL_LOG .
67.El
68.Sh TARGETS
69Most of the following targets are only useful for scripting the installer.
70For interactive use, most users will be interested only in the
71.Cm auto ,
72.Cm jail ,
73and
74.Cm script
75targets.
76.Bl -tag -width "jail destination"
77.It Cm auto
78Run the standard interactive installation, including disk partitioning.
79.It Cm jail Ar destination
80Sets up a new chroot system at
81.Pa destination ,
82suitable for use with
83.Xr jail 8 .
84Behavior is generally similar to
85.Cm auto ,
86except that disk partitioning and network setup are skipped and a kernel is
87not installed into the new system.
88.It Cm script Ar script
89Runs the installation script at
90.Pa script .
91See
92.Sx SCRIPTING
93for more information on this target.
94.It Cm keymap
95If the current controlling TTY is a
96.Xr syscons 4
97or
98.Xr vt 4
99console, asks the user to set the current keymap, and saves the result to the
100new system's
101.Pa rc.conf .
102.It Cm hostname
103Prompts the user for a host name for the new system and saves the result to the
104new system's
105.Pa rc.conf .
106If
107.Ev BSDINSTALL_CONFIGCURRENT
108is set, also sets the host name of the current system.
109.It Cm netconfig
110Interactively configures network interfaces (first invoking
111.Cm wlanconfig
112on wireless interfaces), saving the result to the new system's
113.Pa rc.conf
114and
115.Pa resolv.conf .
116If
117.Ev BSDINSTALL_CONFIGCURRENT
118is set, also configures the network interfaces of the current system to match.
119.It Cm autopart
120Provides the installer's interactive guided disk partitioner for single-disk
121installations.
122Defaults to UFS.
123.It Cm bootconfig
124Detects an appropriate partition and installs UEFI boot loader files.
125.It Cm zfsboot
126Provides a ZFS-only automatic interactive disk partitioner.
127Creates a single
128.Ic zpool
129with separate datasets for
130.Pa /home ,
131.Pa /tmp ,
132.Pa /usr ,
133.Pa /usr/ports ,
134.Pa /usr/src ,
135and
136.Pa /var .
137Optionally can set up
138.Xr geli 8
139to encrypt the disk.
140.It Cm partedit
141Provides the installer's interactive manual disk partitioner with an interface
142identical to
143.Xr sade 8 .
144Supports multiple disks as well as UFS, ZFS, and FAT file systems.
145ZFS is set up with one pool and dataset per partition.
146.It Cm scriptedpart Ar parameters
147Sets up disks like
148.Cm autopart
149and
150.Cm partedit ,
151but non-interactively according to the disk setup specified in
152.Ar parameters .
153Each disk setup is specified by a three-part argument:
154.Pp
155.Ar disk
156.Op Ar scheme
157.Op Ar {partitions}
158.Pp
159Multiple disk setups are separated by semicolons.
160The
161.Ar disk
162argument specifies the disk on which to operate (which will be erased),
163or the special value
164.Em DEFAULT ,
165which will result in either a selection window (as in
166.Cm autopart )
167for the destination disk or, if there is only one possible disk, will
168automatically select it.
169The
170.Ar scheme
171argument specifies the
172.Xr gpart 8
173partition scheme to apply to the disk.
174If
175.Ar scheme
176is unspecified,
177.Cm scriptedpart
178will apply the default bootable scheme on your platform.
179The
180.Ar partitions
181argument is also optional and specifies how to partition
182.Ar disk .
183It consists of a comma-separated list of partitions to create enclosed in
184curly braces.
185Each partition declaration takes the form
186.Pp
187.Ar size
188.Ar type
189.Op Ar mount point
190.Pp
191.Ar size
192specifies the partition size to create in bytes (K, M, and G suffixes
193can be appended to specify kilobytes, megabytes, and gigabytes respectively),
194while the
195.Em auto
196keyword causes the partition to take all the remaining space on the disk.
197The
198.Ar type
199option chooses the
200.Xr gpart 8
201filesystem type, e.g., freebsd-ufs, freebsd-zfs, or freebsd-swap.
202The optional
203.Ar mount point
204argument sets where the created partition is to be mounted in the installed
205system.
206As an example, a typical invocation looks like:
207.Pp
208bsdinstall scriptedpart ada0 { 20G freebsd-ufs /, 4G freebsd-swap, 20G freebsd-ufs /var, auto freebsd-ufs /usr }
209.Pp
210Note that the list of partitions should
211.Em not
212include boot partitions (e.g. EFI system partitions), which will be created automatically on whatever disk includes /.
213.Pp
214A shorter invocation to use the default partitioning (as
215.Cm autopart
216would have used) on the same disk:
217.Pp
218bsdinstall scriptedpart ada0
219.Pp
220or, even shorter:
221.Pp
222bsdinstall scriptedpart DEFAULT
223.It Cm mount
224Mounts the file systems previously configured by
225.Cm autopart ,
226.Cm partedit ,
227or
228.Cm scriptedpart
229under
230.Ev BSDINSTALL_CHROOT .
231.It Cm distfetch
232Fetches the distributions in
233.Ev DISTRIBUTIONS
234to
235.Ev BSDINSTALL_DISTDIR
236from
237.Ev BSDINSTALL_DISTSITE .
238.It Cm checksum
239Verifies the checksums of the distributions listed in
240.Ev DISTRIBUTIONS
241against the distribution manifest.
242.It Cm distextract
243Extracts the distributions listed in
244.Ev DISTRIBUTIONS
245into
246.Ev BSDINSTALL_CHROOT .
247.It Cm pkgbase Op Fl --no-kernel
248Fetch and install base system packages to
249.Ev BSDINSTALL_CHROOT .
250Packages are fetched according to repository configuration in
251.Ev BSDINSTALL_PKG_REPOS_DIR
252if set, or
253.Lk pkg.freebsd.org
254otherwise.
255If the
256.Fl --no-kernel
257option is passed, no kernel is installed.
258.It Cm firmware
259executes
260.Xr fwget 8
261inside the
262.Ev BSDINSTALL_CHROOT
263to install any needed and available firmware for the new system.
264.It Cm rootpass
265Interactively invokes
266.Xr passwd 1
267in the new system to set the root user's password.
268.It Cm adduser
269Interactively invokes
270.Xr adduser 8
271in the new system.
272.It Cm time
273Interactively sets the time, date, and time zone of the new system.
274.It Cm services
275Queries the user for the system daemons to begin at system startup,
276writing the result into the new system's
277.Pa rc.conf .
278.It Cm entropy
279Reads a small amount of data from
280.Pa /dev/random
281and stores it in a file in the new system's root directory.
282.It Cm config
283Installs the configuration files destined for the new system, e.g.,
284.Xr rc.conf 5
285fragments generated by
286.Cm netconfig ,
287etc.) onto the new system.
288.El
289.Sh ENVIRONMENT VARIABLES
290The following environment variables control various aspects of the installation
291process.
292Many are used internally during installation and have reasonable default values
293for most installation scenarios.
294Others are set by various interactive user prompts, and can be usefully
295overridden when making scripted or customized installers.
296.Bl -tag -width "BSDINSTALL_DISTSITE"
297.It Ev TMPDIR
298The directory to use for temporary files.
299Default:
300.Dq Pa /tmp
301.It Ev DISTRIBUTIONS
302The set of distributions to install, e.g., "base.txz kernel.txz ports.txz".
303Default: unset
304.It Ev PARTITIONS
305The partitioning of the disk onto which the system is being installed.
306See
307.Cm scriptedpart
308of
309the
310.Sx TARGETS
311section for format details. If this variable is unset, the installer will
312use the default partitioning as in
313.Cm autopart .
314Default: unset
315.It Ev BSDINSTALL_DISTDIR
316The directory in which the distribution files can be found (or to which they
317should be downloaded).
318Default:
319.Dq Pa /usr/freebsd-dist
320.It Ev BSDINSTALL_DISTSITE
321URL from which the distribution files should be downloaded if they are not
322already present in the directory defined by
323.Ev BSDINSTALL_DISTDIR .
324This should be a full path to the files, including architecture and release
325names.
326Most targets, e.g.,
327.Cm auto
328and
329.Cm jail ,
330that prompt for a
331.Fx
332mirror will skip that step if this variable is already defined in the
333environment.
334Example:
335.Pa https://download.freebsd.org/ftp/releases/powerpc/powerpc64/13.1-RELEASE/
336or
337.Pa http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/amd64/12.2-RELEASE/ .
338.It Ev BSDINSTALL_PKG_REPOS_DIR
339Directory containing
340.Xr pkg 8
341repository configuration files used by the
342.Cm pkgbase
343target.
344See
345.Sx REPOSITORY CONFIGURATION
346in
347.Xr pkg.conf 5 .
348Default: unset
349.It Ev BSDINSTALL_CHROOT
350The directory into which the distribution files should be unpacked and the
351directory at which the root file system of the new system should be mounted.
352Default:
353.Dq Pa /mnt
354.It Ev BSDINSTALL_LOG
355Path to a log file for the installation.
356Default:
357.Dq Pa $TMPDIR/bsdinstall_log
358.It Ev BSDINSTALL_SKIP_FIRMWARE
359If not empty, the
360.Cm auto
361target
362will not invoke the
363.Cm firmware
364target.
365.It Ev BSDINSTALL_SKIP_HARDENING
366If not empty, the
367.Cm auto
368target
369will not invoke the
370.Cm hardening
371target.
372.It Ev BSDINSTALL_SKIP_HOSTNAME
373If not empty, the
374.Cm auto
375target
376will not invoke the
377.Cm hostname
378target.
379.It Ev BSDINSTALL_SKIP_KEYMAP
380If not empty, the
381.Cm auto
382target
383will not invoke the
384.Cm keymap
385target.
386.It Ev BSDINSTALL_SKIP_MANUAL
387If not empty, the
388.Cm auto
389target will not offer to open a shell in the new system
390for final manual modifications.
391.It Ev BSDINSTALL_SKIP_SERVICES
392If not empty, the
393.Cm auto
394target
395will not invoke the
396.Cm services
397target.
398.It Ev BSDINSTALL_SKIP_TIME
399If not empty, the
400.Cm auto
401target
402will not invoke the
403.Cm time
404target.
405.It Ev BSDINSTALL_SKIP_USERS
406If not empty, the
407.Cm auto
408target
409will not invoke the
410.Cm adduser
411target.
412.It Ev BSDINSTALL_SKIP_FINALCONFIG
413If not empty, the
414.Cm auto
415target will not show the final configuration dialog,
416where earlier configuration choices can be revisited.
417.It Ev BSDINSTALL_TMPETC
418Directory where files destined for the new system's
419.Pa /etc
420will be stored until the
421.Cm config
422target is executed.
423If this directory does not already exist, it will be created.
424Default:
425.Dq Pa $TMPDIR/bsdinstall_etc
426.It Ev BSDINSTALL_TMPBOOT
427Directory where files destined for the new system's
428.Pa /boot
429will be stored until the
430.Cm config
431target is executed.
432If this directory does not already exist, it will be created.
433Default:
434.Dq Pa $TMPDIR/bsdinstall_boot
435.It Ev ROOTPASS_ENC
436Encrypted string to set the root password to in the format expected by
437.Xr pw 8
438.Fl H Ar 0 .
439This option is used if both it and
440.Ev ROOTPASS_PLAIN
441are set.
442.It Ev ROOTPASS_PLAIN
443Plain text string to set the root password to.
444.It Ev ZFSBOOT_POOL_NAME
445Name for the pool containing the base system.
446Default:
447.Dq zroot
448.It Ev ZFSBOOT_POOL_CREATE_OPTIONS
449Options to be used when creating the base system's pool.
450Each option must be preceded by the -O flag to be taken into consideration
451or the pool will not be created due to errors using the command
452.Cm zpool .
453Default:
454.Dq Li "-O compress=lz4 -O atime=off"
455.It Ev ZFSBOOT_BEROOT_NAME
456Name for the boot environment parent dataset.
457This is a non-mountable dataset meant to be a parent dataset where different
458boot environment are going to be created.
459Default:
460.Dq ROOT
461.It Ev ZFSBOOT_BOOTFS_NAME
462Name for the primary boot environment, which will be the default boot
463environment for the system.
464Default:
465.Dq default
466.It Ev ZFSBOOT_VDEV_TYPE
467The type of pool to be created for the base system.
468This variable can take one of this values: stripe (No redundancy),
469mirror (n-Way mirroring), raid10 (RAID 1+0 - n x 2-Way Mirrors),
470raidz1 (RAID-Z1 - Single Redundancy RAID), raidz2 (RAID-Z2 - Double Redundancy RAID)
471or raidz3 (RAID-Z3 Triple Redundancy RAID).
472Default:
473.Dq stripe
474.It Ev ZFSBOOT_FORCE_4K_SECTORS
475Controls the minimum sector size of the pool.
476If this variable is not empty, the minimum sector size is 4K.
477If this variable is empty, the minimum sector size is 512.
478Note that the sector size of the pool will always be at least
479the sector size of the backing disks.
480Default:
481.Dq 1
482.It Ev ZFSBOOT_GELI_ENCRYPTION
483If this variable is not empty, it will use
484.Xr geli 8
485to encrypt the root pool, enabling automatically the
486.Ev ZFSBOOT_BOOT_POOL
487variable.
488Default:
489.Dq ""
490.It Ev ZFSBOOT_GELI_KEY_FILE
491Path to the
492.Xr geli 8
493keyfile used to encrypt the pool where the base system is stored.
494Default:
495.Dq Pa /boot/encryption.key
496.It Ev ZFSBOOT_BOOT_POOL
497If set, a separated boot pool will be created for the kernel of the
498system and
499.Xr loader 8 .
500Default: unset
501.It Ev ZFSBOOT_BOOT_POOL_CREATE_OPTIONS
502Options to use when creating the boot pool, when enabled (See
503.Ev ZFSBOOT_BOOT_POOL ).
504Default: unset
505.It Ev ZFSBOOT_BOOT_POOL_NAME
506Name for the optional boot pool when it is enabled, (See
507.Ev ZFSBOOT_BOOT_POOL ).
508Default:
509.Dq bootpool
510.It Ev ZFSBOOT_BOOT_POOL_SIZE
511Size of the boot pool when it is enabled (See
512.Ev ZFSBOOT_BOOT_POOL ).
513Default:
514.Dq 2g
515.It Ev ZFSBOOT_DISKS
516Disks to be used for the base system, including the boot pool.
517This variable must only be used on a scripted installation.
518See
519.Sx SCRIPTING
520for more information.
521Default: unset
522.It Ev ZFSBOOT_SWAP_SIZE
523Size of the swap partition on each block device.
524This variable will be passed to
525.Xr gpart 8 ;
526which supports SI unit suffixes.
527Default:
528.Dq 2g
529.It Ev ZFSBOOT_SWAP_ENCRYPTION
530If set, enables the encryption of the swap partition using
531.Xr geli 8 .
532Default: ""
533.It Ev ZFSBOOT_SWAP_MIRROR
534If set, enables a swap mirroring using
535.Xr gmirror 8 .
536Default:
537unset
538.It Ev ZFSBOOT_DATASETS
539ZFS datasets to be created on the root zpool, it requires the
540following datasets:
541.Pa /tmp ,
542.Pa /var/tmp ,
543.Pa /$ZFSBOOT_BEROOT_NAME/$ZFSBOOT_BOOTFS_NAME .
544See
545.Sx ZFS DATASETS
546for more information about how to populate this variable and
547its default value.
548.It Ev ZFSBOOT_CONFIRM_LAYOUT
549If set and the installation is interactive, allow the user to confirm
550the layout before continuing with the installation.
551Default:
552.Dq 1
553.El
554.Sh SCRIPTING
555.Nm
556supports unattended, or minimally-attended, installations using scripting.
557This can be used with either modified physical installation media or with
558.Xr diskless 8
559installations over the network; information on preparing such media can be
560found in
561.Sx BUILDING AUTOMATIC INSTALL MEDIA
562.Pp
563Scripted installations follow an essentially identical path to interactive
564installations, though with some minor feature differences (for example,
565scripted installations do not support fetching of remote distribution files
566since scripted installations normally install the same files and the distributions
567can be added directly to the installation media).
568.Nm
569scripts consist of two parts: a
570.Em preamble
571and a
572.Em setup script .
573The preamble sets up the options for the installation (how to partition the
574disk[s], which distributions to install, etc.) and the optional second part is
575a shell script run under
576.Xr chroot 8
577in the newly installed system before
578.Nm
579exits.
580The two parts are separated by the usual script header (#!), which also sets
581the interpreter for the setup script.
582.Pp
583A typical bsdinstall script, using the default filesystem layout and the UFS
584filesystem, looks like this:
585.Bd -literal -offset indent
586PARTITIONS=DEFAULT
587DISTRIBUTIONS="kernel.txz base.txz"
588
589#!/bin/sh
590sysrc ifconfig_DEFAULT=DHCP
591sysrc sshd_enable=YES
592pkg install puppet
593.Ed
594.Pp
595For a scripted installation involving a ZFS pool spanning multiple disks,
596the script instead looks like this:
597.Bd -literal -offset indent
598DISTRIBUTIONS="kernel.txz base.txz"
599export ZFSBOOT_VDEV_TYPE=stripe
600export ZFSBOOT_DISKS="ada0 ada1"
601export nonInteractive="YES"
602
603#!/bin/sh
604echo "ifconfig_DEFAULT=DHCP" >> /etc/rc.conf
605echo "sshd_enable=YES" >> /etc/rc.conf
606pkg install puppet
607.Ed
608.Pp
609On
610.Fx
611release media, such a script placed at
612.Pa /etc/installerconfig
613will be run at boot time and the system will be rebooted automatically after
614the installation has completed.
615This can be used for unattended network installation of new systems; see
616.Xr diskless 8
617for details.
618.Ss PREAMBLE
619The preamble consists of installer settings.
620These control global installation parameters (see
621.Sx ENVIRONMENT VARIABLES )
622as well as disk partitioning.
623The preamble is interpreted as a
624.Xr sh 1
625script run at the very beginning of the install.
626If more complicated behavior than setting these variables is desired,
627arbitrary commands can be run here to extend the installer.
628In addition to the variables in
629.Sx ENVIRONMENT VARIABLES ,
630in particular
631.Ev DISTRIBUTIONS ,
632the preamble can contain a variable
633.Ev PARTITIONS
634which is passed to the
635.Cm scriptedpart
636target to control disk setup.
637.Pp
638Alternatively,
639to use
640.Cm zfsboot
641instead of
642.Cm partedit ,
643the preamble can contain the variable
644.Ev ZFSBOOT_DATASETS
645instead of
646.Ev PARTITIONS
647(see below).
648If using
649.Cm zfsboot ,
650the variables
651.Ev ZFSBOOT_DISKS
652and
653.Ev ZFSBOOT_VDEV_TYPE
654must be set to create the pool of disks for the base system.
655Usually, for a mirrored booting disk, these two variables look like this:
656.Bd -literal -offset indent
657ZFSBOOT_DISKS="ada0 ada1"
658ZFSBOOT_VDEV_TYPE=mirror
659.Ed
660.Pp
661Remember to export all the variables for the
662.Cm zfsboot
663command, otherwise installation will fail.
664.Ss SETUP SCRIPT
665Following the preamble is an optional shell script, beginning with a #!
666declaration.
667This script will be run at the end of the installation process inside a
668.Xr chroot 8
669environment in the newly installed system and can be used to set up
670configuration files, install packages, etc.
671Note that newly configured system services, e.g., networking have not
672been started in the installed system at this time and only installation
673host services are available.
674.Ss ZFS DATASETS
675If using
676.Cm zfsboot
677in an installation script, the
678.Cm zfsboot
679partitioning tool takes the
680.Ev ZFSBOOT_DATASETS
681variable to create the ZFS datasets on the base system.
682This variable definition can become large if the pool contains many datasets.
683The default value of
684.Ev ZFSBOOT_DATASETS
685is:
686.Bd -literal -offset indent
687# DATASET	OPTIONS (comma or space separated; or both)
688
689# Boot Environment [BE] root and default boot dataset
690/$ZFSBOOT_BEROOT_NAME				mountpoint=none
691/$ZFSBOOT_BEROOT_NAME/$ZFSBOOT_BOOTFS_NAME	mountpoint=/
692
693# Home directories separated so they are common to all BEs
694/home		mountpoint=/home
695
696# Compress /tmp, allow exec but not setuid
697/tmp		mountpoint=/tmp,exec=on,setuid=off
698
699# Do not mount /usr so that 'base' files go to the BEROOT
700/usr		mountpoint=/usr,canmount=off
701
702# Ports tree
703/usr/ports	setuid=off
704
705# Source tree (compressed)
706/usr/src
707
708# Create /var and friends
709/var		mountpoint=/var,canmount=off
710/var/audit	exec=off,setuid=off
711/var/crash	exec=off,setuid=off
712/var/log	exec=off,setuid=off
713/var/mail	atime=on
714/var/tmp	setuid=off
715.Ed
716.Pp
717The first column is the name of the dataset to be created as part of the
718.Ev ZFSBOOT_POOL_NAME
719pool and the remainder of each line contains the options to be set on each dataset.
720If multiple options are given, they can be separated by either commas or whitespace;
721everything following a pound/hash character is ignored as a comment.
722.Ss BUILDING AUTOMATIC INSTALL MEDIA
723If building automatic install media, use tar to extract a release ISO:
724.Dl mkdir release-media
725.Dl tar -C release-media -xvf FreeBSD-13.0-RELEASE-amd64-disc1.iso
726.Pp
727Then place a script as above in
728.Pa etc/installerconfig
729.Pp
730This directory can then be used directly as an NFS root for
731.Xr diskless 8
732installations or it can be rebuilt into an ISO image using the release scripts in
733.Pa /usr/src/release .
734For example, on amd64:
735.Dl sh /usr/src/release/amd64/mkisoimages.sh -b '13_0_RELEASE_AMD64_CD' output.iso release-media
736.Sh HISTORY
737This version of
738.Nm
739first appeared in
740.Fx 9.0 .
741.Sh AUTHORS
742.An Nathan Whitehorn Aq Mt nwhitehorn@FreeBSD.org
743.An Devin Teske Aq Mt dteske@FreeBSD.org
744.An Allan Jude Aq Mt allanjude@FreeBSD.org
745