Gentoo 설치를 통해 보는 리눅스 시스템의 기본 개념들 2 - 부팅과 파티션

Stephen Kyoungwon Kim@Google의 이미지

부팅과 부팅까지 고려한 파티션

부팅

모든 컴퓨터 소스 프로그램은 궁극적으로 기계어로 번역되어 수행됩니다. 기계어는 각각이 2진수입니다. 이런 기계어들의 집합인 프로그램을 메모리에 올라가야만 수행될 준비가 됩니다. 간단히 말해 각 기계어는 거대한 Finite State Machine 안으로 들어가는 제어 신호 입력입니다.

대부분의 컴퓨터 아키텍쳐에서는 이 기계어들이 메모리에 올라와 있어야 수행이 가능합니다. 리눅스로 부팅을 한다, 이게 무슨 말이냐면, 결국 리눅스 커널을 메모리상에 올리고, 온갖 종류의 프로그램들이 궁극적으로는 리눅스 커널의 허가와 협조를 통해 순차적으로 메모리 상에 올라와 수행된다는 의미입니다. 윈도우즈로 부팅을 한다, 이것 역시 윈도우즈 커널이 메모리에 올라가고, 역시 온갖 종류의 윈도우즈 프로그램이 메모리에 결국은 올라가서 수행된다는 의미이구요.

어차피 올라갈 거, 그냥 올려 놓으면 좋을 수도 있겠는데 불행히도 메모리는 휘발성입니다. 컴퓨터를 끄면 내용이 저장되지 않습니다. 아마 영구적으로 저장 가능한 장치는 비싸고 작거나, 크고 싸지만 느리거나 둘 중 하나겠죠.프로그램들이나 커널조차도 제법 큽니다. 그래서 보통은 이런 것들은 싸고 느리고 영구적인 저장 장치에 저장되는데, 그게 디스크입니다.

거듭, 리눅스 커널을 메모리에 올리는 게 리눅스로 부팅을 하는 거고, 윈도우즈 커널을 올리는 게 윈도우즈로 부팅을 하는 겁니다. 둘다 디스크 어딘가에 들어 있습니다. 그런데 도대체 둘 중의 무엇을 메모리에 올릴 것이며, 어떻게 찾을까요?

보드 펌웨어, 부트로더, 커널

부트로더

컴퓨터 하드웨어가 부팅이 되기 전에, 윈도우즈와 리눅스 커널은 디스크 내의 임의의 위치에 들어 있습니다. 심지어 이 디스크는 엊그제 제가 친구에게서 받아온 것일 수도 있습니다. 따라서 디스크마다 커널의 위치는 다릅니다. 리눅스의 경우엔 커널 여러 개가 같은 디스크 파티션 내에 들어 있을 수도 있고요.

어떤 커널을 올려야 할까요?

혹은, 달리 물어보죠. 보통은 멀티 부팅을 하면 뭘로 부팅할지 선택하라는 메뉴를 보실 겁니다. 당연히 그걸 해주는 프로그램이 메모리에 올라와 있겠죠. 이건 어느 커널의 일부일까요? 다시, 그게 예컨대 리눅스 커널의 일부라면, 컴퓨터는 어떻게 리눅스 커널을 찾아내서 메모리에 올렸을까요?

그 프로그램은 커널의 일부는 아닙니다. 이렇게 사용자한테 커널 고르라고 하고, 커널을 찾아내어 메모리에 올려주는 프로그램을 부트로더라고 합니다.

그럼 컴퓨터는 어떻게 부트로더를 찾을까요? 커널도 부트로더도 프로그램이고, 둘다 디스크에 있는데 커널을 못 찾는다면 부트로더는 어떻게 찾을까요?

전통적인 방식에서는 예컨대, 부트로더는 하드 디스크의 0번지 (첫 512바이트)에 들어 있기 때문에 부팅이 되면, 그냥 0번지로 가서 거기 있는 프로그램과 데이터를 약속된 크기만큼 무조건 메모리에 올려줘 버리면 됩니다.

이 첫 섹터를 Master Boot Record라고 합니다. 앞서 파티션 테이블 얘기할 때도 같은 용어가 언급되었죠?

https://en.wikipedia.org/wiki/Master_boot_record

이 MBR 내에 커널을 찾아줄 부트로더 프로그램과, 각 파티션의 위치 정보가 적힌 파티션 테이블이 다 들어 있습니다. 따라서 컴퓨터 하드웨어는 이걸 한꺼번에 메모리에 올려주고, 부트로더 코드의 시작점으로 점프해 주기만 하면 되죠.

UEFI는 부트로더를 어떻게 찾을 것인지, 그 방식이 좀 다릅니다. UEFI의 경우에는, 주로 FAT 타입으로 포맷된, 일정 사이즈 이하의 파티션 내에 EFI라는 폴더 아래에 efi 파일 형식으로 들어가면 됩니다. 이렇게 되면 MBR과는 달리 도대체 부트로더를 어떻게 찾을 것이고 누가 찾아줄 것이냐의 문제가 남습니다.

하드디스크의 첫 주소에서 512바이트를 들어와 메모리에 올려주는 건, 하드웨어로 구현하기 전혀 어렵지 않습니다. 그런데 efi가 들어 있는 파티션을 다 찾아서, 그 중에 어떤 부트로더를 고를지 결정하는 건 훨씬 더 복잡해서 하드웨어로 하기는 어렵죠.

보드 펌웨어 (a.k.a. BIOS)

