본문 바로가기
Linux/Linux 이해

2. Linux(리눅스) 이해 kernel vs OS(distribution), 커널 vs 운영체제

by ahsung 2022. 7. 16.

개요

Kernel과 OS(리눅스 배포판)의 차이를 아는 것은 앞으로 OS를 운영하는데 핵심적인 지식입니다.

흔히 OS에서 제공하는 기능과 종속적인 시스템들을 OS 수준인지 커널 수준인지 혼동하는 경우가 많습니다.

이는 애플리케이션을 운영하는데 있어서도 고수준으로 갈수록 중요한 문제입니다.

 

 

커널이란?

커널은 컴퓨팅 하드웨어 자원을 추상화하고

프래그램 수준에서 하드웨어 자원에 접근할수 있도록 인터페이스를 제공하고 하드웨어를 컨트롤하는 시스템 소프트웨어입니다.

 

커널과 OS의 차이를 알기위해서 소프트웨어, 프로그램등의 미묘한 차이를 구분할 수 있는 것이 중요합니다.

아래 포스팅을 먼저 읽는 것을 추천드립니다.

https://asung123456.tistory.com/53

 

1. Linux(리눅스) 이해 - 개요

  해당 카테고리 포스팅은 기초적인 용어 정의와 내용도 복기하고 다루지만, 학부생수준의 OS 지식을 전제로 진행합니다. 들어가기 앞서, 컴퓨터 공학(이하 CS)에서 여러 용어들은 명확한 차이가

asung123456.tistory.com

 

커널은 단순하게 하드웨어를 추상화한 범용 소프트웨어라고 이해할 수 있으며 크게 모놀리식(Monilithic), 마이크로(Micro) 2종류의 개념이 있습니다.

 

그 중 Linux 커널은 대표적은 모놀리식 커널입니다. ( 두 개념의 차이 설명은 생략 )

 

 

 

그렇다면 Operation System(OS, 운영체제)는 무엇인가?

흔히 컴퓨터 공학에서 커널과 OS는 혼용되어 자주 등장합니다.

OS의 기능으로 프로세스 스케줄링, 메모리 관리, 파일시스템 등이 있으며 위키피디아에서는 OS를 아래와 같이 정의하고 있습니다.

운영 체제 ( OS )는 컴퓨터 하드웨어 , 소프트웨어 리소스 를 관리하고 컴퓨터 프로그램 에 대한 공통 서비스 를 제공 하는 시스템 소프트웨어 입니다 .

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

 

Operating system - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Software that manages computer hardware resources An operating system (OS) is system software that manages computer hardware, software resources, and provides common services for compu

en.wikipedia.org

위키피디아의 커널 설명도 OS와 크게 다르지는 않죠.

 

대부분의 OS 교육들은 "커널은 운영체제의 핵심 부분이다!"라고 설명하고

OS의 기능중 커널의 역할이 무엇인지 커널과 OS의 관계, 차이점등을 명확히 알려주는 글은 많지 않습니다.

 

 

OS와 커널의 차이는 도대체 무엇인가?

매번 여러 책들이 하는 말처럼 커널은 OS를 구성하는 핵심 부분입니다.

그렇다면 이 둘은 어떻게 구분하는 것이 좋을까요?

이는 1장 포스팅에서 말했듯이 소프트웨어, 프로그램 그리고 더 나아가 프로세스에 대한 개념까지 이해하는 것이 좋습니다.

 

OS는 분명 하나의 시스템 소프트웨어이지만, OS를 구성하는 소프트웨어와 CS 개념은 아주 다양합니다.

커널은 그런 OS를 구성하는 다양한 범용 소프트웨어중 하나일뿐입니다. (물론 핵심적이며 대부분이지만)

 

즉, OS와 커널을 구분하기 가장 좋은 이해 형태는 OS를 구현하기위해 OS가 커널을 사용했다라고 생각하면됩니다.

