대용량 저장장치 구조

2026. 6. 30. 17:59·개인공부/OS

대용량 저장장치 구조의 개관

최신 컴퓨터를 위한 대량의 보조저장장치는 주로 하드 디스크 드라이브와 비휘발성 메모리 장치에 의해 제공되는 구조.



하드 디스크 드라이브

HDD는 회전하는 원형 플래터에 데이터를 자기적으로 기록하고 읽는 저장장치.

각 플래터의 양쪽 표면은 자기 물질로 덮여 있으며, 디스크 헤드는 이 자기 패턴을 감지하여 데이터를 읽는 구조.


모든 헤드는 디스크 암에 부착되어 함께 이동하며,

플래터 표면은 트랙으로 나누어지고 트랙은 다시 섹터로 나누어지는 구조.

동일한 암 위치에 있는 트랙들의 집합은 실린더.

섹터는 디스크의 가장 작은 전송 단위이며, 

과거에는 보통 512바이트였고 이후 많은 제조업체가 4KB 섹터로 전환한 흐름.

디스크 드라이브의 저장 용량은 일반적으로 기가바이트나 테라바이트 단위로 측정.



디스크 드라이브 모터는 플래터를 고속으로 회전시키며, 회전 속도는 보통 RPM 단위로 표현.

일반적인 드라이브는 5,400, 7,200, 10,000, 15,000 RPM 수준에서 회전하는 방식.

전송 속도는 드라이브와 컴퓨터 사이에서 데이터가 이동하는 속도.

위치 지정 시간 또는 임의 접근 시간은 탐색 시간과 회전 지연 시간으로 구성되는 성능 지표.

탐색 시간은 디스크 암이 원하는 실린더로 이동하는 데 걸리는 시간.

회전 지연 시간은 원하는 섹터가 디스크 헤드 아래로 올 때까지 기다리는 시간.

일반적인 디스크는 초당 수백 메가바이트 수준의 데이터 전송률과 

수 밀리초 수준의 탐색 시간 및 회전 지연 시간을 가지는 구조.

드라이브 컨트롤러는 DRAM 버퍼를 사용하여 디스크 성능을 향상시키는 역할.

디스크 헤드는 공기나 헬륨 위를 매우 얇게 떠서 이동하지만, 디스크 표면과 충돌하면 헤드 충돌이 발생할 수 있음.

헤드 충돌은 일반적으로 수리하기 어려우며, 보호되지 않은 데이터 손실을 유발할 수 있는 심각한 오류.

HDD는 밀봉된 장치이며, 일부 시스템이나 저장장치 새시는 시스템 종료 없이 드라이브를 교체할 수 있는 구조.

이러한 제거 가능 저장장치는 불량 드라이브를 정상 드라이브로 교체하거나 저장장치 수를 유연하게 관리할 때 유용.

디스크 성능 수치에서 공표 전송률과 실제 전송률은 동일하지 않음.

공표 전송률은 디스크 헤드가 자기 매체에서 비트를 읽는 비율에 가깝지만,

운영체제에 블록이 전달되는 실제 비율은 컨트롤러와 시스템 경로의 영향을 받는 값.


 

비휘발성 메모리 장치

비휘발성 메모리 장치는 전원이 꺼져도 내용을 유지하는 저장장치.

대표적인 예는 플래시 NAND 기반 SSD.

일부 NVM 기술은 배터리 백업을 갖춘 DRAM이나 3D XPoint 같은 다른 반도체 기술을 포함하지만, 

여기서 설명하는 것은 플래시 기반 NVM 장치.

NVM 장치는 움직이는 부품이 없으므로 HDD보다 탐색 시간과 회전 지연이 없고, 

일반적으로 더 빠른 접근 시간을 제공하는 구조.

그러나 NAND 플래시는 제자리 덮어쓰기가 불가능하고, 쓰기 전에 먼저 지우기 작업이 필요한 특성.

이러한 물리적 제약 때문에 NVM 장치에는 컨트롤러 알고리즘이 매우 중요한 역할.


 

비휘발성 메모리 장치 개요

 

플래시 메모리 기반 NVM은 디스크 인터페이스를 사용하면 SSD라고 부르는 경우가 많음.

다른 형태로는 USB 드라이브, 플래시 드라이브, DRAM 스틱 형태의 장치가 존재.



NVM 장치는 움직이는 부품이 없기 때문에 충격에 강하고, 탐색 시간과 회전 지연이 없는 장점.

플래시 반도체 가격은 과거에 HDD보다 비쌌지만 시간이 지나며 가격이 낮아지고 용량이 증가한 흐름.

NVM 장치는 HDD보다 빠르고 에너지 효율적이며, PCIe 같은 빠른 버스와 직접 연결되어 처리량을 크게 높일 수 있음.

NAND 반도체는 몇 가지 저장 및 신뢰성 문제를 가지며, 쓰기 전에 지우기 작업이 필요하다는 점이 대표적인 특징.

NAND 셀은 여러 페이지로 구성된 블록 단위로 지워지고, 읽기와 쓰기는 페이지 단위로 수행되는 구조.

삭제 횟수에는 한계가 있으므로 NVM 수명은 단순 시간보다 DWPD 같은 쓰기 내구성 지표로 표현되는 경우가 많음.

DWPD는 Drive Writes Per Day의 약자이며, 

보증 기간 동안 하루에 장치 전체 용량을 몇 번 쓸 수 있는지를 나타내는 값.

NVM 컨트롤러는 삭제 제한, 쓰기 전 지우기, 병렬 다이 구조, 오류 수정 등 여러 특성을 관리하는 역할.


 

NAND 플래시 컨트롤러 알고리즘

 

NAND 반도체는 한 번 쓴 위치를 바로 덮어쓸 수 없으므로, 유효하지 않은 데이터가 포함된 페이지가 생기는 구조.

파일이 수정되면 기존 페이지를 직접 덮어쓰지 않고 새로운 페이지에 최신 데이터를 기록하는 방식.

기존 페이지는 더 이상 유효하지 않은 페이지가 되고, 컨트롤러는 어떤 페이지가 유효한지 추적해야 하는 필요.



NVM 장치는 논리 블록 주소를 실제 물리 페이지 위치로 변환하기 위해 플래시 변환 계층(FTL)을 유지.

FTL은 Flash Translation Layer의 약자.

FTL은 현재 유효한 논리 블록이 어느 물리 페이지에 저장되어 있는지 매핑하는 역할.

쓰기가 계속되면 유효하지 않은 페이지가 늘어나고, 결국 사용 가능한 빈 블록이 부족해지는 상황 발생.

이때 가비지 수집이 발생하여 유효한 데이터는 다른 위치로 옮기고, 

유효하지 않은 페이지가 많은 블록은 삭제하여 다시 사용할 수 있게 만드는 과정.

가비지 수집은 쓰기 성능에 영향을 주는 작업이며, 장치가 여유 공간을 얼마나 갖고 있는지가 성능에 중요.

NVM 장치는 성능 향상과 수명 관리를 위해 실제 사용자에게 보이는 용량보다 

더 많은 물리 공간을 내부적으로 보유하는 과잉 공급(over-provisioning) 사용.

과잉 공급 공간은 가비지 수집, 마모 평준화, 불량 블록 대체에 사용되는 숨겨진 여유 공간.

마모 평준화는 특정 블록만 반복적으로 지워져 빨리 마모되는 것을 막고, 

전체 블록의 삭제 횟수를 균등하게 만드는 알고리즘.

NVM 장치도 오류 수정 코드를 제공하며, 읽기 중 오류가 감지되면 ECC를 통해 수정 가능한 오류를 복구하는 구조.

ECC로 해결할 수 없는 오류나 장치 결함이 발생하면 RAID 같은 더 높은 수준의 보호가 필요.


 

