ULK(Understanding Linux Kernel)라는 책에서 저자는 각 블록 장치에 자체 드라이버가 있다고 말합니다. 문제는 여기서 블록 장치가 물리적 디스크를 나타내는가, 아니면 단지 디스크의 파티션을 나타내는가 하는 것입니다.
책에서는 struct block_device가 파티션이나 디스크("bd_contains" 속성으로 표시됨)가 될 수 있다고 기록합니다. 그러나 struct gendisk는 디스크를 나타낼 수도 있습니다. 혼란스럽습니다. 두 구조 "디스크"가 동일한 것을 의미합니까?
답변1
기본 수준에서 블록 장치는 고정된 블록 크기를 갖는 N개의 데이터 블록 집합을 나타냅니다. 이들 블록은 연속적으로 0..(N-1)으로 번호가 지정됩니다.
이는 물리적 디스크, 파티션, RAID 어레이일 수 있습니다.많은 종류의다음을 포함하는 LVM 논리 볼륨인 물리적 디스크하나 이상의 디스크의 일부, 또는 암호화 계층을 통해 위의 가상 뷰를 볼 수 있습니다.
파일 시스템 드라이버는 일반적으로 물리적인 세부 사항에 신경 쓰지 않습니다. 해당 블록 범위를 기능적인 파일 시스템으로 표현하는 작업만 처리합니다. 저수준 드라이버는 각 블록이 해당 번호로 고유하게 주소를 지정할 수 있는 한 필요하다고 생각하는 방식으로 블록 번호를 변환할 수 있습니다.
- 파티션 드라이버는 단순히 블록 번호에 오프셋을 적용하고 기본 전체 디스크 장치를 참조합니다.
- LVM 논리 볼륨 드라이버에는 논리 블록 번호 범위와 해당(기본 장치 + 오프셋) 쌍의 테이블이 있습니다.
- RAID 드라이버에는 여러 기본 장치가 있을 수 있으며 단일 블록에 대한 요청은 중복성을 위해 여러 장치의 여러 기본 블록에 매핑될 수 있습니다. 단일 읽기 요청은 성능을 향상시키기 위해 동일한 콘텐츠를 가진 여러 기본 장치 간에 분할될 수 있습니다. 또는 기본 장치 중 하나에 오류가 발생하면 다른 기본 장치에서 복구할 수 있으며 각 기본 장치에서 쓰기 요청을 수행해야 할 수도 있습니다. (RAID1의 경우) 및/또는 이에 대한 체크섬을 계산합니다(RAID5/6의 경우).
- 다중 경로 드라이버에는일부연결된 모든 기본(경로) 장치동일한경로의 원격 끝에 있는 저장 장치입니다. 블록 번호는 변경되지 않지만 필요한 경우 여러 경로에서 동일한 작업을 다시 시도할 수 있습니다.
- 디스크 암호화 드라이버는 블록 번호를 매핑할 수도 있고 그렇지 않을 수도 있지만(실제 디스크 액세스 패턴을 난독화하기 위해) 이를 통과하는 데이터를 확실히 수정합니다. 기록될 모든 블록은 요청을 기본 장치에 전달하기 전에 암호화됩니다. 기본 장치에서 읽은 데이터는 해독됩니다.
블록 장치는 물리적 디스크, 파티션, LVM LV, RAID 장치 또는 기타 장치인지 여부에 관계없이 본질적으로 동일한 인터페이스를 갖기 때문에 이러한 모든 매핑 드라이버는쌓을 수 있음: 이러한 매핑 레이어를 서로 위에 자유롭게 배치할 수 있습니다. 물론 모든 조합이 합리적이거나 유용하다고 보장되는 것은 아닙니다.