 e7db2d3588
			
		
	
	
		e7db2d3588
		
	
	
	
	
		
			
			This driver can be loaded as an overlay on top of a real block device, and can then be used to generate block-level failures for certain transfer requests. Specifically, a rule-based system allows the user to introduce (overt and silent) data corruption and errors. It exposes itself through /dev/fbd, and a file system can be mounted on top of it. The new fbdctl(8) tool can be used to control the driver; see ``man fbdctl'' for details. It also comes with a test set, located in test/fbdtest.
		
			
				
	
	
		
			110 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| .TH FBDCTL 8
 | |
| .SH NAME
 | |
| fbdctl \- Faulty Block Device rule management interface
 | |
| .SH SYNOPSIS
 | |
| \fBfbdctl\fR \fBadd\fR [\fB-d\fR \fIdevice\fR]
 | |
| [\fB-a\fR \fIstart\fR[\fB-\fR\fIend\fR]] [\fB-s\fR \fIskip\fR]
 | |
| [\fB-c\fR \fIcount\fR] [\fB-rw\fR] \fIaction\fR [\fIparams\fR]
 | |
| .PP
 | |
| \fBfbdctl\fR \fBdel\fR [\fB-d\fR \fIdevice\fR] \fIrulenum\fR
 | |
| .PP
 | |
| \fBfbdctl\fR \fBlist\fR [\fB-d\fR \fIdevice\fR]
 | |
| .SH DESCRIPTION
 | |
| The Faulty Block Device (FBD) driver is an interposing block device driver
 | |
| which can simulate certain disk-level I/O corruption and errors, based on a
 | |
| user-provided set of rules. The \fBfbdctl\fR tool allows one to add, delete,
 | |
| and list rules on a running FBD driver instance.
 | |
| .PP
 | |
| The \fBadd\fR subcommand adds a new rule, which will perform a predefined
 | |
| faulty action on a disk transfer when triggered. See the ACTIONS subsection
 | |
| below. The \fBdel\fR subcommands deletes an existing rule, based on its rule
 | |
| number. All currently active rules and their corresponding rule numbers can be
 | |
| viewed with the \fBlist\fR subcommand.
 | |
| .SH OPTIONS
 | |
| .TP 10
 | |
| \fB-d\fR \fIdevice\fR
 | |
| By default, \fBfbdctl\fR operates on \fB/dev/fbd\fR. With this option, one can
 | |
| specify a different device node. This is useful when using multiple FBD
 | |
| instances at the same time. The user would have to create extra device nodes
 | |
| first in that case.
 | |
| .TP 10
 | |
| \fB-a\fR [\fIstart\fR[\fB-\fR\fIend\fR]]
 | |
| When adding a rule, this option specifies the disk address range for which the
 | |
| rule triggers. That is, the rule will trigger when an I/O operation overlaps
 | |
| with the given range. Both \fIstart\fR and \fIend\fR are expected to be
 | |
| hexadecimal numbers, without a "0x" prefix. The \fIend\fR address is exclusive.
 | |
| If no \fIend\fR address is given, the rule will affect the disk from the
 | |
| starting address to the disk end. If this option is not provided at all,
 | |
| the rule will affect the entire disk.
 | |
| .TP 10
 | |
| \fB-s\fR \fIskip\fR
 | |
| This option makes the new rule refrain from triggering for the given number
 | |
| of times it matches. The \fIskip\fR value must be a positive decimal number.
 | |
| If this option is omitted, the value is set to zero, meaning the rule will
 | |
| start triggering immediately.
 | |
| .TP 10
 | |
| \fB-c\fR \fIcount\fR
 | |
| This option makes the new rule trigger for this many I/O operations when
 | |
| matched, after which it will be removed automatically. The \fIcount\fR value
 | |
| must be a positive decimal number. If this option is omitted, or a value of
 | |
| zero is given, the rule is permanent and will not be removed automatically.
 | |
| .TP 10
 | |
| \fB-r\fR, \fB-w\fR
 | |
| These options allow one to make the new rule trigger on read or write
 | |
| operations only. By default, or when both are specified, the new rule will
 | |
| trigger for both read and write I/O operations.
 | |
| .SH ACTIONS
 | |
| The following actions are supported. They are executed when the rule matches
 | |
| for a transfer request, and is triggered as a result. Note that the exact
 | |
| meaning of the rule's disk address range (as given by the \fB-a\fR option)
 | |
| depends on the action type.
 | |
| .TP 10
 | |
| \fBcorrupt\fR [\fBzero\fR|\fBpersist\fR|\fBrandom\fR]
 | |
| In the part of the transfer that matches the disk address range given for the
 | |
| rule (i.e., the intersection of the rule range and the transfer range), the
 | |
| data will be corrupted. The following corruption policies are supported: the
 | |
| data is set to \fBzero\fR, it is \fBpersist\fRently set to the same garbage
 | |
| data for the same disk locations, or it is set to different \fBrandom\fR data
 | |
| in every transfer.
 | |
| .TP 10
 | |
| \fBerror\fR [\fBOK\fR|\fBEIO\fR]
 | |
| Only the part of the transfer up to the start of the rule's disk address range
 | |
| will be performed, after which the given error code is returned. The \fBOK\fR
 | |
| code effectively simulates an end-of-disk condition, whereas the \fBEIO\fR code
 | |
| simulates generic disk-level I/O failure.
 | |
| .TP 10
 | |
| \fBmisdir\fR \fIstart\fR\fB-\fR\fIend\fR \fIalign\fR
 | |
| Transfer requests that match this rule, will be \fBmisdirected\fR in their
 | |
| entirety, to a random location in the given address range, and with the given
 | |
| disk byte alignment within that range. The \fIstart\fR and \fIend\fR parameters
 | |
| are specified just like the \fB-a\fR option, although the \fIend\fR parameter
 | |
| is compulsory here (since the driver does not know the disk end). The
 | |
| \fIalign\fR value must be a positive nonzero decimal number, and should be a
 | |
| multiple of the medium sector size; a typical value would be 4096.
 | |
| .TP 10
 | |
| \fBlost\fR
 | |
| Transfer requests that match this rule, will be \fBlost\fR in their entirety.
 | |
| That is, they will not actually be performed, and yet report successful
 | |
| completion.
 | |
| .TP 10
 | |
| \fBtorn\fR \fIlead\fR
 | |
| Transfer requests that match this rule, will be \fBtorn\fR: only the first
 | |
| \fIlead\fR bytes of the transfer request will actually be performed, and yet
 | |
| completion of the full transfer is reported. The \fIlead\fR value must be a
 | |
| positive nonzero decimal number. A \fBtorn\fR action with a \fIlead\fR value of
 | |
| zero would be the same as the \fBlost\fR action.
 | |
| .SH EXAMPLES
 | |
| .TP 10
 | |
| .B fbdctl add -a 2000-3000 corrupt zero
 | |
| # Zero out the 4096 bytes starting from disk address 0x2000 in any transfer
 | |
| that involves any of those bytes.
 | |
| .TP 10
 | |
| .B fbdctl add -s 9 -c 1 -r error EIO
 | |
| # Fail the tenth read request with an I/O error.
 | |
| .TP 10
 | |
| .B fbdctl add -a A0000-B0000 -w misdir D0000-E0000 4096
 | |
| # Misdirect write requests that overlap with the first range, to fall somewhere
 | |
| in the second range, at 4K-block-granular alignment.
 | |
| .SH AUTHOR
 | |
| David van Moolenbroek <david@minix3.org>
 |