(예시, 카카오톡은 다음웹뷰 + DB + 채팅 서비스 + 광고 배너를 사용해서 구현됨)

대표적인 Linux 커널을 사용하는 Ubuntu와 Centos를 예시로 들겠습니다.

 

Linux 커널은 위에서 언급했던 것처럼 모놀리식 커널로서 한 개의 프로그램으로 짜여져있습니다.

(커널 프로그램은 대부분의 리눅스 배포판에서 /boot 디렉토리 하위에 존재합니다.) 

하지만 단순히 커널 프로그램만으로 커널을 정상적으로 동작시킬 수는 없습니다.

커널 또한 다양한 Config 파일과 드라이버가 있어야 의도한 정상적인 구동을 할 수 있습니다.

https://www.geeksforgeeks.org/device-driver-and-its-purpose/

 

Device Driver and It's Purpose - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

위 링크에서 보듯이 Linux 커널 프로그램은 다양한 기기 장치(device)들을 항상 직접적으로 이해할 수도 없을 뿐더러

매번 새로운 코드를 추가할 수도 없습니다.

(커널 코드 자체에 기본적으로 탑재된 드라이버들도 있습니다.)

 

커널은 하드웨어를 추상화하여 제공하고 제어하기위해 만들어진 시스템 소프트웨어이지만,

단일 커널 프로그램만으로는 이 목적을 수행할 수 없다는 것이죠

 

커널은 기기 장치들과 통신하기 위해, 장치 제조사가 만든 드라이버라는 소프트웨어를 모듈로서 포함시키고 사용합니다.

물론, 드라이버는 커널과의 호환성에 의존적이므로 OS에 종속적입니다.

드라이버와 커널이 통신하는 방식은 커널마다 달라 장치 제조사는 OS(커널) 별로 드라이버를 제작해야합니다.

 

드라이버는 커널과 통신을하는데 왜 OS에 종속적이라고 했을까요?

Ubuntu와 같은 Linux 배포판 OS는 Operation System의 목적을 달성하고 구현하기 위해

Kernel + 드라이버 구성을 기본적으로 구현하고 있습니다.

 

즉, 단순한 커널 프로그램 하나로는 아무 쓸데가 없지만 커널 + 드라이버라는 조합이 생겨야

우리가 키보드와 마우스, 모니터를 사용할 수 있고 이를 최종적으로 구현한 것은 OS 운영체제이기 때문에

드라이버는 OS에 종속적이다라고 표현할 수도 있습니다. (아래에서 더 상세 설명)

 

다시 복기하자면

1. Linux 커널은 모놀리식으로 단일 프로그램으로 구현되었습니다.

2. 단일 커널 프로그램만으로는 모든 하드웨어 장치를 컨트롤할 수 없습니다.

3. OS는 커널 프로그램과 드라이버 조합을 구성하며, 커널이 드라이버를 인식할 수 있도록 기능을 제공합니다.

4. 비로서 우리가 알고있는 하드웨어를 제어하는 커널 구성이 완성됩니다

 

우리는 바라보는 관점에 따라 드라이버는 커널에 포함되는 부분인지, OS에 포함되는 부분인지 구분해서 이야기할 수 있습니다.

예로, 커널 코드의 버그등 커널에 집중해서 얘기를 풀고자한다면 커널 프로그램 + 드라이버 조합을 커널 소프트웨어라고 생각할 수 있습니다. 

(실제로 드라이버는 커널 모듈이라는 개념을 통해 커널 공간에 확장됩니다.)

 

반대로 Linux 배포판에 집중한 케이스를 본다면, (아래는 예시를 위한 가정입니다.)

Ubuntu 입장에서는 CentOS와의 경쟁에서 차별을 두기위해 새롭게 등장한 하드웨어 제품의 호환성을 기본으로 제공할 수 있습니다.

(신규 하드웨어 작동에 필요한 드라이버 및 기타 소프트웨어들이 기본 설치)

 