휘발성 메모리

DRAM은 전원이 꺼지면 데이터가 사라지는 휘발성 메모리이지만, 일부 상황에서는 저장장치처럼 활용될 수 있음.

RAM 드라이브는 시스템 DRAM의 일부 영역을 보조저장장치처럼 사용하는 방식.

RAM 드라이브는 매우 빠른 임시 저장 공간으로 유용하지만, 전원 장애나 시스템 재시작 시 내용이 사라지는 한계.

운영체제는 RAM 드라이브를 일반 파일 시스템처럼 사용할 수 있도록 드라이브 인터페이스를 제공할 수 있음.

Linux에는 /dev/ram0 같은 장치가 있고, macOS와 Windows도 도구를 통해 유사한 RAM 드라이브를 제공 가능.

RAM 드라이브는 파일 생성, 읽기, 쓰기, 삭제가 매우 빠르므로 

임시 파일 저장, 테스트, 부팅 초기 파일 시스템 등에 유용.

부팅 과정에서는 초기 루트 파일 시스템을 메모리에 올려 

장치 드라이버나 초기화 프로그램을 빠르게 사용할 수 있게 만드는 용도로도 활용.



자기 테이프는 초기 보조저장장치 매체로 사용되었고, 현재는 주로 백업이나 장기 보관용 저장장치로 사용되는 방식.

테이프는 무작위 접근 시간이 길어 일반적인 보조저장장치로는 부적합하지만, 대량의 데이터를 저렴하게 보관할 수 있는 장점.

테이프 드라이브는 테이프를 감거나 되감으며 읽기·쓰기 헤드 위치를 맞추고, 

LTO 같은 기술 표준에 따라 용량과 성능이 결정되는 구조.


 

보조저장장치 연결 방법

보조저장장치는 시스템 버스 또는 I/O 버스를 통해 컴퓨터에 연결되는 구조.

대표적인 연결 방식에는 ATA, SATA, eSATA, SAS, USB, FC 등이 존재.

가장 일반적인 연결 방식은 SATA이며, NVM 장치는 더 빠른 처리를 위해 NVMe 인터페이스를 사용하는 경우가 많음.

NVMe는 NVM Express의 약자이며, 

PCIe 버스를 통해 NVM 장치와 직접 연결되어 지연 시간을 줄이고 처리량을 높이는 방식.

버스에서의 데이터 전송은 컨트롤러 또는 호스트 버스 어댑터를 통해 수행.

호스트 버스 어댑터는 HBA라고 부르며, 장치와 시스템 사이의 명령 전송과 데이터 이동을 담당.

각 저장장치에는 장치 컨트롤러가 내장되어 있고, 시스템은 메모리 매핑 I/O나 명령 레지스터를 통해 컨트롤러와 통신.

대용량 저장장치 I/O 작업에서는 명령이 컨트롤러로 전달되고, 

데이터 이동은 일반적으로 DMA를 통해 메인 메모리와 장치 사이에서 수행되는 구조.


 

주소 매핑

저장장치는 논리 블록의 1차원 배열처럼 주소가 매겨지는 구조.

논리 블록은 가장 작은 전송 단위이며, 각 논리 블록은 물리 섹터나 반도체 페이지로 매핑.

HDD에서는 논리 블록 주소가 과거에는 실린더, 트랙, 섹터 번호로 변환될 수 있었지만, 

현대 드라이브에서는 복잡한 내부 매핑 때문에 운영체제가 실제 물리 위치를 정확히 알기 어려운 구조.

현대 HDD는 불량 섹터 대체, 트랙별 섹터 수 차이, 내부 캐시, 존 구조 등으로 인해 

단순한 CHS 주소와 실제 물리 위치가 직접 대응하지 않는 경우가 많음.

LBA는 Logical Block Addressing의 약자이며, 

운영체제가 저장장치를 연속된 논리 블록 번호로 접근하게 하는 방식.

HDD에서는 LBA와 물리 섹터 사이의 관계가 장치 컨트롤러에 의해 숨겨지는 구조.

NVM에서도 논리 블록 주소는 FTL을 통해 물리 플래시 페이지로 매핑.

운영체제는 논리 블록 번호를 기준으로 I/O 요청을 만들고, 

저장장치 컨트롤러는 내부 구조에 맞게 실제 위치를 결정하는 역할.

일부 드라이브는 일정한 선형 속도나 일정한 각속도를 이용해 데이터를 기록하는 방식.

고정 선형 속도는 트랙 위치에 따라 회전 속도를 조정하여 데이터 밀도를 일정하게 유지하는 방식.

고정 각속도는 회전 속도를 일정하게 유지하고 바깥쪽 트랙에 더 많은 데이터를 저장하는 방식.

현대 디스크는 여러 존으로 나누어 바깥쪽 트랙일수록 더 많은 섹터를 갖게 하는 구조를 사용할 수 있음.

이러한 내부 주소 매핑은 운영체제가 디스크 스케줄링을 최적화할 때 완전한 물리 정보를 알기 어렵게 만드는 요인.


 

디스크 스케줄링

운영체제의 책임 중 하나는 하드웨어를 효율적으로 사용하는 것.

HDD에서 이 책임은 접근 시간을 최소화하고 전송 대역폭을 최대화하는 것을 의미.

HDD 또는 플래터 저장장치의 접근 시간은 탐색 시간과 회전 지연 시간으로 구성.

탐색 시간은 디스크 암이 원하는 실린더로 이동하는 시간.

회전 지연 시간은 원하는 섹터가 헤드 아래로 회전해 올 때까지 기다리는 시간.

디스크 대역폭은 첫 번째 서비스 요청부터 마지막 전송 완료까지의 시간 동안 전송된 총 바이트 수로 계산되는 값.

운영체제는 장치 I/O 요청이 도착하는 순서를 관리하여 접근 시간과 대역폭을 모두 개선할 수 있음.

프로세스가 입출력을 해야 할 때 운영체제에 시스템 콜을 발생시키며, 

요청에는 입력 또는 출력 여부, 열린 파일 핸들, 전송 위치, 전송할 데이터 양 등이 포함되는 구조.

장치가 쉬고 있으면 요청은 즉시 시작되지만, 장치가 바쁘면 요청은 큐에 들어가 대기.

여러 프로세스가 장치를 공유하는 다중 프로그래밍 시스템에서는 디스크 큐에 많은 요청이 쌓일 수 있음.

운영체제는 큐의 순서를 조정하여 헤드 이동을 줄이고 디스크 성능을 향상시킬 수 있는 기회.

SSD나 NVM 장치에서는 물리 헤드가 없으므로 HDD 중심의 스케줄링 효과가 작지만, 

HDD에서는 여전히 중요한 주제.

디스크 스케줄링의 목표는 공정성, 적시성, 최적화의 조합.

처리량을 높이려면 인접한 요청을 묶어 처리하는 것이 유리하지만, 

특정 요청이 지나치게 오래 기다리는 문제도 고려해야 하는 구조.

드라이브가 스스로 논리 블록 주소를 물리 주소로 매핑하므로, 

운영체제의 스케줄링은 실제 물리 위치를 완벽히 알지 못한 상태에서 이루어지는 한계.


 

선입 선처리 스케줄링

FCFS 스케줄링은 가장 먼저 들어온 요청을 가장 먼저 처리하는 단순한 방식.

FCFS는 first-come first-served의 약자.

이 방식은 본질적으로 공평하지만, 가장 빠른 서비스를 제공하지는 못하는 한계.

예를 들어 헤드가 53번 실린더에 있고 요청 큐가 98, 183, 37, 122, 14, 124, 65, 67 순서라면, 

요청 순서대로 이동하면서 총 헤드 이동 거리가 커지는 구조.



