목차
리눅스 부팅
부팅은 컴퓨터의 전원이 켜진 후 운영체제가 가동되어 사용자가 컴퓨터를 사용이 가능하게 하는 과정이다.
시스템에 장착된 하드웨어를 인식하고 점검하며 사용자가 운영체제를 사용하고 다양한 응용 프로그램을 메모리에 상주시키는 단계로 나눈다.
리눅스 부팅 과정: 하드 디스크에 설치된 운영체제의 부팅 단계
1.BIOS/UEFI 초기화
- 설명:
- 전원이 켜지면 BIOS 또는 UEFI가 실행되어 하드웨어를 초기화하고 점검한다.
- POST(Power-On Self-Test)를 수행하여 CPU, 메모리, 저장 장치 등의 기본 하드웨어 상태를 확인한다.
- 결과:
- 부팅 가능한 디바이스(예: 하드 디스크, USB)를 탐색하고, 부트 로더를 실행한다.
2.부트 로더 로딩
- 설명:
- BIOS/UEFI가 디스크의 부트 섹터(MBR 또는 GPT)를 읽고 부트 로더(예: GRUB)를 메모리에 로드한다.
- 부트 로더는 사용자가 선택한 운영체제를 부팅하기 위한 정보를 관리한다.
- 결과:
- GRUB 메뉴에서 부팅할 커널과 옵션을 선택하거나 기본값으로 진행한다.
3.커널 로딩
- 설명:
- 부트 로더가 선택한 리눅스 커널 이미지를 메모리에 로드한다.
- 초기화 램 디스크(initrd 또는 initramfs)를 메모리에 로드하여 커널이 파일 시스템과 필요한 드라이버에 접근할 수 있도록 한다.
- 결과:
- 커널이 시스템 하드웨어를 초기화하고, 루트 파일 시스템을 마운트한다.
4.init 프로세스 실행
- 설명:
- 커널이 초기화 완료 후, 시스템의 첫 번째 프로세스인 init(또는 systemd)를 실행한다.
- init은 시스템을 부팅하기 위한 주요 서비스와 데몬을 관리한다.
- 결과:
- 런레벨 또는 타겟(Target)에 따라 다양한 서비스가 실행된다.
5.서비스 및 데몬 시작
- 설명:
- init 또는 systemd는 설정된 런레벨/타겟에 따라 서비스(예: 네트워크, 로깅, 데이터베이스)를 시작한다.
- 예: /etc/init.d 또는 /etc/systemd/system 디렉터리에 정의된 서비스 스크립트를 실행한다.
- 결과:
- 시스템이 정상적으로 동작할 수 있는 환경이 준비된다.
6.사용자 로그인
- 설명:
- 모든 서비스가 실행되면 로그인 화면(TTY 또는 GUI)이 표시된다.
- 사용자는 getty 또는 display manager를 통해 텍스트 또는 그래픽 환경에 로그인한다.
- 결과:
- 사용자는 셸 또는 데스크톱 환경을 통해 시스템을 사용할 수 있다.
단계내용
단계 | 내용 |
---|---|
1. BIOS/UEFI 초기화 | 하드웨어 초기화 및 POST 수행, 부트 디바이스 선택. |
2. 부트 로더 로딩 | GRUB와 같은 부트 로더를 통해 커널 선택 및 실행. |
3. 커널 로딩 | 커널과 초기 램 디스크(initrd, initramfs)를 메모리에 로드. |
4. init 실행 | 커널이 초기화 완료 후 init 또는 systemd를 실행하여 서비스 관리. |
5. 서비스 및 데몬 시작 | 시스템 서비스를 시작하여 시스템을 준비. |
6. 사용자 로그인 | 사용자 로그인 화면을 통해 시스템 사용 가능. |
리눅스 부트 프로세스
리눅스는 초창기 부터 유닉스부터 사용하던 init 프로세스를 사용해서 부팅을 한다.
init은 부팅 과정에서 중요한 역할을 하지만, 부팅과 관련된 모든 작업을 직접 수행하는 것이 아니라 초기화 작업을 관리하고 조정하는 역할을 한다. init 프로세스란 부팅 과정에서 커널이 가장 먼저 실행하는 사용자 공간 프로세스로, 부팅 이후 시스템의 초기화와 서비스 관리를 담당하는 프로세스다.
로그인, 로그아웃
리눅스는 X-Window 기반의 그래픽 로그인창과 텍스트 기반의 콘솔에 로그인하는 경우로 나뉜다.
명령어 | 내용 |
---|---|
텍스트 모드로 기본 타겟 변경(영구) | sudo systemctl set-default multi-user.target |
GUI 모드로 기본 타겟 변경(영구) | sudo systemctl set-default graphical.target |
터미널에 입력 후 재부팅 시 적용된다. |
파일명 | 설명 |
---|---|
/etc/issue | 사용자가 로그인할 때 'login:'이 출력되기 전에 출력되는 내용을 적는 파일이다. |
/etc/issue.net | /etc/issue 파일과 같은 역할을 하는 파일이다. 차이점은 issue는 로컬(Local)의 터미널로 접속할 때 출력되는 메시지를 작성하고 issue.net은 텔넷(Telnet)을 통하여 접속할 때 출력되는 메시지를 작성하는 곳이다. |
/etc/motd | motd(Message Of The Day)로 성공적으로 로그인이 되었을 때 출력되는 메시지를 작성하는 곳이다. |
로그아웃
로그아웃의 경우 콘솔 모드나 터미널에서 logout 또는 exit 명령어를 입력 또는 Ctrl + D를 누루면 로그아웃이 되며 X-Window에서는 로그아웃 버튼을 찾아 누루면 된다.
systemd
systemd는 Linux 운영체제에서 시스템의 부팅 과정을 관리하고, 실행 중인 서비스(데몬)를 제어하는 시스템 및 서비스 관리자다. 기존의 SysVinit과 Upstart를 대체하며, 더 빠르고 강력한 기능을 제공한다.
systemd의 주요 특징
- 병렬 처리 지원:
- 시스템 부팅 과정에서 가능한 작업을 병렬로 실행하여 부팅 속도를 크게 향상시킨다.
- 기존 SysVinit에서는 작업을 순차적으로 실행했다.
- 데몬의 On-Demand 시작:
- 필요할 때만 데몬을 실행하여 리소스를 절약한다.
- 예를 들어, 네트워크 요청이 있을 때만 네트워크 서비스를 시작한다.
- 서비스 의존성 자동 해결:
- 각 서비스 간의 의존성을 자동으로 분석하고, 올바른 순서로 실행 및 종료를 처리한다.
- 이를 통해 부팅 및 서비스 관리가 더 안정적으로 이루어진다.
- 타겟(Target) 기반 부팅:
- SysVinit의 런레벨 개념을 대체하여 target이라는 유연한 구조를 도입.
- 예: multi-user.target, graphical.target.
- 로그 관리:
- journalctl 명령을 통해 systemd의 로깅 시스템(journald)에서 효율적인 로그 확인 가능.
- 범용 소켓 활성화:
- 소켓 활성화를 통해 네트워크 서비스를 더 효율적으로 처리.
- cgroups 통합:
- Linux의 cgroups(Control Groups)와 통합하여 프로세스 리소스 사용량을 더 잘 관리.
- 기본화된 유닛 파일:
- 서비스, 타이머, 소켓, 스왑 등 다양한 유닛 유형을 통합 관리.
- 유닛 파일은 /etc/systemd/system 또는 /lib/systemd/system에 위치한다.
systemd 관련 디렉터리 | |
/etc/systemd/system |
|
/run/systemd/system |
|
/usr/lib/systemd/system |
|
유닛 파일 로드 우선순위
systemd는 유닛 파일을 로드할 때 아래 순서대로 디렉터리를 검색하며, 먼저 발견된 파일을 사용한다:
- /etc/systemd/system: 사용자 정의 유닛 파일(최우선).
- /run/systemd/system: 런타임 유닛 파일.
- /usr/lib/systemd/system: 기본 유닛 파일(배포판 제공, 최하위 우선순위).
systemd의 핵심은 유닛(unit)이라고 부르는 일종의 대상(Object) 파일고, 유닛은 service, target, socket, path 등과 같이 다양한 유형(type)을 가지고 있다.
systemd의 핵심: 유닛(Unit)
systemd에서 **유닛(Unit)**은 시스템의 작업이나 리소스를 관리하기 위한 "객체"라고 생각하면 된다. 유닛은 시스템의 서비스, 소켓, 경로, 타겟 등 다양한 구성 요소를 나타내며, 이를 통해 systemd가 시스템을 제어하고 관리한다.
쉽게 말하면:
- 유닛은 시스템에서 특정 작업을 수행하거나 리소스를 나타내는 "설정 파일"이다.
- 각 유닛은 **유형(Type)**을 가지며, 이 유형에 따라 동작 방식이 다르다.
유닛(Unit)의 특징
- 객체(Object):
- 유닛은 시스템 내의 대상이나 리소스(서비스, 장치, 경로 등)를 나타냄.
- 예: sshd.service는 SSH 데몬(서비스)을 나타내는 유닛.
- 설정 파일:
- 유닛은 .ini 형식의 설정 파일로 정의된다.
- 주로 /etc/systemd/system/ 또는 /usr/lib/systemd/system/에 저장된다.
- 유닛 이름:
- 파일 이름은 <이름>.<유형> 형식을 가진다.
- 예: nginx.service, local-fs.target.
유닛(Unit)의 주요 유형
1. Service 유닛 (.service)
- 설명:
- 시스템의 서비스(데몬)를 관리하는 유닛.
- 서비스의 시작, 중지, 재시작 등을 제어한다.
- 예:
- nginx.service (NGINX 웹 서버)
- sshd.service (SSH 데몬)
2. Target 유닛 (.target)
- 설명:
- 시스템의 상태나 그룹을 나타내는 유닛.
- SysVinit의 런레벨과 유사한 역할.
- 여러 유닛을 그룹으로 묶어 특정 상태를 구성.
- 예:
- multi-user.target: 텍스트 기반 멀티유저 모드.
- graphical.target: GUI 기반 모드.
3. Socket 유닛 (.socket)
- 설명:
- 네트워크 소켓(예: TCP, UDP) 또는 유닉스 소켓을 나타냄.
- 서비스와 연동되어, 요청이 있을 때만 서비스를 시작(On-Demand).
- 예:
- cups.socket: 프린터 서비스를 위한 소켓.
- sshd.socket: SSH 접속 요청 시 sshd.service를 시작.
4. Path 유닛 (.path)
- 설명:
- 특정 경로(파일 또는 디렉터리)를 모니터링.
- 지정된 조건(파일 생성, 수정 등)이 충족되면 연결된 유닛 실행.
- 예:
- example.path: /var/log/example.log 생성 시 특정 서비스 실행.
5. Timer 유닛 (.timer)
- 설명:
- 시간 기반 작업을 실행.
- 크론(cron)과 유사하지만 더 유연한 설정 가능.
- 예:
- backup.timer: 특정 시간마다 백업 작업 실행.
6. Mount 유닛 (.mount)
- 설명:
- 파일 시스템의 마운트 포인트를 관리.
- /etc/fstab의 항목을 대체하거나 확장.
- 예:
- home.mount: /home 디렉터리 마운트.
7. Swap 유닛 (.swap)
- 설명:
- 시스템의 스왑 공간을 관리.
- 예:
- swapfile.swap: 특정 스왑 파일 활성화.
8. Device 유닛 (.device)
- 설명:
- 하드웨어 장치를 나타냄.
- udev 장치 이름과 연결.
- 예:
- dev-sda1.device: 디스크 파티션 /dev/sda1.
9. Slice 유닛 (.slice)
- 설명:
- 프로세스와 리소스를 그룹화하여 관리.
- CPU, 메모리 등 리소스 제한 가능.
- 예:
- user.slice: 사용자 세션 그룹.
10. Scope 유닛 (.scope)
- 설명:
- 이미 실행 중인 프로세스를 관리.
- 주로 D-Bus를 통해 시작된 작업에 사용.
유닛 관계 및 동작
- 유닛은 서로 의존성(dependency)을 정의하여 동작 순서를 관리한다.
- 예: network.service는 basic.target 이후에 실행.
- systemd는 이러한 의존성을 분석해 필요한 유닛을 올바른 순서로 실행하거나 중지.
서비스(service)
시스템에서 제공하는 서비스, 즉 웹 서버나 메일 서버와 같은 데몬(daemon)을 말한다.
**데몬(daemon)**은 리눅스와 유닉스 기반 시스템에서 백그라운드에서 실행되는 프로세스를 의미한다. 주로 시스템의 특정 기능을 관리하거나 서비스를 제공하기 위해 지속적으로 실행된다. |
systemd 체제에서 서비스들은 init 체제에서 chkconfig, service와 같이 다양한 명령으로 제어된 것과 다르게 systemctl이라는 명령어로 통합되어 제어된다.
서비스가 이해가 안되는 분들을 위해 실제 프로젝트에 사용된 것을 예시로 작성해봅니다.. |
|
프로젝트에서 사용된 예시 Tomcat: 애플리케이션 서버
|
httpd(Apache): 웹 서버 및 리버스 프록시
|
MySQL: 데이터베이스 서버
|
|
결론 이 프로젝트에서 사용된 서비스는 다음과 같다:
|
실제로 서비스에 등록하여 사용중인 예를 보자.
위의 사진을 보면 서비스 상태에 대한 정보를 볼 수 있는데 그중 초록색이 눈에 보인다. 밑에 표를 보면 알 수 있다.
상태값 | 내용 |
loaded | 유닛의 환경 설정 파일이 프로세스에 로드되었음을 나타낸다. |
enabled | 유닛이 부팅 시 자동으로 활성화되도록 설정되었음을 나타낸다. |
disabled | 유닛이 부팅 시 자동으로 활성화되지 않음을 나타낸다. |
active(running) | 유닛이 실행 중이며, 현재 정상적으로 동작하고 있음을 나타낸다. |
active(extied) | 유닛이 성공적으로 **완료(종료)**된 상태를 나타낸다. 주로 실행이 끝난 1회성 작업이나 타겟에서 확인된다. |
failed | 유닛이 시작되거나 실행되는 과정에서 오류가 발생했음을 나타낸다. |
systemctl(또는 service) mysqld start systemctl(또는 service) mysqld stop **service mysqld start**와 service mysqld stop:
|
다음장에 이어서..
'리눅스' 카테고리의 다른 글
#6-1 리눅스 파일 시스템 (0) | 2025.01.09 |
---|---|
#5-2 리눅스 부팅과 셧다운 (0) | 2025.01.09 |
#4 리눅스 디렉터리 (0) | 2024.12.15 |
#3 리눅스의 구조 (0) | 2024.12.15 |
#2 리눅스 시스템 (1) | 2024.12.13 |