首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >破译kpartx输出

破译kpartx输出
EN

Server Fault用户
提问于 2017-09-21 09:51:18
回答 1查看 472关注 0票数 1

我希望我已经张贴在适当的地方,如果我还没有,那么请告诉我在哪里移动的帖子。

我自己也试过破译kpartx输出,但现在我有点卡住了,需要指导。我缺乏很多领域的知识,我正在努力改进,因此我的破译。到目前为止,我将发布我的问题和我的发现,我希望这里的人能抽出一些时间来指导我的故障排除/解密。

问题

代码语言:javascript
复制
[root@hostname ~]# kpartx -l /dev/mapper/mpathcg 
mpathcg1 : 0 673171632 /dev/mapper/mpathcg 63

这里的号码是我的问题: 673171632。据我所知,也根据这个答案https://serverfault.com/a/469734。这个数字应该代表这个特定设备的块数。

代码语言:javascript
复制
[root@hostname ~]# fdisk -l /dev/mapper/mpathcg

Disk /dev/mapper/mpathcg: 344.7 GB, 344671125504 bytes
255 heads, 63 sectors/track, 41903 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 32768 bytes / 32768 bytes
Disk identifier: 0xa5c9e23d

          Device Boot      Start         End      Blocks   Id  System
/dev/mapper/mpathcgp1               1       41903   336585816   8e  Linux LVM
Partition 1 does not start on physical sector boundary.

但是看看fdisk输出,根据我的经验,这个设备的块数是336585816。对我来说,我们在这里有矛盾。由于我根据经验信任fdisk,所以我很好奇kpartx如何找到块的数量,然后可能查看fdisk,看看它们之间有何不同。这就是“破译”开始的地方。

实际问题

我来这里实际上是为了提供指导,但我想遵循这个论坛的指导方针,并帮助其他想知道同样事情的人:

kpartx如何确定它的输出,特别是块的数量?

我的发现到目前为止,

我的第一个发现:我不擅长读C代码.

kpartx/kpartx.c

代码语言:javascript
复制
            printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n",
                   mapname, delim, j+1,
                   slices[j].size, device,
                   slices[j].start);
        }

在我看来,这个叫做片(S)的结构似乎有一个元素(或任何术语),命名为大小。这是块中分区的大小。这就是被淘汰的原因。然而,我不明白它是如何被实际数字填充的。

kpartx/kpartx.h

代码语言:javascript
复制
struct slice {
    uint64_t start;
    uint64_t size;
    int container;
    int major;
    int minor;
};

这就是这个结构的样子。这似乎与kpartx输出的内容一致。

kpartx/kpart.c:

代码语言:javascript
复制
typedef int (ptreader)(int fd, struct slice all, struct slice *sp, int ns);
...
...
...
extern ptreader read_dos_pt;

这看起来也很有趣,我基于这个名称read_dos_pt,因为问题中的分区是dos分区,而ptreader似乎使用的是片结构。也许是为了填充它?

kpartx/dos.c:

代码语言:javascript
复制
read_dos_pt(int fd, struct slice all, struct slice *sp, int ns) {
    struct partition p;
    unsigned long offset = all.start;
    int i, n=4;
    unsigned char *bp;
    uint64_t  sector_size_mul = get_sector_size(fd)/512;

    bp = (unsigned char *)getblock(fd, offset);

在这里,我注意到getblock函数,对我来说,这个函数对于我正在寻找的东西来说是显而易见的。但是,查看kpartx/kpartx.c中的getblock函数,我会感到迷茫和困惑。

我能得到的任何帮助都将不胜感激。谢谢您抽时间见我。

EN

回答 1

Server Fault用户

回答已采纳

发布于 2017-09-21 10:21:26

不确定这与服务器错误有多相关,但我还是会把它拆开的。

跳过read_dos_pt中的getblock。有趣的部分在第97行。sp[i].size = sector_size_mul * le32_to_cpu(p.nr_sects); sector_size_mul是该磁盘的一个本机扇区中512个字节扇区的数目(例如,4k磁盘的sector_size_mul为8)。最有可能的是,这将是1,特别是如果它是一个文件,你正在探测。

p.nr_sects正在使用memcpy直接从磁盘上dos分区表中填充。osdev wiki有一个很好的表格式dos分区格式描述,所以您可以看到nr_sects结构字段是从分区条目的12字节开始的uint32_t (cf )。Partition.nr_sects的剂量.h偏移)。

因此,kpartx在该字段中的内容是“分区中512字节扇区的数量,而不管本地扇区大小如何”。

回到您的fdisk输出,它很明显是1k块。

将您的字节大小除以1024,您将得到您在fdisk中看到的336585816数字,但除以512,您将得到kpartx显示的内容。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/874797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档