FCFS는 구현이 간단하지만, 요청 순서가 좋지 않으면 헤드가 디스크 전체를 불필요하게 왕복할 수 있는 문제.

따라서 평균 탐색 시간을 줄이기 위한 다른 스케줄링 알고리즘의 필요.


 

SCAN 스케줄링

SCAN 스케줄링은 디스크 암이 한쪽 끝에서 다른쪽 끝으로 이동하면서 이동 경로에 있는 요청을 처리하는 방식.

디스크 암은 한 방향으로 이동하다가 끝에 도달하면 방향을 바꾸어 반대 방향으로 이동하는 구조.

이 방식은 엘리베이터가 한 방향으로 이동하며 요청을 처리하고 

끝에서 방향을 바꾸는 동작과 비슷하므로 엘리베이터 알고리즘이라고도 부르는 방식.

예를 들어 헤드가 53번 실린더에 있고 0번 방향으로 이동 중이라면, 

먼저 37과 14를 처리한 뒤 0번까지 이동하고, 

다시 반대 방향으로 이동하며 65, 67, 98, 122, 124, 183을 처리하는 흐름.



SCAN은 FCFS보다 평균 탐색 시간을 줄일 수 있는 경우가 많음.

그러나 요청이 디스크의 한쪽 방향에 몰려 있으면, 헤드가 반대쪽 끝까지 이동하는 동안 새로운 요청이 기다릴 수 있는 문제.

요청들이 균일하게 도착한다고 가정하면, 헤드가 한쪽 끝에 가까울 때 반대쪽 끝의 요청은 더 오래 기다릴 수 있음.

SCAN은 현재 위치보다 반대쪽 끝부터 서비스를 시작하는 것이 다음 알고리즘의 기본 개념으로 이어지는 구조.


 

C-SCAN 스케줄링

C-SCAN은 circular-SCAN의 약자이며, 요청에 대한 대기 시간을 더 균등하게 만들기 위한 SCAN의 변형.

C-SCAN은 한쪽 방향으로만 요청을 처리하고, 

끝에 도달하면 반대 방향 요청을 처리하지 않은 채 처음 위치로 빠르게 돌아가 다시 같은 방향으로 처리하는 방식.

예를 들어 헤드가 53번 실린더에 있고 0에서 199 방향으로 이동한다면, 

65, 67, 98, 122, 124, 183을 처리한 뒤 199까지 이동하고, 다시 0으로 돌아가 14와 37을 처리하는 흐름.



C-SCAN은 디스크 실린더를 원형 리스트처럼 다루며, 마지막 실린더에서 첫 번째 실린더로 되돌아가는 구조.

이 방식은 SCAN보다 요청 대기 시간을 더 균등하게 만들 수 있는 장점.

반면 끝까지 이동하고 다시 처음으로 돌아가는 추가 이동이 필요할 수 있는 비용.


 

디스크 스케줄링 알고리즘 선택

디스크 스케줄링 알고리즘은 FCFS, SCAN, C-SCAN 외에도 여러 변형이 존재.

운영체제 설계자는 요청 종류, 요청 수, 디스크 구조, 작업 부하 특성에 따라 적절한 알고리즘을 선택해야 하는 문제.

큐에 대기 중인 요청이 하나뿐이거나 디스크 부하가 낮으면 모든 스케줄링 알고리즘은 사실상 FCFS처럼 동작.

SCAN과 C-SCAN은 기아 문제를 일으킬 가능성이 작기 때문에

 디스크 부하가 큰 시스템에서 좋은 성능을 제공할 수 있음.

Linux 마감시간 스케줄러는 읽기와 쓰기별로 큐를 유지하고, 요청이 너무 오래 기다리지 않도록 기한을 관리하는 방식.

이 스케줄러는 기본적으로 C-SCAN처럼 LBA 순서로 요청을 정렬하지만, 

일정 시간 이상 기다린 요청은 먼저 처리할 수 있는 구조.

Linux의 CFQ 스케줄러는 completely fair queuing의 약자이며, 프로세스별 I/O 대기열과 우선순위를 고려하는 방식.

CFQ는 SATA 같은 덤프트 스케줄러에서 공정성과 성능을 함께 고려하는 역할.

빠른 NVM 장치에서는 NOOP 또는 단순 FCFS에 가까운 스케줄러가 적합할 수 있음.

디스크 스케줄링 알고리즘은 장치 특성에 따라 성능 효과가 달라지므로, 

HDD와 NVM을 같은 기준으로 다루기 어려운 문제.


 

NVM 스케줄링

앞에서 다룬 디스크 스케줄링 알고리즘은 HDD 같은 기계식 플래터 기반 저장장치에 적합한 방식.

NVM 장치에는 이동하는 디스크 헤드가 없으므로 탐색 시간을 줄이기 위한 스케줄링의 의미가 작음.

많은 Linux 시스템에서 NVM 장치에는 NOOP 스케줄러처럼 단순한 FCFS 정책이 선호되는 이유.

NVM 장치에서 중요한 것은 인접한 요청을 병합하거나, 

읽기 요청을 빠르게 처리하고 쓰기 요청을 효율적으로 배치하는 것.

SSD 스케줄러는 읽기 지연 시간과 플래시 메모리의 쓰기 특성을 함께 고려해야 하는 구조.

무작위 I/O는 HDD에서는 매우 느리지만, NVM에서는 물리적 이동이 없기 때문에 HDD보다 훨씬 높은 IOPS를 제공 가능.

IOPS는 Input/Output Operations Per Second의 약자이며, 

초당 입출력 연산 수를 의미.

NVM은 수십만 IOPS 수준의 성능을 제공할 수 있지만, 

쓰기 증폭과 가비지 수집 때문에 읽기와 쓰기 성능이 항상 동일하지는 않은 특징.

쓰기 증폭은 하나의 논리 쓰기가 내부적으로 여러 물리 쓰기나 블록 이동을 발생시키는 현상.

장치가 가득 차거나 유효하지 않은 페이지가 많을수록 가비지 수집과 쓰기 증폭이 심해질 수 있음.

운영체제는 파일이 삭제될 때 장치에 해당 블록이 더 이상 필요하지 않음을 알리는 방식으로 

NVM 성능과 수명을 개선할 수 있음.

이러한 알림은 TRIM 명령과 유사한 역할.

NVM 스케줄링의 핵심은 헤드 이동 최소화가 아니라

 읽기 지연 시간, 쓰기 증폭, 병합 가능성, 장치 내부 병렬성을 고려하는 것.


 

오류 감지 및 수정

오류 감지와 수정은 메모리, 네트워크, 저장장치 등 컴퓨터의 많은 영역에서 필요한 기능.

오류 감지는 문제가 발생했는지 여부를 결정하는 과정.

예를 들어 DRAM의 비트가 0에서 1로 바뀌었는지, 

전송 중 네트워크 패킷이 손상되었는지, 저장된 데이터 블록이 읽는 시점에 변경되었는지를 판단하는 역할.

오류가 감지되면 시스템은 작업을 중단하거나 사용자 또는 관리자에게 오류를 보고하거나, 

가능한 경우 오류를 수정하고 계속 진행할 수 있음.

전통적인 오류 감지 방법 중 하나는 패리티 비트.

패리티는 데이터 비트들의 1의 개수가 짝수 또는 홀수가 되도록 추가 비트를 붙이는 방식.

단일 비트 오류는 패리티 변화로 감지할 수 있지만, 두 비트가 동시에 바뀌면 감지하지 못할 수 있는 한계.

체크섬은 데이터 블록의 값을 계산해 저장하고, 나중에 다시 계산한 값과 비교하여 오류를 감지하는 방식.

네트워크에서는 CRC가 흔히 사용되는 오류 감지 기법.

