Gentoo 설치를 통해 보는 리눅스 시스템의 기본 개념들 1 - 파티션과 파티션 테이블

익명 사용자의 이미지

들어가는 말

몇 편의 글이 될지 모르겠습니다. Gentoo 설치 과정을 통해 알아야 할, 그리고 다른 배포판의 설치 및 사용에도 도움이 되는 기본 개념들이 있습니다. 나름대로 이해한 바를 기록으로 남겨 보려고 합니다.

저는 전문적인 시스템 관리자나 SRE가 아닙니다. 그분들에 비해서 시스템에 대한 이해나, 소위 hand on knowledge가 훨씬 떨어집니다. 그냥, 개인적으로 리눅스를 10년 이상 사용한 소프트웨어 엔지니어 입장에서 쓰는 글입니다. 제가 해본 건 간단한 개인 서버나 전혀 scalable할 필요가 없는 대학원 연구실 랩 서버 정도입니다.

리눅스를 당장 써야 하겠는데 거기에 들일 시간은 별로 없으신 분들도 있을 겁니다. 이 글은 그런 분들에게는 적합하지 않을 것 같습니다. 대신 VirtualBox를 추천하겠습니다.

대충 컴퓨터를 어느 정도 아시는 전자공학/소프트웨어 전공 학생이나 엔지니어 정도가 듣고 있다고 생각하겠습니다. 어떤 분들께는 글의 내용이 과하게 친절할 텐데, 막상 제 석사 랩의 동료, 선후배 생각해 보니 과하게 친절한 게 낫겠더군요.

아래 gentoo handbook에 대한 자유로운 주석이라고 생각하셔도 좋습니다. https://wiki.gentoo.org/wiki/Handbook:AMD64

그리고 저는 어떤 것을 이해할 때 처음부터 완전히 정확한 내용을 알 필요는 없다고 생각합니다. 그렇게 하기도 어렵고요. 처음에는 부정확하더라도 다음에 좀더 옳은 다음 방향으로 나아가게 해주는 어떤 아이디어를 갖는 게 중요하다고 생각합니다. 이 글도 그런 관점에서 쓰겠습니다.

디스크 준비

이 챕터의 목표는 파티션, 파일시스템, 그리고 파티션 테이블을 이해하는 것입니다. 이건 리눅스를 설치하기 위한 디스크 준비에 거의 필수적인데, 특히나 윈도우즈가 기설치된 시스템에 리눅스를 설치, 멀티 부팅으로 둘다 native로 돌리려고 한다면 어떤 배포판을 쓰시더라도 아는 것이 좋습니다.

디스크

첫 글은 디스크 준비에 관한 것입니다. 디스크에 대해선 얘기하지 않겠습니다. 다들 아실 테니까요. 다만 메모리처럼 디스크도 일종의 주소가 있다는 것만 얘기해 두죠. 메모리는 각 주소마다 1 바이트가 들어갑니다만, 디스크는 각 주소마다 훨씬 큰 사이즈가 들어간다고 해두겠습니다. 설명 편의상 512바이트라고 해두죠.

파티션

디스크 분할

파티션은 일단은 C 드라이브나 D 드라이브가 파티션이라고 해두겠습니다. 파티션은 한국어로 분할된 구획 정도의 의미인 것 같습니다. 아닌 게 아니라 250gb 짜리 디스크 하나도 둘로 쪼개어 하나는 C 드라이브 삼아 윈도우즈를 깔고, 다른 하나는 D 드라이브로 만들어 데이터를 저장하기도 합니다.

파티션을 왜 만들까요? 혹은 어디에 좋은가요? 아마 디스크는 하나지만 C 드라이브를 포맷해도 D 드라이브에 있는 데이터는 살릴 수 있기 때문이라고 대답하실 수 있겠습니다.

이게 리눅스 설치에서도 비슷하게 적용됩니다. 윈도우즈든 리눅스든, 한 OS는 기본적으로는 자기가 한 드라이브 (윈도우즈는 흔히 C죠)를 독점한다고 생각합니다. 그러면서 필요한 파일과 폴더들을 제멋대로 만들고 지우고 그 내용과 속성을 변경합니다. 리눅스와 윈도우즈가 한 파티션을 공유한다면 일단 문제가 생기겠죠. 예컨대 리눅스가 쓴 파일이나 디렉토리 전체를 윈도우즈가 날려버릴 수도 있겠습니다. 윈도우즈용 응용, 리눅스용 응용 프로그램들도 마찬가집니다. 각자 OS한테 디스크를 변경해도 좋은지 물어보는 셈이거든요.

