=head1 NAME

salvageserver - Initializes the Salvageserver component of the dafs process

=head1 SYNOPSIS

=for html
<div class="synopsis">

B<salvageserver> [I<initcmd>] S<<< [B<-partition> <I<name of partition to salvage>>] >>>
    S<<< [B<-volumeid> <I<volume id to salvage>>] >>> [B<-debug>] [B<-nowrite>]
    [B<-inodes>] [B<-force>] [B<-oktozap>] [B<-rootinodes>]
    [B<-salvagedirs>] [B<-blockreads>]
    S<<< [B<-parallel> <I<# of max parallel partition salvaging>>] >>>
    S<<< [B<-tmpdir> <I<name of dir to place tmp files>>] >>>
    [B<-showlog>] [B<-showsuid>] [B<-showmounts>]
    S<<< [B<-orphans> (ignore | remove | attach)] >>>
    [B<-client>] [B<-help>]

=for html
</div>

=head1 DESCRIPTION

In its typical mode of operation, the B<salvageserver> is a daemon process 
responsible for salvaging volumes.  It is a component of the C<dafs> 
process type.  In the conventional configuration, its binary file is 
located in the F</usr/afs/bin> directory on a file server machine.

The Salvageserver daemon is responsible for scheduling and executing 
volume salvage operations on behalf of client processes.  The fileserver 
acts as the primary salvageserver client: any failed volume attach 
operation results in a salvageserver scheduling request.  The 
salvageserver also accepts periodic volume activity messages in order to 
update its salvage request priority queue.  Other clients of the 
salvageserver daemon include the B<salvsync-debug> utility, and the
salvageserver command itself by passing the B<-client> flag.

The salvage operations performed on vice partition data are nearly 
identical to those performed by the standalone Salvager command.  The 
key differences between the two commands are:

=over 4

=item *

The Salvageserver is a daemon process which runs concurrently with the 
fileserver.  In contrast, the Salvager is a stand-alone application which 
is invoked when the fileserver and volserver are not running.

=item *

The Salvageserver is incapable of performing whole partition salvage 
operations; it operates at volume group granularity.

=back

The Salvageserver normally creates new inodes as it repairs damage. If the
partition is so full that there is no room for new inodes, use the
B<-nowrite> argument to bringing undamaged volumes online without
attempting to salvage damaged volumes. Then use the B<vos move> command to
move one or more of the undamaged volumes to other partitions, freeing up
the space that the Salvageserver needs to create new inodes.

By default, multiple Salvageserver subprocesses run in parallel: one for each 
volume group.  By default, four concurrent salvage operations are 
permitted.  You may alter this default by providing a positive integer 
value for the B<-parallel> argument.  The maximum permitted value is 32 
concurrent salvageserver subprocesses.

By default, the salvageserver enables a heuristic which attempts to stop
disk head thrashing by concurrent salvageserver subprocesses.  Unfortunately,
this heuristic significantly degrades performance in many cases.  In at least 
the following environments, passing the C<all> string to the B<-parallel> 
argument is strongly encouraged:

=over 4

=item *

On NAMEI fileservers

=item *

When a vice partition is backed by multiple disks (e.g. RAID)

=item *

When a vice partition is backed by SAN-attached storage, LVM, or some other
form of storage virtualization which would cause unix device id numbers to
be unpredictable.

=back

The Salvageserver creates temporary files as it runs, by default writing them
to the partition it is salvaging. The number of files can be quite large,
and if the partition is too full to accommodate them, the Salvageserver
terminates without completing the salvage operation (it always removes the
temporary files before exiting). Other Salvageserver subprocesses running at
the same time continue until they finish salvaging all other partitions
where there is enough disk space for temporary files. To complete the
interrupted salvage, reissue the command against the appropriate
partitions, adding the B<-tmpdir> argument to redirect the temporary files
to a local disk directory that has enough space.

The B<-orphans> argument controls how the Salvageserver handles orphaned files
and directories that it finds on server partitions it is salvaging. An
I<orphaned> element is completely inaccessible because it is not
referenced by the vnode of any directory that can act as its parent (is
higher in the filespace). Orphaned objects occupy space on the server
partition, but do not count against the volume's quota.

To generate a list of all mount points that reside in one or more volumes,
rather than actually salvaging them, include the B<-showmounts> flag.

This command does not use the syntax conventions of the AFS command
suites. Provide the command name and all option names in full.

=head1 OPTIONS

=over 4

=item [I<initcmd>]

Accommodates the command's use of the AFS command parser, and is optional.

=item B<-partition> <I<name of partition to salvage>>

Specifies the name of the partition to salvage. Specify the full partition
name using the form F</vicepI<x>> or F</vicepI<xx>>. Omit this argument to
salvage every partition on the file server machine.

=item B<-volumeid> <I<volume id to salvage>>

Specifies the volume ID of a specific read/write volume to salvage.  The
B<-partition> argument must be provided along with this one and specify
the volume's actual site.

=item B<-debug>

This flag should be considered deprecated.  Its primary purpose was to disable
forking and parallelization of the Salvager so that log messages were not
interleaved.  Due to the manner in which F</usr/afs/logs/SalSrvLog> is 
written, log messages from subprocesses are never interleaved; the entire log
for a volume group salvage is appended to the master log as one atomic 
transaction.

=item B<-nowrite>

Brings all undamaged volumes online without attempting to salvage any
damaged volumes.

=item B<-inodes>

Records in the F</usr/afs/logs/SalSrvLog> file a list of all AFS inodes
that the Salvageserver modified.

=item B<-force>

Inspects all volumes for corruption, not just those that are marked as
having been active when a crash occurred.

=item B<-oktozap>

Removes a volume that is so damaged that even issuing the B<vos zap>
command with the B<-force> flag is ineffective. Combine it with the
B<-partition> and B<-volumeid> arguments to identify the volume to remove.
Using this flag will destroy data that cannot be read, so use only with
caution and when you're certain that nothing in that volume is still
needed.

=item B<-rootinodes>

Records in the F</usr/afs/logs/SalSrvLog> file a list of all AFS inodes
owned by the local superuser C<root>.

=item B<-salvagedirs>

Salvages entire directory structures, even if they do not appear to be
damaged. By default, the Salvageserver salvages a directory only if it is
flagged as corrupted.

=item B<-blockreads>

Forces the Salvageserver to read a partition one disk block (512 bytes) at a
time and to skip any blocks that are too badly damaged to be salvaged.
This allows it to salvage as many volumes as possible. By default, the
Salvageserver reads large disk blocks, which can cause it to exit prematurely
if it encounters disk errors. Use this flag if the partition to be
salvaged has disk errors.

=item B<-parallel> <I<# of max parallel partition salvaging>>

Specifies the maximum number of Salvageserver subprocesses to run in parallel.
Provide one of three values:

=over 4

=item *

An integer from the range C<1> to C<32>. A value of C<1> means that a
single Salvageserver subprocess salvages the volume groups sequentially.
The disk partition heuristic (see above) based upon unix device ids is 
enabled.

=item *

The disk partition heuristic (see above) based upon unix device ids is 
disabled.

=item *

The string C<all> followed immediately (with no intervening space) by an
integer from the range C<1> to C<32>, to run the specified number of
Salvageserver subprocesses in parallel on volume groups.  The disk partition 
heuristic (see above) based upon unix device ids is disabled.

=back

If this argument is omitted, up to four Salvageserver subprocesses run
in parallel.

=item B<-tmpdir> <I<name of dir to place tmp files>>

Names a local disk directory in which the Salvageserver places the temporary
files it creates during a salvage operation, instead of writing them to
the partition being salvaged (the default). If the Salvageserver cannot write
to the specified directory, it attempts to write to the partition being
salvaged.

=item B<-showlog>

Displays on the standard output stream all log data that is being written
to the F</usr/afs/logs/SalSrvLog> file.

=item B<-showsuid>

Displays a list of the pathnames for all files that have the setuid or
setgid mode bit set.

=item B<-showmounts>

Records in the F</usr/afs/logs/SalSrvLog> file all mount points found in
each volume. The Salvageserver does not repair corruption in the volumes, if
any exists.

=item B<-orphans> (ignore | remove | attach)

Controls how the Salvageserver handles orphaned files and directories.  Choose
one of the following three values:

=over 4

=item ignore

Leaves the orphaned objects on the disk, but prints a message to the
F</usr/afs/logs/SalSrvLog> file reporting how many orphans were found and
the approximate number of kilobytes they are consuming. This is the
default if the B<-orphans> argument is omitted.

=item remove

Removes the orphaned objects, and prints a message to the
F</usr/afs/logs/SalSrvLog> file reporting how many orphans were removed
and the approximate number of kilobytes they were consuming.

=item attach

Attaches the orphaned objects by creating a reference to them in the vnode
of the volume's root directory. Since each object's actual name is now
lost, the Salvageserver assigns each one a name of the following form:

=over 4

=item C<__ORPHANFILE__.I<index>> for files.

=item C<__ORPHANDIR__.I<index>> for directories.

=back

where I<index> is a two-digit number that uniquely identifies each
object. The orphans are charged against the volume's quota and appear in
the output of the B<ls> command issued against the volume's root
directory.

=back

=item B<-client>

Salvageserver runs in client Mode.  The requested volume on the requested
partition will be scheduled for salvaging by the Salvageserver daemon.

=item B<-help>

Prints the online help for this command. All other valid options are
ignored.

=back

=head1 EXAMPLES

The following command instructs the Salvageserver to schedule the salvage 
of the volume with volume ID 258347486 on F</vicepg> on the local machine.

   % /usr/afs/bin/salvageserver -partition /vicepg -volumeid 258347486 -client

=head1 PRIVILEGE REQUIRED

To issue the command at the shell prompt, the issuer must be logged in as
the local superuser C<root>.

=head1 SEE ALSO

L<BosConfig(5)>,
L<SalvageLog(5)>,
L<salvager(8)>,
L<bos_create(8)>,
L<bos_getlog(8)>,
L<bos_salvage(8)>,
L<vos_move(1)>

=head1 COPYRIGHT

IBM Corporation 2000. <http://www.ibm.com/> All Rights Reserved.
Sine Nomine Associates 2008.  All Rights Reserved.

This documentation is covered by the IBM Public License Version 1.0.  It was
converted from HTML to POD by software written by Chas Williams and Russ
Allbery, based on work by Alf Wachsmann and Elizabeth Cassell.  This document
was adapted from the Salvager POD documentation.
