리눅스의 IDE 드라이버는 디스크의 구조정보와 용량 및 기타 정보를
ATA IDENTIFY 명령(?)을 이용하여 얻는다.
최근까지 드라이버는 C*H*S에 의해 계산된 용량이 반환된 lba_capacity 값보다
10% 이상 큰 경우 이 값을 신뢰하지 않았다.
어쨌거나 업계간의 약정에 의해, 16514064 섹터보다 큰 용량을 갖는 대용량 IDE 디스크는 그들의 실제 크기에 무관하게 7.8 GB 용량을 나타내는 C=16383, H=16, S=63 값을 반환한다. 그러나 그들의 실제 크기는 lba_capacity를 통해 전달한다.
최근의 리눅스 커널(2.0.34, 2.1.90)은 이러한 내용이 반영되어 있어
정상적으로 처리한다.
만약 여러분이 구버전의 커널을 가지고 있으며, 업그레이드를 원하지
않는다면, 그리고 현재의 커널이 전체 대용량 디스크의 크기중 8 GiB 만을
인식할 수 있다면 /usr/src/linux/drivers/block/ide.c 에 있는
lba_capacity_is_ok 의 실행부분을 다음과 같이 변경하도록 하여라.
static int lba_capacity_is_ok (struct hd_driveid *id) {
id->cyls = id->lba_capacity / (id->heads * id->sectors);
return 1;
}
보다 신중한 패치 작업을 원한다면 2.1.90를 보아라
언급하였듯이, 대용량 디스크는 실제 크기와 무관하게 C=16383, H=16, S=63 값의 구조정보를 반환한다. 반면에 실제 크기는 LBAcapacity을 통해 반환된다.
몇몇 BIOS 들은 이것을 인식하지 못하고 16383/16/63 값에서 실린더수를 줄이고, 헤드의 수를 늘이는 변환을 한다.
그래서 커널은 단일 구조정보 16383/16/63와 부정확한 값을 반환하는 BIOS의 정보도 인식해야 한다.
커널 2.2.2 이후부터 이러한 문제는 정상적으로 작동된다.
(BIOS에서 H 와 S값을 구하고 C 값은 전체용량을 (H*S)로 나누어 구함으로서
해결된다.)