Linuxカーネルがディスクに特定のブロックサイズを使用するように強制する方法は?

Linuxカーネルがディスクに特定のブロックサイズを使用するように強制する方法は?

私はIT分野で働いています。時々、故障したドライブからデータを取得するように求められます。我々は、このタスクを実行するために様々なSATA-USB、ATA-USBなどのアダプタを持っています。ただし、時にはコンピュータに誤ったブロックサイズを報告することがあります(またはブロックサイズをまったく報告せずにLinuxラップトップで誤ったサイズを想定する場合があります)。カーネルが4096バイトのブロックサイズを使用しようとすると、カーネルに512バイトのブロックサイズを使用するように指示し、その逆も同様ですか?

違いがある場合は、カーネルバージョン5.2.11-100.fc29.x86_64のFedoraを実行しています。


以下は、私が要求したいくつかの追加データです(デバイス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ブリッジには暗号化またはRAID機能があり、一部のセクタをメタデータ用に予約できるなど、一部のUSBアダプタには他の欠点があります。

したがって、可能であれば、回避策なしに必要な作業を実行するハードウェアを使用することをお勧めします。

関連情報