emmc 파일 블록 매핑 정보

emmc 파일 블록 매핑 정보

ext4 파일 시스템에서 파일을 성공적으로 찾았습니다. 예를 들어, "cycl.txt" 파일의 시작 4k 블록은 105441입니다. 그러나 emmc 카드에서 직접 읽을 때 첫 번째 emmc 블록은 없지만 5168904로 변경되었습니다. 전체 emmc 메모리를 검색하여 가져왔습니다. 하지만 매우 느립니다. 실제 위치를 직접 확인하는 방법은 무엇입니까? 후자의 보안 삭제 작업에만 사용할 수 있나요? 매우 감사합니다!!!

답변1

debugfs의 "stat" 명령을 사용하거나 "filefrag -v"를 사용하여 찾을 수 있는 ext4에서 사용하는 블록 번호는 논리적인 4k 블록 번호입니다. 즉, 파티션 시작 부분을 기준으로 4k 단위입니다.

fdisk 또는 gdisk와 같은 프로그램을 사용하면 512바이트 섹터에서 파티션 시작이 제공됩니다.

여기에 예가 있습니다. /boot/vmlinuz-4.19.0-2-amd64의 위치를 ​​찾고 싶다고 가정해 보겠습니다. ("df /boot/vmlinuz-4.19.0-2-amd64" 명령을 사용하면 /dev/nvme0n1p4에 /boot 파일 시스템이 있음을 알 수 있습니다.) 여러 가지 방법을 사용하십시오:

  • filefrag -v /boot/vmlinuz-4.19.0-2-amd64
  • debugfs -R "vmlinuz-4.19.0-2-amd64 범위" /dev/nvme0n1p4
  • debugfs -R "stat vmlinuz-4.19.0-2-amd64" /dev/nvme0n1p4

이러한 메커니즘을 사용하면 파일이 블록 번호 60416-61680을 사용하고 있음을 알 수 있습니다.

/dev/nvme0n1p4의 시작 부분을 기준으로 해당 블록 번호를 찾으려면 바이트 오프셋을 원하는 경우 해당 블록 번호에 4096을 곱하고, 512바이트 섹터 단위로 원하는 경우 8을 곱합니다.

장치의 시작 부분을 기준으로 위치를 원하는 경우(예: 이 경우 /dev/nvme0n1) 다음 명령을 사용하여 찾을 수 있습니다.

  • 고양이 /sys/block/nvme0n1/nvme0n1p4/start

또는 gdisk 명령을 사용하여 파티션 테이블을 인쇄할 수 있습니다. 두 경우 모두 512바이트 섹터 단위로 파티션 "p4"의 시작 위치를 제공합니다.

최종 참고 사항: 때때로 사람들은 Linux 커널에서 사용되는 512 섹터 번호에 대해 이야기할 때 LBA 번호를 언급하지만 약간 주의해야 합니다. 저장 장치의 관점에서 LBA는 논리적 블록 주소(Logical Block Addresses)를 나타내며 저장 장치가 논리적 블록 크기로 간주하는 모든 단위입니다. 역사적으로 대부분의 장치에서 거의 모든 저장 장치의 논리 블록 장치 크기는 512바이트였습니다. 섹터 크기가 2048바이트인 IBM Mainframe DASD와 같은 예외가 있었지만 512가 효과적인 표준이었습니다. 최신 저장 장치에는 4k 논리 블록 크기를 사용하는 일부 "고급 포맷 HDD"가 있으며, CPU와 HDD 사이에 SATA 분석기를 연결하면 I/O 요청이 전송되는 것을 볼 수 있습니다. 4k LBA 번호 단위. 그러나 Linux 커널은 블록 장치 계층에서 모든 숫자가 512바이트 섹터 단위라고 가정합니다. 비록 장치 드라이버 수준에서는 그렇지 않을 수도 있습니다. 우리 대부분은 작업대에 SCSI 또는 SATA 버스 분석기를 갖고 있지 않으므로 호스트 버스 어댑터용 장치 드라이버를 디버깅하거나 작성하지 않는 한 이러한 구별은 그다지 중요하지 않을 것입니다. 따라서 512바이트 섹터를 언급할 때 "LBA"라는 용어를 사용해도 실제적인 피해는 없습니다. 이는 매우 일반적으로 수행되며 Linux 커널 및 해당 사용자 공간 유틸리티의 관점에서만 문제를 걱정한다면 아무런 해가 없습니다. 그러나 그런 것에 대해 까다롭게 굴기를 좋아하는 사람들이 있고, 사람들이 언제 KB 대신 KiB를 사용해야 하는지 지적하여 자신이 도덕적으로 우월하다고 믿고 싶어하는 사람이라면 이제 다른 방법을 알 수 있습니다. 짜증나고 까칠하게 굴어라. :-)

관련 정보