이미 인터넷에 CHS와 LBA에 대한 내용을 다룬 훌륭한 문서가 많이 있다. 다만, 최근 Cylinder 값의 초과에 대해서 이상하게 생각하는 경우에 대한 답변을 위해 본 문서를 작성하게 되었다.

Advanced Format과 alignment

최근 Advanced Format(AF) 디스크가 등장하면서 디스크를 파티셔닝하는데 정렬(alignment)에 대한 이슈가 생겨났다. 기존 섹터가 512byte 단위였던 것이 4096byte(4K)로 증가하면서 디스크 접근에 있어서 성능저하를 막기 위해 파티션의 시작지점을 4K 단위로 맞춰 줄 필요가 생긴 것이다. 최신 parted에서는 aligment 옵션을 제공하지만 fdisk와 같은 툴 에서는 제공하지 않아 Bash 쉘 스크립트로 섹터 값으로 계산해서 파티셔닝 하도록 툴을 만들어 해결 했고 이를 업무에 활용하였다. 그런데, 파티션 결과에 대한 문의 사항이 많아 이 문서를 작성하게 되었다.

본 글에서는 AF에 대해서는 다루지 않을 것이기 때문에 관련 된 내용은 구글(Google)신에게..

Cylinder의 초과

먼저 500GB SATA 디스크의 파티션 정보(fdisk -l /dev/sda)를 보면

Imgur

분명히 디스크 정보에는 실린더가 60788개가 존재 한다고 되어있는데 파티션 된 정보를 보면 60789까지 파티셔닝이 되어있다. 디스크에 허용된 범위를 초과해 버린 잘못된 파티셔닝이 아닌가 하는 의구심이 들 수 있다.

또한, 3개 파티션의 시작과 끝 부분이 다음 파티션 실린더 값과 동일하다. 파티션의 시작과 끝이 서로 맞물려 버렸으니 문제가 된다라고 생각할 수 있다.

그러면 해당 디스크 정보를 섹터(sector) 단위로 확인해 보자. (fdisk -lu /dev/sda)

Imgur

위 그림에서 보이는 것 처럼 전체 976562176개의 섹터 중에서 976562175까지만을 사용 한 것을 알 수 있다. 그리고, 각 파티션은 맞물리는 섹터가 없이 깔끔하게 나뉘어 있는 것을 볼 수 있다.

  • 참고로 첫 번째 파티션이 2048부터 시작하는 것은 AF 디스크 정렬을 위해서 이다

전체 섹터를 다 사용하지도 않았는데 왜 실린더는 초과한 것으로 보일까? 먼저 이렇게 된 배경을 살펴보도록 하겠다.

CHS (Cylinder-Head-Sector)

CHS 주소 지정 방식은 물리적인 디스크의 위치를 나타내기 위한 주소 방식이다.

Imgur

위 그림의 각 항목은

  • Platter : 원형 판. 과거 플로피 디스크의 내부 저장 마그네틱 판 또는 CD-ROM 처럼 원형이다.
  • Track : 나무의 나이테처럼 원형으로 데이터를 기록하는 줄이 트랙이다.
  • Sector : 트랙을 일정한 구간으로 나누어 놓은 것이 섹터이며 512byte (AF는 4KB)이다. 1부터 시작.
  • Head : 디스크를 읽어들이는 부분.
  • Cylinder : 트랙을 수직으로 잘랐을 때 같은 위치에 있는 트랙의 집합으로 물리적인 값이라기보다는 논리적인 값 이다.

위 그림은 총 3개의 플래터와 6개의 헤드를 가지고 있다. 즉, 플래터가 양면에 데이터를 기록 할 수 있다. 운영체제에 의해서 특정 파일을 접근하려고 하면 BIOS INT 13h 인터럽트를 통해서 디스크 컨트롤러에 명령을 내리게 되는데 만약 CHS(10/3/6)라는 주소에 접근하도록 명령을 내렸다면 4번 째 헤드를 11번 째 실린더의 6번 째 섹터에 위치시키고 데이터를 읽게 된다.

이러한 디스크 접근 방법이 CHS 방식이며 초기에 제안된 ATA 표준에 의해서 28bit 블럭 주소방식을 사용하였다. 28bit는 실린더 16bit, 헤드 4bit, 섹터 8bit로 할당 되었다. 나중에 ATA-1이 정식으로 소개되면서 BIOS INT 13h가 지정할 수 있는 24bit에 맞추어 아래와 같이 바뀌었다.

  • Sylinder : 10bit (2^10 = 1024)
  • Head : 8bit (2^8 = 256)
  • Sector : 6bit (2^6 = 64)

결과적으로 아래 표와 같이 가용공간을 계산 할 수 있게 된다. (※ 참고로 섹터는 1부터 시작한다)

Imgur

