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