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 어댑터에는 다른 단점이 있습니다.

따라서 가능하다면 해결 방법 없이 원하는 작업을 수행하는 하드웨어를 사용하는 것이 좋습니다.

관련 정보