블록을 이해하여 블록 장치 및 스토리지의 기반 다지기
목차
- 블록을 이해해야 하는 이유
- 우리가 흔하게 접하는 블록 장치에 대한 설명
- 블록 장치란 무엇인가 ?
- 파일시스템을 생성할 때 블록이 생성된다는 것을 눈으로 이해하자
- 블록 크기에 따른 성능 차이
- 블록이란 용어가 모든 운영체제에서 사용되는걸까 ?
- 블록 장치와 함께 대표적인 디바이스 파일인 캐릭터 장치와의 차이
블록을 이해해야 하는 이유
블록을 이해함으로써 저장 단위와 성능 튜닝을 알 수 있으며, 블록 스토리지를 이해할 수 있는 기반이 된다.
또한, 클라우드 스토리지 서비스를 제공할 때 가장 많이 사용되는 유형 중 하나가 블록 스토리지이다.
(주로 가상 머신의 OS 디스크 이미지를 블록 단위로 저장)
우리가 흔하게 접하는 블록 장치에 대한 설명
블록 장치는 일반적으로 디스크를 의미하며, HDD나 SSD가 대표적인 예이다.
리눅스에서 볼 수 있는 대표적인 블록 장치는 sda와 같은 이름으로 지정된 것 들이다.
또 다른 대표 블록 장치는 SCSI로 연결되는 CD-ROM인 /dev/sr0가 있다.
리눅스의 디스크 및 파티션 이름 규칙
이름이 지정되는 규칙은 로컬디스크를 읽어들인 순서에 따라 sdN 순으로 이름이 정해진다.
만약 로컬의 SCSI 장치에 두 개의 디스크가 장착되어 있다면 리눅스에서 처음으로 찾은 디스크를 sda, 두 번째로 찾은 디스크를 sdb 규칙으로 할당된다.
파티션은 sdN 뒤에 1, 2 순으로 지정된다.
예시로 리눅스가 부팅될 때 가장 처음으로 읽어들여야 하는 /boot 파티션은 sda1라는 이름으로 사용되며, 첫 번째로 읽은 디스크의 첫 번째 파티션이라는 의미가된다.
참고로 /boot가 sda1으로 잡히지 않을 경우 Boot Loader(GRUB2 등)에서 설정을 바꿔주면 된다.
블록 장치란 무엇인가 ?
블록 장치란 “일정 크기의 블록 단위로 접근하는 저장 장치”를 의미한다.
블록의 크기는 일반적으로 4096바이트(4KB)가 할당되며, 크기를 1024바이트, 2048바이트 등 달리 지정할 수 있다.
즉, 블록은 단위이며, 블록 장치는 디스크나 스토리지, CD-ROM 등을 의미한다.
블록 장치는 일반적으로 커널에서 직접 접근하는 것이 아니라 ‘파일 시스템’이라는 논리적인 체계를 통해서 접근한다.
파일시스템에는 Windows에서 사용되는 NTFS가 있으며, 리눅스는 XFS, ext4 등이 있고 맥OS는 HFS+가 있다. USB에 주로 볼 수 있는 FAT32도 파일시스템이다.
파일시스템은 데이터에 효율적으로 접근하고 관리하기 위한 것으로 흔히 윈도우 재설치를 할 때 사용하는 용어인 포맷이란 말이 파일시스템 생성을 의미한다.
왜냐하면 포맷의 정확한 정의가 “디스크 등에 자료를 저장할 수 있도록 형태를 잡아주는 것”이기 때문이다.
커널이 블록 장치에 직접 접근하는 경우도 있다. 대표적으로 스왑 공간은 커널이 직접 데이터를 읽고 쓰게 된다. 그리고 오라클 데이터베이스에서 RAW 디바이스를 이용하는 경우도 파일 시스템을 거치지 않고 직접 블록 장치에 접근한다.
그럼 다시 블록으로 돌아와서 얘기하자.
블록의 구성 단위는 섹터로 이루어진다. 즉, 블록은 1개 이상의 섹터를 가지고 있어야 한다.

