Gom3rye
리눅스를 활용한 패키지 관리 본문
패키지 관리
C언어 컴파일 및 실행 파일 만들기
패키지를 사용하는 방법 중 소스 코드를 내려받아서 컴파일 한 후 사용하는 방법이 제공된다.
구글이 만든 것 → 쿠버네티스 (오픈 소스)
카카오 → DKOS
AWS → EKS (쿠버네티스의 소스 코드를 고쳐서 더 편리하게 만든 것)
⇒ 소스 코드 고칠 수 있어야 한다.
- 컴파일러가 설치되어 있는지 확인
- gcc 명령을 수행해서 gcc가 없다고 나오면 설치를 해야 한다.
- 설치 : sudo apt install gcc
- 소스 파일 1개로 구성된 경우
- 소스 코드 작성 : vi test.c
#include <stdio.h> int main(){ printf("Hello GCC\\n"); return 0; }
- 컴파일 및 실행 파일 만들기 : gcc 소스 코드 파일 별다른 옵션이 없으면 실행 파일은 a.out으로 만들어진다.
- 실행 : ./a.out
- 실행 파일 이름 변경하기 : -o 실행파일이름 (gcc -o test test.c)


- 소스 파일이 여러 개인 경우
- 순서대로 컴파일을 해서 목적 프로그램을 만들고 다시 링크를 해서 실행 파일을 만들어야 한다.
- makefile(컴파일 및 링크 설정)을 만들어서 make 명령을 하면 조금 더 수월하게 이 작업을 수행할 수 있다.
- make 패키지 설치 : sudo apt install make
- 첫 번째 소스 코드 작성 : vi two.c
#include <stdio.h> int two(){ printf("TWO\\n"); return 0; }
- 두 번째 소스 코드 작성 : vi one.c
#include <stdio.h> extern int two(); int main(){ printf("ONE\\n"); two(); return 0; }
- makefile 작성 : vi makefile
- 실행파일매크로이름 = 실행파일이름
- 목적파일매크로이름 = 목적파일을 나열
${실행파일매크로이름} : ${목적파일매크로이름} gcc -o ${실행파일매크로이름} ${목적파일매크로이름} 목적파일이름 : 소스파일이름 gcc -c 소스파일이름 -------------------------------------------------------------------- TARGET=one OBJECTS=one.o two.o ${TARGET} : ${OBJECTS} gcc -o ${TARGET} ${OBJECTS} one.o : one.c gcc -c one.c two.o : two.c gcc -c two.c
- make 명령

리눅스의 부팅과 종료
리눅스의 부팅
부팅 과정 : 전원 → BIOS 단계 → Boot Loader → Kernel Init → Systemd → Login Prompt
- BIOS 단계
- 전원을 켜면 BIOS (Basic Input/Output System)가 동작
- 기본적인 하드웨어(키보드, 디스크 등)의 상태를 확인하고 부팅 장치를 선택해서 부팅 디스크의 첫 섹터에서 512B를 로딩
- 첫 섹터의 512B를 MBR(Master Boot Record)라고 하며 디스크의 어느 파티션에 2차 부팅 프로그램(Boot Loader)이 있는지에 대한 정보가 저장되어 있다.
- MBR은 부트 로더를 찾아서 메모리에 로드하는 작업까지 수행
- Boot Loader
- 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공
- 우분투에서는 GRUB를 사용하는데 기본적으로 멀티 부팅이 아니면 GRUB는 메뉴를 출력하지 않고 바로 부팅 작업을 진행
- 부팅할 때 GRUB 메뉴를 출력하려면 /etc/default/grub 파일을 수정해야 한다.
- GRUB_TIMEOUT_STYLE=hidden 부분을 삭제 or #을 추가해서 주석을 만드는 것이 좋다.
- GRUB_TIMEOUT=0 부분의 숫자를 다른 숫자로 변환 (메뉴가 화면에 나왔을 때 얼마동안 동작이 없으면 기본으로 넘어갈 것인지의 설정, ex. 0 → 메뉴가 뜨자마자 넘어가 버리는 것)
- sudo update-grub 를 실행해서 변경 내용을 적용
- 이렇게 다 수정하면 다시 부팅할 때 메뉴를 선택하는 창이 나온다.
- 왠만하면 서버 쓰는 사람들은 부팅 메뉴를 보는 것이 좋다. (ex. cmd 창 켜져 있는 상황에서 java 깔고 java 버전 물어보면 없다고 나온다.)
- 부트 로더는 리눅스 커널을 메모리에 로딩하는 역할을 수행한다.
- 리눅스 커널은 /boot 디렉토리 아래에 vmlinuz-버전 명의 형태로 존재한다.



