Skip to content

Instantly share code, notes, and snippets.

@surfaceflinger
Created November 3, 2024 22:01
Show Gist options
  • Save surfaceflinger/dea723330cd6b5ea4cc55ac843d30305 to your computer and use it in GitHub Desktop.
Save surfaceflinger/dea723330cd6b5ea4cc55ac843d30305 to your computer and use it in GitHub Desktop.
Compare property/setting differences across all ZFS zpools and datasets!
#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3Packages.py-libzfs
import libzfs
def collect_all_datasets(dataset, all_datasets):
"""
Recursively collects all datasets from a given dataset and its children.
Args:
dataset: The starting dataset.
all_datasets: A list to store all collected datasets.
"""
all_datasets.append(dataset)
for child in dataset.children:
collect_all_datasets(child, all_datasets)
def compare_dataset_properties(datasets, ignore_properties):
"""
Compares properties of multiple ZFS datasets and prints out differences.
Args:
datasets: A list of ZFS dataset objects.
ignore_properties: A set of property names to ignore.
"""
# Get a list of all property names across all datasets, excluding ignored ones
all_properties = set()
for dataset in datasets:
all_properties.update(set(dataset.properties.keys()) - ignore_properties)
# Compare property values for each property
for property_name in all_properties:
property_values = set()
for dataset in datasets:
if property_name in dataset.properties:
property_values.add(dataset.properties[property_name].value)
# If more than one value exists, print the differences
if len(property_values) > 1:
print(f"Property '{property_name}' has different values across datasets:")
for dataset in datasets:
if property_name in dataset.properties:
print(f" - Dataset '{dataset.name}': {dataset.properties[property_name].value}")
if __name__ == "__main__":
# Define properties to ignore
ignore_properties = {"unique", "keyguid", "used", "refcompressratio", "createtxg", "usedbychildren", "logicalused", "canmount", "written", "logicalreferenced", "guid", "usedbydataset", "compressratio", "referenced", "objsetid", "encryptionroot", "name", "prevsnap", "usedbysnapshots", "creation", "keylocation", "pbkdf2salt", "available"}
# Collect all datasets from all pools
all_datasets = []
for pool in libzfs.ZFS().pools:
collect_all_datasets(pool.root_dataset, all_datasets)
compare_dataset_properties(all_datasets, ignore_properties)
#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3Packages.py-libzfs
import libzfs
def compare_pool_properties(pools):
"""
Compares properties of multiple ZFS pools and prints out differences.
Args:
pools: A list of ZFS pool objects.
"""
# Get a list of all property names across all pools
all_properties = set()
for pool in pools:
all_properties.update(pool.properties.keys())
# Compare property values for each pool
for property_name in all_properties:
property_values = set()
for pool in pools:
if property_name in pool.properties:
property_values.add(pool.properties[property_name].value)
# If more than one value exists, print the differences
if len(property_values) > 1:
print(f"Property '{property_name}' has different values across pools:")
for pool in pools:
if property_name in pool.properties:
print(f" - Pool '{pool.name}': {pool.properties[property_name].value}")
if __name__ == "__main__":
# Get a list of all ZFS pools
pools = list(libzfs.ZFS().pools)
# Compare pool properties
compare_pool_properties(pools)
@surfaceflinger
Copy link
Author

zfs get all | grep -v inherited\|default | grep local | sort -k2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment