我希望我已经张贴在适当的地方,如果我还没有,那么请告诉我在哪里移动的帖子。
我自己也试过破译kpartx输出,但现在我有点卡住了,需要指导。我缺乏很多领域的知识,我正在努力改进,因此我的破译。到目前为止,我将发布我的问题和我的发现,我希望这里的人能抽出一些时间来指导我的故障排除/解密。
[root@hostname ~]# kpartx -l /dev/mapper/mpathcg
mpathcg1 : 0 673171632 /dev/mapper/mpathcg 63这里的号码是我的问题: 673171632。据我所知,也根据这个答案https://serverfault.com/a/469734。这个数字应该代表这个特定设备的块数。
[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
printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n",
mapname, delim, j+1,
slices[j].size, device,
slices[j].start);
}在我看来,这个叫做片(S)的结构似乎有一个元素(或任何术语),命名为大小。这是块中分区的大小。这就是被淘汰的原因。然而,我不明白它是如何被实际数字填充的。
kpartx/kpartx.h
struct slice {
uint64_t start;
uint64_t size;
int container;
int major;
int minor;
};这就是这个结构的样子。这似乎与kpartx输出的内容一致。
kpartx/kpart.c:
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:
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函数,我会感到迷茫和困惑。
我能得到的任何帮助都将不胜感激。谢谢您抽时间见我。
发布于 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显示的内容。
https://serverfault.com/questions/874797
复制相似问题