새로운 하드웨어를 CentOS에서 작동하기 위해서는 하드웨어 제조사 페이지에서 특수한 소프트웨어(드라이버 포함)를 설치해야 하며

최악의 경우 CentOS 정책과 위반되는 소프트웨어라면 실행이 안될 수도 있습니다.

 

예로 CentOS와 Ubuntu는 사용하는 Linux 커널 버전이 다릅니다.

CentOS에서 사용할 수 있는 Linux 커널은 특정 드라이버와 호환되지 않을 수도 있습니다.

 

이와 같은 케이스에서는 커널 프로그램 + 드라이버 조합은 OS의 역할이라고 생각할 수도 있습니다.

결국 중요한건 정확한 정의가 아니라 우리가 어떤 관점을 갖고 어떤 목적을 갖고 논의를 하냐에 따라 도메인이 달라질 수 있습니다.

 

결론

커널과 OS를 구분하는 것은 관점에따라 용어가 혼용되기 아주 쉽습니다.

하지만 명백히 kernel과 OS는 다릅니다.

 

커널은 OS의 구성품중 하나이며 Linux kernel은 단순한 프로그램 하나로도 볼수 있지만, 

Linux 배포판(OS)에서 여러 조각, 구성품들과 하나로 뭉쳐 커널은 시스템 소프트웨어로 확장되고 완성됩니다.

또한 그외의 소프트웨어 및 CS 개념들이 모두 합쳐져 Operation System Software(OS, Linux 배포판)가 최종 구현됩니다.

 

위에서 드라이버는 커널 영역인지, OS 영역인지 관점에따라 다를 수 있는 개념을 다뤘지만 명백히 OS 영역에서 구현되는 것들도 있습니다.

 

POSIX 인터페이스를 따르는 흔한 Unix 계열의 ls, vi, iptables, ip, sh 기타 등등 명령어(프로그램)들은

(커널 <> 일반 애플리케이션)과 같은 수준의 관계이지만, 엄연히 OS를 구성하는 소프트웨어입니다.

ex)
CentOS6는 최초의 init 프로세스로 initd라는 솔루션(소프트웨어)를 사용했지만,
CentOS7이후로는 init프로세스로 systemd를 사용한다.

 

또한 커널은 파일시스템을 이해하고 파일시스템에 접근하고 제어하기 위한 모듈, 프로그램 로직(VFS, Virtual Filesystem)등은 소스 코드(함수)로 존재하지만 파일시스템 공간 자체가 커널 프로그램에 포함되어 있지는 않습니다.

하지만 커널은 파일시스템 없이 정상적으로 동작할 수 없고 최초 filesystem을 mount해서 자신에게 필요한 모듈, driver등을 load해야합니다.

(커널과 파일시스템등을 어떻게 부팅시킬지는 grub같은 부트로더를 통해서 실행됩니다.)

 

커널(특정 버전) + 파일시스템 (특정 종류,버전)을 어떤 조합으로 사용하고 지원할지는 Linux 배포판(OS)의 역할입니다.

(grub또한 어떻게 설정해서 사용할지는 Linux 배포판에 따라 달라질 수 있습니다.)

 

물론, 우리가 완성된 자동차의 부품들을 새로운 것들로 교체할 수 있듯이 OS의 부품을 교체할 수도 있습니다. 

신규 커널 버전을 설치하여 바꾸던가, 신규 버전의 OS구성품 소프트웨어(mount 등)를 설치(또는 업그레이드)할수 있습니다.

 

위에서 언급했듯이 어떤 드라이버가  CentOS 커널버전에 호환이 되지 않는다면 더 높은 버전의 커널을 바꿀 수도 있습니다.

하지만, CentOS의 다양한 구성품(소프트웨어, 파일시스템 등)은 정책적으로 특정 Linux 커널 버전들에 맞추는 것을 제안할 것이고

