OS

[ Linux ] 운영체제란? 리눅스 부팅과정

jogaknabi_1023 2024. 3. 5. 17:44

 

운영체제(OS)란?

운영체제(Operating System:OS)는 하드웨어, 컴퓨터의 시스템 리소스(CPU, Memory, I/O Device, 저장매체)를 제어하고 프로그램에 대한 일반적인 지원을 하는 시스템 소프트웨어이다. 컴퓨터 하드웨어와 응용 프로그램 간의 상호작용을 관리하고 제어하는 역할을 한다.

 

  • CPU : 각 프로그램이 얼마다 CPU 사용할지 결정
  • Memory : 각 프로그램이 어느 주소에 저장 되어야하는지, 어느 정도의 메모리 공간을 확보해줘야하는지 결정
  • I/O Device(모니터, 키보드, 마우스) : 키보드, 마우스로 전달 받은 데이터 어떻게 화면에 표시할지 결정
  • 저장매체(HDD, SSD) : 어떤 주소 공간에 어떤 구조(파일)로 저장해야할지 결정

 

운영체제 기능

사용자와 하드웨어 사이의 인터페이스를 제공해 효율적으로 응용 프로그램이 동작하도록 지원하고, 시스템 자원을 효율적으로 관리하여 응용 프로그램이 원활하게 동작할 수 있도록 한다. 최근에는 가상화 기술의 발전으로 실제 하드웨어가 아닌 하이퍼바이저(가상 머신) 위에서 실행되기도 한다.

 

운영체제의 구성에서 가장 핵심적인 역할을 하는 것은 커널(Kernel)이다. 이 부분은 [ Linux ] OS, Kernel 그리고 socket - kakao 실무진 특강 (2) 게시물에서 자세히 다뤘기 때문에 이번에는 운영체제의 종류와 그 중 리눅스에 대해 더욱 자세히 다뤄보겠다.

 

운영체제 제공 서비스

( 부팅 서비스, 사용자 서비스, 시스템 서비스, 시스템 호출 )

하드웨어 - OS - 사용자 사이의 구조

 

1. 부팅 서비스

PC가 켜진 후에 운영체제를 메인 메모리(DRAM)에 적재하는 일련의 과정. 또한 전원버튼을 누르는 순간부터 로그인 화면이 나올 때 까지 일어나는 모든 과정이라고 할 수 있다.

 

 

💡 부팅 시 운영체제 실행 과정

 

1 단계) 컴퓨터가 켜지면 먼저 CPU가 ON 되고, CPU는 ROM(비휘발성 메모리)에 있는 BIOS 데이터를 읽어온다.

 

 

2 단계) BIOS는 부팅 과정 중 컴퓨터와 연결된 하드웨어의 정상적인 작동을 검사하기 위해 POST(Power On Self Test)를 진행한다. 

             BIOS는 운영체제 중 가장 기본적인 소프트웨어. 컴퓨터의 입출력을 처리하는 펌웨어로 메인보드에 필수로 내장되어 있다.

             - 펌웨어(firmware) : 변경할 필요가 없는 소프트웨어를 ROM에 내장하여 하드웨어를 제어하는 프로그램

 

 

3 단계) Boot Loader 실행

             POST를 성공적으로 마치면 ROM-BIOS는 하드디스크의 첫번째 부트섹트인 MBR에 있는 부트로더에게 그 제어권을 넘겨준다.                  MBR(Master Boot Record)에 존재하는 Boot Loader인 GRUB 를 읽어 들이고, 부트로더가 메모리(RAM)에 적재된다.

MBR 이란?
- 마스터 부트 레코드, MBR은 운영체계가 어디에, 어떻게 위치해 있는지를 식별하여 컴퓨터의 주기억장치에 적재될 수 있도록 하기 위한 정보로서 하드디스크나 디스켓의 첫 번째 섹터에 저장되어 있다.
- MBR은 파티션 섹터 또는 마스터 파티션 테이블이라고도 불리는데, 이유는 하드디스크가 포맷될 때 나뉘어지는 각 파티션의 위치에 관한 정보를 가지고 있기 때문이다.
- 모든 저장 장치(HDD, SSD)는 MBR(Main Boot Record)를 가지고 있다. Disk의 첫 512 byte의 정보를 MBR 이라고 부른다.
이 MBR에는 Bootstrap code 라고 불리는 Bootloader와 Partition Table에 대한 정보를 가지고 있다.

 

 

4 단계) Kernal 부트 이미지 적재

            (GRUB 부트 메뉴 표시 - Kernal 을 메모리에 올릴 때 레스큐 모드로 실행할 지 일반 모드로 실행할 지 결정하는 화면이 나타난다.)

            부트로더는 Kernal 이미지를 불러들이고 시스템 파일들을 찾아서 메모리에 올려놓는다.

            Boot Loader에 의해 OS(window or Linux)가 메모리에 올라가게 된다.

 

 

