이번 포스팅에서는 Mass Storage 챕터의 나머지 부분들을 다뤄보려고 한다.
디스크에 저장된 데이터가 올바른지 검증하고 에러가 있다면 이를 수정하는 작업이 필요하다. 저장장치에 저장된 데이터가 손실되었다면 프로세스의 작동이 올바르지 않을 것이기 때문이다.
예를 들어서 한 개의 bit가 flipping 되었다면, 이를 어떻게 확인할 수 있을까?
Parity bit는 실제 데이터에 1 bit가 몇개 존재하는 지를 확인할 수 있는 추가 비트이다. 정확히 말하면, 원본 데이터의 1 bit 개수가 짝수인지 홀수인지를 저장한다. 1 bit가 짝수개라면 parity bit 는 0이고, 홀수인 경우에는 parity bit에 1이 저장된다.
따라서 데이터를 체크해봤는데 1의 개수가 3개인데, parity bit가 0이라면, 하나 이상의 비트에 에러가 생겼음을 알 수 있다.
00010000 ( Parity = 1 ), 00111100 ( Parity = 0 )
하지만, 2개 이상의 bit flipping이 발생한 경우에는 parity bit로는 에러를 발견하지 못할 수도 있다.
HDD를 사용하기 전에 우리는 HDD를 사용할 수 있는 상태로 만드는 과정이 필요하다. 이것을 Formatting 이라고 부른다. 매우 익숙한 단어인만큼 바로 설명해보도록 하겠다.
물리적 포맷은 하드 디스크를 섹터 단위로 분할하는 것을 의미한다. 즉, 공장에서 디스크를 생산해서 출하할 때 거치는 과정이다. HDD는 데이터를 읽고 쓰는 단위가 sector로 이루어져 있다고 했다. 따라서 물리적 포맷 과정에서 디스크를 섹터 단위로 분할하면서 디스크를 사용자가 사용할 수 있는 상태로 만드는 것이다.
논리적 포맷은 흔히 우리가 아는 포맷을 의미한다. 논리적 포맷에서는 디스크에 파일 시스템을 만들게 되는데, 파일 시스템이란 OS가 파일을 저장하고 관리할 수 있는 데이터 구조를 의미한다.
우리는 디스크를 효율적으로 사용하기 위해서 partition 이라는 것을 할 수 있다. 파티션이란 디스크를 하나 이상의 논리적인 디스크 (파티션)으로 나누는 것을 의미한다. 파티션을 수행함으로써 우리는 여러 운영체제를 이용할 수도 있고, 파일 관리를 더욱 효율적으로 할 수 있다.
파일 시스템을 더 효과적으로 사용하기 위해 파일 시스템을 하나의 그룹으로 묶어 cluster 라는 단위로 활용한다. File의 입출력은 클러스터 단위로 이루어진다.
지금부터는 루트 파티션에 대해서 알아볼 것이다.
root partition 이란, OS 자체가 저장되어 있는 파티션으로 boot time에 자동으로 마운트 된다.
mount?
마운트란 사용할 수 있는 상태가 된다는 의미로, 위에서는 OS가 root partion에 마운트되면서, OS가 부팅 시에 자동으로 사용할 수 있는 상태가 된다는 것이다.
- 이것과는 다르게 파일 시스템에서의 마운트도 있는데, 파일을 읽기 전에 먼저 열어야 하는 것처럼, 파일 시스템도 사용하기 전에 먼저 마운트되어야 한다. 따라서, 프로세스가 파일 시스템을 요청하기 전에 OS 가 올바른 마운트 포인트(디렉토리)에 파일 시스템을 마운트하여야 한다.
파티션을 마운트 할 때, OS는 해당 파티션의 파일 시스템에 대한 일관성 검사를 수행한다. 이 과정에서 파일의 메타 데이터가 손상되지 않았는지 확인하는 과정이 수행된다.
지금부터는 컴퓨터 부팅 시에 어떤 동작들이 일어나는지 알아볼 것이다.
디스크에서 OS가 어떻게 실행되는지, 디스크의 어떤 파티션으로부터 시작되는지 등에 대해서 살펴볼 것이다.
하지만 그전에 알아야 하는 단어들이 몇 가지 있다.
BIOS (Baisc Input/Output System)
바이오스는 OS 중 가장 기본적인 소프트웨어이자 컴퓨터의 입출력을 처리하는 펌웨어이다. 메인보드에 내장되어 있으며, 사용자가 컴퓨터를 켜면 처음 시작되는 프로그램으로 주변 장치(하드웨어)와 OS 사이의 데이터의 흐름을 관리한다.
MBR (Master Boot Record)
: MBR은 하드디스크의 첫 번째 섹터에 위치한 특수 영역으로, 부트 코드와 파티션 테이블을 저장한다. 부트 코드는 부트 로더를 실행하는데 필요한 코드이며, 파티션 테이블은 하드 디스크를 여러 파티션으로 나누고 각 파티션의 유형, 크기, 위치 정보를 저장한다.
Boot block
: 부트 블록은 디스크의 부트 파티션에 저장된 특수한 영역이다. 부트 블록에는 컴퓨터 시스템을 부팅하기 위한 이미지와 정보들이 저장되어 있다. 또한 bootstrap 프로그램의 위치를 저장하고 있다.
Boot Strap
: 부트스트랩 프로그램은 하드디스크로부터 운영체제 커널을 로딩하는데 필요한 최초의 작은 프로그램이라고 할 수 있다. 부트스트랩은 NVM 플래시 메모리의 펌웨어와 부트 블록에 저장되어 있다.
부트 프로세스를 효율적으로 하기 위해 부트 스트랩을 나누어서 저장하는 것이다.
이제부터 컴퓨터의 부팅 과정에 대해서 설명하겠다.
사용자가 전원을 인가하면 제일 먼저 실행되는 것은 바이오스이다. 바이오스가 하드웨어를 초기화하고 MBR의 부트 코드를 실행하는데, 부트 코드가 부트 파티션의 부트 블록을 실행한다. 부트 블록은 부트 로더를 실행하고 부트 로더가 부트 스트랩 프로그램을 실행한다. 이후 부트 스트랩이 커널을 로드하고 운영체제를 실행하게 된다.
등장하는 단어가 전부 비슷해서 헷갈릴 수 있는데, 대충 흐름만 이해해도 괜찮을 것 같다.
아래 그림은 윈도우의 부팅 과정이다.
Redundant Array of Inexpensive Disks (RAID) 란, 여러 개의 하드 디스크 드라이브를 하나의 논리적 장치로 결합하는 것을 말한다. RAID 형태를 통해 안정성을 확보할 수 있는데, 이유는 뒤에 설명하겠다.
Muiltiple Disks vs RAID
그러면 그냥 디스크를 여러 개 쓰는 거랑 뭐가 달라?
아래의 이미지를 보면 차이점이 보일 것이다.
RAID 를 이용하면, 여러 개의 디스크를 하나의 큰 디스크로 접근할 수 있다는 것이다. 단순히 여러 개의 디스크를 쓰는 것과는 다르다.
RAID 에도 여러 방식이 있다. 디스크를 어떠한 형태로 결합하느냐에 따라 안정성이 높아질 수도 있고, 성능이 좋아질 수도 있다.
RAID 0은 striping 기술을 활용하는 RAID 방식이다.
A1과 A2를 동시에 접근할 수 있으므로 하나의 디스크를 읽을 시간에 두개의 디스크를 읽는 것이 가능하다. 따라서 RAID 0을 활용하면 성능을 높이는 것이 가능하다.
RAID 1 에서는 mirroring 기술을 활용한다. 미러링이란 이름 그대로 하나의 디스크 정보를 추가적으로 다른 디스크에 중복 저장하는 기술이다. 이는 디스크에 에러가 나서 데이터 손실이 발생하는 것을 방지하기 위함이다. 하나의 디스크에 결함이 발생해도 다른 디스크의 데이터에는 영향이 없기 때문이다.
RAID 1 + 0 은 데이터를 먼저 미러링한 후에 스트라이핑을 적용하는 것이다.
반대로 데이터를 먼저 스트라이핑 한 후에 미러링을 적용한다.
RAID 0 + 1은 하나의 디스크에 결함이 생기면 함께 스트라이핑 된 디스크도 같이 읽을 수 없다. 데이터가 2개의 디스크에 연속적으로 저장되어 있기 때문.
하지만 RAID 1 + 0은 하나의 디스크에 결함에 생겨도 다른 디스크 혹은 RAID 에 영향을 미치지 않으므로 더 높은 유연성을 가졌다고 할 수 있다.
RAID 4,5,6은 error detection을 위해 parity bit를 별도로 저장하는 방식이다.
RAID 4 는 parity 비트를 별도의 디스크에 모아서 저장하고 관리하는 것이다. 하지만 이렇게 되면 해당 parity 디스크에 부담 증가할 수도 있다.
따라서 RAID 5 에서는 parity 비트를 여러 개의 디스크에 분산 시켜서 저장한다.
RAID 6 는 안전성 향상을 위해 parity 비트를 다중화하여 저장한다.