열렬히.뛰기

5. 저장장치 관리

운영체제 > part 5 : 저장장치 > 공룡책 11장 : 대용량 저장장치 > 5. 저장장치 관리

운영체제가 책임져야 할 저장장치의 관리 항목.

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

저수준 포매팅

새로운 저장장치를 받았다고 보자.

이는 아무런 정보가 없는 판이거나 초기화되지 않은 반도체 저장 셀의 집합이다.

  • NVM 페이지는 초기화되어야 하고, FTL이 생성되어야 한다.

이를 저수준 포매팅 또는 물리적 포매팅이라고 한다.

  • 각 저장장치 위치마다 특별한 자료구조로 장치를 채운다.
  • 섹터/페이지를 위한 자료구조 : 헤더, 자료구역, 트레일러
    • 헤더/자료구역 : 섹터/페이지 번호 & 오류 탐지 및 수정 코드와 같은 컨트롤러가 사용하는 정보 담음.
  • 이미 공장에서 되어 나온다.
    • 디스크 품질을 검사할 수 있고, 논리적 블록 주소를 손상되지 않은 섹터/페이지에게 할당 가능
    • 섹터 크기를 미리 지정 가능. 크기가 커지면 트랙 당 섹터 수가 줄지만 헤더와 트레일러가 차지하는 공간이 줄어들게 되어 사용자 데이터를 위한 공간이 늘어나게 됨.

파티션, 볼륨, 논리적 포매팅

드라이브를 사용하여 파일을 보유하려면 운영체제가 여전히 자체 데이터 구조를 장치에 기록해야 함.

이 과정을 3가지; 파티셔닝, 볼륨 설정, 논리적 포매팅으로 나눔.

  1. 파티셔닝

    • 장치를 하나 이상의 블록 또는 페이지 그룹으로 파티션하는 것
    • 운영체제는 각 파티션을 별도의 장치인 것 처럼 취급 가능
      • 어떤 파티션은 운영체제의 실행 가능 코드 사본을,
      • 다른 파티션은 스왑 공간을, 또 다른 파티션은 사용자 파일을 관리…
    • 리눅스의 fdisk 명령이 대표적인 파티션 관리 명령어

    파티션의 순서는 다음과 같다.

    1. 운영체제에서 장치를 인식해 파티션 정보를 읽음.

    2. 파티션에 해당하는 장치 항목을 설정한다. (/dev에 있음)

    3. 구성파일은 운영체제에 파일 시스템을 포함하는 각 파티션을 지정된 위치에 마운트.

      마운트 시 사용자가 그 파일 시스템을 사용할 수 있음.

  2. 볼륨 생성 및 관리

    볼륨 = 마운트 가능한 모든 파일 시스템. 또는 파일 시스템을 포함하는 파일

    파일 시스템이 파티션 내에 직접 배치된다면 이 과정은 암묵적으로 이뤄짐.

    그렇지만, 필요 시에는 명시적으로 해당 과정이 필요할 때가 있음.

    • 여러 파티션이 RAID 집합으로 함께 사용되고, 그 위에 하나 이상의 파일 시스템이 분산되어 있는 경우

    리눅스의 볼륨 관리자 lvm2가 대표적인 볼륨 생성 기능 제공.

    ZFS는 볼륨 관리와 파일 시스템을 묶어 하나의 명령과 기능 집합으로 제공.

  3. 논리적 포매팅 (파일 시스템의 생성)

    운영체제가 초기 파일 시스템 자료구조를 장치에 저장.

    • 자료구조 = 가용공간, 할당된 공간의 맵, 초기의 빈 디렉토리

파티션 정보는 부팅 가능한 파일 시스템이 포함되어 있는지도 나타냄.

  • 부팅 가능으로 표기된 파티션 = 파일 시스템의 루트를 설정하는데 사용됨
  • 마운트 되면 모든 다른 장치 링크와 해당 파티션이 생성될 수 있음.
    • 윈도우 : 문자를 사용해 각각 이름이 붙여짐
    • 리눅스 : 부트 파일 시스템이 마운트 → 해당 트리 구조 내에 다른 파일 시스템 존재.

효율성을 높이기 위해 블록들을 묶어서 클러스터라는 단위로 만들기도 한다.

  • 파일 시스템 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)

데이터를 잃게되는 경우이며, 손상된 블록 내용은 백업으로부터 가져와야 하는 등 사람의 개입이 필요하게 된다.