确定给定文件的 LVM 范围编号

Bra*_*ley 9 linux performance filesystems lvm

我目前正在从事与工作无关的家庭作业。我有一个位于逻辑卷上的 ext4 文件系统。我正在测试不同的性能调优策略,我想到了这个想法。由于 pvmove 可以移动单个和范围的范围,有没有办法绘制出保存特定文件的物理范围(理论上它可以是数据库的后备文件,或一个大的经常访问的文件共享)并将它们移动到特定的存储设备(例如,我在同一个 LVM 卷组中有一个普通 HDD 和一个 SSD 驱动器)?

我想过使用“filefrag”,但后来我发现我不是 100% 确定是否一定要按顺序使用范围数字(所以知道 ext4 中有多少扇区看到一个文件不一定会让我弄清楚文件实际位于哪个范围编号/卷上。

有任何想法吗?

fro*_*utz 14

两个主要成分是hdparm --fibmap file,它告诉您文件在 LV 中的物理位置,以及lvs -o +seg_pe_ranges,vg_extent_size它告诉您 LV 在您的设备上的物理位置。

剩下的就是数学了。

因此,例如:

# hdparm --fibmap linux-3.8.tar.bz2 

linux-3.8.tar.bz2:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0     288776     298511       9736
     4984832     298520     298623        104
     5038080     298640     298695         56
     5066752     298736     298799         64
     5099520     298824     298895         72
     [...]
Run Code Online (Sandbox Code Playgroud)

我不知道为什么这会如此分散 - 用 wget 下载。可能是一个很好的例子,因为如您所见,如果不以某种方式编写脚本,您会头疼,至少对于碎片文件。我只取第一段 288776-298511(9736 个扇区)。计数是错误的,因为它不是 512 字节扇区,但无论如何。

首先检查此数据是否确实正确:

# dd if=linux-3.8.tar.bz2 bs=512 skip=0 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0506548 s, 98.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -

# dd if=/dev/lvm/src bs=512 skip=288776 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.123292 s, 40.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -
Run Code Online (Sandbox Code Playgroud)

Wheeee。那是相同的,所以我们在正确的位置读取 LV-src。现在源-LV 在哪里?

# lvs -o +seg_pe_ranges,vg_extent_size
  LV          VG   Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert PE Ranges             Ext   

[...]
 src         lvm  -wi-ao---   4.00g                                            /dev/dm-1:5920-6047   32.00m
[...]
Run Code Online (Sandbox Code Playgroud)

现在无聊了,这个LV不支离破碎。这里没有头疼。反正。

它说 src 在 /dev/dm-1 上,从 PE 5920 开始,到 PE 6047 结束。PE 大小为 32 MiB。

所以让我们看看我们是否可以直接从 /dev/dm-1 读取相同的内容。在数学方面,这有点模糊,因为我们之前使用了 512 字节的块大小... :-/ 但我很懒,所以我只计算 MiB,然后除以 512!哈!:-D

# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0884709 s, 56.3 MB/s
3858a4cd75b1cf6f52ae2d403b94a685  -
Run Code Online (Sandbox Code Playgroud)

嘘。这不是我们要找的。什么地方出了错?啊! 我们忘记在 PV 的开头添加 LVM 占用的偏移量,用于存储 LVM 元数据和废话。通常这是 MiB 对齐的,所以只需添加另一个 MiB:

# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776 + 1024*1024/512)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0107592 s, 463 MB/s
7ac1bb05a8c95d10b97982b07aceafa3  -
Run Code Online (Sandbox Code Playgroud)

你有它。

  • 总有一天他们会为你建造雕像。 (3认同)