CRC는 cyclic redundancy check의 약자이며, 다중 비트 오류를 감지하는 데 효과적인 방식.

오류 수정 코드는 ECC라고 부르며, 오류를 감지할 뿐 아니라 일정 수준까지 수정할 수 있는 코드.

ECC는 error-correction code의 약자.

저장장치는 데이터를 기록할 때 ECC 정보를 함께 저장하고,

읽을 때 데이터와 ECC를 비교하여 오류를 감지하거나 수정.

수정 가능한 오류는 자동으로 고쳐질 수 있지만, 

수정 불가능한 오류는 하드 오류로 보고되어 더 높은 수준의 복구가 필요.

ECC는 DRAM 오류 보호, 저장장치 내부 오류 복구, 데이터 경로 보호 등 여러 시스템에서 사용되는 기술.


 

저장장치 관리

운영체제는 저장장치 관리와 관련하여 드라이브 초기화, 파티션, 볼륨, 부팅, 손상된 블록 복구 같은 여러 책임을 가짐.

여기서는 저장장치가 운영체제에서 사용 가능한 논리 저장 공간이 되기까지 필요한 관리 절차에 대한 설명.


 

드라이브 포맷팅, 파티션, 볼륨

새로운 저장장치는 아무 정보도 없는 상태이거나 초기화되지 않은 반도체 저장장치일 수 있으므로, 

저장장치로 사용하려면 먼저 포맷팅 필요.

저수준 포맷팅 또는 물리적 포맷팅은 저장장치를 섹터나 페이지 단위로 나누고, 

헤더와 트레일러 같은 제어 정보를 만드는 과정.

헤더와 트레일러에는 섹터 번호, 오류 감지 코드, 오류 수정 코드 같은 컨트롤러 정보 포함.

대부분의 하드디스크는 공장에서 이미 저수준 포맷이 되어 출고되는 구조.

운영체제는 저장장치를 하나 이상의 블록 또는 페이지 그룹으로 파티션할 수 있음.

파티션은 독립적인 논리 저장 영역으로 취급될 수 있으며, 

하나의 파티션은 운영체제 커널을 위한 공간이고 다른 파티션은 파일 시스템을 위한 공간일 수 있음.

Linux의 fdisk 같은 도구는 저장장치의 파티션 정보를 관리하는 데 사용.

파티션된 장치는 파일 시스템을 생성하거나 raw 장치로 사용할 수 있는 상태.

파일 시스템을 사용하려면 논리 포맷팅 또는 파일 시스템 생성이 필요.

논리 포맷팅은 

가용 공간 목록, 초기 빈 디렉터리, 파일 시스템 메타데이터 같은 자료구조를 저장장치에 기록하는 과정.

파일 시스템이 생성된 파티션은 볼륨으로 취급될 수 있음.

볼륨은 하나의 파티션일 수도 있고, 

여러 디스크나 여러 파티션을 결합한 논리 저장 단위일 수도 있음.

파일 시스템을 사용하려면 볼륨을 마운트해야 하며, 

마운트된 파일 시스템은 디렉터리 트리에 연결되어 사용자와 프로그램이 접근 가능.



효율성을 위해 대부분의 파일 시스템은 블록을 클러스터라는 더 큰 단위로 묶어 사용.

클러스터링은 파일 시스템 I/O 횟수를 줄이고, 

파일의 연속된 내용을 가까운 위치에 배치해 디스크 헤드 이동을 줄이는 데 도움.

일부 응용 프로그램은 파일 시스템을 거치지 않고 raw 디스크 또는 raw I/O를 사용하기도 함.

raw I/O는 파일 시스템의 버퍼 캐시, 파일 잠금, 공간 할당, 파일 이름 및 디렉터리 같은 서비스를 우회하는 방식.

데이터베이스처럼 자체 저장 구조와 캐시를 가진 응용은 raw I/O를 통해 더 직접적인 저장장치 제어를 얻을 수 있음.

그러나 raw I/O는 운영체제의 일반 파일 시스템 기능을 우회하므로 응용 프로그램이 더 많은 책임을 져야 하는 방식.


 

부트 블록

컴퓨터가 전원을 켜거나 재부팅되면 실행을 시작할 초기 프로그램이 필요.

이 초기 프로그램은 부트스트랩 로더라고 부르는 작은 프로그램.

부트스트랩 로더는 보통 펌웨어의 NVM에 저장되어 시스템 전원이 켜질 때 실행되는 구조.

부트스트랩은 CPU 레지스터, 장치 컨트롤러, 메모리 내용 등 시스템의 여러 측면을 초기화하는 역할.

작은 부트스트랩 로더는 완전한 부트스트랩 프로그램을 저장장치에서 메모리로 불러오는 역할을 수행.

완전한 부트스트랩 프로그램은 운영체제 커널을 찾아 메모리에 적재하고 실행을 시작하는 과정.

저장장치에서 부트스트랩 코드가 저장된 고정 위치를 부트 블록이라고 부르는 개념.

Linux의 대표적인 부트 로더는 grub2.

부트 파티션은 운영체제가 시작되는 데 필요한 부트 코드와 설정 정보를 포함한 파티션.

 



 

Windows에서는 부트 코드가 MBR에 위치하고, MBR이 부트 파티션을 찾아 추가 부트 코드를 실행하는 방식.

MBR은 master boot record의 약자이며, 저장장치의 첫 번째 논리 블록 또는 첫 번째 페이지에 위치하는 구조.

MBR에는 부트 코드와 함께 파티션 테이블 정보가 포함될 수 있음.

시스템은 MBR의 부트 코드를 읽어 실행하고, 부팅 가능한 파티션을 찾아 운영체제 로더를 실행하는 흐름.

운영체제 로더는 커널을 메모리에 적재하고, 필요한 시스템 파일과 장치 드라이버를 준비하여 부트 과정을 계속 진행.


 

손상된 블록

디스크는 움직이는 부품이 있고 정밀한 구조를 가지므로 고장이 발생하기 쉬운 장치.

심각한 고장에서는 디스크 전체를 교체하고 백업으로부터 내용을 복원해야 하는 상황 발생.

일부 블록만 사용할 수 없는 경우 해당 블록을 손상 블록이라고 부르는 개념.

손상된 블록은 디스크와 컨트롤러에 따라 여러 방식으로 처리 가능.

간단한 컨트롤러에서는 포맷 중 디스크를 스캔하여 손상 블록을 찾고, 

파일 시스템이 해당 블록을 할당하지 않도록 표시하는 방식.

UNIX의 badblocks 프로그램이나 Windows의 chkdsk는 손상 블록을 찾아 사용하지 못하게 할 수 있는 도구.

더 복잡한 컨트롤러는 손상 블록 목록을 유지하고, 여분의 섹터를 이용해 손상된 섹터를 대체하는 방식.

이 기법은 섹터 예비 또는 섹터 포워딩이라고 부르는 방식.

예를 들어 논리 블록 87을 읽으려 했는데 섹터가 손상된 경우, 

컨트롤러는 그 섹터를 예비 섹터로 대체하고 이후 논리 블록 87 요청을 새로운 물리 섹터로 보낼 수 있음.

이러한 재배치는 디스크 스케줄링 알고리즘이 가정하는 물리적 인접성을 깨뜨릴 수 있는 요인.

섹터 밀어내기는 손상 섹터 주변의 섹터들을 한 칸씩 밀어내어 논리적 순서를 최대한 유지하는 방식.

섹터 밀어내기는 sector slipping의 의미.

소프트 오류는 ECC로 복구 가능한 오류이며, 

복구 가능한 오류가 자주 발생하면 장치가 해당 블록을 예비 블록으로 교체할 수 있음.