- 커널 초기화 단계
- 시스템에 연결된 메모리, 디스크, 키보드, 마우스 등의 장치를 검사한다.
- 사용 가능한 하드웨어 정보를 미리 확인했다가 부팅될 때 이러한 장치들이 사용 가능한 상태로 유지되고 있는지 확인한다.
- 장치 검사 등 기본적인 초기화 과정이 끝나면 일반적으로 프로세스를 만드는 fork를 사용하지 않고 프로세스와 스레드를 생성한다.
- 이렇게 만들어진 프로세스와 스레드는 메모리 관리와 같은 커널의 여러가지 동작을 수행한다.
- 커널 프로세스의 개수는 버전에 따라 달라진다.
- 커널 프로세스들은 다른 프로세스와 구분하기 위해서 [ ]로 표시되고 PID가 낮게 배정된다.
- [ 대괄호로 표시되는 커널 프로세스들은 시스템 동작에 필수적이므로 임의로 종료하거나 변경해서는 안 된다.
- 이들 프로세스를 잘못 건드리면 시스템 전체가 불안정해질 수 있다.
- 커널 프로세스가 생성되면 커널이 수행할 작업이 끝나고 systemd 서비스를 동작한다.
- systemd 서비스 단계
- 리눅스가 본격적으로 동작하기 시작한 단계
- 우분투에서는 기존의 init 스크립트를 대체한다.
- 각 서비스가 시작되는 과정을 메시지로 출력한다.
- 우분투에서 GUI를 설치하게 되면 메시지가 전부 출력되지는 않고 Splash 이미지가 출력된다. (로딩될 때 보여주는 이미지 : Splash 이미지)
- if 메시지 전부 보고 싶으면 → GUI가 설치된 환경에서 systemd 메시지를 출력하도록 설정하면 된다.
- /etc/default/grub 파일의 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”에서 quiet를 삭제하고 sudo update-grub를 실행하고 재부팅하면 된다.
- 메시지는 부팅 후 dmesg 명령이나 /var/log/boot.log 파일을 확인해도 된다.
- 터미널에서는 sudo dmesg | more 나 less 또는 cat 명령으로 확인하면 된다.
- systemd 서비스는 데몬을 모두 실행한 뒤 로그인 시스템을 출력한다.
- GUI를 설치한 경우는 GDM(Gnome Display Manager)를 출력
systemd
- 기존에는 init 프로세스가 스크립트를 순차적으로 실행하여 다른 프로세스를 동작시켰다.
- 현재는 init 서비스는 systemd 서비스로 대체되고 심볼릭 링크로 변경됐다.
- run level : unit의 상태를 7가지로 구분하고 각 경우에 따라 스크립트 파일을 실행한다.
- init run level
- 0: 시스템 종료
- 1: 응급 복구 모드
- 2, 3, 4: 다중 사용자 모드
- 5: 그래피컬 다중 사용자 모드
- 6: 재시작
- init run level
- systemd가 가지는 init에 대비한 장점
- 소켓 기반으로 동작해 inetd와 호환성을 유지하고 셀과 독립적으로 부팅이 가능하다.
- 마운트 제어가 가능하고 fsck 제어가 가능하다.
- 시스템 상태에 대한 스냅샷을 유지한다. (항상 현재 상태에 대한 정보를 가지고 있다.)
- 각 서비스에 시그널을 전달 가능하다.
- 셧다운 전에 사용자 세션의 안전한 종료가 가능하다.
- systemd 유닛
- service : 시스템 서비스 유닛으로 데몬을 시작하고 종료하고 재시작하고 로드한다. .service → 데몬을 시작시켜줌
- 이 유닛을 제일 많이 사용한다.
- target : 유닛을 그룹화
- automount : 디렉토리 계층 구조에서 자동 마운트 포인트를 관리
- device : 리눅스 장치 트리에 있는 장치를 관리
- path : 파일 시스템의 파일이나 디렉토리 등 경로를 관리
- score : 외부에서 생성된 프로세스를 관리
- slice : 시스템 프로세스를 계층적으로 관리
- socket : 소켓을 관리하는 유닛
- swap : 스왑장치 관리
- timer : 타이버와 관련된 기능을 관리
- systemd 관련 명령
- systemctl
- systemd 기반으로 서비스를 시작하거나 종료할 때 사용하는 명령어
- systemctl 명령에서는 유닛을 지정할 때 유닛의 종류는 생략해도 된다.
- sshd.service 를 사용할 때는 sshd라고만 해도 된다.
- systemctl
systemctl [옵션] [명령] [유닛]
옵션
- a: 유닛 전체를 출력
- t 유닛종류: 지정한 유닛만 출력
명령
- start: 유닛을 시작
- stop: 유닛을 종료
- reload: 유닛의 설정 파일을 다시 읽어 온다.
- restart: 유닛을 재시작
- status: 유닛의 상태를 출력
- enable: 부팅시 유닛이 시작되도록 설정
- disable: 부팅시 유닛이 시작되지 않도록 설정
- is-action: 유닛이 동작하고 있는지 확인
- is-enable: 유닛이 시작되었는지 확인
- isolate: 지정한 유닛 및 이와 관련된 유닛만 시작하고 나머지는 정지
- kill: 유닛에 시그널을 전송
동작 중인 유닛을 출력
systemctl
특정 유닛만 출력하기
systemctl -t service
cron 서비스 시작하기
sudo systemctl start cron
유닛 상태 확인
systemctl status cron

→ enabled 상태니까 cron은 부팅되자마자 무조건 서비스가 실행된다.
서비스 중지
systemctl stop cron
systemctl status cron #-> Active: inactive 상태로 바뀌어 있을 것
런레벨 변경
systemctl isolate 런레벨(이름으로 해도 되고 run level 숫자로 해도 된다.)
- 런레벨
- 0 - runlevel0.target poweroff.target
- 1 - runlevel1.target rescue.target
- 2 - runlevel2.target multi-user.target (3,4번도 동일)
- 5 - runlevel5.target graphical.target
- 6 - runlevel6.target poweroff.target
- 현재 타켓과 런레벨
systemctl get-default
- 기본 타겟 설정
systemctl set-default <name of target>.target
- target 변경
systemctl isolate multi-user
- telinit과 init을 이용한 런레벨 변경
- init 런레벨 → 런레벨 수정된다.
- telinit : systemctl의 심볼릭 링크 (사실 systemctl 명령을 대신 하는 것)
- ls -l /sbin/telinit
1번 단일 사용자 모드 : rescue.target
→ 망가지면 쓰는 모드 (like 안전모드, network 차단하고 작업 수행)
- 시스템에 문제가 발생한 경우 이 모드로 런레벨을 변경해서 다른 유저가 사용을 못하도록 하고 관리자가 수정을 할 수 있도록 한다.
- 이때 모든 다른 유저는 로그아웃을 해야 한다.
init 1 또는
systemctl isolate rescue 또는
systemctl isolate runlevel1
연습 문제
colord.service가 동작 중인지 is-active 명령으로 확인
systemctl is-active colord #inactive (.service 생략 가능)
만약 colord.service가 동작 중이라면 정지
sudo systemctl stop colord
colord.service의 상태 확인
systemctl status colord
colord.service를 다시 시작
sudo systemctl start colord
colord.service의 상태에서 PID를 조회 (실행 한 후 찾아야 한다.)
ps -ef
리눅스 시스템의 종료
종료 방법
- shutdown 명령
- halt 명령
- poweroff 명령
- 런레벨을 0이나 6으로 변경
- reboot 명령
- 전원을 차단
shutdown [옵션] [시간] [메시지]
정상적인 종료를 위한 명령어로 다양한 종료 방법 제공한다.
- 옵션
- k: 실제로 종료를 수행하는게 아니라 메시지만 전달
- r: 종료한 후 재시작
- h: 종료하고 halt 상태로 이동
- f: 빠른 재시작으로 fsck를 생략할 수 있다.
- c: shutdown 명령 취소
- 시간
- hh:mm
- +m (분단위)
- now 지정
Ex. 즉시 종료를 하고 싶다.
shutdown -h now
Ex. 일정 시간 후에 메시지를 보내고 종료 (3분 후에 종료되는 것)
sudo shutdown -h +3 "System is going down in 2 minutes."
Ex. 3분 후 재부팅
sudo shutdown -r +3
halt, poweroff, reboot 명령
- systemctl 명령의 심볼릭 링크
- 심볼릭 링크인지 확인

3개의 명령은 전부 /sbin 디렉토리에 있다.
Daemon Process
- 리눅스의 백그라운드에서 동작하며 특정한 서비스를 제공하는 프로세스
- 웹 서버나 데이터베이스 서버, 원격 접속 서버 등 각종 서비스를 제공하는 프로세스가 데몬이다.
- 데몬의 동작 방식
- 데몬 스스로 동작하는 독자형 (standalone)
- 시스템의 백그라운드에서 항상 동작하고 있는 방식
- super daemon에 의해 동작하는 방식
- 평소에는 super daemon만 동작하고 있다가 필요에 의해 해당 daemon을 다시 호출하는 방식
- 데몬 스스로 동작하는 독자형 (standalone)
- super daemon
- 데몬의 개수가 늘어나면서 이를 관리하기 위한 목적으로 탄생
- 유닉스에서는 inetd 였으나 리눅스에서는 보안 기능을 강화한 xinetd를 사용한다.
- super daemon은 네트워크 서비스를 이용하는 데몬만 관리한다.
- 조상 데몬
- systemd daemon과 kernel thread 데몬
- systemd daemon
- init을 대체한 데몬
- 1번 프로세스
- pstree 명령을 이용하면 조상 데몬이라는 것을 확인할 수 있다.

-
- kernel thread daemon
- 커널의 일부분을 프로세스처럼 관리하는 데몬
- ps 명령으로 확인했을 때 [ ] 안에 있는 프로세스들이 여기에 해당한다.
- 대부분 메모리 관리, 입출력, 디스크 동기화 등을 수행한다.
- kernel thread daemon

- 주요 데몬
- atd: at 명령
- cron: crontabl 명령
- dhcpd: 동적으로 IP주소를 배정하는 서비스
- httpd: 웹 서버
- nfs: 네트워크 파일 시스템 서비스
- named: DNS (domain name ↔ IP 변환 서비스)
- sendmail
- smtpd: 메일을 보내는 서비스
- popd: 기본 편지함 서비스
- routed: 자동 IP 라우터 테이블 서비스
- smb: 삼바 서비스
- syslogd: 로그 기록 서비스
- sshd: 원격 보안 접속 서비스
- ffpd: 파일 송수신 서비스
- ntpd: 시간 동기화 서비스 (되게 중요!! 특히 쿠버네티스 사용하면서 컴퓨터 여러 개 동기화했을 때 시간 다르면 에러 난다. → 네트워크 만들 때 제일 먼저 하는게 시간 동기화)
computer 구분: IP → 숫자 but 기억하기 어려우니까 의미 있는 문자열 : Domain으로 변환
application 구분: port
systemctl start mysqld (d는 daemon의 약어)
systemctl stop mysqld
runlevel 바꿔서 종료 시키는 것과 systemctl 명령어 쓸 줄 알아야 한다. +password 바꾸는 것도
클라우드 서비스에서는 cli로 해야 한다. gui로 하면 사람이 계속 서있어야 하니까. But cli로 하면 스크립트 만들어서 실행시켜주면 되니까 사람이 없어도 된다.
GRUB
부트 로더는 커널을 메모리에 로드하는 역할을 수행
Linux에서는 LILO와 GRUB를 지원하는데 ubuntu에서는 GRUB를 기본으로 지원
- GRUB : GRand Unified Bootloader의 약자
- GRUB의 장점
- LILO는 리눅스에서만 사용이 가능하지만 GRUB는 윈도우에서도 가능하다.
- LILO에 비해 설정과 사용이 편리하고 부팅할 때 명령을 사용하여 수정할 수 있다.
- 멀티 부팅 기능을 지원한다.
- GRUB 관련 디렉토리와 파일
- /boot/grub/grub.cfg → 기본 설정파일인데 직접 수정 안된다.
- 이 파일은 /etc/default/grub 파일과 /etc/grub.d 디렉토리 아래에 있는 스크립트를 수정하면 자동으로 반영된다.
- /etc/grub.d 디렉토리
- GRUB의 명령이 실행될 때 순서대로 실행되어 grub.cfg 파일을 생성한다.
- /etc/default/grub 파일
- GRUB 메뉴 설정 내용
- 암호 복구
- root 사용자의 암호를 잊어버린 경우
- 순서
- grub 메뉴 화면이 나오도록 하기
- 재시작
- 메뉴 화면이 나올 때 E 키를 눌러서 편집 모드로 진입
- 이 편집 화면에서 ro splash &vt_handoff 를 rw init=/bin/bash로 수정하기
- F10을 눌러서 재부팅하기
- 비밀번호 입력 없이 root 계정으로 로그인 된다.
- 이때 암호 바꾸기!
- 복구 모드로 부팅하기
- 가장 기본적인 서비스만 제공하며 명령 모드로 작업한다.
- 복구 모드에서는 root 계정으로 로그인해서 시스템의 복구에 필요한 작업을 수행한다.
- 부팅 과정
- 재부팅해서 GRUB 선택 화면에 두 번째 메뉴로 부팅
- 부팅 과정이 진행되다가 복구 메뉴 화면이 출력된다.
- root로 로그인
- 마운트 명령어 치기
mount -o remount.rw /
사용자 관리
사용자 계정 관련 파일- /etc/passwd
- 사용자 계정 정보가 저장된 파일
- 파일의 구조 : 로그인ID:x:UID:GID:설명:홈디렉토리:로그인셸
- 로그인ID: 사용자 계정 이름
- x: 유닉스 시스템에서는 이 자리에 암호를 기록했는데 리눅스에서는 별도의 파일에 기록
- UID: 사용자 ID 번호로 시스템이 사용자를 구별하기 위해서 부여하는 번호로 일반적으로 0-999번과 65534번은 시스템 사용자 용으로 예약되어 있고 일반 사용자는 1000번부터 할당된다.
- GID: 그룹을 구별하기 위한 번호
- 설명: 사용자의 실명이나 부서명 등 일반적인 정보가 기록되는 부분
- 홈디렉토리: 사용자가 로그인했을 때 처음 접속하는 디렉토리
- 로그인셸: 로그인했을 때 사용할 수 있는 셸
- /etc/shadow
- 계정의 비밀번호를 저장하고 있는 파일
- root 사용자만 조회 가능하다.
- 파일의 구조 : 로그인ID:비밀번호:최종변경일:MIN:MAX:WARNING:INACTIVE:EXPIRE:Flag
- 비밀번호: 암호화해서 저장
- 비밀번호가 없으면 비어있고 시스템 계정은 *로 되어 있음
- 사용자 계정의 암호는 해독할 수 없도록 되어 있다. (hash 함수를 이용해서, 똑같은 비밀번호도 hash 함수가 다르게 적용되기 때문에 다르게 암호화된다.)
- 사용자가 비밀번호를 입력하면 이를 암호화해서 비교하도록 한다.
- 최종변경일: 리눅스는 항상 기준일이 1970년 1월 1일을 기준으로 해서 지나온 날 수
- MIN: 비밀번호를 변경하고 이 날짜 만큼은 사용을 해야 한다. ex. 당근의 닉네임 → 바꾸면 1달 동안은 사용해야 한다.
- MAX: 비밀번호를 변경하고 최대로 사용할 수 있는 날 수
- WARNING: 암호가 만료되기 전에 경고를 시작하는 날 수
- INACTIVE: 암호가 만료된 후에도 지정한 날 수 동안은 로그인이 가능하도록 해주는 것
- EXPIRE: 계정이 만료되는 날로 최종 변경일과 동일하게 계산
- Flag: 미래를 위해 남겨둔 항목
- 비밀번호: 암호화해서 저장
- /etc/login.defs
- 사용자 계정의 설정과 관련된 기본값을 정의한 파일
- 리눅스는 id가지고 구별하는게 아니라 uid를 가지고 구별하는 것 (로그인 할 때만 id로 구별하는 것) → uid 함부로 고치면 에러 난다.
- /etc/group
- 리눅스의 사용자는 반드시 하나의 그룹에 속해야 한다.
- 그룹에 관련된 정보를 가지고 있는 파일
- 파일 구조: 그룹이름:x:GID:그룹 멤버
- /etc/gshadow
- 그룹의 암호 관련 파일
- 파일 구조: 그룹이름:그룹암호:관리자:그룹멤버
사용자 계정 관련 명령
useradd [옵션] [로그인ID]
옵션
- u uid: uid 설정
- o: uid의 중복을 허용
- g gid: gid 설정
- G gid: 2차 그룹 아이디
- d 디렉토리: 홈 디렉토리 설정
- s 셸: 기본 셸을 설정
- c 설명: 설명 설정
- D: 기본값을 설정하거나 출력
- e 유효기간: EXPIRE를 설정 (YYYY-MM-DD)
- f 비활성일수: INACTIVE 항목 설정
- k 디렉토리: 계정 생성 시 복사할 초기 파일이나 디렉토리를 설정해놓은 디렉토리 설정
'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글
네트워크 (1) | 2025.05.26 |
---|---|
(중요!) 리눅스를 활용한 패키지 관리 (0) | 2025.05.23 |
리눅스를 활용한 시스템 관리 (1) | 2025.05.21 |
Linux (0) | 2025.05.20 |
Linux (0) | 2025.05.20 |