xref: /freebsd/usr.sbin/bsdinstall/bsdinstall.8 (revision 046c625e9382e17da953767b881aaa782fa73af8)
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 --jail
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 --jail
257option is passed, no kernel is installed, and the
258.Dq jail
259variant of each package set will be selected where applicable.
260.It Cm firmware
261executes
262.Xr fwget 8
263inside the
264.Ev BSDINSTALL_CHROOT
265to install any needed and available firmware for the new system.
266.It Cm rootpass
267Interactively invokes
268.Xr passwd 1
269in the new system to set the root user's password.
270.It Cm adduser
271Interactively invokes
272.Xr adduser 8
273in the new system.
274.It Cm time
275Interactively sets the time, date, and time zone of the new system.
276.It Cm services
277Queries the user for the system daemons to begin at system startup,
278writing the result into the new system's
279.Pa rc.conf .
280.It Cm entropy
281Reads a small amount of data from
282.Pa /dev/random
283and stores it in a file in the new system's root directory.
284.It Cm config
285Installs the configuration files destined for the new system, e.g.,
286.Xr rc.conf 5
287fragments generated by
288.Cm netconfig ,
289etc.) onto the new system.
290.El
291.Sh ENVIRONMENT VARIABLES
292The following environment variables control various aspects of the installation
293process.
294Many are used internally during installation and have reasonable default values
295for most installation scenarios.
296Others are set by various interactive user prompts, and can be usefully
297overridden when making scripted or customized installers.
298.Bl -tag -width "BSDINSTALL_DISTSITE"
299.It Ev TMPDIR
300The directory to use for temporary files.
301Default:
302.Dq Pa /tmp
303.It Ev DISTRIBUTIONS
304The set of distributions to install, e.g., "base.txz kernel.txz ports.txz".
305Default: unset
306.It Ev PARTITIONS
307The partitioning of the disk onto which the system is being installed.
308See
309.Cm scriptedpart
310of
311the
312.Sx TARGETS
313section for format details. If this variable is unset, the installer will
314use the default partitioning as in
315.Cm autopart .
316Default: unset
317.It Ev BSDINSTALL_DISTDIR
318The directory in which the distribution files can be found (or to which they
319should be downloaded).
320Default:
321.Dq Pa /usr/freebsd-dist
322.It Ev BSDINSTALL_DISTSITE
323URL from which the distribution files should be downloaded if they are not
324already present in the directory defined by
325.Ev BSDINSTALL_DISTDIR .
326This should be a full path to the files, including architecture and release
327names.
328Most targets, e.g.,
329.Cm auto
330and
331.Cm jail ,
332that prompt for a
333.Fx
334mirror will skip that step if this variable is already defined in the
335environment.
336Example:
337.Pa https://download.freebsd.org/ftp/releases/powerpc/powerpc64/13.1-RELEASE/
338or
339.Pa http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/amd64/12.2-RELEASE/ .
340.It Ev BSDINSTALL_PKG_REPOS_DIR
341Directory containing
342.Xr pkg 8
343repository configuration files used by the
344.Cm pkgbase
345target.
346See
347.Sx REPOSITORY CONFIGURATION
348in
349.Xr pkg.conf 5 .
350Default: unset
351.It Ev BSDINSTALL_CHROOT
352The directory into which the distribution files should be unpacked and the
353directory at which the root file system of the new system should be mounted.
354Default:
355.Dq Pa /mnt
356.It Ev BSDINSTALL_LOG
357Path to a log file for the installation.
358Default:
359.Dq Pa $TMPDIR/bsdinstall_log
360.It Ev BSDINSTALL_SKIP_FIRMWARE
361If not empty, the
362.Cm auto
363target
364will not invoke the
365.Cm firmware
366target.
367.It Ev BSDINSTALL_SKIP_HARDENING
368If not empty, the
369.Cm auto
370target
371will not invoke the
372.Cm hardening
373target.
374.It Ev BSDINSTALL_SKIP_HOSTNAME
375If not empty, the
376.Cm auto
377target
378will not invoke the
379.Cm hostname
380target.
381.It Ev BSDINSTALL_SKIP_KEYMAP
382If not empty, the
383.Cm auto
384target
385will not invoke the
386.Cm keymap
387target.
388.It Ev BSDINSTALL_SKIP_MANUAL
389If not empty, the
390.Cm auto
391target will not offer to open a shell in the new system
392for final manual modifications.
393.It Ev BSDINSTALL_SKIP_SERVICES
394If not empty, the
395.Cm auto
396target
397will not invoke the
398.Cm services
399target.
400.It Ev BSDINSTALL_SKIP_TIME
401If not empty, the
402.Cm auto
403target
404will not invoke the
405.Cm time
406target.
407.It Ev BSDINSTALL_SKIP_USERS
408If not empty, the
409.Cm auto
410target
411will not invoke the
412.Cm adduser
413target.
414.It Ev BSDINSTALL_SKIP_FINALCONFIG
415If not empty, the
416.Cm auto
417target will not show the final configuration dialog,
418where earlier configuration choices can be revisited.
419.It Ev BSDINSTALL_TMPETC
420Directory where files destined for the new system's
421.Pa /etc
422will be stored until the
423.Cm config
424target is executed.
425If this directory does not already exist, it will be created.
426Default:
427.Dq Pa $TMPDIR/bsdinstall_etc
428.It Ev BSDINSTALL_TMPBOOT
429Directory where files destined for the new system's
430.Pa /boot
431will be stored until the
432.Cm config
433target is executed.
434If this directory does not already exist, it will be created.
435Default:
436.Dq Pa $TMPDIR/bsdinstall_boot
437.It Ev ROOTPASS_ENC
438Encrypted string to set the root password to in the format expected by
439.Xr pw 8
440.Fl H Ar 0 .
441This option is used if both it and
442.Ev ROOTPASS_PLAIN
443are set.
444.It Ev ROOTPASS_PLAIN
445Plain text string to set the root password to.
446.It Ev ZFSBOOT_POOL_NAME
447Name for the pool containing the base system.
448Default:
449.Dq zroot
450.It Ev ZFSBOOT_POOL_CREATE_OPTIONS
451Options to be used when creating the base system's pool.
452Each option must be preceded by the -O flag to be taken into consideration
453or the pool will not be created due to errors using the command
454.Cm zpool .
455Default:
456.Dq Li "-O compression=on -O atime=off"
457.It Ev ZFSBOOT_BEROOT_NAME
458Name for the boot environment parent dataset.
459This is a non-mountable dataset meant to be a parent dataset where different
460boot environment are going to be created.
461Default:
462.Dq ROOT
463.It Ev ZFSBOOT_BOOTFS_NAME
464Name for the primary boot environment, which will be the default boot
465environment for the system.
466Default:
467.Dq default
468.It Ev ZFSBOOT_VDEV_TYPE
469The type of pool to be created for the base system.
470This variable can take one of this values: stripe (No redundancy),
471mirror (n-Way mirroring), raid10 (RAID 1+0 - n x 2-Way Mirrors),
472raidz1 (RAID-Z1 - Single Redundancy RAID), raidz2 (RAID-Z2 - Double Redundancy RAID)
473or raidz3 (RAID-Z3 Triple Redundancy RAID).
474Default:
475.Dq stripe
476.It Ev ZFSBOOT_FORCE_4K_SECTORS
477Controls the minimum sector size of the pool.
478If this variable is not empty, the minimum sector size is 4K.
479If this variable is empty, the minimum sector size is 512.
480Note that the sector size of the pool will always be at least
481the sector size of the backing disks.
482Default:
483.Dq 1
484.It Ev ZFSBOOT_GELI_ENCRYPTION
485If this variable is not empty, it will use
486.Xr geli 8
487to encrypt the root pool, enabling automatically the
488.Ev ZFSBOOT_BOOT_POOL
489variable.
490Default:
491.Dq ""
492.It Ev ZFSBOOT_GELI_KEY_FILE
493Path to the
494.Xr geli 8
495keyfile used to encrypt the pool where the base system is stored.
496Default:
497.Dq Pa /boot/encryption.key
498.It Ev ZFSBOOT_BOOT_POOL
499If set, a separated boot pool will be created for the kernel of the
500system and
501.Xr loader 8 .
502Default: unset
503.It Ev ZFSBOOT_BOOT_POOL_CREATE_OPTIONS
504Options to use when creating the boot pool, when enabled (See
505.Ev ZFSBOOT_BOOT_POOL ).
506Default: unset
507.It Ev ZFSBOOT_BOOT_POOL_NAME
508Name for the optional boot pool when it is enabled, (See
509.Ev ZFSBOOT_BOOT_POOL ).
510Default:
511.Dq bootpool
512.It Ev ZFSBOOT_BOOT_POOL_SIZE
513Size of the boot pool when it is enabled (See
514.Ev ZFSBOOT_BOOT_POOL ).
515Default:
516.Dq 2g
517.It Ev ZFSBOOT_DISKS
518Disks to be used for the base system, including the boot pool.
519This variable must only be used on a scripted installation.
520See
521.Sx SCRIPTING
522for more information.
523Default: unset
524.It Ev ZFSBOOT_SWAP_SIZE
525Size of the swap partition on each block device.
526This variable will be passed to
527.Xr gpart 8 ;
528which supports SI unit suffixes.
529Default:
530.Dq 2g
531.It Ev ZFSBOOT_SWAP_ENCRYPTION
532If set, enables the encryption of the swap partition using
533.Xr geli 8 .
534Default: ""
535.It Ev ZFSBOOT_SWAP_MIRROR
536If set, enables a swap mirroring using
537.Xr gmirror 8 .
538Default:
539unset
540.It Ev ZFSBOOT_DATASETS
541ZFS datasets to be created on the root zpool, it requires the
542following datasets:
543.Pa /tmp ,
544.Pa /var/tmp ,
545.Pa /$ZFSBOOT_BEROOT_NAME/$ZFSBOOT_BOOTFS_NAME .
546See
547.Sx ZFS DATASETS
548for more information about how to populate this variable and
549its default value.
550.It Ev ZFSBOOT_CONFIRM_LAYOUT
551If set and the installation is interactive, allow the user to confirm
552the layout before continuing with the installation.
553Default:
554.Dq 1
555.El
556.Sh SCRIPTING
557.Nm
558supports unattended, or minimally-attended, installations using scripting.
559This can be used with either modified physical installation media or with
560.Xr diskless 8
561installations over the network; information on preparing such media can be
562found in
563.Sx BUILDING AUTOMATIC INSTALL MEDIA
564.Pp
565Scripted installations follow an essentially identical path to interactive
566installations, though with some minor feature differences (for example,
567scripted installations do not support fetching of remote distribution files
568since scripted installations normally install the same files and the distributions
569can be added directly to the installation media).
570.Nm
571scripts consist of two parts: a
572.Em preamble
573and a
574.Em setup script .
575The preamble sets up the options for the installation (how to partition the
576disk[s], which distributions to install, etc.) and the optional second part is
577a shell script run under
578.Xr chroot 8
579in the newly installed system before
580.Nm
581exits.
582The two parts are separated by the usual script header (#!), which also sets
583the interpreter for the setup script.
584.Pp
585A typical bsdinstall script, using the default filesystem layout and the UFS
586filesystem, looks like this:
587.Bd -literal -offset indent
588PARTITIONS=DEFAULT
589DISTRIBUTIONS="kernel.txz base.txz"
590
591#!/bin/sh
592sysrc ifconfig_DEFAULT=DHCP
593sysrc sshd_enable=YES
594pkg install puppet
595.Ed
596.Pp
597For a scripted installation involving a ZFS pool spanning multiple disks,
598the script instead looks like this:
599.Bd -literal -offset indent
600DISTRIBUTIONS="kernel.txz base.txz"
601export ZFSBOOT_VDEV_TYPE=stripe
602export ZFSBOOT_DISKS="ada0 ada1"
603export nonInteractive="YES"
604
605#!/bin/sh
606echo "ifconfig_DEFAULT=DHCP" >> /etc/rc.conf
607echo "sshd_enable=YES" >> /etc/rc.conf
608pkg install puppet
609.Ed
610.Pp
611On
612.Fx
613release media, such a script placed at
614.Pa /etc/installerconfig
615will be run at boot time and the system will be rebooted automatically after
616the installation has completed.
617This can be used for unattended network installation of new systems; see
618.Xr diskless 8
619for details.
620.Ss PREAMBLE
621The preamble consists of installer settings.
622These control global installation parameters (see
623.Sx ENVIRONMENT VARIABLES )
624as well as disk partitioning.
625The preamble is interpreted as a
626.Xr sh 1
627script run at the very beginning of the install.
628If more complicated behavior than setting these variables is desired,
629arbitrary commands can be run here to extend the installer.
630In addition to the variables in
631.Sx ENVIRONMENT VARIABLES ,
632in particular
633.Ev DISTRIBUTIONS ,
634the preamble can contain a variable
635.Ev PARTITIONS
636which is passed to the
637.Cm scriptedpart
638target to control disk setup.
639.Pp
640Alternatively,
641to use
642.Cm zfsboot
643instead of
644.Cm partedit ,
645the preamble can contain the variable
646.Ev ZFSBOOT_DATASETS
647instead of
648.Ev PARTITIONS
649(see below).
650If using
651.Cm zfsboot ,
652the variables
653.Ev ZFSBOOT_DISKS
654and
655.Ev ZFSBOOT_VDEV_TYPE
656must be set to create the pool of disks for the base system.
657Usually, for a mirrored booting disk, these two variables look like this:
658.Bd -literal -offset indent
659ZFSBOOT_DISKS="ada0 ada1"
660ZFSBOOT_VDEV_TYPE=mirror
661.Ed
662.Pp
663Remember to export all the variables for the
664.Cm zfsboot
665command, otherwise installation will fail.
666.Ss SETUP SCRIPT
667Following the preamble is an optional shell script, beginning with a #!
668declaration.
669This script will be run at the end of the installation process inside a
670.Xr chroot 8
671environment in the newly installed system and can be used to set up
672configuration files, install packages, etc.
673Note that newly configured system services, e.g., networking have not
674been started in the installed system at this time and only installation
675host services are available.
676.Ss ZFS DATASETS
677If using
678.Cm zfsboot
679in an installation script, the
680.Cm zfsboot
681partitioning tool takes the
682.Ev ZFSBOOT_DATASETS
683variable to create the ZFS datasets on the base system.
684This variable definition can become large if the pool contains many datasets.
685The default value of
686.Ev ZFSBOOT_DATASETS
687is:
688.Bd -literal -offset indent
689# DATASET	OPTIONS (comma or space separated; or both)
690
691# Boot Environment [BE] root and default boot dataset
692/$ZFSBOOT_BEROOT_NAME				mountpoint=none
693/$ZFSBOOT_BEROOT_NAME/$ZFSBOOT_BOOTFS_NAME	mountpoint=/
694
695# Home directories separated so they are common to all BEs
696/home		mountpoint=/home
697
698# Create /tmp and allow exec but not setuid
699/tmp		mountpoint=/tmp,exec=on,setuid=off
700
701# Do not mount /usr so that 'base' files go to the BEROOT
702/usr		mountpoint=/usr,canmount=off
703
704# Ports tree
705/usr/ports	setuid=off
706
707# Source tree
708/usr/src
709
710# Create /var and friends
711/var		mountpoint=/var,canmount=off
712/var/audit	exec=off,setuid=off
713/var/crash	exec=off,setuid=off
714/var/log	exec=off,setuid=off
715/var/mail	atime=on
716/var/tmp	setuid=off
717.Ed
718.Pp
719The first column is the name of the dataset to be created as part of the
720.Ev ZFSBOOT_POOL_NAME
721pool and the remainder of each line contains the options to be set on each dataset.
722If multiple options are given, they can be separated by either commas or whitespace;
723everything following a pound/hash character is ignored as a comment.
724.Ss BUILDING AUTOMATIC INSTALL MEDIA
725If building automatic install media, use tar to extract a release ISO:
726.Dl mkdir release-media
727.Dl tar -C release-media -xvf FreeBSD-13.0-RELEASE-amd64-disc1.iso
728.Pp
729Then place a script as above in
730.Pa etc/installerconfig
731.Pp
732This directory can then be used directly as an NFS root for
733.Xr diskless 8
734installations or it can be rebuilt into an ISO image using the release scripts in
735.Pa /usr/src/release .
736For example, on amd64:
737.Dl sh /usr/src/release/amd64/mkisoimages.sh -b '13_0_RELEASE_AMD64_CD' output.iso release-media
738.Sh HISTORY
739This version of
740.Nm
741first appeared in
742.Fx 9.0 .
743.Sh AUTHORS
744.An Nathan Whitehorn Aq Mt nwhitehorn@FreeBSD.org
745.An Devin Teske Aq Mt dteske@FreeBSD.org
746.An Allan Jude Aq Mt allanjude@FreeBSD.org
747