하드 오류는 복구할 수 없는 오류이며, 손상된 데이터는 백업에서 가져와야 하는 상황.

NVM 장치도 시간이 지나며 손상된 비트, 바이트, 페이지가 생길 수 있음.

NVM 컨트롤러는 불량 페이지 테이블을 유지하고, 

과잉 공급 공간을 사용하여 불량 페이지가 다시 사용되지 않도록 처리하는 구조.


 

스왑 공간 관리

스와핑은 프로세스 전체 또는 일부 페이지를 메인 메모리에서 보조저장장치로 이동시키는 기법.

스왑 공간은 물리 메모리가 부족할 때 메모리 내용을 임시로 저장하기 위한 보조저장장치 공간.

현대 운영체제에서는 전체 프로세스 스와핑보다 페이지 단위의 페이징이 더 일반적이며, 

스와핑과 페이징이라는 용어가 혼용되기도 하는 상황.

스왑 공간 관리는 운영체제가 수행하는 낮은 수준의 작업이지만, 

가상 메모리는 보조저장장치를 메인 메모리의 확장처럼 사용하므로 성능에 큰 영향.

드라이브는 메모리보다 훨씬 느리기 때문에 스왑 공간의 설계와 구현은 시스템 성능에 매우 중요한 문제.


 

스왑 공간 사용

스왑 공간은 사용하는 메모리 관리 알고리즘에 따라 운영체제마다 다양한 방식으로 운영.

프로세스 전체를 스왑하는 시스템에서는 코드와 데이터 전체, 즉 프로세스 이미지 전체를 스왑 공간에 유지할 수 있음.

페이징 기반 시스템에서는 메모리에서 밀려난 페이지만 스왑 공간에 저장하는 방식.

스왑 공간의 크기는 물리 메모리 크기, 가상 메모리 크기, 가상 메모리가 사용되는 방식에 따라 달라지는 값.

일반적으로 스왑 공간은 수 MB에서 수 GB까지 다양하게 설정 가능.

스왑 공간은 너무 작으면 시스템 운영 중 부족해질 수 있으므로 과소평가보다 과대평가가 안전한 편.

스왑 공간이 부족하면 프로세스를 중단하거나, 최악의 경우 시스템 장애가 발생할 수 있음.

일부 시스템은 여러 개의 스왑 공간을 제공하여 I/O 부하를 여러 저장장치에 분산하는 방식.

과거 Linux는 물리 메모리의 두 배 정도를 스왑 공간으로 권장했지만, 

최근에는 물리 메모리가 커지면서 더 작은 기본 스왑 공간을 사용하는 경우도 많은 흐름.


 

스왑 공간 위치

스왑 공간은 일반 파일 시스템 안의 파일로 만들 수도 있고, 별도의 raw 파티션으로 만들 수도 있음.

파일 시스템 안의 스왑 파일은 일반 파일 시스템 루틴을 사용하여 생성, 삭제, 관리할 수 있는 장점.

하지만 파일 시스템 경로를 거치므로 성능 면에서 추가 오버헤드가 발생할 수 있는 단점.

별도의 raw 파티션은 파일 시스템이나 디렉터리 구조가 없고, 스왑 공간 관리 루틴만 사용하는 방식.

raw 파티션은 저장 공간 효율성보다 속도 효율성을 우선하여 설계되는 구조.

스왑 공간 안의 내부 단편화는 일반 파일보다 큰 문제가 아니며, 스왑되는 데이터는 보통 짧은 시간 동안만 존재.

raw 파티션 방식은 빠르지만, 

스왑 공간 크기를 바꾸려면 파티션을 다시 나누거나 추가 스왑 공간을 마련해야 하는 불편함.

일부 운영체제는 스왑 파일과 스왑 파티션을 모두 지원.

Linux도 두 방식을 모두 지원하며, 시스템 관리자가 편의성과 성능 사이에서 선택 가능.


 

스왑 공간 관리의 예

초기 UNIX는 전체 프로세스를 디스크의 연속 공간으로 스와핑하는 방식에서 출발.

이후 하드웨어 페이징 기술이 발전하면서 페이징과 스와핑을 함께 사용하는 방식으로 발전.

Solaris는 가상 메모리 설계를 효율적으로 반영하기 위해 

스왑 공간을 익명 메모리와 페이지 교체에 연결하는 구조를 사용.

실행 파일의 텍스트 세그먼트처럼 파일 시스템에서 다시 읽을 수 있는 페이지는 스왑 공간에 쓰지 않고 버려질 수 있음.

나중에 필요하면 해당 페이지는 원래 파일 시스템에서 다시 읽어오는 방식.

프로세스 스택, 힙, 초기화되지 않은 데이터처럼 파일에 백업되지 않은 익명 메모리는 스왑 공간이 필요.

Solaris는 처음부터 모든 가능한 페이지에 스왑 공간을 예약하지 않고, 

페이지가 실제로 물리 메모리에서 쫓겨날 때 스왑 공간을 할당하는 방식.

이 방식은 실제보다 많은 물리 메모리를 가진 것처럼 동작할 수 있게 하며, 스왑 공간 사용을 줄이는 효과.

Linux도 익명 메모리에 대해서 비슷한 방식으로 스왑 공간을 사용.

Linux는 하나 이상의 스왑 영역을 허용하며, 각 스왑 영역은 연속된 페이지 슬롯으로 구성.

각 스왑 영역에는 스왑 맵이 연결되어 있고, 스왑 맵은 각 페이지 슬롯의 사용 상태를 나타내는 카운터를 유지.

카운터 값이 0이면 해당 페이지 슬롯은 사용 가능 상태이고, 0보다 크면 스왑된 페이지들이 해당 슬롯을 차지하는 상태.

 

 



저장장치 연결

컴퓨터는 보조저장장치에 접근하기 위해 호스트에 직접 연결하는 방식, 

네트워크로 연결하는 방식, 클라우드 저장장치를 사용하는 방식을 가짐.


 

호스트 연결 저장장치

호스트 연결 저장장치는 로컬 I/O 포트를 통해 접근되는 저장장치.

이 포트들은 SATA 같은 여러 저장장치 연결 기술을 사용할 수 있음.

일반적인 시스템은 하나 이상의 SATA 포트를 가지며, 

저장장치나 저장장치 새시는 USB, FireWire, Thunderbolt 같은 포트를 통해 연결 가능.

고성능 워크스테이션이나 서버는 더 많은 저장장치와 높은 유연성이 필요하므로 FC 같은 고급 I/O 아키텍처를 사용.

FC는 Fibre Channel의 약자이며, 광섬유 또는 구리 케이블을 통해 다수의 장치와 호스트를 연결하는 방식.

FC는 큰 주소 공간과 높은 확장성을 제공하여 여러 호스트와 저장장치가 망 형태로 연결될 수 있는 구조.

호스트 연결 저장장치의 예에는 HDD, NVM 장치, CD, DVD, Blu-ray, 테이프 드라이브, SAN 등이 포함.

호스트는 저장장치에 논리 블록 읽기와 쓰기 명령을 내려 데이터를 전송하는 방식.


 

 네트워크 연결 저장장치

NAS는 network-attached storage의 약자이며, 네트워크를 통해 저장장치에 접근하는 방식.

NAS 장치는 특수 목적 저장장치 시스템이거나, 저장장치가 연결된 일반 호스트일 수 있음.

클라이언트는 원격 프로시저 호출 인터페이스를 통해 네트워크 저장장치에 접근.

UNIX와 Linux에서는 NFS, Windows에서는 CIFS 같은 프로토콜이 대표적인 예.

NFS와 CIFS는 파일 시스템 수준의 접근을 제공하며, 여러 클라이언트가 원격 파일을 읽고 쓸 수 있게 하는 구조.



