티스토리 뷰

Study/Linux

[Linux] Booting Sequence

생각많은 소심남 2014. 8. 3. 20:33

언제부터 Linux Boot Sequence에 대해서 정리해야겠다고 생각만 하고 있었는데, 이번 기회에 복습하는 겸해서 한번 정리해보고자 한다. 참고로 현재 edX에서 Introduction to Linux라는 이름으로 강의가 진행되고 있으니까 평소에 Linux에 대해서 관심을 가졌던 사람한테는 좋은 기회가 아닐까 싶다.




우선 대부분의 사람은 컴퓨터 전원버튼을 켜고 잠시후에 운영체제의 화면이 뜨는 것을 확인할 것이다. 여기까지 걸리는데 대략 30초에서 1분정도의 시간이 걸린다. 그런데 사실 컴퓨터의 boot process는 이 30초에서 1분이라는 짧은 시간안에 이뤄진다. 우선 처음으로 부팅이 되었을 때, BIOS(Basic Input / Output System)가 실행되게 된다. 이름에도 들어가 있는 내용이긴 하지만 컴퓨터는 기본적으로 사용자의 입력(Input)을 받고 이에 대한 출력(output)을 내보내는 기계이다. 따라서 이에 필요한 기능이 제대로 활성화되어 있는지를 확인한 후 초기화하는 과정을 거치게 된다. 우리가 가장 쉽게 볼 수 있는 입출력 도구는 지금 보고 있는 monitor screen과 keyboard가 될 것이다.


키보드나 모니터가 제대로 돌아가는지를 확인하는 것은 기본적으로 컴퓨터가 사용자의 입력을 제대로 받을 수 있는가에 대한 test가 된다. 이때 주변장치로 붙어있는 CPU나 RAM, USB같은 주변 장치의 입력에 대해서도 정상적으로 돌아가는지에 대한 test를 같이 수행하는데 보통 이 과정을 POST(Power On Self Test) 라고 한다. 아마 부팅시 Mainboard 제조사에서 미리 만들어놓은 부팅 스크린이 뜨거나 순식간에 지나가서 모르겠지만, 아마 처음 부팅 과정을 유심히 본 사람이라면 이런 화면을 보면서 컴퓨터 비프음을 들었을 것이다.


사실 이 과정이 POST 과정이고, 이때 컴퓨터에 연결된 장치들의 동작 유무에 대한 Test를 진행하고, 그 결과를 Beep음으로 나타내준다. 일반적인 케이스라면 그냥 짧은 Beep음 한번만 들었겠지만 컴퓨터에 문제가 발생하거나, 장치가 제대로 인식이 안되었다면 아마 음의 형태가 조금 다르게 나왔을 것이다. 그래서 과거에는 Beep음만 가지고 어떤 부분이 고장났는지를 알고, 고치는 것이 컴퓨터 수리하는데 도움이 되기도 했다. 여기까지가 운영체제로 들어가기전에 BIOS에서 수행하는 pre-boot process가 되겠다. 그래서 요 부분까지는 윈도우나 리눅스나 같은 화면을 띄우고 똑같은 과정을 수행하게 된다.


 이렇게 POST가 끝나게 되면 이제 컴퓨터는 어떤 운영체제를 선택할 건지를 결정해야 된다. 일반적인 사용자는 아마 한 PC에 하나의 운영체제만을 사용하기 때문에 잘 느끼지는 못하겠지만 보통 운영체제는 하나의 이미지 형태로 되어있고, 이걸 BootLoader가 불러오는 형태를 띈다. 그러면 결국 컴퓨터에 설치되어 있는 HDD같은 저장장치에서 어떤 위치에 운영체제 이미지가 저장되어 있는지를 찾을 필요가 있을 것이다. 이렇게 운영체제가 저장되어 있는 위치를 Boot sector라고 하는데 과거에는 운영체제 설치시 MBR(Master Boot Record)가 같이 설치되어서 쓰였지만, 요새 나오는 대부분의 컴퓨터들은 메인보드 상에 존재하는 칩셋의 펌웨어 형태로 존재하기도 한다. 아마 메인보드 상자 겉면에 보면 EFI(Extensible Firmware Interface) 에 대한 설명이 적혀있는 것을 확인할 수 있을텐데, 여기서 보통 어떤 HDD에 운영체제가 저장되어 있는지, 메인보드 기능에 대한 설정을 해주게끔 한다. 최근에 나오는 메인보드라면 이런 과정들이 통합(unified)되어 있어서 따로 UEFI(Unified Extensible Firmware Interface)라고 칭하기도 한다. 간단하게 말해서 운영체제와 하드웨어 펌웨어간의 interface라고 보면 좋을거 같다.



