
1. 리눅스 시스템 부팅
(1) 리눅스 시스템의 부팅 단계
- PC의 전원을 켜는 순간부터 리눅스가 완전히 동작하여 로그인 프롬프트가 출력될 때까지를 의미함
- 전원 ON > 바이오스 단계(시스템 연결된 부품 모니터, 마우스 등등 확인하는 프로세스)
> 부트 로더 단계(램의 운영체제를 올리는 작업) > 커널 초기화 단계 > system 서비스 단계 > 로그인 프롬프트 출력
- 전원 ON ~ 바이오스 단계 : PC 부팅, 리눅스가 설치된 하드웨어 부팅
- 부트 로더 단계 ~ 로그인 프롬프트 출력 : 리눅스 부팅, 리눅스 운영 체제의 부팅
(2) 바이오스 단계 : PC의 전원 스위치를 키면 제일 먼저 바이오스BIOS(Basic Input/Output System)가 동작
- 바이오스는 보통 ROM(Read Only Memory)에 저장되어 있어 흔히 ROM-BIOS라고 부름
- 바이오스는 PC에 장착된 기본적인 하드웨어(키보드, 디스크 등)의 상태를 확인한 후
부팅 장치를 선택하여 부팅 디스크의 첫 섹터에서 512B를 로딩함
- 512B : 마스터 부트 레코드(MBR)이라고 함
> 디스트의 어떤 파티션에 2차 부팅 프로그램(부트 로더)이 있는지에 대한 정보가 저장되어있음
> 부트 로더를 찾아 메모리에 로딩하는 작업까지 수행함
- 바이오스 단계 : 하드웨어 검사 > 부팅 장치 선택 > MBR 로드 > 부터 로더 로드
- 바이오스 단계에서 MBR은 부트 로더를 찾아 메모리에 로딩함
(2) 부트 로더 단계
- 부트 로더는 일반적으로 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공함
- 부트 로처는 리눅스 커널을 메모리에 로딩하는 역할을 수행함
- 리눅스 커널은 /boot 디렉터리 아래에 'vmlinux-버전명'의 형태로 제공
- rescue 버전은 응급 상황에서 시스템을 복구하는데 사용
- GRUB(리눅스의 대표적인 부트 로더)
- 처음 설치한 후 업데이트 시 커널이 추가로 생성됨
(3) 커널 초기화 단계 : 부트 로더에 의해 메모리에 로딩된 커널은 가장 먼저 시스템에 연결된 장치를 검사함
- 리눅스를 처음 시스템에 설치할 때 사용 가능한 하드웨어 정보를 미리 확인해두고, 부팅 시 장치들을 사용 가능한 상태로 유지되고 있는지 확인
- 장치 검사 등 기본적인 초기화 과정이 후 커널은 일반적으로 프로세스를 만드는 방식인 fork를 사용하지 않고 프로세스와 스레드를 생성함
> 이 프로세스들은 메모리 관리같은 커널의 여러가지 동작을 수행함
- 커널 프로세스의 개수와 종류 : 리눅스의 버전과 종류별로 다름, 일반 프로세스와 구분되도록 []로 표시, 주로 PID 번호가 낮음
- ps -ef | more 시
- 커널 프로세스가 생성되면 커널이 수행할 작업이 끝남
- 이제 systemd 서비스를 동작시킴
(4) systemd 서비스 단계 : 리눅스의 여러 서비스가 활성화됨
- init 스크립트가 따로 운영되는 운영체제가 있고, systemd로 대체하는 운영체제도 있음
- 각 서비스가 시작되는 과정은 화면에 메세지로 출력됨
- 부트 스플래시 화면이 진행되고 있을 때 [Alt] + d를 누르면 메세지가 출력되는 화면으로 전환
- 부팅 시 출력되는 메세지는 각종 서비스가 정상적으로 시작되는지 실패인지를 나타냄
- 이 메세지는 부팅 후 dmesg 명령이나 more /var/log/boot.log 명령으로 확인 가능
- dmesg 명령으로 출력되는 메세지에는 데몬의 시작과 관련된 메세지 뿐만 아니라 하드웨어 검사와 관련된 log도 포함
- 유닉스 : 전통적인 init 프로세스가 서비스를 실행, init 프로세스는 처음 생성된 프로세스로서 PID가 1번임
- 리눅스 : 시스템과 서비스 관리자로 init 대신 systemd 사용, systemd 프로세스가 PID 1번임
- 데몬을 모두 실행한 뒤 그래픽 로그인 시스템인 GDMGnome Display Manager를 동작시키고, 로그인 프롬프트 출력
2. 시스템 서비스
(1) init과 systemd의 개념
- init 프로세스는 PID가 1번인 프로세스로 모든 프로세스의 조상 역할을 함
- init 프로세스는 부팅 과정에서 각종 서비스를 제공하는 셸 스크립트 파일을 실행함
- init 프로세스 설정은 /etc/inittab에 있음(커널 제어 시 참조)
- init 프로세스가 실행하는 셸 스크립트는 /etc/rc.d/init.d 디렉터리에 위치, 현재는 init 프로세스 기능이 systemd로 대체
- 해당 디렉터리에 README 파일만 있음, init 스크립트가 systemd 기반으로 바뀌었다는 내용
- init은 시스템의 상태를 일곱개로 정의하여 구분하고 각 상태에 따라 셸 스크립트를 실행
| 런레벨 | target 파일(심볼릭 링크) | target 원본 파일 |
| 0 | 시스템 종료 | 시스템 종료 |
| 1, S | 단일 사용자 모드 | 단일 사용자/복구 모드 |
| 2 | 다중 사용자 모드 (NFS 실행 안함) | 다중 사용자 모드 |
| 3 | 다중 사용자 모드 (NFS 실행) | |
| 4 | 사용하지 않음 | |
| 5 | GUI 상태로 부팅 | GUI 상태로 부팅 |
| 6 | 재시작 | 재시작 |
- systemd는 리눅스 서비스 관리와 관련된 복잡한 구조로 되어있음
- systemd의 장점 : 소켓 기반 동작으로 inetd와 호환 가능, 셸과 독립적으로 부팅 가능, 마운트 제어 가능, fsck 제어 가능, 시스템 상태에 대한 스냅숏을 유지, SELinux와 통합 가능, 서비스에 시그널을 전달할 수 있음, 셧다운 전 사용자 세션의 안전한 종료 가능
- systemd은 전체 시스템을 시작하고 관리하기 위해 유닛이라는 구성 요소 사용
- systemd의 유닛들은 '서비스명.유닉 종류'의 형태로 구분 관리
- 각 유닉은 같은 이름과 종류로 구성된 설정 파일과 동일한 이름 사용
| 유닛 종류 | 기능 | 예 |
| service | 시스템 서비스 유닛으로 데몬을 시작, 종료, 재시작, 로드함 | atd.service |
| socket | 소켓을 관리하는 유닉으로 AF_INET, AF_INET6, AF_UNIX 소켓 스티림과 데이터 그램 FIFO 지원 | dbus.socket |
| target | 유닛을 그룹핑함 | basic.target |
| device | 리눅스의 커널 장치를 관리 | sys-module-fuse.device |
| mount | 파일 시스템의 마운트 포인트 관리 | tmp.mount |
| automount | 파일 시스템에서 자동 마운트 포인트 관리 | proc-sys-fs-binfmt_misc.automount |
| timer | 타이머 기능 관리 | fstrim.timer |
| swap | 스왑 파티션이나 파일 관리 | x2dswap.swap |
| path | 파일 시스템의 개체가 변경되면 다른 서비스를 동작 시킴 | cups.path |
| slice | 시스템 프로세스를 계층적으로 관리 | user.slice |
| scope | 외부에서 생성된 프로세스 관리 | init.scope |
(2) systemctl 관련 명령
- systemd 기반으로 서비스를 시작하거나 종료 시 사용하는 명령
- systemctl 명령에서 유닉을 지정 시 유닛의 종류는 제외 가능
- systemd 서비스를 제어
- systemctl [옵션] [명령] [유닛명]
* -a 상태와 관계 없이 유닛 전체 출력
* -t 유닛 종류 지정한 종류의 유닛만 출력
- start 유닛 시작, stop 정지, reload 다시 읽어옴, restart 재시작, status 상태 출력, enable 부팅 시 유닛이 시작되도록 설정
disable 부팅 시 유닛이 시작하지 않도록 설정, is-active 유닛이 동작하는지 확인, is-enable 유닛이 시작되었는지 확인
isolate 지정한 유닛 및 이와 관련된 유닛만 실행하고 나머지는 정지, kill 유닛에 시그널 전송
- 옵션이나 명령 없이 systemctl 명령만 사용하면 현재 동작중인 유닛 출력
- stop 명령은 root 권한이므로 root로 사용자를 전환하여 실습 필요
(3) systemd와 런레벨
- 현재 시스템의 상태를 나타내는 한자리 숫자(문자 S 포함)
- systemd의 target 유닛 파일들은 /usr/lib/systemd/System 디렉터리에 있음
- 각 런레벨에 해달하는 runlevelX.target 파일이 제공됨 > 런레벨에 익숙한 사용자 편의를 위한 심볼릭 링크
| 런레벨 | target파일(심볼릭 링크) | target 원본 파일 |
| 0 | runlevel0.target | poweroff.target |
| 1 | runlevel1.target | rescue.target |
| 2 | runlevel2.target | multi-user.target |
| 3 | runlevel3.target | |
| 4 | runlevel4.target | |
| 5 | runlevel5.target | graphical.target |
| 6 | runleve6.target | reboot.target |
- 현재 target을 확인하려면 get-default 명령을 사용 (systemctl get-default)
- 런레벨 확인을 위해선 (runlevel) 명령 사용, 'N 5' 출력 시 런레벨 5로 부팅했다는 의미
- 예전에는 부팅 시 동작하는 기본 런레벨을 /etc/inittab 파일에 지정했으나 지금은 default.target이 가르키는 target유닛으로 바뀜
- default.target은 /etc/systemd/ system 디렉터리 아래에 있으며 심볼릭 링크임
- 기본 target 지정 방법 : (ststemctl set-default <name of target>.targe)
- /etc/systemd/system 디렉터리 아래의 심볼릭 링크인 default.target이 가르키는 target 파일 변경
- 현재 target인 grapical.target에서 multi-user.target 으로 바꾸려면 (systemctl set-defaut multi-user.target) 으로 입력
- 런레벨이 0이나 6에 해당하는 타겟으로 지정은 안됨
- 기본 target은 graphical(5)로 해놓는 것이 좋음
- 현재의 target을 다른 target으로 바꿔야 할 때 systemd isolate 명령으로 간단히 해결 가능
(systemctl isolate multi-user 혹은 runlevel3) 입력
- init은 1번 프로세스 이름이자 init 프로세스의 런레벨을 바꿀 때 사용하는 명령이기도 함
* 현재 init는 systemd의 심볼릭 링크 > init 명령 입력 시 required argument missing Error 발생
- (init --help) 사용법 확인 시, 기존 init에 익숙한 사용자들을 위해 명령 유지 중 init 3 입력 시 런레벨 3으로 변경 가능
- 런레벨을 변경하는 명령으로 telinit(systemctl에 대한 심볼릭 링크임) telinit 실행 시 init 명령과 동일하게 실행
- 단일 사용자 모드로 전환하기 : 시스템에 문제가 생기면 시스템을 rescue.target 유닛(런레벨 1, S)로 변경 후 점검해야 함
- 다중 사용자 모드에서 시스템 관리자만 사용할 수 있는 단일 사용자 모드로 전환하는 것
- 이 모드로 전환하기 전에 다른 사용자들이 로그아웃해야 함
- 단일 사용자 모드로 전환 시 그래픽 환경에서 텍스트 모드로 변경
3. 시스템 종료 및 데몬 프로세스
(1) 리눅스 시스템의 종료
- 리눅스에서 시스템을 종료할 때 정상적인 절차를 거치는 것이 매우 중요
- 리눅스는 비정상적으로 시슽메을 종료하여 문제가 발생하면 서비스를 제공하지 못할 수 있음
- 전원 끄기는 다른 무엇도 할 수 없을 때에만 사용하는 최후의 수단임
- 전원 끄기 방법 : shutdown 명령, 런레벨 0이나 6으로 전환, halt 명령, poweroff 명령, reboot 명령, 전원을 끔
- 리눅스 시스템을 가장 정상적으로 종료하는 방법은 shutdown 명령임 (시스템 런레벨 변경 시에도 사용)
- shutdown [옵션] [시간] [메세지] (시간 후에 메세지를 보내고 끈다는 의미)
* -k 실제로 시스템을 종료하는 것이 아니라, 사용자에게 메세지만 전달함
* -r 종료 후 재시작
* -h 종료하며 halt 상태로 이동
* -f 빠른 재시작으로 이 과정에서 fsck 생략
* -c 이전에 내렸던 shutdown 명령을 취소
* 시간 종료할 시간(hh:mm 혹은 +m 혹은 now)
* 메세지 모든 사용자에게 보내질 메세지
- shutdown 명령으로 시스템 즉시 종료 시 -h 옵션과 함께 now로 현재 시간 지정
- 종료 시간이 now 이므로 시스템 종료 절차가 바로 시작됨
- 메세지 사용 시 사용자가 메세지를 받고 정리할 시간이 필요하므로 시간을 지정해주는 것이 좋음
- 시스템을 종료하는 다른 방법은 런레벨을 변경하는 것
- telinit 명령으로 런레벨을 0으로 변경하면 시스템이 종료되고 6으로 변경하면 리부팅됨 (telinit 0)
- systemd 기능 사용 시 target을 바꾸면 됨 (systemctl isolate poweroff.target 아니면 runlevel0.target)
- halt, poweroff, reboot도 있음(같은 systemctl의 심볼릭 링크로 전통적인 방법으로 유지 중)
> /var/log/wtmp에 시스템 종료 기록을 남기고 시스템을 종료하거나 재시작함
* -n 재시작하거나 종료 전에 sync를 호출하지 않음
* -w 실제로 재시작하거나 종료하지는 않지만 wtmp 파일에 기록을 남김
* -d wtmp 파일에 기록을 남기지 않음(-n 옵션은 -d 포함)
* -f 강제로 명령을 실행 shutdown을 호출하지 않음
* -p 시스템의 전원을 끔
(2) 데몬 프로세스
- 데몬 : 리눅스의 백그라운드에서 동작하며 특정 서비스를 제공하는 프로세스
- 리눅스 시스템에서 동작하는 웹 서버나 데이터 베이스 서버, 원격 접속 서버 등 각종 서비스를 제공하는 프로세스
- 독자형 : 데몬 혼자서 스스로 동작, 백그라운드에서 항상 동작, 자주 호출하지 않으면 시스템 자원 낭비 우려가 있음
- 슈퍼데몬에 의한 동작 : 평소 슈퍼 데몬만 동작하다가 서비스 요청이 오면 슈퍼 데몬이 해당 데몬을 동작시킴
독자형보다 서비스 응답에 시간이 좀 더 걸릴 수 있음, 자원 효율적 사용 가능
- 데몬이 제대로 동작하지 않으면 시스템이 서비스를 제공할 수 없음
- 데몬은 종류가 늘어나자 이를 관리하기 위한 슈퍼 데몬이 등장
- 유닉스의 슈퍼 데몬 : inetd
- 로키 리눅스의 슈퍼 데몬 : 보안 기능이 포함된 xinetc
- 슈퍼 데몬은 사용자의 요청을 받아 해당하는 서비스 데몬을 동작시킴
- systemd는 init를 대체한 데몬
- systemd는 1번 프로세스로서 대다수 프로그램의 조상 프로세스로 시스템의 상태를 종합적으로 관리
- 커널 스레드 데몬 : 커널 일부를 프로세스처럼 관리하는 데몬
> ps 명령으로 확인 시 []에 들어있는 데몬
> 대부분 입출력이나 메모리 관리, 디스크 동기화 등을 수행하며 대체로 낮은 PID 할당
> 커널 스레드를 동작하는 조상데몬은 커널 스레드 데몬임
> PPID가 2번임을 알 수 잇음 kthread 데몬
- 리눅스에서는 다양한 서비스 제공
| 데몬 | 기능 |
| atd | 특정 시간에 실행하도록 예약한 명령 실행 (at 명령으로 예약) |
| crond | 주기적으로 실행하도록 예약한 명령을 실행 |
| dhcpd | 동적으로 IP 주소를 부여하는 서비스 제공 |
| httpd | 웹 서비스를 제공 |
| lpd | 프린트 서비스를 제공 |
| nfs | 네트워크 파일 시스템 서비스 제공 |
| named | DNS 서비스 제공 |
| sendemail | 이메일 서비스 제공 |
| smtpd | 메일 전송 서비스 제공 |
| popd | 기본 편지함 서비스 제공 |
| routed | 자동 IP 라우터 테이블 서비스 제공 |
| smb | 삼바 서비스 제공 |
| syslogd | 로그 기록 서비스 제공 |
| sshd | 원격 보안 접속 서비스 제공 |
| in.telnetd | 원격 접속 서비스 제공 |
| ftpd | 파일 송수신 서비스 제공 |
| ntpd | 시간 동기화 서비스 제공 |
'컴퓨터공학부' 카테고리의 다른 글
| [데이터 구조와 활용] 그래프 (1) | 2026.04.23 |
|---|---|
| [자료구조] 정렬 ① (0) | 2026.04.22 |
| [문제 해결 알고리즘] 그리디 알고리즘 2 (1) | 2026.04.19 |
| [차크라 명상] 딴뜨라에서 소리/파동(sabda)와 치유 (1) | 2026.04.18 |
| [데이터 구조와 활용] 트리 (0) | 2026.04.17 |