여러 번 질문했지만 확실한 답변이 없습니다. 논리적 블록 크기를 512e에서 4k(물리적 블록 크기)로 변경할 수 있습니까?
사용된 솔루션은 hdparm --set-sector-size 4096
qemu/kvm에서 작동하지 않기 때문에 제가 가지고 있지 않은 예비 장치를 사용하지 않고는 실제로 테스트할 수 없습니다.
Linux 커널이 512e 대신 4k 섹터 크기로 전환하도록 설득될 수 있습니까? 어떤 방식으로든 가상 머신에서 테스트하는 것이 좋습니다.
답변1
HDD를 기본 4k 섹터로 변경하면 적어도 WD Red Plus 14TB 드라이브에서는 작동하지만모든 데이터 손실. 데이터가 실제로 지워지지는 않았지만 파티션 테이블과 파일 시스템은 이제 잘못된 LBA 위치에 있기 때문에 변경 후 찾을 수 없습니다.
hdparm --set-sector-size 4096 --please-destroy-my-drive /dev/sdX
이 명령은 드라이브를 기본 4k 섹터로 변경합니다. 변경 사항은 드라이브를 재부팅해도 유지되지만 나중에 512를 설정하여 되돌릴 수 있습니다.지금 다시 시작디스크 조정 후. 재부팅 후에만 드라이브 파티션을 나누고 데이터를 추가하십시오(gdisk는 4096/4096 섹터 크기를 표시합니다).
튜닝 후 직접 드라이브에 액세스하려고 하면 커널에 읽기 오류가 발생합니다. 대신 컨트롤러 재검색이나 핫 스왑을 사용할 수 있지만 대부분의 사람들에게는 시스템을 재부팅하는 것이 가장 쉽습니다.
이것을 시도하면 문제가 발생할 수 있습니다DD512바이트 섹터 크기로 생성된 모든 디스크 이미지(예: 배포 설치에 사용되는 .iso 파일)
NVME SSD의 경우 이 유틸리티를 사용하여 LBA 섹터 크기를 변경할 수 있습니다
nvme
(nvme-cli
Debian 기반 ditros 패키지에 있음).
답변2
답변3
그래 넌 할수있어. 하지만 운영 체제 수준이 아닌 하드 드라이브 수준에서 시스템을 수정해야 합니다. 운영 체제가 이를 처리합니다.
기억해야 할 다음 문제는 드라이브에 이미 데이터가 포함되어 있는 경우 이러한 작업으로 인해 파티션 테이블(MBR 및 GPT)이 파괴된다는 것입니다.
제가 말하는 내용을 확인하는 간단한 예는 Samsung S1 Mini 드라이브(1k 섹터)를 표준 드라이브(보통 512바이트 에뮬레이션)에 복사하는 것입니다.
오늘날의 드라이브는 대부분 4K 기본 크기로 실행되므로 드라이브 제조업체에서 해당 옵션을 제공하지 않는 경우 원하는 동작을 생성하려면 펌웨어를 패치해야 합니다(저는 할 수 없었습니다).
이러한 드라이브를 직접 검색했을 때 제조업체는 512로 "축소"하지 않고 물리적 4k를 논리적 4k로 변환하는 드라이브에 라벨을 잘 붙인다는 것을 알았습니다. 섹터 읽기가 실패할 때 읽기 오류를 신속하게 반환하는 기능에도 동일하게 적용됩니다(RAID 어레이에 중요). 이것은 단지 펌웨어 문제일 뿐입니다. 일반적인 최종 사용자 드라이브에서 드라이브는 오랜 시간 동안 반복적으로 읽은 다음 결국 오류 조건을 반환합니다.
어쩌면 이 변환을 허용하는 컨트롤러 카드를 둘 사이에 놓으면 문제가 해결될 수도 있습니다. 단지 생각만 하면 됩니다.
이 문제를 어떻게 해결했는지 알려주세요. 흥미로운 문제입니다!
답변4
의견에 따르면 msdos 스타일 파티셔닝("UEFI/GPT를 사용하지 않음")을 사용하려는 것으로 보이며 아마도 msdos 파티션의 최대 파티션 크기와 디스크 사용량을 허용하기 위해 4K 섹터 크기를 사용하려는 것 같습니다. Linux에서 이를 수행하는 한 가지 방법은 루프백 장치를 사용하여 다양한 섹터 크기의 기본 블록 장치에 대한 보기를 제공하는 것입니다.
# truncate -s 20T disk.20T.img
# parted -s disk.20T.img mklabel msdos p mkpart primary 16M 10TB p
Model: (file)
Disk /home/ubuntu/disk.20T.img: 22.0TB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
Error: partition length of 19531218944 sectors exceeds the msdos-partition-table-imposed maximum of 4294967295
여기서는 섹터 크기가 512바이트인 20Tb 디스크에 10Tb msdos 파티션을 만드는 데 실패했음을 알 수 있습니다. 그러나 디스크에 루프백 장치를 사용하고 섹터 크기를 4K로 설정하면 10Tb msdos 파티션이 생성되고 전체 파티션을 사용하여 EXT4 파티션을 생성할 수 있습니다.
# losetup --sector-size 4096 --show -f disk.20T.img
/dev/loop18
# blockdev --getss --getpbsz /dev/loop18
4096
4096
# parted -s /dev/loop18 mklabel msdos mkpart primary 16M 10TB p
Model: Loopback device (loopback)
Disk /dev/loop18: 22.0TB
Sector size (logical/physical): 4096B/4096B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 15.7MB 10000GB 10000GB primary lba
# kpartx -av /dev/loop18
add map loop18p1 (253:4): 0 19531218944 linear 7:18 30720
# mkfs.ext4 /dev/mapper/loop18p1
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 2441402368 4k blocks and 305176576 inodes
Filesystem UUID: 6aa698fa-1cb7-4aa6-9ba6-ebc493d40808
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544, 1934917632
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
# mount /dev/mapper/loop18p1 /mnt
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/loop18p1 9.1T 28K 8.6T 1% /mnt
physical_block_size=4096
QEMU 가상 머신에서 이 기능을 사용하려면 속성을 사용하고 디스크의 물리적 및 논리적 섹터 크기를 지정하는 디스크를 추가할 수 있습니다 logical_block_size=4096
.
편의상 테스트에 사용한 명령은 다음과 같습니다. 원하는 부팅 가능한 ISO를 사용할 수 있습니다.
qemu-system-x86_64 -name 'test live cd: bios' -m 2048 -serial stdio -rtc base=localtime \
-vga std --enable-kvm -cdrom /media/ubuntu/STORAGE/isos/lubuntu-18.04-desktop-i386.iso \
-boot d -device virtio-scsi-pci,id=scsi1,bus=pci.0 \
-drive file=/tmp/disk.20T.img,if=none,id=drive-virtio-disk1 \
-device scsi-hd,bus=scsi1.0,drive=drive-virtio-disk1,id=virtio-scsi-pci1,physical_block_size=4096,logical_block_size=4096
이제 가상 머신에 설치하고 4K 드라이브를 사용하여 수행하려는 모든 테스트를 수행할 수 있습니다. 마찬가지로 운영 체제가 512바이트에서 4K 섹터 크기로 블록 장치의 실시간 변경을 처리하는 방법을 테스트하려는 경우 해당 시뮬레이션을 QEMU에 작성하지 않는 한 운이 좋지 않습니다. 어쨌든 질문을 명확히하는 것이 도움이 될 것이라고 생각합니다.