그게 유일한 이유는 아니지만 그거 때문에라도 리눅스를 설치하신다면, 최소한 리눅스 파티션 하나가 필요합니다. 우분투와 젠투를 설치한다면 두 개가 필요합니다. 윈도우즈와 우분투, 젠투라면 세 개가 필요하죠.

저는 가끔 이런 질문을 주위에서 받았습니다. C 드라이브 총 용량 (저장 가능한 용량, capacity죠)이 300기가이고 50기가만 썼는데 그 나머지 250기가 안에 리눅스를 설치할 수 없겠느냐고요. 일반적으로는 어렵습니다. 리눅스는 파티션 하나, 그러니까 드라이브 하나를 독점해야 하는데, C 드라이브에 빈 공간이 있다고 윈도우즈가 그걸 앞으로도 영원히 쓰지 않으리라는 보장은 없습니다.

디스크가 300기가고 C 50, D가 250기가 먹고 있는데 그럼 리눅스 설치가 안 되는 거냐, 좋은 질문입니다. 안 됩니다. 이 경우는 D가 좀 커보이니까 D 드라이브의 크기를 150기가로 줄인 다음, 어떤 파티션도 차지하고 있지 않은 디스크 상의 free space 100기가 바이트에 새 파티션을 만들어 리눅스에게 주어야 합니다.

OS마다 최소 한 파티션을 먹는다고 말씀드렸습니다만, 그건 OS마다 단 하나의 파티션만 먹는다는 얘기는 아닙니다. 자세한 얘기는 뒤에서 부팅 얘기할 때 하겠습니다. 보통 윈도우즈가 만드는 파티션의 개수에다 리눅스도 약간의, 대체로, 작은 파티션들이 추가로 필요할 수 있습니다.

일단은 윈도우즈 1개 이상, 리눅스마다 1개 이상의 파티션이 필요하다고 해두겠습니다.

파일 시스템

파티션의 역할 중 하나는 다른 파티션과 선을 그어주는 것입니다. 이건 우리도 일상-윈도우즈 생활을 통해 잘 압니다. 그것 뿐일까요? 그럴 리는 보통 없겠죠.

이제 약간 더 깊게 들여다 봅시다. 제게 3기가 짜리 파일이 하나 있다고 해보겠습니다. 이걸 하드 디스크에 저장하고 싶습니다. 말씀드렸듯 하드 디스크는 주소로 접근하고, 각 주소마다 512 바이트 짜리 저장 공간이 있습니다.

어떻게 저장할까요? 제일 소박한 방법은 그냥 3기가 이상 비어 있는 공간을 찾아서 3기가 짜리 파일을 거기에 연속적으로 저장하는 것입니다. C 드라이브 공간을 15기가로 정했다고 해봅시다. 파일을 C에 저장하면, 이 3기가는 당연히 이 15기가 내에 들어가겠죠. 그런데, C의 몇 번지부터 이 파일이 들어가 있을까요? 쓰긴 쓰는데, 나중에 다시 읽을 때는 어디 가서 찾나요?

한 가지 방법은 C의 첫 주소에 있는 512 바이트에는 사용자의 데이터 대신 일종의 메타 정보를 담은 테이블을 만드는 겁니다. 예컨대 거기 가보면 파일들의 목록과, 각 파일의 시작 주소 및 크기가 적혀 있는 거죠.

OS든 뭐든 디스크에서 파일을 읽어오는 코드는 파일 목록에서 해당하는 엔트리를 찾아서 거기 적힌 주소를 보고 그리로 가서, 아까 봤던 크기만큼 읽어오면 될 겁니다.

이런 방법은 현실에서 아마 안 쓰일 겁니다. 쓰인다면 시스템 소프트웨어 과제를 하는 학부생의 프로젝트겠죠. 왜 안 쓰는지, 문제가 너무나도 많지만, 중요한 건 문제가 많아서 안 쓰인다는 거니까 한 가지만 예로 들어보죠. fragmentation 입니다.

