출처 : 유튜브 따라하면서 배우는 it - 리눅스 고급
init 뿐만 아니라 다른 기능들도 대체한 systemd
PID
: Process ID , 운영체제에서 프로세스를 식별하기 위해 부여하는 번호. PPID
: 커널(운영체제)가 실행시키는 애 0번.
Parent Process ID 의 줄임말로, 부모 프로세스의 PID를 의미한다.
부모 프로세스는 현재 실행중인 프로세스(자식 프로세스)를 시스템 콜을 호출하여 생성한 프로세스를 의미한다.
init 프로세스는 PID 1을 갖는 최초 프로세스이다. 부팅 시 운영체제가 생성하는 프로세스이다.
- 프로세스는 다른 프로세스로부터 생성되는데, 이 때 생성된 프로세스가 자식이 ㅗ디고, 이를 생성한 프로세스가 부모 프로세스가 된다.
리눅스를 부팅하면 커널이 가장 먼저 실행시키는 프로세스
기존의 리눅스는 가장 먼저 init 프로세스를 실행하고, 👍init 프로세스가 필요한 다른 프로세스를 실행
(부팅 과정 중: 앞에는 같음. post -> 부팅 장치 찾고 -> mbr 부트 코드 실행 -> 부트 로더 -> 커널 선택 -> 커널 메모리로 올라옴 -> init이나 systemd 등 실행 시키게 함 )
init이란 ls /etc/ | grep rc.
rc 숫자 디렉토리 안에 있는 여러 가지 스크립트를 실행/종료 등 내용을 수행.
예전에는 열 몇개 등 많이 있었음.
(이제는 X)
기존의 init 프로세스는 단계적으로 런 레벨을 올려가며 해당 런 레벨의 rc(Run command) 스크립트를 차례대로 실행
-🌟 각 런레벨의 상태를 만들어주는 것이 init 프로세스가 실행해주었다. 엄청 오래됨.
하지만 init은 아주 오래전 리눅스에서부터 사용하던 아주 오래된 프로세스였고,
이에 계속해서 기능이 추가되면서 프로그램들이 복잡해지다보니 👎효율 또한 떨어지게 되었다.
이에 systemd
는 init
의 단점을 보완하며 기존 리눅스의 의존성을 해치지 않도록 개발
되었다.
- systemd는 가능한 한 병렬로 시작 프로그램들을 실행시키는 것으로 부팅 속도를 끌어올리고,
프로그램 실행을 위한 파일로는 쉘 스크립트가 아니라,
service
라는 systemd만의unit
을 통해 체계적이면서가독성이 좋도록 개발
👍되었다.
systemd는 단지 init뿐만 아니라, 다른 프로그램들의 기능마저 대체
네임서버 주소를 설정하는 resolv.conf의 자리를 systemd-resolved
가 대체, DHCP 서버에서 IP를 받아와 네트워크 인터페이스에 설정하는 dhcpcd의 자리를 systemd-networkd 가 대체
🤔 systemd 무슨 기능을 수행?
- 시스템 부팅 관련 프로세스를 실행
- 서비스 관리(리눅스에서는 데몬 프로세스,백 그라운드 : ex) 웹 서버, DNS, FTP, SSH 서버 등을 관리) ex) 웹 서버 구축: 설치하고 실행시킬 때 systemd로 실행 (얘가 관리하기 때문)
systemd 는 전체 시스템을 시작하고 관리하는 데 유닛(units)이라 부르는 구성 요소를 사용
systemd는 관리 대상의 이름을 서비스 이름.유닛 종류
의 형태로 관리
유닛은 같은 이름과 종류로 구성된 설정 파일과 동일한 이름을 사용
유닛 | 기능 | 예 |
---|---|---|
service | 데몬의 시작, 종료, 재시작 담당 | atd.service |
socket | 소켓을 관리하는 유닛 | dbus.socket |
device | 리눅스의 여러 장치들을 관리 | dev-sda.device |
mount | 마운트 포인트 관리 | boot.mount |
automount | 자동 마운트 포인트 관리 | proc-sys-fs-binfmt_misc.automount |
systemd를 제어하는 systemctl 명령어
⭐systemctl [옵션][명령] [유닛이름]
-a
: 상태와 관계없이 유닛 전체를 출력한다-t
[유닛의 종류] : 지정한 종류의 유닛만 출력한다. start
: 유닛을 시작한다.stop
: 유닛을 정지한다.reload
: 유닛의 설정 파일을 다시 읽어온다.restart
: 유닛을 재시작한다.status
: 유닛이 현재 상태를 확인한다.enable
: 부팅 시 유닛이 자동으로 시작되도록 설정한다.disable
: 부팅 시 유닛이 자동으로 시작되지 않도록 설정한다. 훨씬 더 많음...
서비스 타입들의 유닛들을 확인하는 법
systemctl list-unit-files --type service
systemctl status service atd.service
- ① 상태확인(active인지)
- ② 프로세스 확인
systemctl stop atd.service
다시 시작 (start해도 되는데, ps 명령어에서 다시 확인하려고 restart 해봄)
부팅 되었을 때, 해당 서비스가 바로 실행이 안 되고 수동으로 실행시켜야 함.
enable로 실행시켜야함.
유닛파일이 등록되어 있으면 자동으로 실행 됨 -> ls -l /usr/lib/systemd/system.atd.service
~.target
: 런 레벨이 init에서 쓰던 것. -> systemd에서 target으로 씀. 런레벨 3에 해당.
ls -l /usr/lib/systemd/system/runlevel*.target
이렇게 실행!
yum install httpd
(패키지 관리 시): 인터넷 저장소에서 뒤에서 지정한 프로그램을 자동으로 다운받아서 설치해주는 것.
yum
, 우분투는 apt-get
🤩 유닛 파일을 직접 만들어줘야 한다.
netcat : 리눅스에도 같은 버전이 있다. 유명한 애가 아님. 자동으로 systemd에 등록되지 않는다. 설치를 하고, 서버로서 동작을 시킬 때, 어떻게 systemd에 등록하는지
나는 파일이 안받아져서(바이러스 발견) 캡쳐로 같이 진행하는 것으로..
tar zxvf로 한번에 풀기
directory 로 들어가면, 소스코드 여러개
c언어로 되어있는 파일. 프로그램으로 만들려면, 컴파일이라는 과정이 필요하다.
컴파일 수행하려면 특정 프로그램이 필요한데, 그걸 설치하기로 한다.
rpm: 설치 실행 파일
yum 을 이용해서 설치하는 것이 가장 깔끔한 방법.
./configure
-> 여러분 환경에 맞게 생성
make
-> compile 하는 것
make install
-> 컴파일 해서 나온 실행파일을 명령어 있는 곳에 복사 등
에러가 없어야 제대로 설치됨.
nc라고 쳤을 때, Cmd line
이 뜬다.
이것이 가장 기본적인 형태.
🖥️ 프로그램을 설치하는 방법
1. httpd처럼 인터넷 저장소에서 자동으로 설치
2. 설치 실행파일이 있어서 그걸 다운받기
3. 소스코드로 되어 있는 파일을 직접 다운 받음
서버로서 등록시키려고 하는데, nc -l -p 1000 명령어를 쳐야함.
systemd로 관리시키고 싶은데 -> 유닛파일 생성해주어야 함.
유닛파일이 어디에? cd /usr/lib/systemd/system
(버전별로 다름)
유닛 파일 만드는 방법
1. 이 파일을 vi/nano로 수동으로 만듦
- vi nc.service
1) 세 군데 영역 :[Unit] / [Service] / [Install]
세 가지로 나눔
- Unit : 얘에 대한 설명, 후속조치, 동작하는 데 필요한 다른 프로그램 등의 것들을 지정
- ⭐Service : 실행파일 위치, 설정파일 위치 지정하는 곳
- Install : 어떤 런레벨에서 실행되게 할 것인가.
vi nc.service
[Unit]
Description=NETCST Server설명 적어줌
[Service]
ExecStart=/usr/local/bin/nc-l -p 9999
: 서버처럼 동작하게 할 거면, l, p 설정
실행파일의 위치. 실행시켜라.
찾는법-> which nc
-> /usr/local/bin/nc
[Install]
WantedBy=multi-user.target : 어떤 런레벨에서 실행할 것인지.
-> systemd에 등록할 수 있음.
find / -name network.service