1

我想使用 dd 命令读取 zpool 存储池中的一个块。由于 zpool 不像其他卷管理器(如 vxvm)那样创建设备文件。我不知道使用哪个块设备来阅读。有没有办法在 zpool 中逐块读取数据?

4

4 回答 4

1

您可以从池中的底层原始设备中读取,但据我所知,没有代表整个池的单个连续块设备的概念。ZFS 中的池不是“经典”卷管理器所具有的单个连续扇区块。ZFS 内部结构更接近于一棵树,将其表示为一个扁平的块数组会有些挑战。

Ben Rockwood 的博客文章“zdb:在 Point-Blank Range 检查 ZFS”可能有助于更好地了解引擎盖下的内容。

于 2013-10-22T17:09:50.367 回答
1

您可能可以使用 zdb 命令。这是一个关于它的pdf,以及帮助输出。

http://www.bruningsystems.com/osdevcon_draft3.pdf

# zdb --help

zdb: illegal option -- -
Usage: zdb [-CumdibcsDvhL] poolname [object...]
   zdb [-div] dataset [object...]
   zdb -m [-L] poolname [vdev [metaslab...]]
   zdb -R poolname vdev:offset:size[:flags]
   zdb -S poolname
   zdb -l [-u] device
   zdb -C

Dataset name must include at least one separator character '/' or '@'
If dataset name is specified, only that dataset is dumped
If object numbers are specified, only those objects are dumped

Options to control amount of output:
    -u uberblock
    -d dataset(s)
    -i intent logs
    -C config (or cachefile if alone)
    -h pool history
    -b block statistics
    -m metaslabs
    -c checksum all metadata (twice for all data) blocks
    -s report stats on zdb's I/O
    -D dedup statistics
    -S simulate dedup to measure effect
    -v verbose (applies to all others)
    -l dump label contents
    -L disable leak tracking (do not load spacemaps)
    -R read and display block from a device

Below options are intended for use with other options (except -l):
    -A ignore assertions (-A), enable panic recovery (-AA) or both (-AAA)
    -F attempt automatic rewind within safe range of transaction groups
    -U <cachefile_path> -- use alternate cachefile
    -X attempt extreme rewind (does not work with dataset)
    -e pool is exported/destroyed/has altroot/not in a cachefile
    -p <path> -- use one or more with -e to specify path to vdev dir
    -P print numbers parsable
    -t <txg> -- highest txg to use when searching for uberblocks
Specify an option more than once (e.g. -bb) to make only that option verbose
Default is to dump everything non-verbosely

不幸的是,我不知道如何使用它。

# zdb
tank:
    version: 28
    name: 'tank'
    ...
    vdev_tree:
    ...
    children[0]:
    ...
        children[0]:
    ...
            path: '/dev/label/bank1d1'
            phys_path: '/dev/label/bank1d1'

    ...

所以我用数组索引 0 0 来获取我的第一个磁盘(bank1d1)并执行了这个命令。它做了一些事情。我不知道如何读取输出。

zdb -R 坦克 0:0:4e00:200 | 字符串

玩得开心...尽量不要破坏任何东西。这是手册页中的警告:

The  zdb  command is used by support engineers to diagnose failures and
gather statistics. Since the ZFS file system is  always  consistent  on
disk  and is self-repairing, zdb should only be run under the direction
by a support engineer.

请告诉我们您真正在寻找什么。艾伦说你想做备份是对的吗?

于 2012-01-06T14:21:56.830 回答
0

如果要备份 ZFS 文件系统,则应使用以下工具:

  • 'zfs snapshot' 创建文件系统的稳定快照
  • 'zfs send' 将快照的副本发送到其他地方
  • 'zfs receive' 从快照返回到文件系统。

'dd' 几乎肯定不是您应该使用的工具。在您的情况下,您可以“zfs send”并将输出重定向到其他文件系统上的文件中。

有关详细信息,请参阅ZFS 管理指南的第 7 章。

于 2011-09-14T18:16:24.333 回答
0

不知道这样做可能有用,但您当然可以读取池使用的底层设备中的块。它们由zpool status命令显示。如果您真正询问的是 zvols 而不是 zpools,可以在 /dev/zvol/rdsk/pool-name/zvol-name 下访问它们。如果您想查看内部 zpool 数据,您可能需要使用 zdb。

于 2010-11-11T21:28:35.947 回答