1*c7996ddfSKirk McKusick.\" 2*c7996ddfSKirk McKusick.\" Copyright (c) 2022 Marshall Kirk McKusick <mckusick@mckusick.com> 3*c7996ddfSKirk McKusick.\" 4*c7996ddfSKirk McKusick.\" Redistribution and use in source and binary forms, with or without 5*c7996ddfSKirk McKusick.\" modification, are permitted provided that the following conditions 6*c7996ddfSKirk McKusick.\" are met: 7*c7996ddfSKirk McKusick.\" 1. Redistributions of source code must retain the above copyright 8*c7996ddfSKirk McKusick.\" notice, this list of conditions and the following disclaimer. 9*c7996ddfSKirk McKusick.\" 2. Redistributions in binary form must reproduce the above copyright 10*c7996ddfSKirk McKusick.\" notice, this list of conditions and the following disclaimer in the 11*c7996ddfSKirk McKusick.\" documentation and/or other materials provided with the distribution. 12*c7996ddfSKirk McKusick.\" 13*c7996ddfSKirk McKusick.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 14*c7996ddfSKirk McKusick.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15*c7996ddfSKirk McKusick.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16*c7996ddfSKirk McKusick.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 17*c7996ddfSKirk McKusick.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18*c7996ddfSKirk McKusick.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19*c7996ddfSKirk McKusick.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20*c7996ddfSKirk McKusick.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21*c7996ddfSKirk McKusick.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22*c7996ddfSKirk McKusick.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23*c7996ddfSKirk McKusick.\" SUCH DAMAGE. 24*c7996ddfSKirk McKusick.\" 25*c7996ddfSKirk McKusick.Dd January 19, 2022 26*c7996ddfSKirk McKusick.Dt GUNION 8 27*c7996ddfSKirk McKusick.Os 28*c7996ddfSKirk McKusick.Sh NAME 29*c7996ddfSKirk McKusick.Nm gunion 30*c7996ddfSKirk McKusick.Nd "control utility for UNION GEOM class" 31*c7996ddfSKirk McKusick.Sh SYNOPSIS 32*c7996ddfSKirk McKusick.Nm 33*c7996ddfSKirk McKusick.Cm create 34*c7996ddfSKirk McKusick.Op Fl v 35*c7996ddfSKirk McKusick.Op Fl o Ar offset 36*c7996ddfSKirk McKusick.Op Fl s Ar size 37*c7996ddfSKirk McKusick.Op Fl S Ar secsize 38*c7996ddfSKirk McKusick.Op Fl Z Ar gunionname 39*c7996ddfSKirk McKusick.Ar upperdev lowerdev 40*c7996ddfSKirk McKusick.Nm 41*c7996ddfSKirk McKusick.Cm destroy 42*c7996ddfSKirk McKusick.Op Fl fv 43*c7996ddfSKirk McKusick.Ar prov ... 44*c7996ddfSKirk McKusick.Nm 45*c7996ddfSKirk McKusick.Cm reset 46*c7996ddfSKirk McKusick.Op Fl v 47*c7996ddfSKirk McKusick.Ar prov ... 48*c7996ddfSKirk McKusick.Nm 49*c7996ddfSKirk McKusick.Cm revert 50*c7996ddfSKirk McKusick.Op Fl v 51*c7996ddfSKirk McKusick.Ar prov ... 52*c7996ddfSKirk McKusick.Nm 53*c7996ddfSKirk McKusick.Cm commit 54*c7996ddfSKirk McKusick.Op Fl frv 55*c7996ddfSKirk McKusick.Ar prov ... 56*c7996ddfSKirk McKusick.Nm 57*c7996ddfSKirk McKusick.Cm list 58*c7996ddfSKirk McKusick.Nm 59*c7996ddfSKirk McKusick.Cm status 60*c7996ddfSKirk McKusick.Nm 61*c7996ddfSKirk McKusick.Cm load 62*c7996ddfSKirk McKusick.Nm 63*c7996ddfSKirk McKusick.Cm unload 64*c7996ddfSKirk McKusick.Sh DESCRIPTION 65*c7996ddfSKirk McKusickThe 66*c7996ddfSKirk McKusick.Nm 67*c7996ddfSKirk McKusickutility is used to track changes to a read-only disk on a writable disk. 68*c7996ddfSKirk McKusickLogically, a writable disk is placed over a read-only disk. 69*c7996ddfSKirk McKusickWrite requests are intercepted and stored on the writable disk. 70*c7996ddfSKirk McKusickRead requests are first checked to see if they have been written 71*c7996ddfSKirk McKusickon the top (writable disk) and if found are returned. 72*c7996ddfSKirk McKusickIf they have not been written on the top disk, 73*c7996ddfSKirk McKusickthen they are read from the lower disk. 74*c7996ddfSKirk McKusick.Pp 75*c7996ddfSKirk McKusickThe 76*c7996ddfSKirk McKusick.Nm 77*c7996ddfSKirk McKusickutility can be especially useful if you have a large disk with a 78*c7996ddfSKirk McKusickcorrupted filesystem that you are unsure of how to repair. 79*c7996ddfSKirk McKusickYou can use 80*c7996ddfSKirk McKusick.Nm 81*c7996ddfSKirk McKusickto place another disk over the corrupted disk and then attempt 82*c7996ddfSKirk McKusickto repair the filesystem. 83*c7996ddfSKirk McKusickIf the repair fails, you can revert all the changes in the upper disk 84*c7996ddfSKirk McKusickand be back to the unchanged state of the lower disk thus allowing you 85*c7996ddfSKirk McKusickto try another approach to repairing it. 86*c7996ddfSKirk McKusickIf the repair is successful you can request that all the writes recorded 87*c7996ddfSKirk McKusickon the top disk be written to the lower disk. 88*c7996ddfSKirk McKusick.Pp 89*c7996ddfSKirk McKusickAnother use of the 90*c7996ddfSKirk McKusick.Nm 91*c7996ddfSKirk McKusickutility is to try out upgrades to your system. 92*c7996ddfSKirk McKusickPlace the upper disk over the disk holding your filesystem that 93*c7996ddfSKirk McKusickis to be upgraded and then run the upgrade on it. 94*c7996ddfSKirk McKusickIf it works, commit it; 95*c7996ddfSKirk McKusickif it fails, revert the upgrade. 96*c7996ddfSKirk McKusickAn example is given below. 97*c7996ddfSKirk McKusick.Pp 98*c7996ddfSKirk McKusickThe upper disk must be at least the size of the disk that it covers. 99*c7996ddfSKirk McKusickThe union metadata exists only for the 100*c7996ddfSKirk McKusickperiod of time that the union is instantiated, 101*c7996ddfSKirk McKusickso it is important to commit the updates before destroying the union. 102*c7996ddfSKirk McKusickIf the top disk is about 2.5 percent larger for 512 byte sector disks 103*c7996ddfSKirk McKusick(or 0.5 percent larger for 4K sector disks) than the disk that it covers, 104*c7996ddfSKirk McKusickit is posible (thought not currently implemented) to save the union 105*c7996ddfSKirk McKusickmetadata between instantiations of the union device. 106*c7996ddfSKirk McKusick.Pp 107*c7996ddfSKirk McKusickIf you do not have physical media available to use for the upper layer, the 108*c7996ddfSKirk McKusick.Xr md 4 109*c7996ddfSKirk McKusickdisk can be used instead. 110*c7996ddfSKirk McKusickWhen used in 111*c7996ddfSKirk McKusick.Cm swap 112*c7996ddfSKirk McKusickmode the changes are all held in buffer memory. 113*c7996ddfSKirk McKusickPages get pushed out to the swap when the system is under memory pressure, 114*c7996ddfSKirk McKusickotherwise they stay in the operating memory. 115*c7996ddfSKirk McKusickIf long-term persistance is desired, 116*c7996ddfSKirk McKusick.Cm vnode 117*c7996ddfSKirk McKusickmode can be used in which a regular file is used as backing store. 118*c7996ddfSKirk McKusickThe disk space used by the file is based on the amount of data that 119*c7996ddfSKirk McKusickis written to the top device. 120*c7996ddfSKirk McKusick.Pp 121*c7996ddfSKirk McKusickThe first argument to 122*c7996ddfSKirk McKusick.Nm 123*c7996ddfSKirk McKusickindicates an action to be performed: 124*c7996ddfSKirk McKusick.Bl -tag -width "destroy" 125*c7996ddfSKirk McKusick.It Cm create 126*c7996ddfSKirk McKusickSet up a union provider on the two given devices. 127*c7996ddfSKirk McKusickThe first device given is used as the top device and must be writable. 128*c7996ddfSKirk McKusickThe second device given is used as the bottom device and need only be readable. 129*c7996ddfSKirk McKusickThe second device may be mounted read-only but it is recommended 130*c7996ddfSKirk McKusickthat it be unmounted and accessed only through a mount of the union device. 131*c7996ddfSKirk McKusickIf the operation succeeds, the new provider should appear with name 132*c7996ddfSKirk McKusick.Pa /dev/ Ns Ao Ar upperdev Ac Ns - Ns Ao Ar lowerdev Ac Ns Pa .union . 133*c7996ddfSKirk McKusickAn alternate name can be specified with the 134*c7996ddfSKirk McKusick.Fl Z 135*c7996ddfSKirk McKusickflag. 136*c7996ddfSKirk McKusickThe kernel module 137*c7996ddfSKirk McKusick.Pa geom_union.ko 138*c7996ddfSKirk McKusickwill be loaded if it is not loaded already. 139*c7996ddfSKirk McKusick.Pp 140*c7996ddfSKirk McKusickAdditional options include: 141*c7996ddfSKirk McKusick.Bl -tag -width "-Z gunionname" 142*c7996ddfSKirk McKusick.It Fl o Ar offset 143*c7996ddfSKirk McKusickWhere to begin on the original provider. 144*c7996ddfSKirk McKusickThe default is to start at the beginning of the disk (i.e., at offset 0). 145*c7996ddfSKirk McKusickThis option may be used to skip over partitioning information stored 146*c7996ddfSKirk McKusickat the beginning of a disk. 147*c7996ddfSKirk McKusickThe offset must be a multiple of the sector size. 148*c7996ddfSKirk McKusick.It Fl s Ar size 149*c7996ddfSKirk McKusickSize of the transparent provider. 150*c7996ddfSKirk McKusickThe default is to be the same size as the lower disk. 151*c7996ddfSKirk McKusickAny extra space at the end of the upper disk may be used to store 152*c7996ddfSKirk McKusickunion metadata. 153*c7996ddfSKirk McKusick.It Fl S Ar secsize 154*c7996ddfSKirk McKusickSector size of the transparent provider. 155*c7996ddfSKirk McKusickThe default is to be the same sector size as the lower disk. 156*c7996ddfSKirk McKusick.It Fl v 157*c7996ddfSKirk McKusickBe more verbose. 158*c7996ddfSKirk McKusick.It Fl Z Ar gunionname 159*c7996ddfSKirk McKusickThe name of the new provider. 160*c7996ddfSKirk McKusickThe suffix 161*c7996ddfSKirk McKusick.Dq .union 162*c7996ddfSKirk McKusickwill be appended to the provider name. 163*c7996ddfSKirk McKusick.El 164*c7996ddfSKirk McKusick.It Cm destroy 165*c7996ddfSKirk McKusickTurn off the given union providers. 166*c7996ddfSKirk McKusick.Pp 167*c7996ddfSKirk McKusickAdditional options include: 168*c7996ddfSKirk McKusick.Bl -tag -width "-f" 169*c7996ddfSKirk McKusick.It Fl f 170*c7996ddfSKirk McKusickForce the removal of the specified provider. 171*c7996ddfSKirk McKusick.It Fl v 172*c7996ddfSKirk McKusickBe more verbose. 173*c7996ddfSKirk McKusick.El 174*c7996ddfSKirk McKusick.It Cm revert 175*c7996ddfSKirk McKusickDiscard all the changes made in the top layer thus reverting to the 176*c7996ddfSKirk McKusickoriginal state of the lower device. 177*c7996ddfSKirk McKusickThe union device may not be mounted or otherwise in use when a 178*c7996ddfSKirk McKusick.Cm revert 179*c7996ddfSKirk McKusickoperation is being done. 180*c7996ddfSKirk McKusick.It Cm commit 181*c7996ddfSKirk McKusickWrite all the changes made in the top device to the lower device 182*c7996ddfSKirk McKusickthus committing the lower device to have the same data as the union. 183*c7996ddfSKirk McKusick.Pp 184*c7996ddfSKirk McKusickAdditional options include: 185*c7996ddfSKirk McKusick.Bl -tag -width "-f" 186*c7996ddfSKirk McKusick.It Fl f 187*c7996ddfSKirk McKusickThe 188*c7996ddfSKirk McKusick.Cm commit 189*c7996ddfSKirk McKusickcommand will not allow the lower device to be mounted 190*c7996ddfSKirk McKusickor otherwise in use while the 191*c7996ddfSKirk McKusick.Cm commit 192*c7996ddfSKirk McKusickoperation is being done. 193*c7996ddfSKirk McKusickHowever, the 194*c7996ddfSKirk McKusick.Fl f 195*c7996ddfSKirk McKusickflag may be specified to allow the lower device to be mounted read-only. 196*c7996ddfSKirk McKusickTo prevent a filesystem panic on the mounted lower-device filesystem, 197*c7996ddfSKirk McKusickimmediately after the 198*c7996ddfSKirk McKusick.Cm commit 199*c7996ddfSKirk McKusickoperation finishes the lower-device filesystem should be unmounted 200*c7996ddfSKirk McKusickand then remounted to update its metadata state. 201*c7996ddfSKirk McKusickIf the lower-device filesystem is currently being used as the root 202*c7996ddfSKirk McKusickfilesystem then the 203*c7996ddfSKirk McKusick.Fl r 204*c7996ddfSKirk McKusickflag should be specified to reboot the system at the completion of the 205*c7996ddfSKirk McKusick.Cm commit 206*c7996ddfSKirk McKusickoperation. 207*c7996ddfSKirk McKusick.It Fl r 208*c7996ddfSKirk McKusickReboot the system at the completion of the 209*c7996ddfSKirk McKusick.Cm commit 210*c7996ddfSKirk McKusickoperation. 211*c7996ddfSKirk McKusick.It Fl v 212*c7996ddfSKirk McKusickBe more verbose. 213*c7996ddfSKirk McKusick.El 214*c7996ddfSKirk McKusick.It Cm reset 215*c7996ddfSKirk McKusickReset statistics for the given union providers. 216*c7996ddfSKirk McKusick.It Cm list 217*c7996ddfSKirk McKusickSee 218*c7996ddfSKirk McKusick.Xr geom 8 . 219*c7996ddfSKirk McKusick.It Cm status 220*c7996ddfSKirk McKusickSee 221*c7996ddfSKirk McKusick.Xr geom 8 . 222*c7996ddfSKirk McKusick.It Cm load 223*c7996ddfSKirk McKusickSee 224*c7996ddfSKirk McKusick.Xr geom 8 . 225*c7996ddfSKirk McKusick.It Cm unload 226*c7996ddfSKirk McKusickSee 227*c7996ddfSKirk McKusick.Xr geom 8 . 228*c7996ddfSKirk McKusick.El 229*c7996ddfSKirk McKusick.Sh EXIT STATUS 230*c7996ddfSKirk McKusickExit status is 0 on success, and 1 if the command fails. 231*c7996ddfSKirk McKusick.Sh EXAMPLES 232*c7996ddfSKirk McKusickThe following example shows how to create and destroy a 233*c7996ddfSKirk McKusickunion provider with disks 234*c7996ddfSKirk McKusick.Pa /dev/da0p1 235*c7996ddfSKirk McKusickas the read-only disk on the bottom and 236*c7996ddfSKirk McKusick.Pa /dev/md0 237*c7996ddfSKirk McKusickas the wriable disk on the top. 238*c7996ddfSKirk McKusick.Bd -literal -offset indent 239*c7996ddfSKirk McKusickgunion create -v md0 da0p1 240*c7996ddfSKirk McKusickmount /dev/md0-da0p1.union /mnt 241*c7996ddfSKirk McKusick.Ed 242*c7996ddfSKirk McKusick.Pp 243*c7996ddfSKirk McKusickProceed to make changes in /mnt filesystem. 244*c7996ddfSKirk McKusickIf they are successful and you want to keep them. 245*c7996ddfSKirk McKusick.Bd -literal -offset indent 246*c7996ddfSKirk McKusickumount /mnt 247*c7996ddfSKirk McKusickgunion commit -v md0-da0p1.union 248*c7996ddfSKirk McKusick.Ed 249*c7996ddfSKirk McKusick.Pp 250*c7996ddfSKirk McKusickIf they are unsuccessful and you want to roll back. 251*c7996ddfSKirk McKusick.Bd -literal -offset indent 252*c7996ddfSKirk McKusickumount /mnt 253*c7996ddfSKirk McKusickgunion revert -v md0-da0p1.union 254*c7996ddfSKirk McKusick.Ed 255*c7996ddfSKirk McKusick.Pp 256*c7996ddfSKirk McKusickWhen done eliminate the union. 257*c7996ddfSKirk McKusick.Bd -literal -offset indent 258*c7996ddfSKirk McKusickumount /mnt 259*c7996ddfSKirk McKusickgunion destroy -v md0-da0p1.union 260*c7996ddfSKirk McKusick.Ed 261*c7996ddfSKirk McKusick.Pp 262*c7996ddfSKirk McKusickAll uncommitted changes will be discarded when the union is destroyed. 263*c7996ddfSKirk McKusick.Pp 264*c7996ddfSKirk McKusickIf you use the name of the full disk, for example 265*c7996ddfSKirk McKusick.Pa da0 266*c7996ddfSKirk McKusickand it is labelled, 267*c7996ddfSKirk McKusickthen a union name will appear for the disk as 268*c7996ddfSKirk McKusick.Pa md0-da0.union 269*c7996ddfSKirk McKusickas well as for each partition on the disk as 270*c7996ddfSKirk McKusick.Pa md0-da0p1.union , 271*c7996ddfSKirk McKusick.Pa md0-da0p2.union , 272*c7996ddfSKirk McKusicketc. 273*c7996ddfSKirk McKusickA commit operation can be done only on 274*c7996ddfSKirk McKusick.Pa md0-da0.union 275*c7996ddfSKirk McKusickand will commit changes to all the partitions. 276*c7996ddfSKirk McKusickIf partition level commits are desired, 277*c7996ddfSKirk McKusickthen a union must be created for each partition. 278*c7996ddfSKirk McKusick.Pp 279*c7996ddfSKirk McKusickThe traffic statistics for the given 280*c7996ddfSKirk McKusickunion providers can be obtained with the 281*c7996ddfSKirk McKusick.Cm list 282*c7996ddfSKirk McKusickcommand. 283*c7996ddfSKirk McKusickThe example below shows the number of bytes written with 284*c7996ddfSKirk McKusick.Xr newfs 8 : 285*c7996ddfSKirk McKusick.Bd -literal -offset indent 286*c7996ddfSKirk McKusickgunion create md0 da0p1 287*c7996ddfSKirk McKusicknewfs /dev/md0-da0p1.union 288*c7996ddfSKirk McKusickgunion list 289*c7996ddfSKirk McKusick.Ed 290*c7996ddfSKirk McKusick.Sh SYSCTL VARIABLES 291*c7996ddfSKirk McKusickThe following 292*c7996ddfSKirk McKusick.Xr sysctl 8 293*c7996ddfSKirk McKusickvariables can be used to control the behavior of the 294*c7996ddfSKirk McKusick.Nm UNION 295*c7996ddfSKirk McKusickGEOM class. 296*c7996ddfSKirk McKusickThe default value is shown next to each variable. 297*c7996ddfSKirk McKusick.Bl -tag -width indent 298*c7996ddfSKirk McKusick.It Va kern.geom.union.debug : No 0 299*c7996ddfSKirk McKusickDebug level of the 300*c7996ddfSKirk McKusick.Nm UNION 301*c7996ddfSKirk McKusickGEOM class. 302*c7996ddfSKirk McKusickThis can be set to a number between 0 and 4 inclusive. 303*c7996ddfSKirk McKusickIf set to 0, no debug information is printed. 304*c7996ddfSKirk McKusickIf set to 1, all the verbose messages are logged. 305*c7996ddfSKirk McKusickIf set to 2, addition error-related information is logged. 306*c7996ddfSKirk McKusickIf set to 3, mapping operations are logged. 307*c7996ddfSKirk McKusickIf set to 4, the maximum amount of debug information is printed. 308*c7996ddfSKirk McKusick.El 309*c7996ddfSKirk McKusick.Sh SEE ALSO 310*c7996ddfSKirk McKusick.Xr geom 4 , 311*c7996ddfSKirk McKusick.Xr geom 8 312*c7996ddfSKirk McKusick.Sh HISTORY 313*c7996ddfSKirk McKusickThe 314*c7996ddfSKirk McKusick.Nm 315*c7996ddfSKirk McKusickutility appeared in 316*c7996ddfSKirk McKusick.Fx 14.0 . 317*c7996ddfSKirk McKusick.Sh AUTHORS 318*c7996ddfSKirk McKusick.An Marshall Kirk McKusick Aq Mt mckusick@mckusick.com 319