5 단계) Kernal 실행

            Kernal 이미지는 압축되어 있기 때문에 PID 0번인 swapper 프로세스를 호출한다.

            swapper 프로세스는 Kernal 이미지를 압축 해제하고 Kernal 이 사용할 각 장치(메모리, HDD, 마우스 등 하드웨어)초기화한다.

 

6 단계) 루트 파일 시스템 마운트

            하드웨어의 검색 후 커널은 루트 (/) 파일 시스템을 읽기 전용 모드(read-only)로 마운트한 뒤 파일 시스템을 검사한다.

            이후 점검 후 루트 (/) 파일 시스템을 읽기/쓰기 모드(read-write)로 다시 마운트한 뒤 init 프로세스를 호출한다. (/sbin/init PID 1)

 

7 단계) systemd 프로세스 실행

            systemd 프로세스는 사용자가 시스템을 실제로 사용할 수 있도록 시스템 초기화를 진행한다.

            systemd 프로세스는 기본 시스템 초기화 스크립트인 local-fs.target 을 통해 파일 시스템을 점검한다.
            이후 sysinit.target 을 시작으로 필요한 스크립트를 통해서 커널 모듈의 메모리 적재, 스왑 파티션 초기화, 네트워크 초기화, 

                서비스 프로세스 관리, 가상 콘솔 접속 관리, 실행 레벨 관리를 실행한다.

            systemd 는 default.target 을 불러서 실행시킨다. 이후 하위 target에 설정된 서비스들 실행된다.

default.target 은 graphical.target 이나 mutil-user.target 둘 중 하나로 설정된다.
각각의 타겟들은 종속성에 의해 연계되서 실행되야 한다.

< 실행 종속성 관계 >
local-fs.target -> sysinit.target -> basic.target -> mutil-user.target -> graphical.target

< 타겟의 종류 >
- graphical.target ⇒ GUI 환경 구성
- mutil-user.target ⇒ CLI 환경 구성, 네트워크 환경 구성, 웹 서비스 환경 구성, rsyslog 서비스 구성
- basic.target ⇒ SELINUX(보안 서비스), microcode
- sysinit.target ⇒ 마운트 안정화
- local-fs.target ⇒ /etc/fsab 에 등록된 마운트 작업
< 추가 타켓 >
- rescue.target ⇒ single mode root/ 로 비밀번호가 필요하고 네트워크를 사용하지 않는다. /(sysroot)에 대해서 읽기쓰기 모드이다. /etc/fstab 에서 마운트 옵션을 제대로 적지 않으면 rescue.target 모드로 부팅이 된다.
- emergency.target ⇒ single mode root/ 비밀번호가 필요 없고 네트워크를 사용하지 않는다. /(sysroot)에 대해서 읽기 전용 모드이다.

 

과거에는 Run Level이라는 개념을 사용했다. Run Level은 시스템의 운영 모드를 나타내는 숫자로, 0부터 6까지의 번호가 있었다.
하지만 최근 리눅스 배포판들은 Run Level 대신 Systemd Targets를 사용하게 되었다. Systemd는 시스템 및 서비스 관리를 위한 새로운 init 시스템이다.

 

 

run level 가 target 비교표

 

 

 

Q) 그럼 OS 말고 다른 응용 프로그램들은 어떻게 메인 메모리에 적재할까?

 

CPU 프로그램(명령어의 집합)을 메인 메모리(DRAM)에서만 가져와 처리할 수 있기 때문에 프로그램을 실행하려면 반드시 프로그램이 메모리에 할당되어 있어야 한다. 보조기억장치에 있던 운영체제는 ROM에 있는 부트 로더 메모리에 적재해주었지만, 다른 응용 프로그램(게임, 워드 등)들은 어떻게 메인 메모리에 적재할 수 있는 걸까?

 

A) 바로 운영체제의 커널이 그 역할을 해준다. 커널전원이 켜져 있는 동안 메인 메모리에 계속 상주하면서 시스템 자원을 관리한다. 커널 응용 프로그램이나 데이터를 메인 메모리에 적재하는 것을 로드(Load)라고 하며 그 과정을 로딩이라고 한다. 프로그램이 메모리에 적재되면 비로소 CPU는 메모리에 있는 프로그램 명령어들을 읽어와 실행을 한다.

 