NAS는 네트워크에 저장장치 풀을 연결하여 여러 시스템이 저장 공간을 공유하도록 하는 편리한 방법.

그러나 일반 데이터 네트워크를 사용하므로 성능은 직접 연결 저장장치보다 낮을 수 있는 한계.

iSCSI는 IP 네트워크를 통해 SCSI 명령을 전달하는 저장장치 프로토콜.

iSCSI를 사용하면 호스트는 네트워크로 연결된 저장장치를 직접 연결된 블록 장치처럼 사용할 수 있음.

NFS와 CIFS는 파일 시스템 접근을 제공하는 반면, iSCSI는 논리 블록 전송을 제공한다는 차이.


 

클라우드 저장장치

클라우드 저장장치는 클라우드 제공 업체가 네트워크를 통해 제공하는 저장 공간.

네트워크 연결 저장장치와 유사하지만, 일반적으로 LAN이 아니라 WAN을 통해 접근하는 방식.

클라우드 저장장치는 무료 또는 유료 서비스로 제공될 수 있으며, 사용자는 네트워크를 통해 원격 저장장치에 접근.

NAS와 클라우드 저장장치는 저장장치가 제공되는 방식과 사용자에게 보이는 방식에서 차이가 존재.

NFS, CIFS, iSCSI 같은 프로토콜이 네트워크 저장장치에 사용될 수 있지만, 

클라우드 저장장치는 HTTP 기반 API나 전용 API를 사용하는 경우가 많음.

Amazon S3, Dropbox, Microsoft OneDrive, Apple iCloud 같은 서비스가 클라우드 저장장치의 예.

클라우드 저장장치가 전통적인 파일 시스템 프로토콜 대신 API를 사용하는 이유는 WAN의 지연 시간과 장애 가능성 때문.

LAN용 프로토콜은 연결이 끊기면 시스템이 멈추거나 복구될 때까지 대기하는 방식이 될 수 있지만, 

클라우드 환경은 이러한 장애가 더 자주 발생할 수 있는 구조.

따라서 클라우드 저장장치는 지연과 장애를 견디도록 설계된 접근 방식을 사용하는 것이 일반적.


 

SAN과 저장장치 배열

네트워크에 부착된 저장 시스템의 단점은 저장장치 I/O가 일반 데이터 네트워크의 대역폭을 소비하고, 

네트워크 지연을 증가시킬 수 있다는 점.

SAN은 storage-area network의 약자이며, 서버와 저장장치를 연결하기 위한 사유 네트워크.

SAN은 일반 네트워크 프로토콜이 아니라 저장장치 프로토콜을 사용하여 서버와 저장장치를 연결하는 구조.



SAN은 여러 호스트와 여러 저장장치가 같은 저장 네트워크에 연결될 수 있게 하는 유연성 제공.

저장장치는 RAID 형식으로 보호된 장치일 수도 있고, 보호되지 않은 JBOD일 수도 있음.

JBOD는 Just a Bunch of Disks의 약자이며, 여러 디스크를 단순히 묶은 구성.

SAN 스위치는 호스트와 저장장치 사이의 접근을 허용하거나 금지할 수 있는 역할.

여러 호스트가 같은 저장장치를 공유할 수 있어 클러스터 구성에 유용.

SAN은 일반적으로 근거리에서 사용되고 라우팅이 없으므로 

NAS보다 더 많은 호스트를 저장장치에 연결할 수 있는 경우가 많음.

저장장치 배열은 SAN 포트, 네트워크 포트, 컨트롤러, 여러 드라이브를 포함하는 전용 저장 시스템.



저장장치 배열의 컨트롤러는 CPU, 메모리, 포트, 드라이브 관리 기능을 포함하는 장치.

배열 기능에는 

네트워크 프로토콜, 사용자 인터페이스, RAID 보호, 스냅샷, 복제, 압축, 중복 제거, 암호화 등이 포함될 수 있음.

일부 스토리지 배열은 SSD와 HDD를 혼합하여 성능과 용량을 함께 제공.

FC는 가장 일반적인 SAN 연결 방식 중 하나이며, 

InfiniBand 같은 고속 버스 아키텍처도 대규모 스토리지 연결에 사용 가능.


 

RAID 구조

저장장치가 점점 소형화되고 저렴해지면서 여러 드라이브를 병렬로 사용하는 방식이 가능해진 구조.

여러 드라이브를 동시에 사용하면 데이터 읽기와 쓰기 비율을 높일 수 있고, 중복 정보를 저장하면 신뢰성도 향상 가능.

RAID는 redundant array of inexpensive disks에서 출발한 용어였지만, 

현대에는 independent disks의 의미로도 해석되는 구조.

RAID의 핵심 목표는 성능 향상과 신뢰성 향상.

RAID는 시스템 버스에 직접 연결된 드라이브, 컨트롤러 카드, 저장장치 배열, SAN 계층, 소프트웨어 RAID 등 다양한 위치에서 구현될 수 있는 구조.


 

 중복으로 신뢰성 향상

N개의 디스크로 구성된 집합은 단일 디스크보다 전체 고장 가능성이 커지는 구조.

한 디스크의 평균 고장 시간을 MTTF라고 하면, 

디스크 수가 많아질수록 전체 시스템의 평균 고장 시간은 줄어드는 경향.

MTTF는 mean time to failure의 약자이며, 평균 고장 시간을 의미.

예를 들어 한 디스크의 MTTF가 100,000시간이고 100개의 디스크로 집합을 구성하면, 

어느 한 디스크가 고장날 때까지의 평균 시간은 훨씬 짧아지는 문제.

이 문제를 해결하는 가장 기본적인 방법은 중복 정보 저장.

중복 정보는 디스크 하나가 고장나도 데이터를 복구할 수 있게 만드는 보호 정보.

가장 단순한 중복 방식은 미러링.

미러링은 하나의 논리 디스크를 두 개의 물리 디스크에 동일하게 저장하는 방식.

미러드 볼륨에서는 모든 쓰기가 두 드라이브에 모두 수행되고, 

하나의 드라이브에 오류가 발생하면 다른 드라이브에서 데이터를 읽을 수 있음.

미러링의 신뢰성은 단일 디스크의 고장 시간뿐 아니라 

고장난 디스크를 교체하고 복구하는 데 걸리는 평균 수리 시간에도 영향.

평균 수리 시간은 mean time to repair의 의미.

드라이브 고장은 독립적이라고 단순 가정할 수 있지만

전력 문제, 온도, 제조 결함, 사용 기간 같은 공통 요인 때문에 실제로는 독립적이지 않을 수 있음.

두 미러 드라이브 모두에 같은 시점에 오류가 발생하면 데이터 손실 가능.

전원 장애 중 쓰기가 진행되면 두 드라이브의 블록이 서로 불일치할 수 있으며, 

이를 막기 위해 NVRAM 같은 비휘발성 캐시를 사용할 수 있음.

비휘발성 캐시는 쓰기 작업을 안전하게 기록하여 전원 장애 후에도 데이터 일관성을 복구하는 데 도움.


 

병렬성을 이용한 성능 향상

여러 드라이브를 사용하면 신뢰성뿐 아니라 성능도 향상 가능.

미러링을 사용하는 시스템에서는 읽기 요청을 두 드라이브 중 하나에서 처리할 수 있으므로 읽기 성능 향상 가능.

쓰기 요청은 두 드라이브 모두에 기록해야 하므로 단일 드라이브와 비교해 큰 성능 향상이 제한될 수 있음.

데이터 스트라이핑은 여러 드라이브에 데이터를 나누어 저장하여 전송률을 높이는 방식.

비트 레벨 스트라이핑은 한 바이트의 비트를 여러 드라이브에 나누어 저장하는 방식.

