1*e4b0a90eSBrooks Davis.\" Copyright (c) 2010 Alexander Motin <mav@FreeBSD.org> 2*e4b0a90eSBrooks Davis.\" All rights reserved. 3*e4b0a90eSBrooks Davis.\" 4*e4b0a90eSBrooks Davis.\" Redistribution and use in source and binary forms, with or without 5*e4b0a90eSBrooks Davis.\" modification, are permitted provided that the following conditions 6*e4b0a90eSBrooks Davis.\" are met: 7*e4b0a90eSBrooks Davis.\" 1. Redistributions of source code must retain the above copyright 8*e4b0a90eSBrooks Davis.\" notice, this list of conditions and the following disclaimer. 9*e4b0a90eSBrooks Davis.\" 2. Redistributions in binary form must reproduce the above copyright 10*e4b0a90eSBrooks Davis.\" notice, this list of conditions and the following disclaimer in the 11*e4b0a90eSBrooks Davis.\" documentation and/or other materials provided with the distribution. 12*e4b0a90eSBrooks Davis.\" 13*e4b0a90eSBrooks Davis.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 14*e4b0a90eSBrooks Davis.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15*e4b0a90eSBrooks Davis.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16*e4b0a90eSBrooks Davis.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 17*e4b0a90eSBrooks Davis.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18*e4b0a90eSBrooks Davis.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19*e4b0a90eSBrooks Davis.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20*e4b0a90eSBrooks Davis.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21*e4b0a90eSBrooks Davis.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22*e4b0a90eSBrooks Davis.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23*e4b0a90eSBrooks Davis.\" SUCH DAMAGE. 24*e4b0a90eSBrooks Davis.\" 25*e4b0a90eSBrooks Davis.\" $FreeBSD$ 26*e4b0a90eSBrooks Davis.\" 27*e4b0a90eSBrooks Davis.Dd April 4, 2013 28*e4b0a90eSBrooks Davis.Dt GRAID 8 29*e4b0a90eSBrooks Davis.Os 30*e4b0a90eSBrooks Davis.Sh NAME 31*e4b0a90eSBrooks Davis.Nm graid 32*e4b0a90eSBrooks Davis.Nd "control utility for software RAID devices" 33*e4b0a90eSBrooks Davis.Sh SYNOPSIS 34*e4b0a90eSBrooks Davis.Nm 35*e4b0a90eSBrooks Davis.Cm label 36*e4b0a90eSBrooks Davis.Op Fl f 37*e4b0a90eSBrooks Davis.Op Fl o Ar fmtopt 38*e4b0a90eSBrooks Davis.Op Fl S Ar size 39*e4b0a90eSBrooks Davis.Op Fl s Ar strip 40*e4b0a90eSBrooks Davis.Ar format 41*e4b0a90eSBrooks Davis.Ar label 42*e4b0a90eSBrooks Davis.Ar level 43*e4b0a90eSBrooks Davis.Ar prov ... 44*e4b0a90eSBrooks Davis.Nm 45*e4b0a90eSBrooks Davis.Cm add 46*e4b0a90eSBrooks Davis.Op Fl f 47*e4b0a90eSBrooks Davis.Op Fl S Ar size 48*e4b0a90eSBrooks Davis.Op Fl s Ar strip 49*e4b0a90eSBrooks Davis.Ar name 50*e4b0a90eSBrooks Davis.Ar label 51*e4b0a90eSBrooks Davis.Ar level 52*e4b0a90eSBrooks Davis.Nm 53*e4b0a90eSBrooks Davis.Cm delete 54*e4b0a90eSBrooks Davis.Op Fl f 55*e4b0a90eSBrooks Davis.Ar name 56*e4b0a90eSBrooks Davis.Op Ar label | Ar num 57*e4b0a90eSBrooks Davis.Nm 58*e4b0a90eSBrooks Davis.Cm insert 59*e4b0a90eSBrooks Davis.Ar name 60*e4b0a90eSBrooks Davis.Ar prov ... 61*e4b0a90eSBrooks Davis.Nm 62*e4b0a90eSBrooks Davis.Cm remove 63*e4b0a90eSBrooks Davis.Ar name 64*e4b0a90eSBrooks Davis.Ar prov ... 65*e4b0a90eSBrooks Davis.Nm 66*e4b0a90eSBrooks Davis.Cm fail 67*e4b0a90eSBrooks Davis.Ar name 68*e4b0a90eSBrooks Davis.Ar prov ... 69*e4b0a90eSBrooks Davis.Nm 70*e4b0a90eSBrooks Davis.Cm stop 71*e4b0a90eSBrooks Davis.Op Fl fv 72*e4b0a90eSBrooks Davis.Ar name ... 73*e4b0a90eSBrooks Davis.Nm 74*e4b0a90eSBrooks Davis.Cm list 75*e4b0a90eSBrooks Davis.Nm 76*e4b0a90eSBrooks Davis.Cm status 77*e4b0a90eSBrooks Davis.Nm 78*e4b0a90eSBrooks Davis.Cm load 79*e4b0a90eSBrooks Davis.Nm 80*e4b0a90eSBrooks Davis.Cm unload 81*e4b0a90eSBrooks Davis.Sh DESCRIPTION 82*e4b0a90eSBrooks DavisThe 83*e4b0a90eSBrooks Davis.Nm 84*e4b0a90eSBrooks Davisutility is used to manage software RAID configurations, supported by the 85*e4b0a90eSBrooks DavisGEOM RAID class. 86*e4b0a90eSBrooks DavisGEOM RAID class uses on-disk metadata to provide access to software-RAID 87*e4b0a90eSBrooks Davisvolumes defined by different RAID BIOSes. 88*e4b0a90eSBrooks DavisDepending on RAID BIOS type and its metadata format, different subsets of 89*e4b0a90eSBrooks Davisconfigurations and features are supported. 90*e4b0a90eSBrooks DavisTo allow booting from RAID volume, the metadata format should match the 91*e4b0a90eSBrooks DavisRAID BIOS type and its capabilities. 92*e4b0a90eSBrooks DavisTo guarantee that these match, it is recommended to create volumes via the 93*e4b0a90eSBrooks DavisRAID BIOS interface, while experienced users are free to do it using this 94*e4b0a90eSBrooks Davisutility. 95*e4b0a90eSBrooks Davis.Pp 96*e4b0a90eSBrooks DavisThe first argument to 97*e4b0a90eSBrooks Davis.Nm 98*e4b0a90eSBrooks Davisindicates an action to be performed: 99*e4b0a90eSBrooks Davis.Bl -tag -width ".Cm destroy" 100*e4b0a90eSBrooks Davis.It Cm label 101*e4b0a90eSBrooks DavisCreate an array with single volume. 102*e4b0a90eSBrooks DavisThe 103*e4b0a90eSBrooks Davis.Ar format 104*e4b0a90eSBrooks Davisargument specifies the on-disk metadata format to use for this array, 105*e4b0a90eSBrooks Davissuch as "Intel". 106*e4b0a90eSBrooks DavisThe 107*e4b0a90eSBrooks Davis.Ar label 108*e4b0a90eSBrooks Davisargument specifies the label of the created volume. 109*e4b0a90eSBrooks DavisThe 110*e4b0a90eSBrooks Davis.Ar level 111*e4b0a90eSBrooks Davisargument specifies the RAID level of the created volume, such as: 112*e4b0a90eSBrooks Davis"RAID0", "RAID1", etc. 113*e4b0a90eSBrooks DavisThe subsequent list enumerates providers to use as array components. 114*e4b0a90eSBrooks DavisThe special name "NONE" can be used to reserve space for absent disks. 115*e4b0a90eSBrooks DavisThe order of components can be important, depending on specific RAID level 116*e4b0a90eSBrooks Davisand metadata format. 117*e4b0a90eSBrooks Davis.Pp 118*e4b0a90eSBrooks DavisAdditional options include: 119*e4b0a90eSBrooks Davis.Bl -tag -width ".Fl s Ar strip" 120*e4b0a90eSBrooks Davis.It Fl f 121*e4b0a90eSBrooks DavisEnforce specified configuration creation if it is officially unsupported, 122*e4b0a90eSBrooks Davisbut technically can be created. 123*e4b0a90eSBrooks Davis.It Fl o Ar fmtopt 124*e4b0a90eSBrooks DavisSpecifies metadata format options. 125*e4b0a90eSBrooks Davis.It Fl S Ar size 126*e4b0a90eSBrooks DavisUse 127*e4b0a90eSBrooks Davis.Ar size 128*e4b0a90eSBrooks Davisbytes on each component for this volume. 129*e4b0a90eSBrooks DavisShould be used if several volumes per array are planned, or if smaller 130*e4b0a90eSBrooks Daviscomponents going to be inserted later. 131*e4b0a90eSBrooks DavisDefaults to size of the smallest component. 132*e4b0a90eSBrooks Davis.It Fl s Ar strip 133*e4b0a90eSBrooks DavisSpecifies strip size in bytes. 134*e4b0a90eSBrooks DavisDefaults to 131072. 135*e4b0a90eSBrooks Davis.El 136*e4b0a90eSBrooks Davis.It Cm add 137*e4b0a90eSBrooks DavisCreate another volume on the existing array. 138*e4b0a90eSBrooks DavisThe 139*e4b0a90eSBrooks Davis.Ar name 140*e4b0a90eSBrooks Davisargument is the name of the existing array, reported by label command. 141*e4b0a90eSBrooks DavisThe rest of arguments are the same as for the label command. 142*e4b0a90eSBrooks Davis.It Cm delete 143*e4b0a90eSBrooks DavisDelete volume(s) from the existing array. 144*e4b0a90eSBrooks DavisWhen the last volume is deleted, the array is also deleted and its metadata 145*e4b0a90eSBrooks Daviserased. 146*e4b0a90eSBrooks DavisThe 147*e4b0a90eSBrooks Davis.Ar name 148*e4b0a90eSBrooks Davisargument is the name of existing array. 149*e4b0a90eSBrooks DavisOptional 150*e4b0a90eSBrooks Davis.Ar label 151*e4b0a90eSBrooks Davisor 152*e4b0a90eSBrooks Davis.Ar num 153*e4b0a90eSBrooks Davisarguments allow specifying volume for deletion. 154*e4b0a90eSBrooks Davis.Pp 155*e4b0a90eSBrooks DavisAdditional options include: 156*e4b0a90eSBrooks Davis.Bl -tag -width ".Fl f" 157*e4b0a90eSBrooks Davis.It Fl f 158*e4b0a90eSBrooks DavisDelete volume(s) even if it is still open. 159*e4b0a90eSBrooks Davis.El 160*e4b0a90eSBrooks Davis.It Cm insert 161*e4b0a90eSBrooks DavisInsert specified provider(s) into specified array instead of the first missing 162*e4b0a90eSBrooks Davisor failed components. 163*e4b0a90eSBrooks DavisIf there are no such components, mark disk(s) as spare. 164*e4b0a90eSBrooks Davis.It Cm remove 165*e4b0a90eSBrooks DavisRemove the specified provider(s) from the specified array and erase metadata. 166*e4b0a90eSBrooks DavisIf there are spare disks present, the removed disk(s) will be replaced by 167*e4b0a90eSBrooks Davisspares. 168*e4b0a90eSBrooks Davis.It Cm fail 169*e4b0a90eSBrooks DavisMark the given disks(s) as failed, removing from active use unless absolutely 170*e4b0a90eSBrooks Davisnecessary due to exhausted redundancy. 171*e4b0a90eSBrooks DavisIf there are spare disks present - failed disk(s) will be replaced with one 172*e4b0a90eSBrooks Davisof them. 173*e4b0a90eSBrooks Davis.It Cm stop 174*e4b0a90eSBrooks DavisStop the given array. 175*e4b0a90eSBrooks DavisThe metadata will not be erased. 176*e4b0a90eSBrooks Davis.Pp 177*e4b0a90eSBrooks DavisAdditional options include: 178*e4b0a90eSBrooks Davis.Bl -tag -width ".Fl f" 179*e4b0a90eSBrooks Davis.It Fl f 180*e4b0a90eSBrooks DavisStop the given array even if some of its volumes are opened. 181*e4b0a90eSBrooks Davis.El 182*e4b0a90eSBrooks Davis.It Cm list 183*e4b0a90eSBrooks DavisSee 184*e4b0a90eSBrooks Davis.Xr geom 8 . 185*e4b0a90eSBrooks Davis.It Cm status 186*e4b0a90eSBrooks DavisSee 187*e4b0a90eSBrooks Davis.Xr geom 8 . 188*e4b0a90eSBrooks Davis.It Cm load 189*e4b0a90eSBrooks DavisSee 190*e4b0a90eSBrooks Davis.Xr geom 8 . 191*e4b0a90eSBrooks Davis.It Cm unload 192*e4b0a90eSBrooks DavisSee 193*e4b0a90eSBrooks Davis.Xr geom 8 . 194*e4b0a90eSBrooks Davis.El 195*e4b0a90eSBrooks Davis.Pp 196*e4b0a90eSBrooks DavisAdditional options include: 197*e4b0a90eSBrooks Davis.Bl -tag -width ".Fl v" 198*e4b0a90eSBrooks Davis.It Fl v 199*e4b0a90eSBrooks DavisBe more verbose. 200*e4b0a90eSBrooks Davis.El 201*e4b0a90eSBrooks Davis.Sh SUPPORTED METADATA FORMATS 202*e4b0a90eSBrooks DavisThe GEOM RAID class follows a modular design, allowing different metadata 203*e4b0a90eSBrooks Davisformats to be used. 204*e4b0a90eSBrooks DavisSupport is currently implemented for the following formats: 205*e4b0a90eSBrooks Davis.Bl -tag -width "Intel" 206*e4b0a90eSBrooks Davis.It DDF 207*e4b0a90eSBrooks DavisThe format defined by the SNIA Common RAID Disk Data Format v2.0 specification. 208*e4b0a90eSBrooks DavisUsed by some Adaptec RAID BIOSes and some hardware RAID controllers. 209*e4b0a90eSBrooks DavisBecause of high format flexibility different implementations support 210*e4b0a90eSBrooks Davisdifferent set of features and have different on-disk metadata layouts. 211*e4b0a90eSBrooks DavisTo provide compatibility, the GEOM RAID class mimics capabilities 212*e4b0a90eSBrooks Davisof the first detected DDF array. 213*e4b0a90eSBrooks DavisRespecting that, it may support different number of disks per volume, 214*e4b0a90eSBrooks Davisvolumes per array, partitions per disk, etc. 215*e4b0a90eSBrooks DavisThe following configurations are supported: RAID0 (2+ disks), RAID1 (2+ disks), 216*e4b0a90eSBrooks DavisRAID1E (3+ disks), RAID3 (3+ disks), RAID4 (3+ disks), RAID5 (3+ disks), 217*e4b0a90eSBrooks DavisRAID5E (4+ disks), RAID5EE (4+ disks), RAID5R (3+ disks), RAID6 (4+ disks), 218*e4b0a90eSBrooks DavisRAIDMDF (4+ disks), RAID10 (4+ disks), SINGLE (1 disk), CONCAT (2+ disks). 219*e4b0a90eSBrooks Davis.Pp 220*e4b0a90eSBrooks DavisFormat supports two options "BE" and "LE", that mean big-endian byte order 221*e4b0a90eSBrooks Davisdefined by specification (default) and little-endian used by some Adaptec 222*e4b0a90eSBrooks Daviscontrollers. 223*e4b0a90eSBrooks Davis.It Intel 224*e4b0a90eSBrooks DavisThe format used by Intel RAID BIOS. 225*e4b0a90eSBrooks DavisSupports up to two volumes per array. 226*e4b0a90eSBrooks DavisSupports configurations: RAID0 (2+ disks), RAID1 (2 disks), 227*e4b0a90eSBrooks DavisRAID5 (3+ disks), RAID10 (4 disks). 228*e4b0a90eSBrooks DavisConfigurations not supported by Intel RAID BIOS, but enforceable on your own 229*e4b0a90eSBrooks Davisrisk: RAID1 (3+ disks), RAID1E (3+ disks), RAID10 (6+ disks). 230*e4b0a90eSBrooks Davis.It JMicron 231*e4b0a90eSBrooks DavisThe format used by JMicron RAID BIOS. 232*e4b0a90eSBrooks DavisSupports one volume per array. 233*e4b0a90eSBrooks DavisSupports configurations: RAID0 (2+ disks), RAID1 (2 disks), 234*e4b0a90eSBrooks DavisRAID10 (4 disks), CONCAT (2+ disks). 235*e4b0a90eSBrooks DavisConfigurations not supported by JMicron RAID BIOS, but enforceable on your own 236*e4b0a90eSBrooks Davisrisk: RAID1 (3+ disks), RAID1E (3+ disks), RAID10 (6+ disks), RAID5 (3+ disks). 237*e4b0a90eSBrooks Davis.It NVIDIA 238*e4b0a90eSBrooks DavisThe format used by NVIDIA MediaShield RAID BIOS. 239*e4b0a90eSBrooks DavisSupports one volume per array. 240*e4b0a90eSBrooks DavisSupports configurations: RAID0 (2+ disks), RAID1 (2 disks), 241*e4b0a90eSBrooks DavisRAID5 (3+ disks), RAID10 (4+ disks), SINGLE (1 disk), CONCAT (2+ disks). 242*e4b0a90eSBrooks DavisConfigurations not supported by NVIDIA MediaShield RAID BIOS, but enforceable 243*e4b0a90eSBrooks Davison your own risk: RAID1 (3+ disks). 244*e4b0a90eSBrooks Davis.It Promise 245*e4b0a90eSBrooks DavisThe format used by Promise and AMD/ATI RAID BIOSes. 246*e4b0a90eSBrooks DavisSupports multiple volumes per array. 247*e4b0a90eSBrooks DavisEach disk can be split to be used by up to two arbitrary volumes. 248*e4b0a90eSBrooks DavisSupports configurations: RAID0 (2+ disks), RAID1 (2 disks), 249*e4b0a90eSBrooks DavisRAID5 (3+ disks), RAID10 (4 disks), SINGLE (1 disk), CONCAT (2+ disks). 250*e4b0a90eSBrooks DavisConfigurations not supported by RAID BIOSes, but enforceable on your 251*e4b0a90eSBrooks Davisown risk: RAID1 (3+ disks), RAID10 (6+ disks). 252*e4b0a90eSBrooks Davis.It SiI 253*e4b0a90eSBrooks DavisThe format used by SiliconImage RAID BIOS. 254*e4b0a90eSBrooks DavisSupports one volume per array. 255*e4b0a90eSBrooks DavisSupports configurations: RAID0 (2+ disks), RAID1 (2 disks), 256*e4b0a90eSBrooks DavisRAID5 (3+ disks), RAID10 (4 disks), SINGLE (1 disk), CONCAT (2+ disks). 257*e4b0a90eSBrooks DavisConfigurations not supported by SiliconImage RAID BIOS, but enforceable on your 258*e4b0a90eSBrooks Davisown risk: RAID1 (3+ disks), RAID10 (6+ disks). 259*e4b0a90eSBrooks Davis.El 260*e4b0a90eSBrooks Davis.Sh SUPPORTED RAID LEVELS 261*e4b0a90eSBrooks DavisThe GEOM RAID class follows a modular design, allowing different RAID levels 262*e4b0a90eSBrooks Davisto be used. 263*e4b0a90eSBrooks DavisFull support for the following RAID levels is currently implemented: 264*e4b0a90eSBrooks DavisRAID0, RAID1, RAID1E, RAID10, SINGLE, CONCAT. 265*e4b0a90eSBrooks DavisThe following RAID levels supported as read-only for volumes in optimal 266*e4b0a90eSBrooks Davisstate (without using redundancy): RAID4, RAID5, RAID5E, RAID5EE, RAID5R, 267*e4b0a90eSBrooks DavisRAID6, RAIDMDF. 268*e4b0a90eSBrooks Davis.Sh RAID LEVEL MIGRATION 269*e4b0a90eSBrooks DavisThe GEOM RAID class has no support for RAID level migration, allowed by some 270*e4b0a90eSBrooks Davismetadata formats. 271*e4b0a90eSBrooks DavisIf you started migration using BIOS or in some other way, make sure to 272*e4b0a90eSBrooks Daviscomplete it there. 273*e4b0a90eSBrooks DavisDo not run GEOM RAID class on migrating volumes under pain of possible data 274*e4b0a90eSBrooks Daviscorruption! 275*e4b0a90eSBrooks Davis.Sh 2TiB BARRIERS 276*e4b0a90eSBrooks DavisNVIDIA metadata format does not support volumes above 2TiB. 277*e4b0a90eSBrooks Davis.Sh SYSCTL VARIABLES 278*e4b0a90eSBrooks DavisThe following 279*e4b0a90eSBrooks Davis.Xr sysctl 8 280*e4b0a90eSBrooks Davisvariable can be used to control the behavior of the 281*e4b0a90eSBrooks Davis.Nm RAID 282*e4b0a90eSBrooks DavisGEOM class. 283*e4b0a90eSBrooks Davis.Bl -tag -width indent 284*e4b0a90eSBrooks Davis.It Va kern.geom.raid.aggressive_spare : No 0 285*e4b0a90eSBrooks DavisUse any disks without metadata connected to controllers of the vendor 286*e4b0a90eSBrooks Davismatching to volume metadata format as spare. 287*e4b0a90eSBrooks DavisUse it with much care to not lose data if connecting unrelated disk! 288*e4b0a90eSBrooks Davis.It Va kern.geom.raid.clean_time : No 5 289*e4b0a90eSBrooks DavisMark volume as clean when idle for the specified number of seconds. 290*e4b0a90eSBrooks Davis.It Va kern.geom.raid.debug : No 0 291*e4b0a90eSBrooks DavisDebug level of the 292*e4b0a90eSBrooks Davis.Nm RAID 293*e4b0a90eSBrooks DavisGEOM class. 294*e4b0a90eSBrooks Davis.It Va kern.geom.raid.enable : No 1 295*e4b0a90eSBrooks DavisEnable on-disk metadata taste. 296*e4b0a90eSBrooks Davis.It Va kern.geom.raid.idle_threshold : No 1000000 297*e4b0a90eSBrooks DavisTime in microseconds to consider a volume idle for rebuild purposes. 298*e4b0a90eSBrooks Davis.It Va kern.geom.raid.name_format : No 0 299*e4b0a90eSBrooks DavisProviders name format: 0 -- raid/r{num}, 1 -- raid/{label}. 300*e4b0a90eSBrooks Davis.It Va kern.geom.raid.read_err_thresh : No 10 301*e4b0a90eSBrooks DavisNumber of read errors equated to disk failure. 302*e4b0a90eSBrooks DavisWrite errors are always considered as disk failures. 303*e4b0a90eSBrooks Davis.It Va kern.geom.raid.start_timeout : No 30 304*e4b0a90eSBrooks DavisTime to wait for missing array components on startup. 305*e4b0a90eSBrooks Davis.It Va kern.geom.raid. Ns Ar X Ns Va .enable : No 1 306*e4b0a90eSBrooks DavisEnable taste for specific metadata or transformation module. 307*e4b0a90eSBrooks Davis.El 308*e4b0a90eSBrooks Davis.Sh EXIT STATUS 309*e4b0a90eSBrooks DavisExit status is 0 on success, and non-zero if the command fails. 310*e4b0a90eSBrooks Davis.Sh SEE ALSO 311*e4b0a90eSBrooks Davis.Xr geom 4 , 312*e4b0a90eSBrooks Davis.Xr geom 8 , 313*e4b0a90eSBrooks Davis.Xr gvinum 8 314*e4b0a90eSBrooks Davis.Sh HISTORY 315*e4b0a90eSBrooks DavisThe 316*e4b0a90eSBrooks Davis.Nm 317*e4b0a90eSBrooks Davisutility appeared in 318*e4b0a90eSBrooks Davis.Fx 9.0 . 319*e4b0a90eSBrooks Davis.Sh AUTHORS 320*e4b0a90eSBrooks Davis.An Alexander Motin Aq Mt mav@FreeBSD.org 321*e4b0a90eSBrooks Davis.An M. Warner Losh Aq Mt imp@FreeBSD.org 322