LDE(8) Linux Programmer's Manual LDE(8)
NAME
lde - a curses based file system viewer/editor for Linux
SYNOPSIS
lde device
DESCRIPTION
lde supports the three most popular file systems under
Linux at the time of its inception: ext2fs, minix, and
xiafs. It also has minimal support for msdos FAT file
systems and a nofs system in which case lde will function
as a binary editor. lde will attempt to automatically
detect the file system present on the device or file when
it is started, if it does not recognize the file system
present on the device, it will default to nofs.
lde allows you to view and edit disk blocks in hex or
ASCII mode, view a block that contains directory entries
in a readable fashion, and view and edit formatted inodes.
lde is a great help when recovering deleted files (see
doc/UNERASE included with the lde distribution for more
info).
The device parameter is a required option for lde. If
omitted, it will print a warning and refuse to start. The
default mode for lde is to use a curses interface; this
can be overriden by some of the options listed below.
OPTIONS
-a, --all
Indicates that searches should be performed on the
entire disk. If -a is not specified, only data
zones which are marked not in use will be searched.
--append
Always append data to existing recovery file. If
file does not exist, create new file.
-b (--block) block_number
Dump block block_number to standard output (hex
mode).
-B block_number
Dump all blocks after block_number to standard out-
put. You can use -N to specify the number of
blocks to display.
--blanked-indirects
Linux <= 2.0.33 blanks all the indirect blocks when
truncating an inode. The inode still knows where
the 1x/2x/3x indirect blocks are, but they're full
of zeros. This was a quick hack that works to
restore small (>12k <~500k) unfragmented files. It
Linux 2.0 23 September 1996 1
LDE(8) Linux Programmer's Manual LDE(8)
can be toggled via the flags menu in the curses
interface.
-d block_number
Dump a block's data to standard out (pure binary
data).
-f, --file recovery_file_name
Signal lde that we want to recover an inode to a
file and specify its name. You should specify the
inode number to be recovered with the -i option.
-g, --grep
This option was designed to work with grep output.
Grep a file for lost data, pipe it through awk to
yield just byte offsets where the desired string
lies. lde will then find the block corresponding
to the desired offset and try to find an inode
which references this block. A sample script is
included with the lde distribution
(crash_recovery/grep-inode).
-h, --help
Display extended help.
-i (--inode) inode_number
Dump inode inode_number to standard output.
-I inode_number
Dump all inodes after inode_number to standard out-
put. You can use -N to specify the number of
inodes to display.
--indirects
Search the filesystem for blocks that looks like
indirect blocks.
--ilookup
When searching, if we find a match, activate this
flag to lookup the inode which contains the matched
block. It might be easier and faster to do this
with paper and use lde to interactively lookup only
the blocks which have a high probability of being
the one you want. --ilookup can also be used if
the -B or -b option is specified to try to find an
inode reference for the specifed blocks. When
using -B make sure to specify a length with the -N
option.
-L --length
Sets search string length (when using -T with a
filename).
Linux 2.0 23 September 1996 2
LDE(8) Linux Programmer's Manual LDE(8)
-N --limit
Sets the number of blocks to dump when using -I or
-B options. If unspecified, default is to the end
of the filesystem. -N can also be used to specify
a block to begin/resume searching at. If unspeci-
fied in this usage, it defaults to the first data
zone.
-O --offset
Sets search string offset (when using -T with a
filename). The first byte in the template file is
0. When searching for matches, the block will be
examined starting at this offset.
-p, -r, --paranoid, --safe, --read-only
Open the device read only. Once set, this cannot
be toggled from within the program.
-q, --quiet
Turn off bell.
--recoverable
When searching, check that any inodes found contain
a deleted file that may be recovered. --ilookup
must also be activated for this option to have any
effect. If no blocks are marked used by another
inode, "recovery possible" will be printed. If
blocks are used by another file "recovery NOT pos-
sible" will be printed to the screen. You may
still be able to get some data back even when it
reports that recovery is not possible. To get an
idea of how many blocks are in use, you will have
to check its recoverablilty from lde via its curses
interface (see Recover mode below).
If --recoverable is used with -I 1 , it will check
all the deleted inodes to see if they can be recov-
ered. The deletion time of the inode will be
printed to the screen if it is recoverable.
--scrubxiafs
Clobbers the xiafs magic number. This is stored on
the very first block of the file system which is
usually reserved for boot code (xiafs does reserve
512 bytes for booting). If you make another file
system on a device which once housed an xiafs, lde
will always autodetect xiafs (other progs may do
the same). As of v2.2alpha4, lde will check block
1, then block 0, so it is not a problem any more.
--unscrubxiafs will reverse the changes.
-S string
Search disk for data (of questionable usefulness).
This was more for searching for a specific type of
Linux 2.0 23 September 1996 3
LDE(8) Linux Programmer's Manual LDE(8)
file (which is now easier with -T ) rather than
file data. To search for data or strings, use the
--grep option. If you insist on using -S which
might be prudent occasionally, The offset of the
string must be specified with -O , and each block
will only be inspected at that offset. If -O is not
specified, then 0 is assumed and the string must
lie at the start of a block. You can also specify
the block to begin/resume searching from with -N
which defaults to the first data zone.
-t fstype
Override the auto-detect. fstype = {no, minix,
xiafs, ext2fs, msdos}
-T type
Search disk for data. This will search the start of
each block for numbers found in /etc/magic for cer-
tain types of files, currently supported types are
{gz, tgz, script}.
Note: type tgz only finds tar files that were cre-
ated with gnu tar using its cfz options. Use gz to
find tar files that were compressed after creation
(or through a pipe?).
If you specify a filename after the -T option, it
will read in the first block of the file and search
the filesystem for something which matches it
exactly. This may be useful for finding deleted
copies of files (i.e. you've found version 1.0, but
deleted version 1.5 and now want to recover it) or
with the -L and -O options, you can pick off a few
bytes and search for magic numbers in a certain
file type. When using the filename option, you
really should specify -L and -O or they will
default to BLOCKSIZE and 0. You can also specify
the block to begin/resume searching from with -N
which defaults to the first data zone.
-V, --version
Display version information.
-w, --write
Allow writes to the disk.
CURSES INTERFACE
The lde main screen displays the file system's superblock
in the workspace window. The header window will be the
same for all modes and indicates the program name and ver-
sion, the device, the current selected inode, and the cur-
rent selected block. There are also nine digits (and some
Linux 2.0 23 September 1996 4
LDE(8) Linux Programmer's Manual LDE(8)
extra characters shifted-12456 on an American keyboard,
sorry I skip '#' which is reserved for another function)
"0123456789!@$%^" which indicate the status of a bogus
inode which can be used for file recovery. A digit means
the inode block entry has not been filled yet, a minus
sign indicates that it has been filled.
While displaying the superblock, you can use the following
keys which are valid in most modes:
b to enter block mode
d display the directory contents of the cur-
rent inode or block
f menu of runtime flags
i to enter inode mode
r to enter recover mode
s return to super block mode ( only valid from
other modes )
q to quit
v view the error/warning log
^L to repaint the screen
^O display menu of valid choices ( also F2 )
F1 display help screen ( also M-h or ? )
I have tried to implement cursor motion modes similar to
both vi and emacs (M = meta key, ^ = control key, ESC is
recognized as the meta key, M-ESC is recognized occasion-
ally as ESC -- to exit menus).
vi emacs
UP k ^P
DOWN j ^N
LEFT h ^B
RIGHT l ^F
PG_UP ^U M-v
PG_DN ^D ^V
Inode mode:
Once in inode mode, the current inode will be dis-
played in the workspace window.
Linux 2.0 23 September 1996 5
LDE(8) Linux Programmer's Manual LDE(8)
PG_DOWN
Make next inode the current inode.
PG_UP Make previous inode the current inode.
arrows Move cursor to different fields of inode.
Up and left go back one field, down or right
will go to the next field.
0123456789!@#$%^
Add corresponding block entry from this
inode to the recovery list.
B Switch to block mode, examining block under
cursor.
b Switch to block mode, examining current
block (displayed in status line).
c Copy inode to inode copy buffer.
e Edit inode information. Use the cursor to
select the field you want to edit, then hit
RET ^M ^J or e and a line will pop up at the
bottom of the screen, enter the new value
here. Entering a blank line will leave the
value unchanged.
Dates can be entered in any format other
than the one displayed on the screen. The
year must be kept near the month and day.
Use formats like "24SEP96 10:00:01" or
"10:00:01 Sep 24, 1996". "12/24/96" will
probably default to the American interpreta-
tion MM/DD/YY. I did not write the date
parser, so I don't want to hear any com-
plaints about it.
p Paste inode from inode copy buffer.
r Switch to recover mode.
R Switch to recover mode, copy current inode
block information into recovery inode.
# This will prompt the user to enter a number
and it will then make that the current
inode. The number may be entered as hex-
adecimal (leading 'x', '0x', or '$'), octal
(leading ''), or decimal.
M-b View inode in its raw block format.
Block Mode:
Linux 2.0 23 September 1996 6
LDE(8) Linux Programmer's Manual LDE(8)
In block mode, the current block will be displayed in hex-
adecimal and ASCII. The numbers along the left hand side
of the screen are hexadecimal offsets from the beginning
of the block. As much of the block as possible will be
displayed. If the block is marked unused, the central row
of ':' will spell out NOT USED.
PG_DOWN
Display next chunk of this block.
PG_UP Display previous chunk of this block.
+ Make next block the current block.
- Make previous block the current block.
arrow Move cursor.
b View block under cursor. lde will interpret
the byte under the cursor as the start of a
block pointer (as if it were part of an
indirect block). This will be a two byte
pointer for the minix file system, four
bytes for ext2fs and xiafs.
B Interpret blocks under cursor as a block
pointer and make it the current block.
c Copy block to copy buffer.
d Dump block as a directory (see directory
popup description below).
e Edit the data in hex or ascii mode. TAB (
^I) switches between hex and ascii editing.
While in hex edit, the keys A-F and
0123456789 will not perform their lde func-
tions, but are used to enter new data. In
ascii edit, most keys (chars 32-126) are
used to enter new data. Characters outside
this range must be entered in hex mode, they
will be displayed on the ASCII display as a
period.
Editing will exit on write block ( ^W ) or a
command which goes to another block or
leaves block mode. To discard your changes
and re-read the block use ^A or view another
block and come back. You will always be
prompted [Yes/Discard changes/Continue edit]
before a write occurs. Select y to save the
block to disk, d to discard your changes and
re-read the data from disk, or c if you made
Linux 2.0 23 September 1996 7
LDE(8) Linux Programmer's Manual LDE(8)
a mistake and want to go back and make some
more changes before saving this block.
It is probably a good idea to unmount the
file system before you do any writes to it.
My guess is that bad things will happen if
you try to write the inode/block tables
while someone else is using the filesystem.
I View inode under cursor. lde will interpret
the byte under the cursor as the start of an
inode pointer (as if it were part of an
directory entry). This will be a two byte
pointer for the minix file system, four
bytes for ext2fs and xiafs.
n, p Next/previous block in file. If the dis-
played file is indexed by the current inode,
you can step to the next or previous block
in the chain.
p Paste block from copy buffer.
w Write the current block to the recovery
file.
0123456789!@#$%^
tag this block to be recovered. Under
Minix, this will display nine blocks which
represent the block pointers in an inode.
0-6 are direct blocks, 7 is the indirect
block, and 8 is the double indirect block.
One day there may be an option for more
direct blocks to make recovery easier. When
a block is tagged, the status line will
reflect this. To untag a block, go to
recover mode and set the block's pointer to
zero.
# This will prompt the user to enter a block
number. The numbers may be entered in the
same format described in inode mode (deci-
mal, hex, or octal).
^R Look up inode which references this block.
Recover Mode:
In recover mode, the tagged blocks are displayed and may
be edited by hand. When they are correct the user can
dump the file. The user is prompted for a filename which
can be 80 chars, the default file is "./RECOVER.file".
Linux 2.0 23 September 1996 8
LDE(8) Linux Programmer's Manual LDE(8)
0123456789!@#$%^
Will prompt the user to enter a numeric
value for the specified block index. The
format of the input should be the same as
that described in inode mode.
c Check that all the blocks marked for recov-
ery are unused. Complete recovery will be
impossible if any blocks are reported in
use, but you might be able to salvage a
large chunk of your file.
r Write out the recovered file.
u Unmark all blocks. The recovery inode will
be filled with zeroes.
Directory View
Accessable from inode and block mode. In block mode, it
formats the current block as a directory entry with no
syntax checking (i.e. it might not really be a directory
block). In inode mode, it uses the block pointers to
determine what to display. You can use the up and down
arrow keys to scroll the display if there are too many
entries to display at once.
d If the cursor is on a directory, it will follow the
link and display that directory. Use D to do the
same and set the current inode to the new directory
inode.
i Set the current inode to the inode under the cur-
sor.
I Set the current inode and immediately view it in
inode mode.
n, p Next/previous block in directory. If the directory
being viewed is indexed by the current inode, you
can step to the next or previous block in the
chain.
EXAMPLES (command line)
lde -I 1 -N 10 /dev/hda1
Display inodes 1-10 on the screen.
lde -b 34 /dev/hda1 | more
Display block 34 on the screen (formatted in hex
and ascii).
lde -D 100 -N 51 /dev/hda1 > MyOuput
Linux 2.0 23 September 1996 9
LDE(8) Linux Programmer's Manual LDE(8)
Cat blocks 100-150 to stdout (binary data), which
is equivalent to
dd if=/dev/hda1 of=MyOutput bs=1024 count=51
skip=100
lde -I 1 --recoverable /dev/hda5
Display all inodes on /dev/hda5 which have been
deleted, but can be recovered.
lde -I 1 --recoverable /dev/hda5 | grep "Sep 23"
Display all inodes on /dev/hda5 which have been
deleted today September 23, but can be recovered.
The date format is that of ctime(3):
"Wed Jun 30 21:49:08 1993"
Note: the day will have a leading space if is less
than 10.
lde -b 100 --ilookup /dev/hda1
Find first inode that references block 100 on
/dev/hda1 (to search for multiple occurances, use
the curses interface).
lde --paranoid -T tgz --ilookup --recoverable /dev/hda5
Find all tgz files which have been deleted, display
possible inodes and check if it is possible to
recover the files, open the file system read only
while searching.
See docs/UNERASE included with the lde distribution for
more examples and instructions for the best way to go
about restoring files.
SEE ALSO
fsck(8), fsck.minix(8), e2fsck(8), xfsck(8), debugfs(8)
AUTHOR
Scott D. Heavner (sdh@po.cwru.edu)
Linux 2.0 23 September 1996 10
               (
geocities.com/capecanaveral/lab)                   (
geocities.com/capecanaveral)