예를 들어 8개의 드라이브가 있다면 각 드라이브에 한 바이트의 한 비트씩 저장할 수 있음.

블록 레벨 스트라이핑은 파일의 블록을 여러 드라이브에 분산하여 저장하는 방식.

예를 들어 n개의 드라이브가 있을 때 파일의 i번째 블록은 (i mod n) + 1번 드라이브에 저장되는 구조.

블록 레벨 스트라이핑은 독립적인 작은 요청들을 서로 다른 드라이브에서 병렬로 처리할 수 있게 하는 장점.

대용량 접근에서는 여러 드라이브가 동시에 참여하므로 전체 전송률을 높일 수 있음.

디스크 병렬성의 목적은 여러 작은 접근의 처리량을 높이고, 큰 접근의 응답 시간을 줄이는 것.


 

RAID 레벨

RAID 레벨은 미러링, 스트라이핑, 패리티를 조합하여 성능과 신뢰성의 서로 다른 절충을 제공하는 구성 방식.

패리티는 데이터 오류를 감지하고 복구하기 위해 추가로 저장되는 중복 정보.



RAID 레벨 0은 블록 레벨 스트라이핑을 사용하지만 중복을 제공하지 않는 방식.

RAID 0은 성능은 높지만 디스크 하나가 고장나면 데이터 손실이 발생할 수 있는 구조.

RAID 레벨 1은 드라이브 미러링을 사용하는 방식.

RAID 1은 높은 신뢰성을 제공하지만, 같은 데이터를 두 번 저장하므로 저장장치 비용이 큰 방식.

RAID 레벨 2는 메모리 스타일 오류 수정 코드를 여러 디스크에 적용하는 방식.

RAID 2는 오류 수정 코드를 위해 여러 개의 추가 디스크가 필요하므로, 현대 시스템에서는 거의 사용되지 않는 구성.

RAID 레벨 3은 비트 인터리브 패리티를 사용하는 방식.

RAID 3은 데이터 비트를 여러 디스크에 나누어 저장하고, 

별도의 패리티 디스크를 사용하여 디스크 하나의 고장을 복구할 수 있는 구조.

RAID 3은 대용량 순차 전송에는 유리하지만, 

모든 디스크가 같은 요청에 함께 참여하므로 독립적인 작은 요청을 병렬 처리하기 어려운 한계.

RAID 레벨 4는 블록 인터리브 패리티를 사용하는 방식.

RAID 4에서는 데이터 블록을 여러 드라이브에 스트라이핑하고, 별도의 패리티 드라이브에 패리티 블록을 저장.

디스크 하나가 고장나면 나머지 데이터와 패리티를 사용하여 손상된 데이터를 재계산할 수 있음.

RAID 4는 대용량 읽기와 쓰기에서는 병렬성이 높지만, 작은 쓰기에서는 패리티 드라이브가 병목이 될 수 있음.

작은 쓰기에서는 기존 데이터와 기존 패리티를 읽고, 

새 데이터와 새 패리티를 다시 쓰는 읽기-수정-쓰기 주기가 필요.

RAID 5는 block-interleaved distributed parity 방식으로, 

RAID 4의 패리티 병목을 줄이기 위해 패리티를 모든 드라이브에 분산하는 구조.

RAID 5에서는 데이터와 패리티가 모든 드라이브에 분산되므로 특정 패리티 드라이브 하나가 병목이 되는 현상 감소.

RAID 6은 P + Q 중복 기법이라고도 부르며, 

두 개의 독립적인 중복 정보를 저장하여 두 개의 드라이브 오류까지 견딜 수 있는 방식.

RAID 6은 Galois field 연산 같은 오류 수정 계산을 사용하며, 

RAID 5보다 더 많은 중복 공간과 계산 비용을 요구.

다차원 RAID 레벨 6은 여러 차원의 패리티를 구성하여 대규모 저장장치 배열에서 다중 오류 복구 능력을 높이는 방식.

RAID 0+1은 RAID 0과 RAID 1을 조합하여 스트라이프 집합을 미러링하는 구성.

RAID 1+0은 미러 쌍들을 스트라이핑하는 구성.



RAID 1+0은 특정 미러 쌍의 두 드라이브가 동시에 고장나지 않는 한 계속 동작할 수 있으므로 

RAID 0+1보다 장애 허용성이 높은 경우가 많음.

기본 RAID 레벨 외에도 여러 변형이 존재하며, 

실제 제품에서는 정확한 정의와 구현 방식이 시스템마다 다를 수 있음.

RAID는 커널이나 시스템 소프트웨어 계층에서 구현 가능.

HBA 하드웨어에서도 구현 가능하며, 

이 경우 운영체제는 RAID 기능을 가진 저장장치를 하나의 장치처럼 볼 수 있음.

저장장치 배열 내부의 컨트롤러 하드웨어에서 RAID가 구현될 수도 있음.

스토리지 배열은 여러 RAID 집합을 만들고, 각 집합을 더 작은 볼륨으로 나누어 여러 호스트에 제공하는 구조.

RAID는 SAN 내부 연결 계층에서도 구현될 수 있으며, 

저장장치 접근을 중간에서 관리하면서 미러링 같은 기능을 제공 가능.

스냅샷과 복제는 RAID 구현 계층 위에서 제공될 수 있는 저장장치 기능.

스냅샷은 특정 시점의 파일 시스템이나 볼륨 상태를 보존하는 기능.

복제는 동일한 데이터를 다른 저장장치나 원격 위치에 복사하는 방식.

동기식 복제는 쓰기가 완료되기 전에 원격 복제까지 끝나야 하므로 데이터 손실 가능성이 낮지만 지연 시간이 증가.

비동기식 복제는 주기적으로 또는 나중에 복제하므로 성능과 거리 면에서 유리하지만, 

장애 시 최근 데이터 일부를 잃을 수 있는 위험.

핫 스페어 드라이브는 RAID 집합 안에 대기 중인 예비 드라이브.

드라이브 장애가 발생하면 핫 스페어가 자동으로 대체 드라이브 역할을 하며, 

RAID는 손상된 중복 정보를 이용해 데이터를 재구성하는 과정.

핫 스페어는 복구 시간을 줄여 두 번째 장애가 발생하기 전 위험 구간을 줄이는 효과.


 

RAID 레벨 선택

 

RAID 레벨 선택에서 중요한 고려 요소는 복구 능력, 복구 시간, 성능, 저장 공간 오버헤드, 비용.

데이터 손실이 중요하지 않은 고성능 임시 작업에는 RAID 0이 적합할 수 있음.

예를 들어 과학 계산에서 중간 결과를 저장하는 임시 공간은 성능이 중요하고, 

필요하면 다시 계산 가능하므로 RAID 0 사용 가능.

RAID 1은 빠른 복구와 단순한 장애 처리가 필요한 환경에 적합.

RAID 0+1과 RAID 1+0은 높은 성능과 높은 신뢰성을 모두 필요로 하는 환경에 사용.

RAID 5는 일반적인 데이터 저장에 널리 사용되는 절충안.

RAID 6과 다차원 RAID 6은 대형 저장장치 배열에서 다중 디스크 장애를 견뎌야 하는 환경에 적합.

RAID 설계자는 몇 개의 드라이브로 구성할 것인지, 

몇 비트를 패리티로 보호할 것인지, 복구 중 두 번째 오류 가능성을 어떻게 처리할 것인지 결정해야 하는 문제.

더 많은 패리티 비트는 보호 능력을 높이지만 저장 공간과 성능 오버헤드를 증가시키는 절충.

대용량 드라이브는 복구 시간이 오래 걸릴 수 있으므로, 복구 도중 추가 오류가 발생할 위험을 함께 고려해야 하는 구조.

