Hi Eric, I am (once again) having trouble getting webrev to work. I got it working back in September, but since have re-installed my system once or twice (search for "using webrev" in the tools-discuss mailing list). So, rather than spin wheels for half a day to try to get this to work, I am attaching the modified zdb.c file. The changes are pretty simple, and currently this sends raw output to standard error.
Here is an example of how I use it. In this example, I start with the blkptr from the uberblock and use the decompress from zdb to dump the objset_phys_t. From there, I use my modified mdb to dump the objset_phys_t. I am currently writing a paper that starts here and displays the data for a file in an unmounted zfs file system. The following should give you an idea of where I am headed with this. It is a bit convoluted since I have to go back and forth between zdb and mdb to get what I want, but it works! # zdb -uuuu laciedisk Uberblock magic = 0000000000bab10c version = 10 txg = 19148 guid_sum = 17219723339164464949 timestamp = 1203801884 UTC = Sat Feb 23 22:24:44 2008 rootbp = [L0 DMU objset] 400L/200P DVA[0]=<0:4e00:200> DVA[1]=<0:1c0004e 00:200> DVA[2]=<0:380001200:200> fletcher4 lzjb LE contiguous birth=19148 fill=1 8 cksum=89aca5d29:38d271ef883:be5570b26779:1af282de579a51 # The above output shows that the objset_phys_t contains 3 copies of the root blkptr_t, one at disk block 0x4e00, the second at 0x1c0004e00, and the third at 0x380001200. Each of these is 0x200 bytes on the disk, and is on vdev 0 (the only disk in the pool). We'll need to find which device(s) make up the pool. We'll use zpool(1) for this. # zpool status laciedisk pool: laciedisk state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM laciedisk ONLINE 0 0 0 c4t0d0p1 ONLINE 0 0 0 errors: No known data errors # Now we'll use zdb to dump the raw data referred to in the uberblock. This is an objset_phys_t. The command below reads a 0x200 bytes from the laciedisk zpool and the /dev/dsk/c4t0d0p1 device in the pool. It reads block number 0x4e00 and performs lzjb decompression. The size after decompression is 0x400 bytes. The output is placed in /tmp/objset. # zdb -R laciedisk:c4t0d0p1:4e00:200:d,lzjb,400 2> /tmp/objset <-- here I am using the modified zdb Found vdev: /dev/dsk/c4t0d0p1 # /tmp/objset contains the objset_phys_t data. We use (a modified) mdb to print the structure contents. # mdb /tmp/objset > ::loadctf <-- this loads current kernel CTF for use with raw data > 0::print -a -t zfs`objset_phys_t { 0 dnode_phys_t os_meta_dnode = { 0 uint8_t dn_type = 0xa <-- DMU_OT_DNODE (see uts/common/fs/zfs/sys/dmu.h) 1 uint8_t dn_indblkshift = 0xe 2 uint8_t dn_nlevels = 0x1 <-- no indirect blocks 3 uint8_t dn_nblkptr = 0x3 <-- 3 copies in the blkptr_t 4 uint8_t dn_bonustype = 0 <-- no data in bonus buffer 5 uint8_t dn_checksum = 0 ... From here, I dump the blkptr using 40::blkptr. (0x40 is the offset within the objset_phys_t of where the blkptr_t resides in /tmp/objset. Then I go back to zdb to decompress the block, then back to mdb to dump the dnode_phys_t array, then back to zdb, and so on. Let me know if you have any ideas of how to make this simpler... thanks, max eric kustarz wrote: > If you can't file a RFE yourself (with the attached diffs), then yeah, > i'd like to see them so i can do it. > > cool stuff, > eric > > On Feb 26, 2008, at 4:35 AM, max at bruningsystems.com wrote: > >> Hi All, >> I have modified zdb to do decompression in zdb_read_block. Syntax is: >> >> # zdb -R poolname:devid:blkno:psize:d,compression_type,lsize >> >> Where compression_type can be lzjb or any other type compression that >> zdb uses, and >> lsize is the size after compression. I have used this with a modified >> mdb to allow one to >> do the following: >> >> given a pathname for a file on a zfs file system, display the blocks >> (i.e., data) of the file. The file >> system need not be mounted. >> >> If anyone is interested, send me email. I can send a webrev of the zdb >> changes for those interested. >> As for the mdb changes, I sent a webrev of those a while ago, and have >> since added a rawzfs dmod. >> >> I plan to present a paper at osdevcon in Prague in June that uses the >> modified zdb and mdb to >> show the physical layout of a zfs file system. (I should mention that, >> over time, I have found that >> the ZFS on-disk format paper actually does tell you almost everything). >> >> max >> >> _______________________________________________ >> zfs-discuss mailing list >> zfs-discuss at opensolaris.org >> http://mail.opensolaris.org/mailman/listinfo/zfs-discuss > > -------------- next part -------------- A non-text attachment was scrubbed... Name: zdb.c Type: text/x-csrc Size: 64338 bytes Desc: not available URL: <http://mail.opensolaris.org/pipermail/mdb-discuss/attachments/20080301/83b11cac/attachment.bin>