운영체제가 책임져야 할 저장장치의 관리 항목.
드라이브 포매팅, 파티션, 볼륨
저수준 포매팅
새로운 저장장치를 받았다고 보자.
이는 아무런 정보가 없는 판이거나 초기화되지 않은 반도체 저장 셀의 집합이다.
- NVM 페이지는 초기화되어야 하고, FTL이 생성되어야 한다.
이를 저수준 포매팅 또는 물리적 포매팅이라고 한다.
- 각 저장장치 위치마다 특별한 자료구조로 장치를 채운다.
- 섹터/페이지를 위한 자료구조 : 헤더, 자료구역, 트레일러
- 헤더/자료구역 : 섹터/페이지 번호 & 오류 탐지 및 수정 코드와 같은 컨트롤러가 사용하는 정보 담음.
- 이미 공장에서 되어 나온다.
- 디스크 품질을 검사할 수 있고, 논리적 블록 주소를 손상되지 않은 섹터/페이지에게 할당 가능
- 섹터 크기를 미리 지정 가능. 크기가 커지면 트랙 당 섹터 수가 줄지만 헤더와 트레일러가 차지하는 공간이 줄어들게 되어 사용자 데이터를 위한 공간이 늘어나게 됨.
파티션, 볼륨, 논리적 포매팅
드라이브를 사용하여 파일을 보유하려면 운영체제가 여전히 자체 데이터 구조를 장치에 기록해야 함.
이 과정을 3가지; 파티셔닝, 볼륨 설정, 논리적 포매팅으로 나눔.
-
파티셔닝
- 장치를 하나 이상의 블록 또는 페이지 그룹으로 파티션하는 것
- 운영체제는 각 파티션을 별도의 장치인 것 처럼 취급 가능
- 어떤 파티션은 운영체제의 실행 가능 코드 사본을,
- 다른 파티션은 스왑 공간을, 또 다른 파티션은 사용자 파일을 관리…
- 리눅스의
fdisk명령이 대표적인 파티션 관리 명령어
파티션의 순서는 다음과 같다.
-
운영체제에서 장치를 인식해 파티션 정보를 읽음.
-
파티션에 해당하는 장치 항목을 설정한다. (
/dev에 있음) -
구성파일은 운영체제에 파일 시스템을 포함하는 각 파티션을 지정된 위치에 마운트.
마운트 시 사용자가 그 파일 시스템을 사용할 수 있음.
-
볼륨 생성 및 관리
볼륨 = 마운트 가능한 모든 파일 시스템. 또는 파일 시스템을 포함하는 파일
파일 시스템이 파티션 내에 직접 배치된다면 이 과정은 암묵적으로 이뤄짐.
그렇지만, 필요 시에는 명시적으로 해당 과정이 필요할 때가 있음.
- 여러 파티션이 RAID 집합으로 함께 사용되고, 그 위에 하나 이상의 파일 시스템이 분산되어 있는 경우
리눅스의 볼륨 관리자
lvm2가 대표적인 볼륨 생성 기능 제공.ZFS는 볼륨 관리와 파일 시스템을 묶어 하나의 명령과 기능 집합으로 제공. -
논리적 포매팅 (파일 시스템의 생성)
운영체제가 초기 파일 시스템 자료구조를 장치에 저장.
- 자료구조 = 가용공간, 할당된 공간의 맵, 초기의 빈 디렉토리
파티션 정보는 부팅 가능한 파일 시스템이 포함되어 있는지도 나타냄.
- 부팅 가능으로 표기된 파티션 = 파일 시스템의 루트를 설정하는데 사용됨
- 마운트 되면 모든 다른 장치 링크와 해당 파티션이 생성될 수 있음.
- 윈도우 : 문자를 사용해 각각 이름이 붙여짐
- 리눅스 : 부트 파일 시스템이 마운트 → 해당 트리 구조 내에 다른 파일 시스템 존재.
효율성을 높이기 위해 블록들을 묶어서 클러스터라는 단위로 만들기도 한다.
- 파일 시스템 I/O가 대표적
- 효과적으로 I/O가 순차적인 접근을 할 수 있게 한다.
일부 운영체제는 특정 프로그램이 파일 시스템 자료구조 없이도 파티션을 논리 블록의 대용량 순차 배열처럼 사용할 수 있게 만들어 줌.
이 배열을 raw 디스크라고 하며, 이에 대한 I/O를 raw I/O라고 함.
- ex. 일부 데이터베이스 시스템은 각 레코드가 저장되는 정확한 위치를 제어할 수 있기 때문에 raw I/O를 선호
- raw I/O는 모든 파일 시스템 서비스를 우회함.
- RAW 파티션에 자체 전용 저장장치 서비스를 구현할 수 있다면 더 효율적이지만, 대부분의 앱들은 제공된 파일 시스템을 사용.
부트 블록
부트스트랩 로더 (bootstrap loader): 컴퓨터의 전원을 켜거나 재부팅할 때와 같이 컴퓨터가 실행을 시작하기 위해 실행되는 초기 프로그램
✔ 작은 부트스트랩 로더 프로그램은 보조저장장치에서 완전한 부트스트랩 프로그램을 가져온다.
✔ 완전한 부트스트랩 프로그램은 장치의 고정된 위치에 있는 '부트 블록'에 저장된다.
- 부트 디스크 / 시스템 디스크: 부트 파티션이 있는 장치
✔ 부트스트랩 NVM의 코드는 저장장치 컨트롤러에게 부트스트랩 프로그램을 메모리에 올리도록 지시하고, 그 프로그램의 수행을 시작한다.
- MBR (master boot record): 하드 디스크의 첫 번째 논리 블록 또는 NVM 장치의 첫 번째 페이지부트 코드와 파티션 테이블이 들어 있다.어떤 파티션이 부트되어야 하는가에 대한 표시가 같이 되어 있다.
✔ 부팅은 시스템 펌웨어에 상주하는 코드를 실행하여 시작하고, 이 코드는 시스템이 MBR에서 부트 코드를 읽도록 지시한다.
손상된 블록
디스크는 움직이는 부품들이 있고 매우 정밀하므로 고장나기 쉽다.
어떤 경우는 공장에서 출고될 때 이미 손상 블록을 가지고 나올 수도 있다.
손상된 블록들은 디스크와 컨트롤러에 따라 다양한 방법으로 처리될 수 있다.
✅ 섹터 예비 (sector sparing) 또는 섹터 포워딩 (sector forwarding)
✔ 컨트롤러는 손상 블록의 리스트를 유지한다.
✔ 리스트는 공장에서 저수준 포맷하는 동안 초기화되고, 디스크가 사용되는 동안 계속 유지된다.
✔ 저수준 포맷팅은 OS가 볼 수 없는 예비 섹터를 남겨 놓고, 컨트롤러는 이러한 예비 섹터 중 하나를 손상된 섹터와 교체시킬 수 있다.
❓ 손상된 섹터를 예비 섹터로 교체했을 경우, 논리적 블록이 요청될 때마다 변경된 새로운 섹터 주소로 가게 됨!
✅ 섹터 밀어내기 (sector slipping)
✔ 블록 17에 결함이 생겼고, 첫번째 예비 섹터가 202 다음에 있다고 할 때, 17부터 202까지 모든 섹터를 재매핑시킨다. (한칸씩 이동)
➡ 섹터 202는 예비 섹터로 복사되고, 201은 202로, 200은 201로,,,
✅ 연성 에러 (soft error)
손상된 블록 데이터를 복사하고 예비 블록으로 대체할 수 있는 경우
✅ 경성 에러 (hard error)
데이터를 잃게되는 경우이며, 손상된 블록 내용은 백업으로부터 가져와야 하는 등 사람의 개입이 필요하게 된다.