예컨대, 저 15기가 중에 5기가 짜리 파일, A, B, C를 세 개 차례로 썼다고 합시다.

 [ A(5G) | B(5G) | C(5G) ]

위와 같은 상태겠죠. 여기서 A와 C를 삭제합시다. 그럼 10GB의 용량이 남습니다. 이 상태에서 3G 짜리 파일을 세 개 넣어보죠. 아마 두 개밖에 못 넣을 겁니다. 총 용량은 충분함에도 불구하고 연속된 3G 짜리 공간 세 개는 안 나오니까요.

이런 문제를 해결하는 기본적인 방법은 파일을 잘게 쪼개어 굳이 연속된 공간에 넣지 않고 흩어서 넣는 것일 수 있습니다. 예컨대 매 파일을 1G 단위로 쪼개서 넣을 수 있다면, 이제는 3G 짜리 파일 세 개를 문제없이 넣을 수 있습니다.

문제는 이 경우에, 테이블의 크기를 증가시키지 않는다고 가정하면, 어떻게 첫 번째 조각 이외의 것을 찾느냐는 거겠죠. 첫번째의 위치야 테이블에 적으면 되구요. 전엔 그냥 시작 주소 가면 크기만큼 다 들어 있었는데, 이젠 일부밖에 없죠.

흔히 생각할 만한 방법은 이런 걸 겁니다. 파일 조각마다 작은 메타 데이터를 붙여서, 이를테면 기본적으로 다음 조각이 있는지, 있다면 위치는 어디인지 적어놓습니다. 링크드 리스트 비슷하죠.

뭐가 되었던 간에 파일을 디스크에서 읽는 프로그램은 먼저 테이블 가서 첫 조각을 찾고, 첫 조각에 붙어 있는 메타 정보에서 두 번째 조각의 위치를 읽은 뒤, 거기로 가서 두번째 조각을 찾습니다.

요컨대 파일을 어떻게 저장하고 읽고 관리하는지에는 여러 가지 방법이 있을 수 있습니다. 역사적으로도 여러 가지 방법이 있었고, 예전에 만들어 놓은 것도 지원해 줘야 할 때도 있고, 어떤 방법이 절대적으로 최적이지도 않습니다.

파일 시스템은, 거칠게 말해, 파일을 디스크에서 어떻게 읽거나 저장하고 관리할지를 정의하는 룰입니다. 이런 약속에 맞추어 파일을 디스크로부터 읽거나 디스크에 쓰는 OS 루틴이 구현되어야겠죠. 약속이 다르다면 코드도 다르게 구현됩니다.

이런 약속, 파일시스템의 종류 중 익숙하실 만한 게 NTFS랑 FAT일 테고, 리눅스는 주로 EXT2, EXT3, EXT4 같은 것들을 전통적으로 흔히 씁니다. 왜 윈도우즈에는 뭘 갖다 꽂아도 다 되느냐, 나는 이런 복잡한 거 전에는 몰랐다고 항변하실 수도 있겠습니다.

왜냐하면, 그 "뭘 갖다 꽂는" 종류는 한계가 있습니다. FAT라거나 NTFS가 대부분일 거에요. 그리고 그건 다들 자주 쓰이는 파일 시스템이라서 윈도우즈에 구현되어 있습니다. 리눅스에서 ext4로 포맷한 외장 하드를 윈도우즈 7에 꽂으면 아마 다른 경험을 하실 겁니다. 혹은 구글 같은 데서 쓰는 워크 스테이션이나 데이터 센터 컴퓨터에서 디스크를 뽑아다 윈도우즈에 꽂아도 아마 생각대로 안 될 겁니다.

파일 시스템 별로, 그 파일 시스템 방식을 통해 디스크에서 뭘 읽고 쓰는 프로그램의 코드가 약간씩 달라야 한다는 말씀은 드렸습니다.

그게 다가 아니고, 디스크 자체에도 파일 시스템 별로 뭔가 메타 데이터가 적혀 있어야 합니다. 예컨대 제가 3분만에 고안한 저 말도 안 되는 두 가지 파일 시스템의 경우엔 각 파티션의 첫 주소 512 바이트 내에 파일 이름, 크기, 시작 주소가 적힌 테이블이 있어야 합니다. 불행히도 제 파일 시스템은 처음에는 별로 테이블에 적힐 내용이 없는 것 같은데, 실제 파일 시스템들은 초기화가 될 때에도 적히게 되는 메타 정보들이 있습니다.