MBR의 경우 디스크가 하나라면 간단합니다. 하지만 디스크가 여러 개, 혹은 usb 스틱이나 CDROM이 끼어 있다면 어떻게 될까요? 여전히 "무엇을 골라서 메모리에 먼저 올려주느냐?"는 문제가 남습니다.

UEFI의 경우는 더더욱 그렇습니다. 이건 하드웨어로 하기 어렵습니다 (비싸고 그 값을 할 만큼 performance critical한 작업이 아닙니다).

보드마다 다르지만 del키나 F2나 이런 거 열심히 눌러서 멀티 부팅 선택 메뉴 가기 전에 소위 "바이오스"로 가서 부팅 순서를 정하실 겁니다. 당연하지만 "바이오스"라는 것도 프로그램입니다.

바이오스는 이런 프로그램들이 구현하는 일종의 "방식"들 가운데 하나니까 저는 제 맘대로 보드 펌웨어라고 부릅니다. 보드 펌웨어는 보드에 붙은 롬에 들어 있습니다. 부팅이 되면, 하드웨어는 디스크의 첫 섹터가 아니라 보드에 붙은 롬에 있는 프로그램을 먼저 올립니다.

이 프로그램은 boot order를 기억하고 있습니다. 거기에 맞춰서 부트 로더를 찾습니다. MBR 방식에서는 대체로 어느 장비를 어느 장비 다음에 하는지 지정해 줍니다. 예컨대 USB 부터 하고 HDD, 이런 식이죠. 각 장치에 대해 디스크 첫 주소에 가서 512바이트를 메모리에 올리고, 그게 부트로더인양 생각하게 됩니다.

UEFI의 경우는 좀더 복잡합니다. 장비 단위로 순서를 정하는 게 아니라, 먼저 디스크들에 붙은 파티션 테이블을 다 보고, efi 파일이 들어 있을 만한 파티션들을 전부 찾습니다. 그 각각이 부트로더입니다. 다음에는 user의 설정 혹은 기본 설정에 따라 그 순서를 정하는 거죠.

리눅스 설치 시 파티션

MBR의 경우라면, 윈도우즈도 리눅스도 별개의 부트 파티션이 필수는 아닙니다. 따라서 윈도우즈나 리눅스나 기본적으로 파티션이 하나씩 있으면 됩니다. 그런데 윈도우즈가 몇 개 파티션을 잡을 거냐는 윈도우즈 설치 프로그램 마음입니다. 보통은 복구 파티션 (아마 복구를 위해 부팅할 수 있게끔 미니멀한 윈도우즈가 들어가 있을 거라고 상상합니다), 뭔가 알 수 없는 파티션, 그리고 윈도우즈 파티션.. 이런 식으로 세 개 정도 잡는 것 같더군요. 리눅스는 하나만 더 있으면 됩니다. 그 하나에 리눅스의 커널과 온갖 프로그램이 다 들어갑니다.

UEFI의 경우라면, efi 파일들이 들어갈 파티션이 별도로 필요합니다. 왜냐하면, 보드 펌웨어가 efi 파일을 검색할 때, 그 검색 대상이 되는 파티션은 충분히 작아야 하는데, 그 정도로 작은 파티션 안에 리눅스 커널과 프로그램들을 넣기는 어렵습니다.

UEFI 부팅이고 윈도우즈가 설치된 시스템이라면 윈도우즈가 이미 자기 efi 파일이 들어간 파티션을 생성해 놓았습니다. 이 경우 리눅스 파티션 하나만 추가하면 됩니다. 윈도우즈가 설치되어 있지 않다면, 윈도우즈 파티션 외에 리눅스마다 파티션 한 개, 그리고 efi가 들어갈 파티션 하나가 최소한 필요합니다.

그간 얘기하지 않았습니다만, 리눅스는 swap이라는 특별한 파티션이 있습니다. 메모리가 부족할 때, 메모리에 있는 내용을 disk로 swap할 때 사용한다고 배우긴 했습니다만... 사실 그거야 하려고만 하면 그냥 리눅스 파티션의 일부를 사용할 수도 있을 것 같은데, 저도 이 용도는 잘 모르겠습니다. 제가 아는 권장 사항은 swap 파티션의 크기는 일반적으로 램의 크기와 비슷하면 좋다고 합니다. swap은 리눅스들 사이에 공유될 수 있습니다. 따라서 몇 개의 리눅스를 설치하든 한 개를 추가하면 됩니다.

예컨대, 500GB의 하드 디스크 하나에 윈도우즈, 우분투, 그리고 Gentoo를 설치한다면, 대충 이렇습니다.

partition size
efi (bootloaders) 250M
Windows 200G
Ubuntu 100G - 250M
Gentoo 200G

그밖에 몇몇 가이드에서는 boot 파티션을 분리하도록 얘기하기도 합니다.

https://superuser.com/questions/522971/is-a-boot-partition-always-necessary

저는 보통 개인용 랩탑, 데스크탑의 경우는 그렇게 하지 않습니다.

어떻게 저런 상태로 만드는지 gentoo handbook amd64 편에 보면 커맨드라인 명령어들로 열심히 설명합니다. 그렇게 하지 않으셔도 됩니다. 당장은 ubuntu live USB stick에서 gparted 라는 프로그램을 설치 후 사용하세요. 직관적인 GUI 메뉴를 통해 같은 작업을 하실 수 있습니다.

그리고 Windows와 Gentoo만 쓰시겠다라고 생각하신다면, 작은 Ubuntu 파티션을 rescue 및 reference 용도로 추가하실 것을 권유합니다.

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.