如何强制 Linux 内核对磁盘使用特定的块大小?

如何强制 Linux 内核对磁盘使用特定的块大小?

我从事 IT 工作。有时我们会被要求从发生故障的驱动器中获取数据。我们有各种 SATA 转 USB、ATA 转 USB 等适配器来完成此任务。但是,有时他们会向计算机报告错误的块大小(或者可能他们根本没有报告任何块大小,而我的 Linux 笔记本电脑只是假设了错误的大小)。当内核想要使用 4096 字节块大小时,如何告诉内核使用 512 字节块大小,反之亦然?

我正在运行 Fedora,内核版本 5.2.11-100.fc29.x86_64,如果这有什么区别的话。


这是我被要求提供的一些额外数据(设备 16 (sdb) 是 Coolmax,19 (sdd) 是 StarTech):

$ sudo lsusb | grep JMicron
Bus 001 Device 016: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge
Bus 001 Device 019: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge

$ cat /sys/block/sdb/queue/logical_block_size 
4096
$ cat /sys/block/sdd/queue/logical_block_size 
4096

$ cat /sys/block/sdb/queue/physical_block_size
4096
$ cat /sys/block/sdd/queue/physical_block_size 
4096

$ sudo sg_readcap /dev/sdb
Read Capacity results:
   Last logical block address=366284645 (0x15d50f65), Number of blocks=366284646
   Logical block length=4096 bytes
Hence:
   Device size: 1500301910016 bytes, 1430799.4 MiB, 1500.30 GB
$ sudo sg_readcap /dev/sdd
Read Capacity results:
   Last logical block address=122096645 (0x7470c05), Number of blocks=122096646
   Logical block length=4096 bytes
Hence:
   Device size: 500107862016 bytes, 476940.0 MiB, 500.11 GB

$ sudo sg_readcap -16 /dev/sdb
Read Capacity results:
   Protection: prot_en=0, p_type=0, p_i_exponent=0
   Logical block provisioning: lbpme=0, lbprz=0
   Last logical block address=2930277167 (0xaea87b2f), Number of logical blocks=2930277168
   Logical block length=512 bytes
   Logical blocks per physical block exponent=0
   Lowest aligned logical block address=0
Hence:
   Device size: 1500301910016 bytes, 1430799.4 MiB, 1500.30 GB
$ sudo sg_readcap -16 /dev/sdd
Read Capacity results:
   Protection: prot_en=0, p_type=0, p_i_exponent=0
   Logical block provisioning: lbpme=0, lbprz=0
   Last logical block address=976773167 (0x3a38602f), Number of logical blocks=976773168
   Logical block length=512 bytes
   Logical blocks per physical block exponent=0
   Lowest aligned logical block address=0
Hence:
   Device size: 500107862016 bytes, 476940.0 MiB, 500.11 GB

答案1

您可以用来losetup创建具有不同逻辑扇区大小的循环设备。

   -b, --sector-size size
          Set  the  logical sector size of the loop device in bytes (since
          Linux 4.14). The option may be used when create a new  loop  de‐
          vice as well as stand-alone command to modify sector size of the
          already existing loop device.

例如:

# losetup --find --show --sector-size 512 /dev/thething
/dev/loop2
# losetup --find --show --sector-size 2048 /dev/thething
/dev/loop3
# losetup --find --show --sector-size 4096 /dev/thething
/dev/loop4
# blockdev --getss /dev/loop2
512
# blockdev --getss /dev/loop3
2048
# blockdev --getss /dev/loop4
4096

更改已有的循环设备:

# blockdev --getss /dev/loop4
4096
# losetup --sector-size 1024 /dev/loop4
# blockdev --getss /dev/loop4
1024

然而,某些 USB 适配器也有其他奇怪之处,例如某些 USB 适配器无法让您访问驱动器的全部容量,例如某些 USB 桥接器具有加密或 RAID 功能,因此它们可能会为元数据保留一些扇区。

因此,如果可能的话,最好使用能够完成您想要的操作而无需解决方法的硬件。

相关内容