이게 포맷이 하는 일이라고 생각하셔도 당분간은 될 것 같습니다. 디스크를 처음 사면 아무 것도 안 적혀 있거나 (다른 말로 0만 잔뜩 적혀 있거나) 쓰레기값이 들어 있습니다. 파티션을 나눠서 포맷을 하면, 무슨 파일-주소 테이블 같은 메타 정보가 적히게 됩니다. 예컨대 NTFS로 포맷을 하면 거기에 맞는 메타 정보가 그 파티션에 대응되는 디스크 상의 해당 주소에 적히게 되고, 향후 윈도우즈가 그걸 읽으면 이 파티션이 NTFS라는 가정을 하며 필요한 일들-파일 쓰기, 읽기, 속성 변경 등-을 정확히 할 수 있게 됩니다.

OS 설치

OS 설치의 대부분은 저수준에서 보면 그냥 적절한 파일들을 파티션에 써주는 것입니다. 아닌 부분도 있지만 일단 그렇다고 생각합시다.

OS별로 파티션을 만들어 줘야 한다고 했습니다. 이건, 일단 free space가 없었다면 짜내고, 짜낸 공간은 포맷을 해서 파티션을 만들어 준다는 의미일 겁니다.

지금까지 리눅스와 윈도우즈는 각각 하나의 파티션이 필요하다는 식으로 얘기했습니다. 그리고 윈도우즈는 NTFS 파일 시스템을, 리눅스는 EXT4를 일반적으로 선호합니다.

따라서 윈도우즈와 우분투, Gentoo 세 개를 설치한다면, NTFS, ext4, ext4 세 개의 파티션이 필요합니다.

파티션 테이블

이제 GPT니 MBR 테이블에 관해 얘기해 보겠습니다. 이게 도대체 뭐고 왜 필요할까요?

우여곡절 끝에 제 2TB 디스크 안에 윈도우즈, 우분투용 ext4, 젠투용 ext4, 세 개의 파티션을 집어넣어 놨습니다. 윈도우즈는 디스크의 시작 주소부터 들어 있다고 가정하기로 하죠. 우분투용 파티션이 어디서 시작하는지 어떻게 알아야 하나요? Gentoo는 어디 있습니까? 아니, 그 이전에, 컴퓨터가 대체 어떻게 파티션이 몇 개 들어 있는지 알게 될까요?

예를 들어 부팅이 시작되어 이제 윈도우즈든 우분투든 커널을 찾아 메모리에 올려줘야 하는데 커널은 커녕 커널이 들어 있는 파티션이 어디서 시작하는지는 어떻게 찾나요?

흔히 생각할 만한 방법으로는 디스크의 약속된 장소, 그러니까 앞쪽 몇 개의 주소 안에다가 메타 정보를 기록하는 게 있겠습니다. 예컨대 무슨 무슨 파티션이 있고 어디에서 시작되고 크기가 어느 정도 된다는 정보를 적습니다. 그 정보를 파티션 테이블이라고 부릅니다.

네, 당연하게도 파티션 테이블을 만드는 방식이 과거부터 현재, 그리고 미래에 걸쳐 영원토록 단 한 가지만 있지는 않을 겁니다. PC에서 많이 쓰이는 방식은 MBR이라고 불립니다. 이거는 Master Boot Record의 약자인데, boot라는 말이 있죠? 부팅에도 MBR 방식이 있어서 사람을 더 헷갈리게 만듭니다.

부팅에 관련된 부분, 왜 부팅도 이것도 MBR이라고 불리우는지는 다음 글에서 얘기하기로 하겠습니다. MBR 방식은 비교적 단순합니다. MBR은 하드 디스크의 첫 주소에 들어 있는, 대충 512 바이트 크기의 공간입니다. 거기에 그냥 뭐가 있고 어디에 있는지 적어 둡니다. 그러니까 관심이 있는 사람, 아니 프로그램은 무조건 일단 첫 주소로 가서 약속된 위치에서 약속된 크기를 읽은 다음, 그걸로 파티션들이 어디에 있고 무슨 타입인지 파악하죠.