2. 사용자 서비스

  • 사용자 인터페이스(User Interface : UI) 제공
    - CLI (Command Line Interface) :  명령어를 입력. 사용자가 프롬프트에서 명령어를 입력하여 컴퓨터와 상호작용함.
    - GUI (Graphical User Interface) : 위젯 그래픽 제어 요소를 사용하여 컴퓨터와 상호작용함. 
        예) Microsoft의 windows, Apple의 mac OS
  • 프로그램 실행 (Program Execution)
    프로그램을 실행하기 위해선 스토레지에 있는 파일의 위치를 찾아 메모리에 적재해야 하고, 프로세서 시간을 할당해야 한다. 운영체제는 프로그램을 실행하려고 메모리 할당이나 해제, 프로세서 스케줄링과 같은 중요 작업을 처리한다.
  • 입출력 동작 수행 (I/O Operations)
    수행 중인 프로그램은 입력이 필요하며, 사용자가 제공하는 입력을 처리한 후에는 출력을 생성해야 한다.
  • 파일시스템 조작 (File Systems)
    디스크에 파일을 저장하려면 특정 블록에 할당해서 저장하고, 파일을 삭제하려면 파일 이름이 제거되면서 할당한 블록이 초기화된다. 운영체제는 파일 시스템 조작 서비스를 제공하여 사용자가 파일 관련 작업을 쉽게 할 수 있도록 한다.
  • 통신 (Communication)
    프로세스가 다른 프로세스와 정보를 교환하는 방법은 동일한 컴퓨터에서 수행하는 프로세스 간의 정보 교환, 네트워크로 연결된 컴퓨터 시스템에서 수행하는 프로세스 간의 정보 교환 두 가지 방법이 있다. 운영체제는 다중 작업 환경에서 공유 메모리를 이용하거나 메시지 전달로 다양한 유형의 프로세스와 통신을 지원한다.
  • 오류탐지 (Error Detection)
    운영체제는 가능한 모든 하드웨어와 소프트웨어 수준에서 오류를 탐지하고, 시스템을 모니터링하여 조정함으로써 하드웨어 문제를 예방한다.

 

3. 시스템 서비스

  • 자원할당 (Resource Allocation)
    운영체제는 다수의 사용자나 작업을 동시에 실행할 때 운영체제가 자원을 각각 할당하도록 관리한다.
  • 계정 (Accounting)
    운영체제는 각 사용자가 어떤 컴퓨터 자원을 얼마나 많이 사용하는지 정보를 저장하고 추적한다.
  • 보호와 보안 (Protection and Security )
    운영체제는 사용자가 다수인 컴퓨터 시스템에서 여러 프로세스의 동시 실행을 허용하기 위해 각 프로세스를 서로의 활동에서 보호한다. 보호는 시스템을 호출하려고 전달한 모든 매개변수의 타당성을 검사하고, 시스템 자원에 모든 사용자 접근을 제어하도록 보장하는 것을 말한다. 보안은 잘못된 접근 시도에서 외부 IO 장치를 방어하며, 외부 사용자에 인증을 요구하는 것이다.

 

4. 시스템 호출 (System Call)

시스템 호출은 실행 중인 프로그램과 운영체제 간의 인터페이스로 API (Application Programming Interface) 라고도 한다. 사용자 프로그램은 API 를 통해 운영체제의 기능을 제공 받는다. 즉, 운영 프로그램이 사용자 수준에서 지원하지 않는 기능을 운영체제의 루틴을 호출하여 제공받는 방법이다. 시스템 호출의 유형으로는 프로세스 제어, 파일 조작, 장치 관리, 정보 유지, 통신 등이 있다.

 

 

운영체제 종류
(그 중에서도 Linux 배포판)

다양한 리눅스 배포판들이 있지만 그 중에서도 Ubuntu(데비안 계열), CentOS(레드헷 계열), Fedora(레드헷 계열)를 많이 사용한다고 한다. 우분투는 가장 널리 쓰이고 널리 알려진 배포판이다. 나도 항상 실습 시에 Ubuntu LTS 를 사용했던 기억이 있다. CentOS는 RHEL(판매되고 있는 레드햇 엔터프라이즈 리눅스)가 유료로 변경되면서 무료 버전으로 빌드된 것이다. 유료로 판매되는 걸 어떻게 무료로 배포될 수 있었는지 궁금했었는데 GPL 라이선스 룰 때문에 가능했다고 한다. GPL은 소스를 받은 자가 그것을 재배포하는 것을 막지 않기 때문에 RHEL을 구입한 자가 누구든간에 그는 레드햇에 소스를 요청할 권리가 있다. 이 점을 이용해서 상표권을 배제하고 배포된 리눅스가 centOS라고 한다. 누구인지 정확하게는 모르지만 항상 감사하면서 써야할듯... 다들 절 한번씩 하고 쓰도록 하자.ㅋㅅㅋ

 

운영체제 종류 / 리눅스 배포판

 

 

 

 

자료 출처) 참고하는 블로그도 야무진 걸로 골라봤다. 한국에 정리의 신들 짱많음.

https://ssunw.tistory.com/entry/Linux-부트-프로세스-부트-로더 (부팅과정)

https://www.lesstif.com/system-admin/linux-systemd-systemctl-run-level-target-98926803.html

https://bentist.tistory.com/63

https://btcd.tistory.com/210