InServ 저장 배열은 chunklet 단위로 드라이브를 나누고, 이 chunklet 수준에서 RAID를 적용하는 구조.

이 방식은 저장 공간을 더 유연하게 배치하고, 스냅샷과 copy-on-write를 지원하며, 

실제 사용량에 따라 물리 저장장치를 점진적으로 할당하는 효과.

thin provisioning은 사용자가 큰 논리 볼륨을 보는 동안 실제 물리 공간은 사용량에 따라 점진적으로 할당하는 방식.

이 기법은 필요한 드라이브 수를 줄이고, 실제 사용 전까지 저장장치 구매를 늦출 수 있는 장점.


 

확장

RAID의 개념은 디스크 배열을 넘어 여러 저장장치와 데이터 전송 구조에도 적용 가능.

여러 테이프 드라이브에 데이터를 분산하거나 중복 저장하면 일부 테이프 손상에도 데이터 복구 가능.

데이터 방송 환경에서도 여러 채널이나 우선순위 흐름을 사용하여 일부 데이터 손실이 있어도 복구할 수 있는 구조.

여러 저장장치에 데이터를 나누고 중복 정보를 함께 저장하는 RAID의 기본 아이디어는

 다양한 시스템에서 신뢰성과 처리량을 높이는 방식으로 확장 가능.


 

RAID의 문제점

RAID는 데이터의 고가용성을 높이지만 사용자의 데이터를 항상 보호하는 것은 아님.

파일 포인터, 파일 시스템 구조, 메타데이터가 잘못되면 RAID가 정상이어도 데이터가 손상될 수 있음.

전원 장애나 시스템 오류 중 발생하는 부분 쓰기, 즉 torn write는 파일 시스템의 일관성을 깨뜨릴 수 있는 문제.

RAID는 물리 매체 오류를 보호하지만, 

소프트웨어 오류, 컨트롤러 버그, 관리 실수, 손상된 데이터 전파까지 자동으로 막지는 못하는 한계.

RAID 컨트롤러나 RAID 소프트웨어에 오류가 있으면 전체 데이터가 손실될 수 있음.

ZFS는 체크섬을 사용하여 이러한 문제를 해결하려는 파일 시스템.

ZFS는 모든 블록에 대해 체크섬을 유지하고, 데이터 블록뿐 아니라 메타데이터 블록에도 체크섬을 적용하는 구조.



ZFS는 데이터 블록의 체크섬을 해당 블록 안에 저장하지 않고, 그 블록을 가리키는 포인터와 함께 저장하는 방식.

이 구조는 데이터와 체크섬이 함께 손상되는 문제를 줄이고, 잘못된 블록을 더 신뢰성 있게 감지할 수 있게 함.

ZFS는 문제가 있는 블록을 발견하면 다른 복제본이나 RAID 정보를 사용하여 올바른 데이터를 읽고, 

손상된 블록을 자동으로 복구할 수 있는 자기 치유 기능 제공.

전통적인 볼륨 관리자와 파일 시스템은 서로 분리되어 있어 공간 관리와 데이터 보호가 복잡해질 수 있음.

ZFS는 파일 시스템 관리와 볼륨 관리를 하나의 단위로 묶어 저장장치 풀을 제공.



저장장치 풀은 여러 디스크를 하나의 집합으로 묶고, 그 위에 여러 ZFS 파일 시스템을 만들 수 있게 하는 구조.

각 파일 시스템은 필요할 때 저장 공간을 할당받고 반환할 수 있으며, 고정된 크기에 묶이지 않는 장점.

quota는 파일 시스템이 사용할 수 있는 최대 크기를 제한하는 기능.

reservation은 파일 시스템에 특정 크기의 공간을 보장하는 기능.

ZFS는 공간 관리와 데이터 무결성을 통합하여 기존 파일 시스템보다 높은 수준의 일관성과 안정성을 제공하는 방식.


 

객체 저장소

객체 저장소는 일반적인 파일 시스템과 다르게 데이터를 객체 단위로 저장하고 관리하는 방식.

저장장치 풀 안에 객체를 생성하면 객체 ID를 받고, 이후 객체 ID를 통해 객체를 관리하거나 삭제하는 구조.

객체 저장소의 기본 흐름은 저장장치 풀 내 객체 생성, 객체 ID를 통한 객체 관리, 객체 ID를 통한 객체 삭제.

HDFS와 Ceph 같은 객체 저장소 관리 소프트웨어는 객체의 위치와 보호 방식을 관리.

HDFS는 객체나 블록을 여러 컴퓨터에 복제하여 저장하고, 복제본을 통해 빠른 접근과 장애 복구를 제공하는 방식.

Hadoop 클러스터에서는 객체에 접근할 수 있는 시스템이 여러 개 존재하므로, 

가까운 복제본이나 사용 가능한 복제본을 통해 데이터를 읽을 수 있음.

객체 저장소는 일반적으로 단일 디스크나 단일 서버에 제한되지 않고, 

저장 노드를 추가하여 용량과 성능을 확장하는 구조.

객체 저장소는 파일 시스템처럼 계층적 디렉터리와 고정된 파일 경로를 중심으로 하지 않고, 

객체와 메타데이터를 중심으로 관리하는 방식.

콘텐츠 주소 지정 가능 저장소는 데이터의 내용에 기반하여 객체를 찾는 방식.

구조화되지 않은 데이터는 고정된 파일 형식이나 데이터베이스 스키마가 없는 데이터이며, 

객체 저장소는 이러한 대규모 비정형 데이터를 저장하는 데 적합.

웹과 클라우드 환경에서는 

Google 검색 콘텐츠, Dropbox 파일, Spotify 음악, Facebook 사진처럼 

많은 양의 데이터를 객체 저장소에 저장하는 경우가 많음.

Amazon S3는 대표적인 클라우드 객체 저장소 예시.

객체 저장소는 복제와 분산 배치를 통해 데이터 보호를 제공하고, 저장 노드 추가로 용량을 쉽게 확장할 수 있는 구조.

저작자표시 비영리 변경금지 (새창열림)

'개인공부 > OS' 카테고리의 다른 글

입출력 시스템  (0) 2026.07.07
가상 메모리  (0) 2026.06.23
메인 메모리  (0) 2026.06.23
DeadLocks  (0) 2026.06.16
동기화 예제  (0) 2026.06.09
'개인공부/OS' 카테고리의 다른 글
  • 입출력 시스템
  • 가상 메모리
  • 메인 메모리
  • DeadLocks
heishooni@gmail.com
heishooni@gmail.com
Linux, Cloud, Network 핵심 이론과 실무 구축 과정을 기록합니다. 인프라 엔지니어를 지향하는 기술 블로그이자 트러블 슈팅 저장소입니다.
  • heishooni@gmail.com
    heishooni
    heishooni@gmail.com
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Network
      • Infra
      • 개인공부
        • network
        • OS
        • Java
        • Dokcer
        • Linux
        • 컴퓨터구조
      • TroubleShooting
      • Personal
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 최근 글

  • 링크

    • https://github.com/heishooni
    • https://hooni.nangman.cloud/
  • 태그

    개발자 설정
    Devian
    NangmanInfra
    터미널 꾸미기
    ipsec
    troubleshooting
    zsh
    Infra
    homelab
    network
    Linux
    WISOFT
    네트워크 #network #CGNAT
    T-pot
    hyperplane
    bgp hijacking
    OS
    teleport
    proxmox
    physical-layer
    Last login
    reverse-proxy
    KIRO
    AWS Summit
    opnsense
    WireGuard
    hushlogin
    네트워크
    Stateful
    CML
  • hELLO· Designed By정상우.v4.10.6
heishooni@gmail.com
대용량 저장장치 구조
상단으로

티스토리툴바