여기서 헷갈릴 수 있는게, 섹터는 물리적 저장 장치의 최소 저장 단위로 사용되는 용어이지만, 블록은 파일 시스템에서 데이터를 관리하는 논리적 단위이다.
즉, 파일시스템을 생성할 때 블록 크기가 정해지는 것이다.
섹터와 블록의 관계 / 참고로 SSD에는 섹터가 없다고 생각하는 사람도 있는데 이건 데이터 할당을 위한 단위를 지칭하는 용어이기에 SSD에도 섹터가 존재한다.
파일시스템을 생성할 때 블록이 생성된다는 것을 눈으로 이해하자
아래를 보면 들어 mke2fs 도구를 이용해 ext4 파일시스템을 만들려고 할 때 미리 /etc/mke2fs.conf 설정 파일에서 블록의 크기를 지정할 수 있다.

디스크 용량이 작게 표시되는 이유
참고로 섹터의 또 다른 재미있는 얘기가 있다. 이는 우리가 2TB의 디스크를 장착해도 용량이 2TB가 되지 않는 이야기다.
섹터의 기본단위는 512바이트로 알고있지만, 이는 순수하게 데이터를 기록하는 영역의 크기가 512바이트란 말이다.
512바이트에 저장된 데이터의 무결성을 검증해주는 ECC 값이나 섹터의 번호, 동기화 데이터, 갭 등이 붙게되어 16바이트 정도가 더 붙게 된다.
즉, 우리가 2TB의 디스크를 구매하더라고 쓸 수 있는 용량은 그보다 작게 표시되는 이유 중 하나이다. TB(1000GB)와 TiB(1024GB)라는 단위 차이도 있겠지만, 위에서 설명한 ECC 등의 영역으로 사용되는 16바이트 때문에 실제 데이터 저장 크기가 작게 보이는 것이다.
블록 크기에 따른 성능 차이
블록의 크기에 의해 영향을 미치는 것은 I/O와 저장 공간이다.
작은 단위로 지정할수록 I/O가 많이 발생하여 성능이 저하되지만, 공간을 촘촘하게 효율적으로 사용할 수 있다. 반대로 단위를 크게 할수록 I/O가 줄어들어 성능이 향상되지만, 용량 공간이 손실 나서 낭비가 생길 수 있다.
예시로, 4MB의 공간에서 2.5MB만 사용하는 경우를 보자.
- 첫 번째 그림은 공간 효율은 떨어지지만 접근할 블록이 적기에 I/O 성능이 향상된다.
- 두 번째 그림은 공간 효율은 좋지만 많은 블록을 접근해야 하기에 I/O 성능이 저하된다.

블록이란 용어가 모든 운영체제에서 사용되는걸까 ?
아니다. 흔히 NIX 계열의 운영체제에서 ‘블록(Block)’이란 용어를 사용한다.
하지만 윈도우에서는 섹터 묶음의 의미로 ‘클러스터(Cluster)’라는 용어를 사용한다. 클러스터라는 용어는 주로 Windows의 NTFS나 FAT에서 볼 수 있을 것이다.
블록 장치와 함께 대표적인 디바이스 파일인 캐릭터 장치와의 차이
캐릭터 디바이스는 터미널, 프린터, 키보드, 사운드 카드 등의 문자 기반 장치 파일이다.
블록 장치와의 대표적인 차이는 캐릭터 디바이스는 버퍼링을 이용하지 않는다는 점이다.
버퍼링을 이용하는 블록 장치의 경우 데이터를 매번 디스크로 쓰지 않고 버퍼에 저장하여 디스크에 쓰기를 한다.
만약 버퍼를 이용하지 않는다면 매번 데이터를 디스크에 써야해서 엄청난 I/O가 발생할 것이다.
때문에 예전에는 시스템을 재기동 하기 전 디스크에 쓰기 위해 메모리에 대기 중이던 데이터를 sync 명령으로 내려주어야 했다.
sync 명령의 동작을 눈으로 보고 싶다면 /proc/meminfo에서 dirty page를 확인하면 된다.
dirty page가 바로 메모리에 저장된 정보가 실제 디스크에 있는 내용과 다르다는 것을 알려주는 정보이기 때문이다.
참고로 재부팅을 할 때 요즘은 sync을 쓰지 않아도 재부팅 명령에 해당 기능이 모두 포함되어 있으니 걱정 말자. 물론 예상치 못한 전원 종료는 예외다.