1 .\" Copyright (c) 2007 The DragonFly Project. All rights reserved.
3 .\" This code is derived from software contributed to The DragonFly Project
4 .\" by Matthew Dillon <dillon@backplane.com>
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
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
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.
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
33 .\" $DragonFly: src/sbin/hammer/hammer.8,v 1.22 2008/06/23 07:37:54 dillon Exp $
39 .Nd HAMMER file system utility
44 .Op Fl f Ar blkdev[:blkdev]*
52 utility provides miscellaneous functions related to managing a HAMMER
55 The options are as follows:
56 .Bl -tag -width indent
60 Specify recursion for those commands which support it.
62 When pruning and reblocking you can instruction HAMMER to start at the
63 object id stored in the specified file. If the file does not exist
64 HAMMER will start at the beginning. If HAMMER is told to run for a
65 specific period of time and is unable to complete the operation it will
66 write out the current obj_id so the next run can pick up where it left
67 off. If HAMMER runs to completion it will delete the cyclefile..
68 .It Fl f Ar blkdev[:blkdev]*
69 Specify the volumes making up a HAMMER filesystem.
71 When pruning a filesystem you can instruct HAMMER to create softlinks
72 to available snapshots.
74 When pruning and reblocking you can tell the utility to stop after a
75 certain period of time. This option is used along with the cycle file
76 option to prune or reblock a portion of the filesystem incrementally.
78 Increase verboseness. May be specified multiple times.
81 The commands are as follows:
82 .Bl -tag -width indent
84 Generate a timestamp suitable for use in the @@ filename extension,
85 representing right now.
87 Generate a full 64 bit timestamp.
92 directives do not generate a guaranteed transaction id.
95 command to generate a guaranteed transaction id.
97 Generate a timestamp suitable for use in the @@ filename extension.
98 This command does not sync() or sleep and care should be taken if
99 generating timestamps for data which may not yet be synced to disk.
100 A time specification of
101 .Pf yyyymmdd Oo :hhmmss Oc Ns Op .fractional
102 specifies an exact as-of timestamp in local (not UTC) time.
103 Set the TZ environment variable prior to running
105 if you wish to specify the time by some other means.
109 command but generates a 64 bit timestamp.
110 .It Ar synctid Ar filesystem Op quick
111 Generates a guaranteed, formal 64 bit transaction id representing the
112 current state of the specified HAMMER filesystem. The filesystem will
113 be synced to the media.
117 keyword is specified the filesystem will be soft-synced, meaning that a
118 crash might still undo the state of the filesystem as of the transaction
119 id returned but any new modifications will occur after the returned
120 transaction id as expected.
121 .It Ar bstats Op interval
122 Output HAMMER B-Tree statistics until interrupted. The default interval
124 .It Ar iostats Op interval
125 Output HAMMER I/O statistics until interrupted. The default interval
128 Output a date equivalent given a transaction id or time stamp.
129 .It Ar history Ar path
130 Show the modification history for a HAMMER file's inode and data.
131 .It Ar show Op vol_no[:clu_no]
132 Dump the B-Tree starting at the specified volume and cluster, or
133 at the root volume if not specified.
134 The B-Tree is dumped recursively if the
138 Dump the btree, record, large-data, and small-data blockmaps, showing
139 physical block assignments and free space percentages.
140 .It Ar namekey Ar filename
141 Generate a HAMMER 64 bit directory hash for the specified file name.
142 The low 32 bits are used as an iterator for hash collisions and will be
144 .It Ar namekey32 Ar filename
145 Generate the top 32 bits of a HAMMER 64 bit directory hash for the specified
147 .It Ar softprune Ar softlink-dir
148 Prune the filesystem based on previously created snapshot softlinks. This
149 is a more convenient method of pruning then the fixed timestamp ranges used
153 The target directory is expected to contain softlinks pointing to
154 snapshots of the filesystems you wish to retain. The directory is scanned
155 non-recursively and the mount points and transaction ids stored in the
156 softlinks are extracted and sorted.
157 The filesystem is then explicitly pruned according to what is found.
158 Cleaning out portions of the filesystem is as simple as removing a softlink
163 As a safety measure pruning only occurs if one or more softlinks are found
164 containing the @@ snapshot id extension.
166 Currently the scanned softlink directory must contain softlinks pointing
167 to a single HAMMER mount. The softlinks may specify absolute or relative
168 paths. Softlinks must use 20-character (@@0x%016llx) transaction ids,
169 as might be returned from 'hammer synctid <filesystem>'.
171 Example, lets say your snapshot directory contains the following links:
173 .Li "lrwxr-xr-x 1 root wheel 29 May 31 17:57 snap1 -> /usr/obj/@@0x10d2cd05b7270d16"
175 .Li "lrwxr-xr-x 1 root wheel 29 May 31 17:58 snap2 -> /usr/obj/@@0x10d2cd13f3fde98f"
177 .Li "lrwxr-xr-x 1 root wheel 29 May 31 17:59 snap3 -> /usr/obj/@@0x10d2cd222adee364"
179 If you were to run the softprune command on this directory, then the HAMMER
180 /usr/obj mount will be pruned to retain the above three snapshots.
181 In addition, modifications made to the filesystem older then the oldest
182 snapshot will be destroyed and potentially fine-grained modifications made
183 to the filesystem more recently then the most recent snapshot will be
186 If you then delete the snap2 softlink and rerun the softprune command,
187 modifications pertaining to that snapshot would be destroyed.
188 .It Ar prune Ar filesystem Ar from Ar #{smhdMy} Ar to Ar #{smhdMy} Ar every Ar #{smhdMy}
189 .It Ar prune Ar filesystem Ar from Ar #{smhdMy} Ar everything
190 .It Ar prune Ar filesystem Ar everything
191 .It Ar prune Ar filesystem Op Ar using Ar filename
192 Prune the filesystem, removing deleted records to free up physical disk
193 space. Specify a time range between the nearest modulo 0 boundary
194 and prune the tree to the specified granularity within that range.
196 The filesystem specification should be the root of any mounted HAMMER
197 filesystem. This command uses a filesystem ioctl to issue the pruning
198 operation. If you specify just the filesystem with no other parameters
199 all prune directives matching that filesystem in the /etc/hammer.conf file
200 will be used. If you specify a
202 file then those directives contained in the file matching
204 will be used. Multiple directives may be specified when extracting from
205 a file. The directives must be in the same format: "prune ....", in
206 ascending time order (per filesystem). Matching prune elements must not
207 have overlapping time specifications.
209 Both the "from" and the "to" value must be an integral multiple
210 of the "every" value, and the "to" value must be an integral multiple
211 of the "from" value. When you have multiple pruning rules you must
212 take care to ensure that the range being pruned does not overlap ranges
213 pruned later on, when the retained data is older. If they do the retained
214 data can wind up being destroyed. For example, if you prune your data
215 on a 30 minute granularity for the last 24 hours any later pruning must
216 use a granularity that is a multiple of 30 minutes. If you prune your
217 data on a 30 minute boundary, then a 1 day boundary in a later pruning (on
218 older data), then a pruning beyond that would have to be a multiple of
221 The "prune <filesystem> from ... everything" command will remove all
222 historical records older then the specified date. It is a way of saying
223 that you do not want to retain any deleted information past a certain point.
225 The "prune <filesystem> everything" command will remove all historical records
226 from the filesystem. The long keyword is designed to prevent accidental use.
227 This option is not recommended.
229 Example: "hammer prune /mnt from 1h to 1d every 30m"
231 Note that pruning a filesystem does not necessarily immediately free space,
232 though typically some space will be freed if a large number of records are
233 pruned out. The filesystem must be reblocked to completely recover all
235 .It Ar reblock Ar filesystem Op Ar fill_percentage
236 .It Ar reblock-btree Ar filesystem Op Ar fill_percentage
237 .It Ar reblock-inodes Ar filesystem Op Ar fill_percentage
238 .It Ar reblock-dirs Ar filesystem Op Ar fill_percentage
239 .It Ar reblock-data Ar filesystem Op Ar fill_percentage
240 Attempt to defragment and free space for reuse by reblocking a live
242 Big blocks cannot be reused by HAMMER until they are completely free.
243 This command also has the effect of reordering all elements, effectively
244 defragmenting the filesystem.
246 The default fill percentage is 100% and will cause the filesystem to be
247 completely defragmented. All specified element types will be reallocated
248 and rewritten. If you wish to quickly free up space instead try specifying
249 a smaller fill percentage, such as 90% or 80% (the '%' suffix is not needed).
251 Since this command may rewrite the entire contents of the disk it is
252 best to do it incrementally from a cron job along with the
256 options to limit the run time.
257 The filesystem would thus be defragmented over long period of time.
259 It is recommended that separate invocations be used for each data type.
260 Btree nodes, inodes, and directories are typically the most important
261 elements needing defragmentation. Data can be defragmented over a longer
263 .It Ar pseudofs Ar dirpath
264 Create a pseudo-filesystem inside a HAMMER filesystem. Up to 65535 such
265 filesystems can be created. Each one uses an independant inode numbering
266 space making it suitable for use as a replication source or target.
270 Exit status is 0 on success and 1 on error.
276 utility first appeared in
279 .An Matthew Dillon Aq dillon@backplane.com