리눅스에서 사용되는 Bootloader는 여러개가 있겠지만 아마 대표적으로 쓰이는게 GRUB(GRand Unified Boot loader)가 될것이다. 여기서 보통 어떤 운영체제 이미지로 부팅할 것인지를 선택한다. 아마 앞에서 이야기 한 것처럼 한 운영체제만 사용하는 사용자라면 이 과정이 짧게 지나가겠지만, 아마 여러개의 리눅스 이미지로 부팅할 필요가 있다면, 이 과정에서 해당 이미지를 선택해줘야 한다. 이밖에도 우분투를 설치해본 사람은 운영체제를 직접적으로 설치하지 않고도 간접적으로 실행해볼 수도 있는데 이때 쓰이는 BootLoader는 isolinux라고 있다. 간단하게 말하면 이미지자체를 iso라는 포멧 형태로 만들어서 이미지 load를 하는 것인데 isolinux라는 말을 직접적으로 들어보지는 못했더라도, livecd를 써봤다면 이렇게 isolinux를 통해서 접근한 것이나 다름없다. 사실 나도 예전 연구실 컴퓨터에 gentoo linux를 설치한다고 엄청 삽질을 했었는데, 사실 그때 이런 개념을 잘 몰라서 조금 헤멨던 적이 있었던 거 같다. 

 아무튼 kernel Image가 bootLoader를 통해서 Memory상에 올라가게 되면 처음으로 /boot 폴더에 포인터가 위치한다. 실제로 file Manager로 / 이하를 살펴보면 boot 폴더가 있고, 그 안에 다양한 파일들이 있는 것을 확인할 수 있다.



이 kernel과는 별개로 bootloader에서는 따로 initramfs라는 것도 load한다. 사실 kernel만으로는 컴퓨터가 돌아가지 않는다. 앞에서 이야기했던 것처럼 컴퓨터에는 주변 장치들이 달려있다. 이런 장치들이 kernel자체가 존재자체를 인식하기 위해서는 사실 kernel가 memory로 load될때 같이 올라가야 이를 인식된다. 그래서 몇가지 중요한 driver와 file들을 따로 file system으로 만들어서 ram에 올리게 된다. 이게 initramfs이다. 이름 자체도 initial ram file system이다. 당연한 이야기겠지만 ram 자체는 빠르다. 하지만 용량의 제한이 있기 때문에 앞에서 말한 것과 같이 필요한 Driver만 올라가게 되는데 이 initramfs가 ram에 올라가면서 memory initialization이나 hardware configuration같은게 이뤄지게 된다. 제일 중요한 것은 이 initramfs도 일종의 file system이고, 이게 실제 시스템에 mount되면서 init 이라는 이름의 process가 실행되게 되는데 이 process가 우리가 사용하는 process의 가장 최상단에 있는 process다. 즉, 운영체제 시간에도 나오는 것처럼 process 생성시 보통 fork()를 통해서 parent를 그대로 복사한 child process가 생성되는데 이 parent의 첫번째가 init process가 되는 것이다. 실제 시스템에서는 /sbin/init에 위치해있다.



위의 이미지들을 보면 sbin폴더안에 다양한 프로그램들이 있는데 여기서부터는 사용자별로, 혹은 Interface별로 사전에 지정해놓은 script에 의해서 실행된다. 이중에 getty라고 하는 프로세스가 있다. 위의 이미지에도 있지만, 이게 user login prompt이다. 즉, 리눅스를 처음 부팅할때 사용자 ID와 PW를 받을텐데, 이게 terminal상에서 받게해주는 process가 getty process다.



여기까지가 기본적인 Linux boot sequence에 대한 설명이었다. 사실 원래 내용은 실제로 code자체를 하나씩 보면서 어떻게 signal이 kernel로 넘어가는지를 설명하려고 했었는데 생각보다 내용도 어렵고 조금더 공부해야 될 부분인 거 같다. 그래서 가장 기본적인 동작을 기준으로 어떻게 부팅되고 실행되는 지에 대해서 간단하게 글을 써봤다.


reference :

 Introduction to Linux : https://www.edx.org/course/linuxfoundationx/linuxfoundationx-lfs101x-introduction-1621#.U94d9B9tj0o

댓글