본문 바로가기

Linux

HDD 4 KIB SECTOR ISSUE

출처 : http://drypot.tumblr.com/post/11315703663/hdd-4-kib-sector-issue

LINUX

HDD 4 KIB SECTOR ISSUE

한줄 요약, 4KiB 섹터 쓰는 신형 하드를 아무 생각 없이 파티셔닝하면 속도가 3 배 느려집니다.

https://ata.wiki.kernel.org/index.php/ATA_4_KiB_sector_issues

4KIB 하드의 등장

최근의 신형 하드 디스크가 나오기 전까지 디스크의 기본 섹터 크기는 512B 였습니다. 하지만 작은 단위로 섹터를 자르면서 섹터간 공간 낭비가 심해집니다. 게다가 요즘 왠만한 운영체제는 파일 입출력을 4KiB 단위로 하지 않습니까? 그러니 디스크의 물리적 섹터 크기를 4KiB 로 하지 않을 이유가 없어보입니다. 그래서 4KiB 물리 섹터 하드들이 나옵니다.

그러나 한 섹터가 512B 라는 가정이 디스크 컨트롤러, 브리지 칩들, 바이오스, 부트 코드, 드라이버, 파티션 유틸리티등 모든 계층에 적용되어 있기 때문에 이 모든 것을 한번에 바꿀 수는 없습니다. 그래서, 4KiB 섹터 쓰는 드라이브는 드라이브 펌웨어에서 512B 섹터를 쓰는 것처럼 보이게 합니다.

문제 시작

운영체제의 4KiB 단위 입출력 요청이 디스크의 4KiB 단위와 딱 맞아 떨어지면 좋은데, 이게 어긋날 경우 운영체제의 4KiB 단위 요청이 디스크에서는 두 섹터에 걸쳐 일어날 수 있습니다. 문제는, 이 문제가 기본적으로 항상 발생하게 되어 있다는 것입니다. =,=

이유는 요즘에는 LBA 란 리니어한 값으로 드라이브 섹터를 억세스하기 때문에 실린더, 헤더, 섹터 좌표를 쓰진 않지만 역사적인 이유로 파티션들은 실린더의 트랙 단위에 맞추어 자리잡게 되어 있었습니다. 과거에 한 트랙에는 63 개 섹터가 있었기 때문에 XP 나 대부분의 최근 Linux 배포판에서까지 디스크 첫 파티션의 시작은 LBA 63 이고, 디스크 두 번째 파티션 부터는 LBA <실린더 바운더리>에 위치하도록 되어 있습니다. 실린더 바운더리는 255 트랙 * 63 섹터, 해서 대략 8 메가 단위가 됩니다.

결과로 최신 파일 시스템들은 내구 구조가 4KiB 단위로 구성되게 되어 있고 입출력도 4KiB 단위로 하지만, 파일 시스템이 들어있는 파티션의 시작이 디스크의 4KiB 단위와 딱 맞아 떨어지지 않기 때문에 운영체제의 4KiB 입출력은 하드웨어적으로 8 KiB 입출력을 발생시켜 속도가 느려집니다. 최적 속도보다 실험결과 보통 3 배까지 느려진다고 하는군요. 이 문제는 XP 와 최신 리눅스에까지 공통으로 발생한다고 합니다.

http://www.osnews.com/story/22872/Linux_Not_Fully_Prepared_for_4096-Byte_Sector_Hard_Drives

윈도우 시리즈

윈도우 2000 은 전통적인 파티션 레이아웃을 따르지 않으면 제대로 동작하지도 않는다고 합니다. 위에도 적었지만 전통적인 파티션 레이아웃이란 첫 파티션의 시작은 LBA 63, 두번째 부터는 LBA 255 * 63 * x 에 위치.

윈도우 XP 부터는 파티션 위치에 상관없이 부팅이 가능해졌다고 합니다. 하지만 XP 에서 파티션을 생성하면 전통적인 레이아웃을 만들므로 역시나 섹터 비정렬 문제가 발생합니다.

윈도우 Vista 부터는 첫 파티션을 LBA 2048 에 만들므로 문제가 사라집니다. 512 * 2048 = 1MiB 이 됩니다.

리눅스에서 FDISK 로

Ubuntu 10.04 에서 아무 생각없이 fdisk 로 첫 파티션 만들었더니 LBA 63 에 위치시킵니다. 망하는 케이스.

fdisk 에서 4KiB 정렬시키려면 아래 글에서 처럼 x 모드에서 파티션 시작 섹터편집하는 방법이 있는데 별로 안 좋아보이고, http://www.formortals.com/how-to-create-4kb-aligned-partitions-in-windows-xp-and-linux/

아래 IBM 에서 하라는 대로 하는 것이 좋아보입니다.http://www.ibm.com/developerworks/linux/library/l-4kb-sector-disks/index.html?ca=dgr-twtr4KB-Disksdth-LX

먼저 간단한 방법은, fdisk 들어가서 c 명령을 내려서 DOS compatibility mode 를 끕니다. 여기서 호환성이란 Windows 2000 이나 XP 들을 말하는 것이겠지요. 이 상태에서 파티션을 만들면 비스타나 윈도우7 처럼 첫 파티션을 2048 섹터에 위치시킵니다.

두번째 파티션부터는 자동으로 시작 위치 4KiB 정렬을 안 해주기 때문에 첫 파티션의 크기를 메가 단위로 이쁘게 먹여두어야겠지요.

좀 완벽한 방법은, 아래 명령처럼 fdisk 진입시 헤더와 섹터 단위를 4KiB 정렬이 되도록 강제지정하는 것입니다.

fdisk -H 224 -S 56 /dev/sda

이상태에서 첫 파티션을 만들었더니 56 섹터에서 시작하도록 해주는군요. 두 번째 파티션도 강제로 4KiB 정렬이 될겁니다.

하지만 옵션 외우기 귀찮으니 첫번째 방법, 즉 들어가자마자 c 명령 넣고 시작하는 것이 무난하고 좋을 것 같습니다. =o=

리눅스에서 PARTED 로

GPT 테이블 만들고,


sudo parted /dev/md0  후

아래와 같이 섬세하게 섹터값을 적어주던지

mkpart 'raid member' 2048s -1s

아래와 같이 메가 단위로 적어주면 2048 섹터 단위로 정렬해주니 깨끗합니다.

mkpart 'raid member' 1M 100M

'Linux' 카테고리의 다른 글

SSH Port Forwarding(SSH Tunneling)  (0) 2012.09.13
sync server ssh로 연결 해서 ubuntu update 하기  (0) 2012.09.13
ubuntu HDD 추가 하기  (0) 2012.08.29
CONFIG_MODVERSIONS  (0) 2012.08.29
[EXT4] noauto_da_alloc 에 관해  (2) 2012.08.28