Hi!
Last week I crashed a btrfs file system. I didn''t lose a lot of data
because I
had current backups of most data and a full backup from a month ago.
But I thought it would be a nice idea to have a rescue tool! Currently I have a
first release of this tool (surely buggy and runnning on little endian
architectures only).
The tool is written in C using the header files from the btrfs userland tools.
I use a wrapper (written in a script language) to restore whole directories.
Such a wrapper could also detect hard links and handle them correctly.
btrfs_rescue implements all disk accesses itself and tries to access only the
absolute minimum of necessary data structures to avoid the pitfalls that lurk
somewhere in the destroyed file system. So you can rescue parts of a destroyed
file system even if the file system driver cannot mount it anymore.
The source code is available under
http://simplux.org/downloads/btrfs_rescue.c
Here is a short overview of the tool''s usage:
Usage:
btrfs_rescue --help
shows this short description of available commands
btrfs_rescue volumes <device>
displays a list of all subvolumes
btrfs_rescue dir <device> <volume>
shows the contents of the root directory
btrfs_rescue dir <device> <volume> <inode>
shows the contents of the directory with the specified inode number
btrfs_rescue stat <device> <volume> <inode>
displays the status of the file with the specified inode
btrfs_rescue cp [--preserve] [--large] <device> <volume>
<inode> <filename>
creates a copy of the file specified by the inode number under the
specified file name
The cp-command can copy regular files as well as symbolic links, block and
character devices. When copying a directory, only the directory node itself is
copied but not its contents!
The "--preserve" option preserves access rights, ownership, access
time and
modification time of the file.
The "--large" option allows copying of files larger than 100MB.
(A very large file size could stem from the filesystem destruction.)
An example output of the above commands:
# btrfs_rescue volumes /dev/sde2
5 (generation 227542)
256 (generation 227106)
257 (generation 227553)
258 (generation 227105)
259 (generation 227506)
260 (generation 225276)
261 (generation 224231)
...
314 (generation 226751)
315 (generation 226752)
316 (generation 227104)
317 (generation 227105)
318 (generation 227106)
# btrfs_rescue dir /dev/sde2 5
dev: 584 (directory)
.backups: 256 (directory)
downloads: 259 (directory)
boot: 381 (directory)
lib: 3504 (directory)
sbin: 18685 (directory)
save2: 260 (directory)
usr: 75153 (directory)
opt: 14258 (directory)
destination: 1056921 (directory)
.joe_state: 1122321 (regular file)
data: 583 (directory)
bin: 263 (directory)
initrd: 257 (directory)
save: 259 (directory)
home: 258 (directory)
net: 14257 (directory)
.bash_history: 1325987 (regular file)
etc: 585 (directory)
source: 1056920 (directory)
var: 18959 (directory)
tmp: 262 (directory)
sys: 261 (directory)
mnt: 14256 (directory)
proc: 258 (directory)
root: 257 (directory)
cmds: 408 (directory)
# btrfs_rescue dir /dev/sde2 5 584
vbi: 362470 (symbolic link)
dri: 1320381 (directory)
dmfm2: 361934 (character device)
mixer1: 362155 (character device)
sequencer: 362269 (character device)
hdb4: 361984 (block device)
hdc7: 361997 (block device)
hda1: 361964 (block device)
...
loop0: 362037 (block device)
sda9: 362218 (block device)
parport0: 362166 (character device)
ippp2: 362026 (character device)
nvram: 362165 (character device)
midi03: 362152 (character device)
pts: 362176 (directory)
# btrfs_rescue stat /dev/sde2 5 362152
type: 21b0
character device
major: 0xe
minor: 0x32
size: 0
allocated: 0
links: 1
uid: 17
gid: 0
mode: 0660
access: 2007-07-17 18:58:42.000000000 +0200
modify: 2007-07-17 18:58:42.000000000 +0200
change: 2010-05-17 23:33:23.720827790 +0200
Greetings, Michael
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs"
in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html