이를 확인하지 않고 함부로 커널 버전을 바꾸어 끼우면 전체적으로 OS가 구동되지 않을 수 있습니다.

 

그렇기에 드라이버는 커널 소프트웨어에 포함되는 모듈이지만, OS에 종속적이다라는 표현도 맞는 것입니다.

PS.
Linux 계열 소프웨어들은 컴파일 당시 호환 가능한 최소 kernel 버전을 명시할 수 있기에 (gcc등 컴파일러에서 기능 제공)
대부분의 Linux 소프트웨어들은 저명한 Linux 배포판 커널 버전에 맞춰 만들어지고 있습니다.
그래서 특수한 경우가 아니라면 굳이 배포판을 구분하지 않고
대부분의 상용 애플리케이션들은 Linux 계열들에게 같은 바이너리파일(소프트웨어)를 제공합니다.

 

PS. 커널은 왜 OS에 핵심적인가?

컴퓨팅(연산)이란 결국 하드웨어를 사용할 수 밖에 없고

커널은 하드웨어를 추상화한 다양한 개념들을 제공하지만 여전히 일반 사용자가 이해하기는 어렵습니다.

OS는 이런 커널의 기능들을 더욱 쉽게 접근하고 사용할 수 있는 다양한 솔루션들을 포함하여 구성되어 있습니다.

 

1 번 예시)

Linux 커널은 현재 CPU 위에서 작동중인 코드 모음(프로그램)을 프로세스라는 단위로 추상화하여 스케줄링하지만

정작 어떤 프로세스가 실행중인지 /proc 디렉토리에서 직접 확인하기란 여간 쉬운일이 아닙니다.

OS는 이런 문제를 해결하기위해 응용프로그램중 하나인 ps를 제공하고있습니다.
ps는 Userlevel에서 실행되어 kernel이 사용중인 프로세스 상태를 해석하여 보여줍니다. 

 

2 번 예시)

Linux 배포판(OS)은 glibc등 GNU 표준 공유 라이브러리들을 제공하고,

이는 다양한 프로세스들이 linux 배포판에서 더욱 쉽게 시스템콜과 커널에 접근하기 쉽게 합니다.

그 내부는 역시 커널에 의존적으로 시스템콜을 호출하게 구현되어 있습니다.

 

3 번 예시)

Linux 커널은 network interface device라는 개념을 통해 NIC와 ip를 매칭시키고 네트워트 하드웨어 기능을 사용할 수 있도록 합니다.

하지만 여전히 커널의 기능을 직접 사용하여 관리하기엔 어렵고 저수준 기능이기에 다양하지 않습니다.

보통의 경우 서버의 네트워크 관리는 OS에서 제공하는 도구를 통해 접근합니다.

Ubuntu20은 netplan, CentOS8은 NetworkManager를 사용중이며 내부적으로는 커널의 기능을 사용하고 있습니다.

 

4 번 예시)

LVM과 같은 논리적인 솔루션들의 성능 이슈도 있습니다.

이런 솔루션은 커널의 기본 시스템콜을 기반으로 User level에서 로직이 구현될 수 있지만 이는 명백히 커널에서 직접 해결해주는 것보다 느립니다.

물론 Linux는 LVM을 커널 수준에서 즉각 제공하여 성능이 좋습니다.

 

그외에도 VM 솔루션등도 User level에서 구현된 것보다

Kernel이 직접 제공해줌으로서 (Linux는 KVM) 더 나은 성능을 보여줍니다.

 

결론

즉, OS에서 제공하는 대부분(사실상 전부)의 패키지들은 커널을 더 쉽게 사용하기위한 개념들이 대부분이고 

device를 제어하기 위해서는 커널의 도움이 필요합니다.

 

반대로말하면 linux 배포판 없이 Linux 커널만 존재했다면

커널에 요청하는 수많은 로직들을 직접 구현해야될 것입니다..

 

 

댓글