ACC SHELL
gpart README
Gpart is a small tool which tries to guess what partitions
are on a PC type harddisk in case the primary partition table
was damaged.
Gpart works by scanning through the device (or file) given on
the command line on a sector basis. Each guessing module is
asked if it thinks a file system it knows about could start at
a given sector. Several file system guessing modules are built
in, others can be added dynamically.
Consult the manual page for command line options and usage.
- Installation ----------------------------------------------------------
See file INSTALL.
- Currently recognized partitions/filesystems types ---------------------
Modname Typ Description
fat 0x01 "Primary DOS with 12 bit FAT"
0x04 "Primary DOS with 16 bit FAT (<= 32MB)"
0x06 "Primary 'big' DOS (> 32MB)"
0x0B "DOS or Windows 95 with 32 bit FAT"
0x0C "DOS or Windows 95 with 32 bit FAT, LBA"
ntfs 0x07 "OS/2 HPFS, NTFS, QNX or Advanced UNIX"
hpfs 0x07 "OS/2 HPFS, NTFS, QNX or Advanced UNIX"
ext2 0x83 "Linux ext2 filesystem"
lswap 0x82 "Linux swap"
bsddl 0xA5 "FreeBSD/NetBSD/386BSD"
s86dl 0x82 "Solaris/x86 disklabel"
minix 0x80 "Minix V1"
0x81 "Minix V2"
rfs 0x83 "Reiser filesystem"
hmlvm 0xFE "Linux LVM physical volumes"
qnx4 0x4F "QNX 4.x"
beos 0xEB "BeOS fs"
xfs 0x83 "SGI XFS filesystem"
- External guessing modules ---------------------------------------------
gpart allows external partition type guessing modules to be
added dynamically. An external module of type "xxx" must be
compiled into a shared object file called "gm_xxx.so".
External modules must provide three functions callable from
gpart:
int xxx_init(disk_desc *d,g_module *m)
Initialisation function. Will be called before a scan.
It should return the minimum number of bytes it wants
to receive for a test. The module should set the
description of the filesystem/partition type it handles
in g_module.m_desc. If the filesystem/partition type
included a partition table like first sector (like the
*BSD disklabels do), the flag m_hasptbl should be set.
Another flag is m_notinext which means the tested type
cannot reside in a logical partition.
int xxx_term(disk_desc *d)
Termination/cleanup function, called after the scanning
of the device has been done.
int xxx_gfun(disk_desc *d,g_module *m)
The actual guessing function, called from within the
scan loop. It should test the plausibility of the
given sectors, and return its guess in m->m_guess (a
probability between 0 and 1). See existing modules
for examples.
The given file descriptor d->d_fd can be used for seeking
and reading (see e.g. gm_ext2.c which tries to read
the first spare superblock). If a module is convinced
that it has found a filesystem/partition start it should
fill in the assumed begin and size of the partition.
The test performed should not be too pedantic, for
instance it should not be relied upon that the file-
system is clean/was properly unmounted. On the other
hand too much tolerance leads to misguided guesses,
so a golden middle way must be found.
To create a shared object file from C source, compile the
module via
gcc -Wall -fPIC -shared gm_xxx.c -o gm_xxx.so
Then install the shared object in a directory searched by
the dynamic linker, or set LD_LIBRARY_PATH accordingly.
The new external module can then be included by calling
gpart like
gpart -t xxx <other options>
- Output explanation ----------------------------------------------------
Here is a sample 'gpart -v' run on my first IDE hard disk
(comments in brackets):
dev(/dev/hda) mss(512) chs(1232/255/63)(LBA) #s(19792080) size(9664mb)
[
mss is the medium sector size, chs the geometry retrieved
from the OS (or from the command line), #s is the total
sector count.
]
Primary partition(1)
type: 006(0x06)(Primary 'big' DOS (> 32MB)) (BOOT)
size: 502mb #s(1028097) s(63-1028159)
chs: (0/1/1)-(63/254/63)d (0/1/1)-(63/254/63)r
hex: 80 01 01 00 06 FE 3F 3F 3F 00 00 00 01 B0 0F 00
[
size: the size of the partition in megabytes, number of
sectors and the sector range.
chs: the partition table chs range (d) and the real one.
If the number of cylinders is less than 1024 both are
identical.
hex: the hexadecimal representation of the partition entry
as found in the partition table.
]
...
Begin scan...
Possible partition(DOS FAT), size(502mb), offset(0mb)
type: 006(0x06)(Primary 'big' DOS (> 32MB))
size: 502mb #s(1028097) s(63-1028159)
chs: (0/1/1)-(63/254/63)d (0/1/1)-(63/254/63)r
hex: 00 01 01 00 06 FE 3F 3F 3F 00 00 00 01 B0 0F 00
Possible extended partition at offset(502mb)
Possible partition(Linux ext2), size(31mb), offset(502mb)
type: 131(0x83)(Linux ext2 filesystem)
size: 31mb #s(64196) s(1028223-1092418)
chs: (64/1/1)-(67/254/62)d (64/1/1)-(67/254/62)r
hex: 00 01 01 40 83 FE 3E 43 7F B0 0F 00 C4 FA 00 00
Possible partition(Linux swap), size(125mb), offset(533mb)
type: 130(0x82)(Linux swap or Solaris/x86)
size: 125mb #s(256976) s(1092483-1349458)
chs: (68/1/1)-(83/254/62)d (68/1/1)-(83/254/62)r
hex: 00 01 01 44 82 FE 3E 53 83 AB 10 00 D0 EB 03 00
[
During the scan phase all found partitions are listed by
their real type names. The Linux swap partition above is
recognized as Linux swap but will get the 0x82 partition
identifier which can be both a Solaris disklabel or a
Linux swap partition.
When examing the hex values of the first primary partition
it can be seen that they are identical to the values of the
actual partition table (good guess) except for the first
value (0x80 vs. 0x00). This entry denotes the partition
'boot' flag which cannot be guessed.
]
...
End scan.
Checking partitions...
Partition(Primary 'big' DOS (> 32MB)): primary
Partition(Linux ext2 filesystem): logical
Partition(Linux swap or Solaris/x86): logical
Partition(Linux LVM physical volume): logical
Partition(Linux ext2 filesystem): logical
Partition(DOS or Windows 95 with 32 bit FAT, LBA): logical
Partition(FreeBSD/NetBSD/386BSD): primary
Partition(Linux LVM physical volume): primary
Ok.
[
During the scan phase gpart gathers a simple list of possible
partitions, the check phase now tries to decide if found
extended partitions seem consistent, if partitions do not
overlap etc. Overlapping partitions are silently discarded,
all remaining ones are given an attribute 'primary', 'logical',
'orphaned' or 'invalid'. If gpart is called like 'gpart -vv ...',
it also tells why it thinks a partition guess is invalid.
If any inconsistencies are found, gpart prints the number
of remaining inconsistencies, otherwise it says 'Ok.'
]
Guessed primary partition table:
Primary partition(1)
type: 006(0x06)(Primary 'big' DOS (> 32MB))
size: 502mb #s(1028097) s(63-1028159)
chs: (0/1/1)-(63/254/63)d (0/1/1)-(63/254/63)r
hex: 00 01 01 00 06 FE 3F 3F 3F 00 00 00 01 B0 0F 00
Primary partition(2)
type: 005(0x05)(Extended DOS)
size: 6157mb #s(12611025) s(1028160-13639184)
chs: (64/0/1)-(848/254/63)d (64/0/1)-(848/254/63)r
hex: 00 00 01 40 05 FE FF 50 40 B0 0F 00 D1 6D C0 00
Primary partition(3)
type: 165(0xA5)(FreeBSD/NetBSD/386BSD)
size: 1396mb #s(2859570) s(13639185-16498754)
chs: (849/0/1)-(1023/254/63)d (849/0/1)-(1026/254/63)r
hex: 00 00 C1 51 A5 FE FF FF 11 1E D0 00 32 A2 2B 00
Primary partition(4)
type: 254(0xFE)(Linux LVM physical volume)
size: 1608mb #s(3293325) s(16498755-19792079)
chs: (1023/254/63)-(1023/254/63)d (1027/0/1)-(1231/254/63)r
hex: 00 FE FF FF FE FE FF FF 43 C0 FB 00 8D 40 32 00
[
This is a resulting primary partition table. Note that
the logical partition guesses were only used to create
the extended partition entry. Up to now gpart cannot
reconstruct a damaged logical partition chain itself.
If a guessed primary partition table should be written to
some file or device the user must specify (via the '-W'
option) which partition gets the active (bootable) one.
]
gpart README, Aug 1999, Michail Brzitwa <mb@ichabod.han.de>
ACC SHELL 2018