컴퓨터 부팅 이후 프로세스 실행 과정

  • CS
  • 운영체제
2025-11-23

들어가며

부트로더가 커널을 메모리에 올리고 나면 화면에는 아직 아무것도 뜨지 않는다. 로그인 화면이 나타나기까지, 그 사이에는 커널 혼자 하드웨어를 붙잡고 준비하는 시간과 여러 프로세스가 차례로 실행 권한을 넘겨받는 과정이 남아 있다.

커널이 하드웨어를 인식하고 초기화한다

부트로더가 커널을 메모리에 로드하면, 커널은 시스템을 사용 가능한 상태로 만들기 위해 초기화 작업을 시작한다. CPU, 메모리, 디스크, 네트워크 카드 등 하드웨어 장치를 인식하고, 각 장치를 제어할 드라이버를 로드해 하드웨어와 OS가 통신할 수 있는 상태로 만든다.

루트 파일 시스템을 마운트한다

하드웨어가 준비되면 커널은 루트 파일 시스템을 마운트한다. 마운트란 HDD / SSD 같은 물리적 저장 장치에 있는 파일 시스템을 OS의 디렉토리 구조에 연결하는 과정이다. 커널은 부트 파라미터로부터 루트 파일 시스템의 위치를 확인하고, 그 저장 장치를 /(루트) 디렉토리에 연결한다. 이 연결이 끝나야 OS가 그 저장소에 접근할 수 있다.

루트 파일 시스템에는 기본 실행 파일이 모인 /bin(ls, cp, cat 등), 시스템 설정 파일이 있는 /etc, 사용자 프로그램과 라이브러리가 있는 /usr, 로그처럼 가변 데이터가 쌓이는 /var, 사용자 홈 디렉토리인 /home이 있다. 이 단계가 끝나면 OS는 설정 파일과 주요 시스템 바이너리를 읽을 수 있는 상태가 된다.

첫 사용자 공간 프로세스, init 또는 systemd가 실행된다

파일 시스템 마운트가 끝나면 커널은 첫 번째 사용자 공간 프로세스를 실행한다. 여기서 커널 공간과 사용자 공간의 구분이 중요해진다. 커널 공간은 OS의 핵심 부분이 실행되는 메모리 영역으로 하드웨어에 직접 접근할 수 있는 높은 권한으로 동작하고, 사용자 공간은 일반 응용 프로그램이 실행되는 영역으로 하드웨어에 직접 접근할 수 없다. 사용자 공간의 프로그램이 파일 접근이나 프로세스 생성 같은 OS 서비스가 필요할 때는 시스템 콜이라는 인터페이스로 커널에 대행을 요청해야 하고, 이 요청이 들어오는 순간 CPU의 실행 권한이 사용자 모드에서 커널 모드로 전환된다.

커널이 실행하는 이 첫 사용자 공간 프로세스가 init 또는 systemd다. PID(Process ID) 1번을 할당받고, 커널에 의해 직접 실행되는 프로세스이자 이후 모든 프로세스의 부모가 된다. 시스템 초기화를 총괄하고, 다른 프로세스를 생성 / 관리하고, 서비스(데몬)를 시작 / 관리한다. 또한 부모가 먼저 종료된 고아 프로세스를 수습하고, 시스템 종료와 재부팅까지 관리한다.

init은 이 작업을 순차적으로 처리하는 전통적인 초기화 시스템이다. systemd는 유닛 사이의 의존성을 관리해, 순서 의존성이 없는 유닛끼리는 동시에 시작한다. systemd 공식 문서는 이렇게 순서 / 요구 의존성을 분리해 필요할 때만 순서를 강제하는 방식이 부팅 속도를 끌어올리는 핵심이라고 설명한다. 대부분의 최신 리눅스 배포판이 systemd를 쓰는 이유도 여기에 있다.

시스템 서비스가 순서대로, 또는 동시에 시작된다

init/systemd는 설정 파일을 읽어 시스템 운영에 필요한 서비스를 시작한다. init은 하나씩 차례로 실행하고, systemd는 여러 서비스를 동시에 시작해 부팅 속도를 높인다.

이 단계에서 시작되는 서비스는 여러 갈래다. 네트워크 서비스는 네트워크 인터페이스를 설정하고 DHCP나 고정 IP로 주소를 할당해 연결을 활성화한다. 로그 시스템은 시스템 로그를 수집 / 기록해 디버깅과 문제 해결에 쓸 정보를 남긴다. 스케줄러(cron)는 백업이나 로그 정리처럼 정기적으로 실행돼야 하는 유지보수 작업을 관리한다. 그 밖에도 웹 서버(Apache, Nginx)나 데이터베이스(MySQL), SSH 서버처럼 사용자 로그인 없이도 백그라운드에서 계속 동작하는 데몬들이 이 시점에 함께 올라온다.

init 시스템에서는 이 상태를 런레벨이라는 0~6 숫자로 나타낸다. 0은 시스템 종료, 1은 싱글 유저(복구) 모드, 3은 CLI 기반 멀티 유저 모드, 5는 그래픽 환경, 6은 재부팅이다. systemd는 같은 개념을 타겟이라는 이름으로 더 유연하게 다루는데, CLI 환경은 multi-user.target, GUI 환경은 graphical.target에 대응한다.

로그인 화면이 뜬다

시스템 서비스가 정상적으로 실행되면 사용자가 시스템에 접근할 수 있는 환경이 준비된다. CLI 환경이라면 Getty 프로세스가 텍스트 기반 콘솔(TTY)에서 login: 프롬프트를 띄우고 대기하다가, 사용자 입력을 받아 /bin/login 프로그램을 실행한다. GUI 환경이라면 GDM / LightDM / SDDM 같은 디스플레이 매니저가 X Server나 Wayland 그래픽 서버를 띄우고, 마우스와 키보드로 인증할 수 있는 그래픽 로그인 화면을 보여준다.

정리하며

전원 버튼부터 로그인 화면까지는 커널 혼자 처리하는 과정이 아니라, 여러 프로세스가 차례로 바통을 넘겨받는 과정이다. 커널이 하드웨어와 파일 시스템을 준비해 두면, PID 1번을 받은 init(또는 systemd)이 그 위에서 나머지 모든 프로세스를 깨우고 관리한다. 로그인 화면을 볼 때 떠올려야 할 것은 화면 자체가 아니라, 그 화면이 뜨기까지 자신을 낳아준 프로세스 하나, PID 1로 거슬러 올라갈 수 있다는 사실이다.