역사적으로 MBR에 들어가는 파티션 테이블은 32비트 주소를 사용했습니다. 2의 32승 곱하기 주소당 용량 크기가 MBR이 표현 가능한 전체 디스크의 크기겠네요. 이게 대충 2TB 정도 됩니다. 제 기억으로 2TB 하드 디스크가 최소한 2000년대 중반엔 없었던 것 같습니다. 지금은 제 디스크가 3TB고 이게 비싸지도 않습니다.

그밖에도 MBR에 파티션 테이블을 적던 과거의 방식은 이래저래 문제가 있습니다. 주 파티션이 네 개까지밖에 안 된다거나 등등...

그래서 새롭게 나온, 혹은 쓰이기 시작한 게 GPT라는 방식입니다. 리눅스 설치를 하면서 디스크를 준비할 때, 특히나 Gentoo는 직접 어느 쪽인지를 정해주거나, 이미 정해져 있다면 (윈도우즈가 설치되었다면 윈도우즈가 정합니다) 그게 뭔지를 알아야 합니다.

따라서 순서는, 일단 디스크에 파티션 테이블이 이미 없다면 만들어 줍니다. 다음에는 파티셔닝이 이미 되어 있다면 좀 변경하고 안 되어 있다면 from the scratch로 만들어 줍니다. 그 결과는 보통 디스크 안에 파티션 테이블, 그리고 윈도우즈, 리눅스 각 1개 이상의 파티션들이겠죠.

한 가지 더 짚자면, 파티션 테이블은 디스크마다 하나씩 있습니다. 왜일까요? 디스크가 두 개라고 생각해 봅시다. 파티션 테이블을 1번 디스크에만 넣습니다.

이랬을 경우, 2번 디스크가 외장이거나, 내장이라도 디스크를 분리해서 다른 컴퓨터에 끼운다면, 그 다른 컴퓨터에서 도는 무슨 프로그램이든 간에 이 디스크의 파티션 상태를 어떻게 알 수 있을까요?

따라서 파티션 테이블은 보통의 경우 디스크 별로 하나씩은 들어가게 됩니다.

여러 OS를 설치할 계획인데 디스크가 하나가 아니라면 디스크마다 파티션 테이블을 만들어 줘야 합니다.

프로그램

파티션이나 포맷은 결국 디스크를 저수준에서 변경하는 것입니다. 약속과 규격이 있는 만큼 구현이 극도로 어렵지는 않을 겁니다. 다만 한 가지 문제가 있습니다.

현재 OS가 사용 중인 파티션의 사이즈 변경을 시도하면 어떻게 될까요? 안 되거나 위험 부담이 있습니다. 자기 파티션에 변경을 가하는 중에 자기가 의존하는 중요한 파일이 순간적으로나마 변경될 가능성이 있으니까요.

마찬가지로 자기 파티션이 있는 디스크의 파티션 테이블을 건드리는 것도 종류에 따라 위험할 수 있습니다. 특히나 "새 파티션 테이블을 생성"하면 그럴듯한 일이 벌어질 것 같은데 저는 상상만 해봤습니다. 물론 free space에 새 파티션을 만들고 기존 파티션 테이블에 업데이트를 하는 정도는 보통 괜찮겠죠. 혹은 다른 파티션의 사이즈를 줄이거나 늘이는 것도 안전할 겁니다.

가장 좋은 건, 아예 파티션을 나누고 파티션 테이블이 변경되는 디스크에 의존하지 않는 OS와 프로그램에서 이런 일을 하는 거겠죠.

대표적인 예는 USB 스틱에 들어 있는 소위 리눅스 설치 USB/CD입니다. 대부분 설치없이 사용이 가능하죠. 이게 왜 그런가는 나중에 다른 글에서 설명하겠습니다.

그래서 디스크 준비의 첫 스템은 리눅스 라이브 USB 제작이기 쉬운데, 저는 우분투 스틱을 씁니다. 만들기 쉽고 만드는 툴도 여기저기 잘 나와 있거든요.

다음 글에서는 부팅 과정을 묘사하겠습니다. 이 부팅 방식에 따라 파티션을 구체적으로 몇 개 만들어야 하는지 결정되므로, 오늘 얘기도 거기 가서 마무리 하겠습니다. 일종의 케이스 스터디로 윈도우즈가 설치된 500기가 짜리 랩탑에 Gentoo를 설치하기 위해 부팅과 파티션을 어떻게 설정하는지도 거기 가서 이야기 하죠.

Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.