Examining ZFS Pools with zdb
The zdb (ZFS Debug) command is a useful tool for examining the low-level structure and metadata of a ZFS pool or dataset, and can read the information from the on-disk data structures of exported pools as well as from the ZFS pool cache file. The output is subject to change over time as ZFS is further developed, which means that the exact content contained in the output may vary depending on which version of ZFS is being used.
This guide will not go into the details of the zdb command but will highlight one useful feature for examining ZFS metadata.
To read the configuration of a zpool that is imported on a host, use the following command:
zdb -C[C] <poolname>
If the -C option is used, the output will display the cached content from the zpool configuration cache. When -C is referenced more than once, zdb will also display on-disk configuration (called the Meta Object Set, or MOS).
For example:
[root@rh7z-mds1 ~]# zpool list mgspool
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
mgspool 1008M 2.23M 1006M - 1% 0% 1.00x ONLINE -
[root@rh7z-mds1 ~]# zdb -C mgspool
MOS Configuration:
version: 5000
name: 'mgspool'
state: 0
txg: 34022
pool_guid: 11089712772589408485
errata: 0
hostid: 1489912803
hostname: 'rh7z-mds1'
vdev_children: 1
vdev_tree:
type: 'root'
id: 0
guid: 11089712772589408485
children[0]:
type: 'mirror'
id: 0
guid: 10014780520217715169
metaslab_array: 34
metaslab_shift: 24
ashift: 9
asize: 1058537472
is_log: 0
create_txg: 4
children[0]:
type: 'disk'
id: 0
guid: 12166736421740210173
path: '/dev/sda1'
whole_disk: 1
create_txg: 4
children[1]:
type: 'disk'
id: 1
guid: 8586593287004549671
path: '/dev/sdc1'
whole_disk: 1
create_txg: 4
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
If the pool has not been imported to the current host, or if there is no zpool cache file on the host for a currently imported pool, use the following command:
zdb -e <poolname>
This will provide a very large amount of output. To get the MOS configuration, use the following:
zdb -eC[C] <poolname>
For example:
[root@rh7z-mds1 ~]# zdb -eC mgspool
MOS Configuration:
version: 5000
name: 'mgspool'
state: 1
txg: 34189
pool_guid: 11089712772589408485
errata: 0
hostid: 1489912803
hostname: 'rh7z-mds1'
vdev_children: 1
vdev_tree:
type: 'root'
id: 0
guid: 11089712772589408485
children[0]:
type: 'mirror'
id: 0
guid: 10014780520217715169
metaslab_array: 34
metaslab_shift: 24
ashift: 9
asize: 1058537472
is_log: 0
create_txg: 4
children[0]:
type: 'disk'
id: 0
guid: 12166736421740210173
path: '/dev/sda1'
whole_disk: 1
create_txg: 4
children[1]:
type: 'disk'
id: 1
guid: 8586593287004549671
path: '/dev/sdc1'
whole_disk: 1
create_txg: 4
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
Note: The MOS includes the hostid of the last host to import the zpool. If the hostid (as presented by the SPL) of the node that imported the zpool is 0 (zero), then this field will not be presented in the zdb MOS output. If there is no hostid in the MOS, then this strongly indicates that the hosts are not configured with proper hostids, and the ZFS volume will not be adequately protected from multiple concurrent accesses from multiple hosts.
Please see the article Protecting File System Volumes from Concurrent Access for details on the importance of correctly setting the hostid when working with high availability failover storage configurations.