hammer.8: Mention that rebalance is part of cleanup.
[dragonfly.git] / sbin / hammer / hammer.8
1 .\" Copyright (c) 2007 The DragonFly Project.  All rights reserved.
2 .\" 
3 .\" This code is derived from software contributed to The DragonFly Project
4 .\" by Matthew Dillon <dillon@backplane.com>
5 .\" 
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
8 .\" are met:
9 .\" 
10 .\" 1. Redistributions of source code must retain the above copyright
11 .\"    notice, this list of conditions and the following disclaimer.
12 .\" 2. Redistributions in binary form must reproduce the above copyright
13 .\"    notice, this list of conditions and the following disclaimer in
14 .\"    the documentation and/or other materials provided with the
15 .\"    distribution.
16 .\" 3. Neither the name of The DragonFly Project nor the names of its
17 .\"    contributors may be used to endorse or promote products derived
18 .\"    from this software without specific, prior written permission.
19 .\" 
20 .\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 .\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 .\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
24 .\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 .\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 .\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 .\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 .\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 .\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 .\" SUCH DAMAGE.
32 .\" 
33 .\" $DragonFly: src/sbin/hammer/hammer.8,v 1.58 2008/11/13 02:04:27 dillon Exp $
34 .\"
35 .Dd September 20, 2009
36 .Dt HAMMER 8
37 .Os
38 .Sh NAME
39 .Nm hammer
40 .Nd HAMMER file system utility
41 .Sh SYNOPSIS
42 .Nm
43 .Op Fl h2qrvB
44 .Op Fl b Ar bandwidth
45 .Op Fl c Ar cyclefile
46 .Op Fl f Ar blkdev[:blkdev]*
47 .\" .Op Fl s Ar linkpath
48 .Op Fl i Ar delay
49 .Op Fl t Ar seconds
50 .Op Fl C Ar cachesize[:readahead]
51 .Ar command
52 .Op Ar argument ...
53 .Sh DESCRIPTION
54 This manual page documents the
55 .Nm
56 utility which provides miscellaneous functions related to managing a
57 .Nm HAMMER
58 file system.
59 For a general introduction to the
60 .Nm HAMMER
61 file system, its features, and
62 examples on how to set up and maintain one, see
63 .Xr HAMMER 5 .
64 .Pp
65 The options are as follows:
66 .Bl -tag -width indent
67 .It Fl h
68 Get help.
69 .It Fl 2
70 Tell the mirror commands to use a 2-way protocol, which allows
71 automatic negotiation of transaction id ranges.
72 This option is automatically enabled by the
73 .Ar mirror-copy
74 command.
75 .It Fl b Ar bandwidth
76 Specify a bandwidth limit in bytes per second for mirroring streams.
77 This option is typically used to prevent batch mirroring operations from
78 loading down the machine.
79 The bandwidth may be suffixed with
80 .Sq k ,
81 .Sq m ,
82 or
83 .Sq g
84 to specify values in kilobytes, megabytes, and gigabytes per second.
85 If no suffix is specified, bytes per second is assumed.
86 .It Fl c Ar cyclefile
87 When pruning and reblocking you can instruction
88 .Nm
89 to start at the object id stored in the specified file.
90 If the file does not exist
91 .Nm
92 will start at the beginning.
93 If
94 .Nm
95 is told to run for a
96 specific period of time and is unable to complete the operation it will
97 write out the current object id so the next run can pick up where it left off.
98 If
99 .Nm
100 runs to completion it will delete
101 .Ar cyclefile .
102 .It Fl f Ar blkdev[:blkdev]*
103 Specify the volumes making up a
104 .Nm HAMMER
105 file system.
106 .It Fl i Ar delay
107 When maintaining a streaming mirroring this option specifies the
108 minimum delay after a batch ends before the next batch is allowed
109 to start.
110 The default is five seconds.
111 .It Fl q
112 Decrease verboseness.
113 May be specified multiple times.
114 .It Fl r
115 Specify recursion for those commands which support it.
116 .It Fl t Ar seconds
117 When pruning and reblocking you can tell the utility to stop after a
118 certain period of time.
119 This option is used along with the
120 .Fl c Ar cyclefile
121 option to prune or reblock a portion of the file system incrementally.
122 .It Fl v
123 Increase verboseness.
124 May be specified multiple times.
125 .It Fl y
126 Force "yes" for any interactive question.
127 .It Fl B
128 Bulk Transfer.
129 .Ar Mirror-stream
130 will not attempt to break-up large initial bulk transfers into smaller
131 pieces.  This can save time but if the link is lost in the middle of the
132 initial bulk transfer you will have to start over from scratch.
133 .It Fl C Ar cachesize[:readahead]
134 Set the memory cache size for any raw I/O.  The default is 16m.
135 A suffix of 'k' for kilobytes and 'm' for megabytes is allowed,
136 else the cache size is specified in bytes.
137 .Pp
138 The read-behind/read-ahead defaults to 4 hammer blocks.
139 .Pp
140 This option is typically only used with diagnostic commands
141 as kernel-supported commands will use the kernel's buffer cache.
142 .El
143 .Pp
144 The commands are as follows:
145 .Bl -tag -width indent
146 .\" ==== synctid ====
147 .It Ar synctid Ar filesystem Op quick
148 Generates a guaranteed, formal 64 bit transaction id representing the
149 current state of the specified
150 .Nm HAMMER
151 file system.
152 The file system will be synced to the media.
153 .Pp
154 If the
155 .Ar quick
156 keyword is specified the file system will be soft-synced, meaning that a
157 crash might still undo the state of the file system as of the transaction
158 id returned but any new modifications will occur after the returned
159 transaction id as expected.
160 .\" ==== bstats ====
161 .It Ar bstats Op interval
162 Output
163 .Nm HAMMER
164 B-tree statistics until interrupted.
165 Pause
166 .Ar interval
167 seconds between each display.
168 The default interval is one second.
169 .\" ==== iostats ====
170 .It Ar iostats Op interval
171 Output
172 .Nm HAMMER
173 I/O statistics until interrupted.
174 Pause
175 .Ar interval
176 seconds between each display.
177 The default interval is one second.
178 .\" ==== history ====
179 .It Ar history Ar path ...
180 Show the modification history for
181 .Nm HAMMER
182 file's inode and data.
183 .\" ==== blockmap ====
184 .It Ar blockmap
185 Dump the blockmap for the filesystem.  The HAMMER blockmap is two-layer
186 blockmap representing the maximum possible filesystem size of 1 Exabyte.
187 Needless to say the second layer is only present for blocks which exist.
188 HAMMER's blockmap represents 8-Megabyte blocks.  Each block has an append
189 point, a free byte count, and a typed zone id which allows content to be
190 reverse engineered to some degree.
191 .Pp
192 In HAMMER allocations essentially appended to a selected big-block using
193 the append offset and deducted from the free byte count.  When space is
194 freed the free byte count is adjusted but HAMMER does not track holes in
195 big-blocks for reallocation.  A big-block must be completely freed, either
196 through normal filesystem operations or through reblocking, before
197 it can be reused.
198 .Pp
199 Data blocks can be shared by deducting the space used from the free byte
200 count for each shared references, though HAMMER does not yet make use of
201 this feature.  This means the free byte count can legally go negative.
202 .Pp
203 This command needs the
204 .Fl f
205 flag.
206 .\" ==== show ====
207 .It Ar show Op Ar lo:objid
208 Dump the B-tree.  By default this command will validate all B-Tree
209 linkages and CRCs, including data CRCs, and will report the most verbose
210 information it can dig up.
211 Any errors will show up with a 'B' in column 1 along with various
212 other error flags.
213 .Pp
214 If you specify a localization and object id field the dump will
215 search for the key printing nodes as it recurses down, and then
216 will iterate forwards.
217 .Pp
218 If you use
219 .Fl q
220 the command will report less information about the inode contents.
221 .Pp
222 If you use
223 .Fl qq
224 the command will not report the content of the inode or other typed
225 data at all.
226 .Pp
227 If you use
228 .Fl qqq
229 the command will not report volume header information, big-block fill
230 ratios, mirror TIDs, or report or check data CRCs.  B-Tree CRCs and
231 linkages are still checked.
232 .Pp
233 This command needs the
234 .Fl f
235 flag.
236 .\" .It Ar blockmap
237 .\" Dump the B-tree, record, large-data, and small-data blockmaps, showing
238 .\" physical block assignments and free space percentages.
239 .\" ==== namekey1 ====
240 .It Ar namekey1 Ar filename
241 Generate a
242 .Nm HAMMER
243 64 bit directory hash for the specified file name, using
244 the original directory hash algorithm in version 1 of the filesystem.
245 The low 32 bits are used as an iterator for hash collisions and will be
246 output as 0.
247 .\" ==== namekey2 ====
248 .It Ar namekey2 Ar filename
249 Generate a
250 .Nm HAMMER
251 64 bit directory hash for the specified file name, using
252 the new directory hash algorithm in version 2 of the filesystem.
253 The low 32 bits are still used as an iterator but will start out containing
254 part of the hash key.
255 .\" ==== namekey32 ====
256 .It Ar namekey32 Ar filename
257 Generate the top 32 bits of a
258 .Nm HAMMER
259 64 bit directory hash for the specified file name.
260 .\" ==== info ====
261 .It Ar info
262 Shows extended information about all the mounted HAMMER filesystems.
263 At the moment volume identification, big blocks information and space details are shown.
264 .\" ==== cleanup ====
265 .It Ar cleanup Op Ar filesystem ...
266 This is a meta-command which executes snapshot, pruning, and reblocking
267 commands on the specified
268 .Nm HAMMER
269 file system.
270 If no
271 .Ar filesystem
272 is specified this command will clean-up all
273 .Nm HAMMER
274 file systems in use, including PFS's.
275 To do this it will scan all
276 .Nm HAMMER
277 and
278 .Nm null
279 mounts, extract PFS id's, and clean-up each PFS found.
280 .Pp
281 This command will by default access a
282 .Pa snapshots
283 subdirectory and a
284 .Pa snapshots/config
285 file for each
286 .Ar filesystem ,
287 creating them if necessary.
288 The format of the configuration file is:
289 .Bd -literal -offset indent
290 snapshots  <period> <retention-time> [any]
291 prune      <period> <max-runtime>
292 rebalance  <period> <max-runtime>
293 reblock    <period> <1/3 max-runtime>
294 recopy     <period> <1/3 max-runtime>
295
296 Defaults are:
297 snapshots  1d 60d  # 0d 60d  for PFS /tmp, /var/tmp, /usr/obj
298 prune      1d 5m
299 rebalance  1d 5m
300 reblock    1d 5m
301 recopy     30d 10m
302 .Ed
303 .Pp
304 Time is given with a suffix of
305 .Cm d ,
306 .Cm h ,
307 .Cm m
308 or
309 .Cm s
310 meaning day, hour, minute and second.
311 .Pp
312 If the snapshots directive has a period of 0 and a retention time of 0
313 then snapshot generation is disabled, removal of old snapshots are
314 disabled, and prunes will use
315 .Ar prune-everything .
316 If the snapshots directive has a period of 0 but a non-zero retention time
317 then this command will not create any new snapshots but will remove old
318 snapshots it finds based on the retention time.
319 .Pp
320 By default only snapshots in the form:  snap-yyyymmdd[-hhmm] are processed.
321 If the
322 .Ar any
323 directive is specified as a third argument on the snapshots config line
324 then any softlink of the form *[- or .]yyyymmdd[-hhmm] will be processed.
325 .Pp
326 A prune max-runtime of 0 means unlimited.
327 .Pp
328 If period hasn't passed since the previous
329 .Ar cleanup
330 run nothing is done.
331 For example a day has passed when midnight is passed (localtime).
332 By default,
333 .Dx
334 is set up to run
335 .Nm Ar cleanup
336 nightly via
337 .Xr periodic 8 .
338 .Pp
339 The default configuration file will create a daily snapshot, do a daily
340 pruning, rebalancing and reblocking run and a monthly recopy run.
341 Reblocking is defragmentation with a level of 95%,
342 and recopy is full defragmentation.
343 .Pp
344 By default prune, rebalance and reblock operations are limited to 5 minutes per
345 function, and recopy operations are limited to 10 minutes per function.
346 Reblocking and recopy runs are each broken down into three separate functions
347 (btree, inodes and data)
348 and are thus by default limited to 15 and 30 minutes respectively.
349 Also note that this directive will by default disable snapshots on
350 the following PFS's:
351 .Pa /tmp ,
352 .Pa /var/tmp
353 and
354 .Pa /usr/obj .
355 .Pp
356 The defaults may be adjusted by modifying the
357 .Pa config
358 file.
359 The pruning and reblocking commands automatically maintain a cyclefile
360 for incremental operation.
361 If you interrupt (^C) the program the cyclefile will be updated, but a sub-command
362 may continue to run in the background for a few seconds until the
363 .Nm HAMMER
364 ioctl detects the interrupt.
365 The
366 .Ar snapshots
367 PFS option can be set to use another location for the snapshots directory.
368 .Pp
369 Work on this command is still in progress.
370 Expected additions:  An ability to remove snapshots dynamically as the
371 file system becomes full.
372 .\" ==== expand ====
373 .It Ar expand Ar filesystem Ar device
374 This command will format
375 .Ar device
376 and add all of its space to
377 .Ar filesystem .
378 .Pp
379 NOTE! All existing data contained on
380 .Ar device
381 will be destroyed by this operation! If
382 .Ar device
383 contains a valid
384 .Nm HAMMER
385 filesystem, formatting will be denied. You can overcome this sanity check
386 by using
387 .Xr dd 1
388 to erase the beginning sectors of the device.
389 Also remember that you have to specify
390 .Ar device ,
391 together with any other device that make the filesystem, colon-separated to
392 .Xr mount_hammer 8 .
393 .\" ==== snapshot ====
394 .It Ar snapshot Oo Ar filesystem Oc Ar snapshot-dir
395 Takes a snapshot of the file system either explicitly given by
396 .Ar filesystem
397 or implicitly derived from the
398 .Ar snapshot-dir
399 argument and creates a symlink in the directory provided by
400 .Ar snapshot-dir
401 pointing to the snapshot.
402 If
403 .Ar snapshot-dir
404 is not a directory, it is assumed to be a format string passed to
405 .Xr strftime 3
406 with the current time as parameter.
407 If
408 .Ar snapshot-dir
409 refers to an existing directory, a default format string of "snap-%Y%d%m-%H%M"
410 is assumed and used as name for the newly created symlink.
411 .Pp
412 Snapshot is a per PFS operation, so a
413 .Nm HAMMER
414 file system and each PFS in it have to be snapshot separately.
415 .Pp
416 Example, assuming that
417 .Pa /mysnapshots
418 is on file system
419 .Pa /
420 and that
421 .Pa /obj
422 is a file system on its own, the following invocations:
423 .Bd -literal -offset indent
424 hammer snapshot /mysnapshots
425
426 hammer snapshot /mysnapshots/%Y-%m-%d
427
428 hammer snapshot /obj /mysnapshots/obj-%Y-%m-%d
429 .Ed
430 .Pp
431 would create symlinks similar to:
432 .Bd -literal -offset indent
433 /mysnapshots/snap-20080627-1210 -> /@@0x10d2cd05b7270d16
434
435 /mysnapshots/2008-06-27 -> /@@0x10d2cd05b7270d16
436
437 /mysnapshots/obj-2008-06-27 -> /obj@@0x10d2cd05b7270d16
438 .Ed
439 .\" ==== prune ====
440 .It Ar prune Ar softlink-dir
441 Prune the file system based on previously created snapshot softlinks.
442 Pruning is the act of deleting file system history.
443 The
444 .Ar prune
445 command
446 will delete file system history such that
447 the file system state is retained for the given snapshots,
448 and all history after the latest snapshot,
449 but all other history is deleted.
450 .Pp
451 The target directory is expected to contain softlinks pointing to
452 snapshots of the file systems you wish to retain.
453 The directory is scanned non-recursively and the mount points and
454 transaction ids stored in the softlinks are extracted and sorted.
455 The file system is then explicitly pruned according to what is found.
456 Cleaning out portions of the file system is as simple as removing a softlink
457 and then running the
458 .Ar prune
459 command.
460 .Pp
461 As a safety measure pruning only occurs if one or more softlinks are found
462 containing the @@ snapshot id extension.
463 Currently the scanned softlink directory must contain softlinks pointing
464 to a single
465 .Nm HAMMER
466 mount.
467 The softlinks may specify absolute or relative paths.
468 Softlinks must use 20-character (@@0x%016llx) transaction ids,
469 as might be returned from
470 .Dq Nm Ar synctid filesystem .
471 .Pp
472 Pruning is a per PFS operation, so a
473 .Nm HAMMER
474 file system and each PFS in it have to be pruned separately.
475 .Pp
476 Note that pruning a file system may not immediately free-up space,
477 though typically some space will be freed if a large number of records are
478 pruned out.
479 The file system must be reblocked to completely recover all available space.
480 .Pp
481 Example, lets say your snapshot directory contains the following links:
482 .Bd -literal -offset indent
483 lrwxr-xr-x  1 root  wheel  29 May 31 17:57 snap1 ->
484 /usr/obj/@@0x10d2cd05b7270d16
485
486 lrwxr-xr-x  1 root  wheel  29 May 31 17:58 snap2 ->
487 /usr/obj/@@0x10d2cd13f3fde98f
488
489 lrwxr-xr-x  1 root  wheel  29 May 31 17:59 snap3 ->
490 /usr/obj/@@0x10d2cd222adee364
491 .Ed
492 .Pp
493 If you were to run the
494 .Ar prune
495 command on this directory, then the
496 .Nm HAMMER
497 .Pa /usr/obj
498 mount will be pruned to retain the above three snapshots.
499 In addition, history for modifications made to the file system older than
500 the oldest snapshot will be destroyed and history for potentially fine-grained
501 modifications made to the file system more recently than the most recent
502 snapshot will be retained.
503 .Pp
504 If you then delete the
505 .Pa snap2
506 softlink and rerun the
507 .Ar prune
508 command,
509 history for modifications pertaining to that snapshot would be destroyed.
510 .\" ==== prune-everything ====
511 .It Ar prune-everything Ar filesystem
512 This command will remove all historical records from the file system.
513 This directive is not normally used on a production system.
514 .\" ==== rebalance ====
515 .It Ar rebalance Ar filesystem Op Ar saturation_level
516 This command will rebalance the B-Tree, nodes with small numbers of
517 elements will be combined and element counts will be smoothed out
518 between nodes.
519 .Pp
520 The saturation level is a percentage between 50 and 100.  The default
521 is 75 percent.
522 .\" ==== reblock ====
523 .It Ar reblock Ar filesystem Op Ar fill_percentage
524 .It Ar reblock-btree Ar filesystem Op Ar fill_percentage
525 .It Ar reblock-inodes Ar filesystem Op Ar fill_percentage
526 .It Ar reblock-dirs Ar filesystem Op Ar fill_percentage
527 .It Ar reblock-data Ar filesystem Op Ar fill_percentage
528 Attempt to defragment and free space for reuse by reblocking a live
529 .Nm HAMMER
530 file system.
531 Big blocks cannot be reused by
532 .Nm HAMMER
533 until they are completely free.
534 This command also has the effect of reordering all elements, effectively
535 defragmenting the file system.
536 .Pp
537 The default fill percentage is 100% and will cause the file system to be
538 completely defragmented.
539 All specified element types will be reallocated and rewritten.
540 If you wish to quickly free up space instead try specifying
541 a smaller fill percentage, such as 90% or 80% (the
542 .Sq %
543 suffix is not needed).
544 .Pp
545 Since this command may rewrite the entire contents of the disk it is
546 best to do it incrementally from a
547 .Xr cron 8
548 job along with the
549 .Fl c Ar cyclefile
550 and
551 .Fl t Ar seconds
552 options to limit the run time.
553 The file system would thus be defragmented over long period of time.
554 .Pp
555 It is recommended that separate invocations be used for each data type.
556 B-tree nodes, inodes, and directories are typically the most important
557 elements needing defragmentation.
558 Data can be defragmented over a longer period of time.
559 .Pp
560 Reblocking is a per PFS operation, so a
561 .Nm HAMMER
562 file system and each PFS in it have to be reblocked separately.
563 .\" ==== pfs-status ====
564 .It Ar pfs-status Ar dirpath ...
565 Retrieve the mirroring configuration parameters for the specified
566 .Nm HAMMER
567 file systems or pseudo-filesystems (PFS's).
568 .\" ==== pfs-master ====
569 .It Ar pfs-master Ar dirpath Op options
570 Create a pseudo-filesystem (PFS) inside a
571 .Nm HAMMER
572 file system.
573 Up to 65535 such file systems can be created.
574 Each PFS uses an independent inode numbering space making it suitable
575 for use as a replication source or target.
576 .Pp
577 The
578 .Ar pfs-master
579 directive creates a PFS that you can read, write, and use as a mirroring
580 source.
581 .Pp
582 It is recommended to use a
583 .Nm null
584 mount to access a PFS, for more information see
585 .Xr HAMMER 5 .
586 .\" ==== pfs-slave ====
587 .It Ar pfs-slave Ar dirpath Op options
588 Create a pseudo-filesystem (PFS) inside a
589 .Nm HAMMER
590 file system.
591 Up to 65535 such file systems can be created.
592 Each PFS uses an independent inode numbering space making it suitable
593 for use as a replication source or target.
594 .Pp
595 The
596 .Ar pfs-slave
597 directive creates a PFS that you can use as a mirroring target.
598 You will not be able to access a slave PFS until you have completed the
599 first mirroring operation with it as the target (its root directory will
600 not exist until then).
601 .Pp
602 Access to the pfs-slave via the special softlink,
603 as described in the
604 .Sx PFS NOTES
605 below, allows
606 .Nm HAMMER
607 to
608 dynamically modify the snapshot transaction id by returning a dynamic result
609 from
610 .Xr readlink 2
611 calls.
612 .Pp
613 A PFS can only be truly destroyed with the
614 .Ar pfs-destroy
615 directive.
616 Removing the softlink will not destroy the underlying PFS.
617 .Pp
618 It is recommended to use a
619 .Nm null
620 mount to access a PFS, for more information see
621 .Xr HAMMER 5 .
622 .\" ==== pfs-update ====
623 .It Ar pfs-update Ar dirpath Op options
624 Update the configuration parameters for an existing
625 .Nm HAMMER
626 file system
627 or pseudo-filesystem.
628 Options that may be specified:
629 .Bl -tag -width indent
630 .It sync-beg-tid=0x16llx
631 This is the automatic snapshot access starting transaction id for
632 mirroring slaves.
633 This parameter is normally updated automatically by the
634 .Ar mirror-write
635 directive.
636 .Pp
637 It is important to note that accessing a mirroring slave
638 with a transaction id greater than the last fully synchronized transaction
639 id can result in an unreliable snapshot since you will be accessing
640 data that is still undergoing synchronization.
641 .Pp
642 Manually modifying this field is dangerous and can result in a broken
643 mirror.
644 .It sync-end-tid=0x16llx
645 This is the current synchronization point for mirroring slaves.
646 This parameter is normally updated automatically by the
647 .Ar mirror-write
648 directive.
649 .Pp
650 Manually modifying this field is dangerous and can result in a broken mirror.
651 .It shared-uuid=<uuid>
652 Set the shared UUID for this file system.
653 All mirrors must have the same shared UUID.
654 For safety purposes the
655 .Ar mirror-write
656 directives will refuse to operate on a target with a different shared UUID.
657 .Pp
658 Changing the shared UUID on an existing, non-empty mirroring target,
659 including an empty but not completely pruned target,
660 can lead to corruption of the mirroring target.
661 .It unique-uuid=<uuid>
662 Set the unique UUID for this file system.
663 This UUID should not be used anywhere else,
664 even on exact copies of the file system.
665 .It label=<string>
666 Set a descriptive label for this file system.
667 .It snapshots=<string>
668 Specify the snapshots directory which
669 .Nm
670 .Ar cleanup
671 will use to manage this PFS.
672 The snapshots directory does not need to be configured for
673 PFS masters and will default to
674 .Pa <pfs>/snapshots .
675 .Pp
676 PFS slaves are mirroring slaves so you cannot configure a snapshots
677 directory on the slave itself to be managed by the slave's machine.
678 In fact, the slave will likely have a
679 .Pa snapshots
680 sub-directory mirrored
681 from the master, but that directory contains the configuration the master
682 is using for its copy of the file system, not the configuration that we
683 want to use for our slave.
684 .Pp
685 It is recommended that
686 .Pa <fs>/var/slaves/<name>
687 be configured for a PFS slave, where
688 .Pa <fs>
689 is the base
690 .Nm HAMMER
691 file system, and
692 .Pa <name>
693 is an appropriate label.
694 You can control snapshot retention on your slave independent of the master.
695 .It snapshots-clear
696 Zero out the snapshots directory path for this PFS.
697 .It prune-min=Nd
698 .It prune-min=Nd/hh[:mm[:ss]]
699 .It prune-min=hh[:mm[:ss]]
700 Set the minimum fine-grained data retention period.
701 .Nm HAMMER
702 always retains fine-grained history up to the most recent snapshot.
703 You can extend the retention period further by specifying a non-zero
704 pruning minimum.  Any snapshot softlinks within the retention period
705 are ignored for the purposes of pruning (the fine grained history
706 is retained).
707 .Pp
708 Because the transaction id in the snapshot softlink cannot be used
709 to calculate a timestamp,
710 .Nm HAMMER
711 uses the earlier of the st_ctime or st_mtime field of the softlink to
712 determine which snapshots fall within the retention period.
713 Users must be sure to retain one of these two fields when manipulating
714 the softlink.
715 .El
716 .\" ==== pfs-upgrade ====
717 .It Ar pfs-upgrade Ar dirpath
718 Upgrade a PFS from slave to master operation.
719 The PFS will be rolled back to the current end synchronization tid
720 (removing any partial synchronizations), and will then become writable.
721 .Pp
722 .Em WARNING!
723 .Nm HAMMER
724 currently supports only single masters and using
725 this command can easily result in file system corruption
726 if you don't know what you are doing.
727 .Pp
728 This directive will refuse to run if any programs have open descriptors
729 in the PFS, including programs chdir'd into the PFS.
730 .\" ==== pfs-downgrade ====
731 .It Ar pfs-downgrade Ar dirpath
732 Downgrade a master PFS from master to slave operation
733 The PFS becomes read-only and access will be locked to its
734 .Ar sync-end-tid .
735 .Pp
736 This directive will refuse to run if any programs have open descriptors
737 in the PFS, including programs chdir'd into the PFS.
738 .\" ==== pfs-destroy ====
739 .It Ar pfs-destroy Ar dirpath
740 This permanently destroys a PFS.
741 .Pp
742 This directive will refuse to run if any programs have open descriptors
743 in the PFS, including programs chdir'd into the PFS.
744 .\" ==== mirror-read ====
745 .It Ar mirror-read Ar filesystem Op Ar <begin-tid>
746 Generate a mirroring stream to stdout.
747 The stream ends when the transaction id space has been exhausted.
748 .\" ==== mirror-read-stream ====
749 .It Ar mirror-read-stream Ar filesystem Op Ar <begin-tid>
750 Generate a mirroring stream to stdout.
751 Upon completion the stream is paused until new data is synced to the
752 master, then resumed.
753 Operation continues until the pipe is broken.
754 .\" ==== mirror-write ====
755 .It Ar mirror-write Ar filesystem
756 Take a mirroring stream on stdin.
757 .Pp
758 This command will fail if the
759 .Ar shared-uuid
760 configuration field for the two file systems do not match.
761 .Pp
762 If the target PFS does not exist this command will ask you whether
763 you want to create a compatible PFS slave for the target or not.
764 .\" ==== mirror-dump ====
765 .It Ar mirror-dump
766 A
767 .Ar mirror-read
768 can be piped into a
769 .Ar mirror-dump
770 to dump an ASCII representation of the mirroring stream.
771 .\" ==== mirror-copy ====
772 .It Ar mirror-copy Ar [[user@]host:]filesystem Ar [[user@]host:]filesystem
773 This is a shortcut which pipes a
774 .Ar mirror-read
775 command to a
776 .Ar mirror-write
777 command.
778 If a remote host specification is made the program forks a
779 .Xr ssh 1
780 and execs the
781 .Ar mirror-read
782 and/or
783 .Ar mirror-write
784 on the appropriate host.
785 The source may be a master or slave PFS, and the target must be a slave PFS.
786 .Pp
787 This command also established full duplex communication and turns on
788 the two-way protocol feature which automatically negotiates transaction id
789 ranges without having to use a cyclefile.
790 If the operation completes successfully the target PFS's
791 .Ar sync-end-tid
792 will be updated.
793 Note that you must re-chdir into the target PFS to see the updated information.
794 If you do not you will still be in the previous snapshot.
795 .Pp
796 If the target PFS does not exist this command will ask you whether
797 you want to create a compatible PFS slave for the target or not.
798 .\" ==== mirror-stream ====
799 .It Ar mirror-stream Ar [[user@]host:]filesystem Ar [[user@]host:]filesystem
800 This command works similarly to
801 .Ar mirror-copy
802 but does not exit after the initial mirroring completes.
803 The mirroring operation will resume as changes continue to be made to the
804 master.
805 The command is commonly used with
806 .Fl i Ar delay
807 and
808 .Fl b Ar bandwidth
809 options to keep the mirroring target in sync with the source on a continuing
810 basis.
811 .Pp
812 If the pipe is broken the command will automatically retry after sleeping
813 for a short while.  The time slept will be 15 seconds plus the time given
814 in the
815 .Fl i
816 option.
817 .Pp
818 This command also detects the initial-mirroring case and spends some
819 time scanning the B-Tree to find good break points, allowing the initial
820 bulk mirroring operation to be broken down into about 20 separate pieces.
821 This means that the user can kill and restart the operation and it will
822 not have to start from scratch once it has gotten past the first chunk.
823 The
824 .Fl B
825 option may be used to disable this feature and perform an initial bulk
826 transfer instead.
827 .\" ==== version ====
828 .It Ar version Ar filesystem
829 This command returns the
830 .Nm HAMMER
831 filesystem version for the specified
832 filesystem as well as the range of versions supported in the kernel.
833 The
834 .Fl q
835 option may be used to remove the summary at the end.
836 .\" ==== version-upgrade ====
837 .It Ar version-upgrade Ar filesystem Ar version Op Ar force
838 This command upgrades the
839 .Nm HAMMER
840 filesystem to the specified version.
841 Once upgraded a filesystem may not be downgraded.
842 If you wish to upgrade a filesystem to a version greater or equal to the
843 work-in-progress version number you must specify the
844 .Ar force
845 directive.
846 Use of WIP versions should be relegated to testing and may require wiping
847 the filesystem as development progresses, even though the WIP version might
848 not change.
849 .Pp
850 NOTE!  This command operates on the entire
851 .Nm HAMMER
852 filesystem and is not a per-PFS operation.
853 All PFS's will be affected.
854 .Bl -tag -width indent
855 .It 1
856 .Dx 2.0
857 default version, first
858 .Nm HAMMER
859 release.
860 .It 2
861 Work-in-progress version.
862 This version is developing a new directory hash key.
863 .El
864 .El
865 .\".Sh EXAMPLES
866 .Sh PSEUDO FILESYSTEM (PFS) NOTES
867 The root of a PFS is not hooked into the primary
868 .Nm HAMMER
869 file system as a directory.
870 Instead,
871 .Nm HAMMER
872 creates a special softlink called "@@PFS%05d" (exactly 10 characters long)
873 in the primary
874 .Nm HAMMER
875 file system.
876 .Nm HAMMER
877 then modifies the contents of the softlink as read by
878 .Xr readlink 2 ,
879 and thus what you see with an
880 .Xr ls 1
881 command or if you were to
882 .Xr cd 1
883 into the link.
884 If the PFS is a master the link reflects the current state of the PFS.
885 If the PFS is a slave the link reflects the last completed snapshot, and the
886 contents of the link will change when the next snapshot is completed, and
887 so forth.
888 .Pp
889 PFS support is currently very new and experimental.
890 The
891 .Nm
892 utility employs numerous safeties to reduce user foot-shooting.
893 The
894 .Ar mirror-copy
895 directive requires that the target be configured as a slave and that the
896 .Ar shared-uuid
897 field of the mirroring source and target match.
898 .Sh FILES
899 .Bl -tag -width ".It Pa <fs>/var/slaves/<name>" -compact
900 .It Pa snapshots
901 default per PFS snapshots directory
902 .It Pa <snapshots>/config
903 .Nm
904 .Ar cleanup
905 configuration file
906 .It Pa <fs>/var/slaves/<name>
907 recommended slave PFS snapshots directory
908 .El
909 .Sh EXIT STATUS
910 .Ex -std
911 .Sh SEE ALSO
912 .Xr undo 1 ,
913 .Xr HAMMER 5 ,
914 .Xr periodic.conf 5 ,
915 .Xr mount_hammer 8 ,
916 .Xr mount_null 8 ,
917 .Xr newfs_hammer 8
918 .Sh HISTORY
919 The
920 .Nm
921 utility first appeared in
922 .Dx 1.11 .
923 .Sh AUTHORS
924 .An Matthew Dillon Aq dillon@backplane.com