xref: /freebsd/lib/geom/union/gunion.8 (revision fa9896e082a1046ff4fbc75fcba4d18d1f2efc19)
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