표에서 나타난 것 처럼 CHS 방식으로는 504MB까지 밖에 사용할 수 없기 때문에 이를 개선하고자 ECHS(Extended CHS)라는 것이 등장하였다. Large Mode라고도 불리우는 ECHS는 BIOS가 전달하는 값에 특정 값을 곱하거나 나누어서 확장시키는 방식인데 그 결과 아래 표와 같은 가용 공간을 사용 할 수 있게 되었다.

Imgur

즉, BIOS INT 13h는 실린더를 1024로 제한하고 있지만 실제 디스크는 그 이상의 실린더를 사용하고 전달하는 과정에서 8로 나누어 1024 제한을 충족시키는 방식이다. 하지만, 이 방식도 위 표에서 나타나는 것 처럼 7.88GB 이상을 사용할 수 없기 때문에 그리 오래가지 못하였다.

이 모든걸 해결하고자 등장 한 것이 LBA(Logical Block Addressing) 모드이다.

LBA

앞서 이야기 한 CHS를 해결하고자 등장 한 것이 LBA라는 것은 정확한 말은 아니다. 실제로 LBA 주소 지정방식은 IDE 표준에서 22bit를 옵션으로 포함하고 있었으며 ATA-1이 공표될 때 28bit로 확장되었다. (※ ATA-6에서는 48bit)

단지, CHS가 물리적 접근에 있어서는 보다 명료했으며 먼저 사용되기 시작하였고 한계점을 드러내면서 LBA가 주목 받은 것이다. LBA 방식은 CHS 처럼 물리적인 연산이 아닌 사용가능한 모든 섹터를 배열로 나타낸 것이다. 즉, LBA 주소 0은 CHS(0,0,1)이다.

실질적으로 ATA-6가 등장하면서 48bit LBA 주소가 제안되었고 LBA 주소로 접근하면 디스크 컨트롤러가 알아서 물리적인 주소로 변환해서 접근하기 때문에 신경 쓸 필요가 없지만 CHS로 디스크 정보를 보여주는 툴의 이해를 위해서 (혹은, 임베디드 같은 분야에서 필요로해서) CHS와 LBA와의 상관관계를 살펴보도록 하겠다.

  • 참고로 BIOS INT 13h의 위키 문서에도 나와있지만 웨스턴디지털과 피닉스 테크놀러지에서 INT 13h Extensions을 소개하였다. 이는 현 시스템들이 사용하는 방식이며 64bit LBA 주소(8ZiB까지 사용가능)까지 지원한다.

먼저, CHS를 LBA로 변환하는 수식이다. 참고문서

LBA = ((실린더 x 실린더 당 헤드 + 헤드) x 트랙 당 섹터) + 섹터 - 1

중요한 것은 LBA 주소로 부터 CHS주소인 실린더, 헤드, 섹터 값을 얻어내는 것인데 이는 아래와 같다.

실린더 = LBA / (실린더 당 헤드 * 트랙당 섹터)
헤드 = (LBA % (실린더 당 헤드 * 트랙당 섹터)) / 트랙당 섹터
섹터 = (LBA % (실린더 당 헤드 * 트랙당 섹터)) % 트랙당 섹터 + 1

fdisk의 결과는?

Imgur

이제 다시 처음 살펴봤던 500GB 디스크의 fdisk 결과를 살펴보면 전체 섹터는 976562176개 였다. LBA는 논리적인 섹터 배열 주소 값이기 때문에 마지막 파티션의 끝 섹터 976562175는 LBA로 976562174이며 실린더 값을 구해보면 다음과 같다.

실린더 = 976562174 / (255 * 63) = 60788.183877995645

실린더는 논리적인 값이기 때문에 정확히 나누어 떨어지지 않는다. 여튼, 소숫점을 떼어내면 해당 파티션이 끝나는 위치의 실린더는 fdisk가 보여주는 전체 실린더 개수 60788과 일치한다.

정리하면 /dev/sda3 파티션의 마지막 섹터가 속한 실린더 위치는 60788.183877995645라는 위치가 된다. 그렇기 때문에 fdisk는 이것을 60789 (60788을 넘어선 위치)로 판단한 것 같다. 상세한 것은 fdisk 소스를 열어보면 되겠지만 시간도 걸리고 크게 중요한 것은 아니라서 생략했다. 대신 구시대 유물인 fdisk 보다 최신의 파티션 툴인 parted의 결과를 보여주면 아래와 같다.

Imgur

parted는 해당 디스크가 60788 실린더를 가지고 있으며 마지막 파티션이 60788에서 끝난다고 표기해 주고 있다. 첫 번째 파티션의 시작 지점의 표현이 fdisk와는 달리 0부터 표기되는 것을 볼 수 있다.

결론은

실린더는 물리적인 것이 아니라 트랙에 존재하는 섹터의 논리적인 집합이기 때문에 그 표현이 툴에 따라서 달라질 수 있다는 것을 볼 수 있다. 따라서, 섹터 단위로 정확히 파티셔닝을 했다면 실린더 값이 겹치거나 초과되어 보일지라도 전혀 문제가 없다고 볼 수 있다.

즉, 디스크 파티셔닝의 핵심은 섹터이다.