[Linux] Linux 응용

Bzeromo·2025년 5월 8일
0

Infra, DevOps, MSA

목록 보기
25/28
post-thumbnail

⚡ Linux 응용


📌 vi 에디터

🔷 유닉스 운영체제를 위해 만들어진 화면 기반의 텍스트 편집기

  • 1970년대 중반: 당시 유닉스 시스템에는 ed라는 라인 기반 텍스트 편집기가 기본

  • 1976년, 빌 조이(Bill Joy)가 UC 버클리에서 ex(익스)라는 라인 편집기를 개발함

  • 1979년 5월, Second BSD와 함께 배포된 ex 2.0부터 vi라는 이름으로 설치

  • 오리지널 vi는 AT&T의 저작권에 묶여 자유롭게 배포 불가(상업적 UNIX만 사용 가능)

  • 2000년대 초, 비로소 오리지널 vi 소스가 오픈소스 라이선스로 풀림


📌 vim 에디터

🔷 Vi IMproved(개선된 vi)의 약자

  • 1991년, 브람 몰렌라가 처음 발표

  • vi와 호환되면서 훨씬 많은 기능 추가하는 것을 목표

  • vi와 100% 호환성을 유지하면서도 더 강력한 텍스트 편집 환경을 제공

  • 서버나 터미널 환경에서 빠르고 가볍게 텍스트 파일을 만들고 수정하는 데 가장 널리 사용


📌 vi/vim 에디터 특징

🔷 모드 방식 에디터

  • vi는 한 가지 모드에서만 작동하는 것이 아니라,
    명령 모드, 입력 모드, 명령줄 모드 세 가지로 나뉘어 있음

🔷 키보드만으로 모든 조작이 가능

  • 마우스 없이 텍스트 편집, 저장, 나가기, 복사/붙여넣기 등 제어

💡 모드형과 비모드형 편집기

🔷 모드형: 입력 모드와 명령 모드를 구분

  • 입력 모드: 텍스트를 입력할 수 있는 모드
  • 명령 모드: 텍스트 수정/삭제/복사/붙이기 등 편집 모드

🔷 비모드형: 모드 구분이 없음 (예: 한글, 워드 등)

  • alt, ctrl, shift 등 특수 키를 이용하여 편집 명령 수행

📌 vi/vim 3가지 모드

🔷 명령 모드 (Command mode)

  • 기본 모드 (vi를 실행하면 바로 이 상태!)

  • 커서 이동, 삭제, 복사, 붙여넣기 등 명령을 입력

  • 입력 모드로 전환: i, a, o

🔷 입력 모드 (Insert mode)

  • 실제로 텍스트를 입력/수정하는 모드

  • 명령 모드에서 i(insert), a(append), o(open line) 등 입력

  • 명령 모드로 돌아가려면: Esc

🔷 명령줄 모드 (command-line mode)

  • 저장, 종료, 검색, 교체 등 명령 입력

  • 명령 모드에서 :(콜론) 입력 후 사용

명령 사용법

  • 저장: :w

  • 종료: :q

  • 강제종료: :q!

  • 저장 & 종료: :wq

  • 삭제 : dd

  • 돌리기 : u

  • 복사 : yy

  • 븥여넣기 : p

  • 행 번호 보이기 : :set nu

  • 위에서부터 찾기 : /검색어

  • 아래에서부터 찾기 : ?검색어

  • 더 찾기 : /enter or ?enter

  • 맨 아래로 내려가기 : G (shift + g)

  • 맨 위로 올라가기 : gg

  • 열의 맨 뒤로 가기 : $ (shift + 4)

  • 열의 맨 앞으로 가기 : ^ (shift + 6)

  • 한 단어 단위로 앞으로 가기 : W

  • 한 단어 단위로 뒤로 가기 : B


📌 환경 변수

🔷 리눅스 시스템에서 운영체제와 쉘, 실행되는 프로그램이 참고하는 값(데이터)

  • 전역적으로 시스템에 영향을 주거나, 특정 프로그램에 옵션/동작 방식을 지정 시 사용

🔷 시스템 환경변수

  • 시스템 전체에 적용, 모든 사용자와 프로세스가 접근 가능

  • /etc/profile, /etc/environment 등에서 지정

🔷 사용자 환경변수

  • 개별 사용자에게만 적용

  • 사용자의 홈 디렉토리에 위치한 ~/.bashrc, ~/.profile, ~/.bash_profile 등에서 지정

    • 파일명용도 및 동작 설명
      ~/.bash_profile로그인 쉘에서 실행. 콘솔, SSH 등 로그인 시 한 번만 읽힘
      ~/.profile대부분의 로그인 쉘에서 실행. bash뿐 아니라 sh, dash 등에서도 읽을 수 있음
      ~/.bashrcbash가 실행될 때 자동으로 run(commands) 하는 스크립트를 모아둔 파일

⭐ 환경변수 확인 및 설정

🔷 전체 환경변수 확인

  • printenv 또는 env

🔷 특정 변수 확인

  • echo $변수이름

🔷 환경변수 임시 설정 (한 세션(터미널)에만 적용)

  • export 변수이름=값

❗ 새 터미널에서는 안뜬다.

🔷 환경변수 영구 설정

  • 특정 계정에 영구 적용

    • 로그인/새 터미널 시 자동 적용

    • ~/.bashrc, ~/.bash_profile, ~/.profile 등에 export 변수이름=값 형태로 추가

  • 시스템 전체에 적용하고 싶으면

    • /etc/profile이나 /etc/environment 파일 편집
  • vi .profile로 환경 변수 파일을 열어 안에 export 변수이름=값 작성

💡 다른 터미널에서는 바로 보이지만 수정 작업을 한 터미널에서는 바로 안보인다. 새 터미널을 열 필요 없이 source .profile 명령어로 반영시킨다.


📌 Process 관리

🔷 시스템의 효율적인 운영과 모니터링, 문제 해결을 위해 꼭 알아야 할 필수 내용

🔷 프로세스는 실행 중인 프로그램의 인스턴스(작업 단위)

  • 각 프로세스는 고유의 PID(Process ID)를 가지며, 부모/자식 관계, 사용자, 상태, 자원 사용량 등의 정보를 가짐

  • 리눅스에서 모든 작업(명령어, 서비스, 프로그램)은 프로세스로 동작함

프로세스 관련 명령어

명령어주요 기능 및 설명
ps, ps aux프로세스 목록, 상태, 상세 정보 확인
top, htop실시간 프로세스/자원 모니터링
pgrep, pidof프로세스 ID(PID) 찾기
kill, killall프로세스 종료
nice, renice프로세스 우선순위 변경
jobs, fg, bg현재 셸의 작업 관리 (백/포그라운드 전환)
pstree프로세스를 트리 형태로 시각화
lsof -p PID해당 프로세스가 이용 중인 파일 목록 확인

💡 ps aux | grep 검색어로 찾아 kill할 수 있다.


📌 Network 관리

🔷 서버와 워크스테이션의 안정적인 통신, 보안, 문제 해결을 위해 필수적인 영역

🔷 네트워크: 여러 컴퓨터(서버, 클라이언트, 장치)가 서로 데이터를 송수신할 수 있도록 연결한 시스템

🔷 리눅스에서 네트워크 인터페이스(유선: eth0, enp0s3 등 / 무선: wlan0 등)를 이용해 IP 주소, 게이트웨이, DNS 설정 등을 구성

🔷 주요 설정 파일

  • /etc/netplan/*.yaml : 우분투 리눅스 네트워크 설정 파일

  • /etc/sysconfig/network-scripts/ifcfg-eth0 : 레드햇 계열 리눅스 네트워크 설정 파일

  • /etc/resolv.conf : DNS 서버 설정 파일

💡 이 설정 파일의 들여쓰기는 중요하다.

⭐ 주요 명령어

🔷 네트워크 IP 확인

  • ipconfig (Legacy)
  • ip addr show
  • ip a

💡 ens33
inet "ip address"

🔷 라우팅 테이블 보기

  • route -n

💡 설치가 필요하다.
sudo apt install net-tools

  • netstat -rn

  • ip route (보기 어려움)

🔷 대상 호스트의 작동 여부를 확인

  • ping "host"

🔷 Ubuntu에서 고정 ip 설정하는 코드

  • sudo vi /etc/netplan/50-cloud-init.yaml
network:
  version: 2
  #renderer: networkd
  ethernets:
    ens33:
      addresses:
        - "ip address"
      routes:
        - to: default
          via: "route address"
      nameservers:
          addresses: ["address 1", "address 2"]

🔷 설정 적용

  • sudo netplan apply

🔷 테스트

  • ping "host"
  • ping google.co.kr

📌 사용자 관리

🔷 리눅스 시스템을 사용하는 개별 계정

  • 각 사용자는 고유의 이름, UID(식별 번호), GID(그룹 ID), 홈 디렉토리, 쉘 정보를 가짐

  • 리눅스에는 크게 일반 사용자와 관리자(root) 계정이 존재

🔷 사용자 정보 파일

  • 파일 경로설명
    /etc/passwd사용자 계정 정보 (이름, UID, 홈 디렉토리, 쉘 등)
    /etc/shadow사용자 암호화된 비밀번호 및 보안 정보
    /etc/group그룹 정보

⭐ 주요 명령어

🔷 사용자 추가

  • sudo adduser [사용자명]

  • sudo useradd [사용자명]

→ adduser는 대화형(Interactive) 방식

→ useradd는 단순 명령어로 옵션 필요

  • sudo useradd -m -s /bin/bash -c "abc123d" -G sudo abc123d
    = 이름, 홈 디렉토리 설정, 권한 설정까지

🔷 비밀번호 설정

  • sudo passwd [사용자명]

🔷 다른 계정으로 로그인

  • su [사용자명]

🔷 사용자 삭제

  • sudo deluser [사용자명]

💡 삭제해도 기존의 작업 디렉토리는 남아있다.

deluser --remove-home [사용자명]으로 디렉토리까지 삭제 가능하다.

  • sudo userdel [사용자명]

💡 마찬가지로 디렉토리가 남지만 userdel -r 옵션으로 메일 주소까지 전부 지워버릴 수 있다.

🔷 사용자 정보 수정

  • sudo usermod [옵션] [사용자명]

  • 홈 디렉토리 변경:
    sudo usermod -d /home/newdir 사용자명

  • 로그인 쉘 변경:
    sudo usermod -s /bin/bash 사용자명

  • sudo 권한 주기:
    sudo usermod -G sudo 사용자명

  • 기존 그룹을 유지하면서 새 그룹에 추가하기:
    sudo usermod -aG sudo 시용자명

🔷 그룹 관리

  • 그룹은 여러 사용자에게 동일한 권한을 부여할 때 사용

  • 그룹 추가:
    sudo addgroup [그룹명]

  • 그룹 삭제:
    sudo delgroup [그룹명]

  • 사용자 그룹 추가:
    sudo usermod -aG [그룹명] [사용자명]


📌 리눅스 권한 설정

🔷 일반적으로 파일 시스템은 파일/디렉토리에 대해 접근을 허용하거나 거부하는 권한 설정 존재

  • 권한 설정은 주로 읽기, 변경, 탐색, 실행 등 기능별로 접근 제어

  • 사용자별 또는 사용자 그룹별로 허용 여부 지정 가능

🔷 리눅스의 권한 설정은 누가 무엇을 할 수 있는지 제한하는 시스템

  • 권한 설정을 제대로 이해하면, 시스템 보안과 효율적인 운영에 큰 도움이 됨

  • 널리 쓰이는 관련 기술:
    SetUID, SetGID, Sticky Bit, 접근 제어 목록(ACL)

🔷 리눅스 권한 설정 기준

  • 전통적으로 유닉스 기반 파일 시스템의 권한 설정은 POSIX.1-2017에서 정의되어 있음

  • 이 표준은 사용자(user), 그룹(group), 기타(others) 세 가지 범주를 지정하고 각 범주에 대해 읽기(read), 쓰기(write), 실행(execute) 권한을 부여하거나 거부할 수 있도록 설정

🔷 권한 대상 분류

  • owner(user): 해당 파일/디렉토리의 소유자

  • group: 해당 파일이 속한 그룹의 사용자

  • others: 그 외 모든 사용자 (소유자와 그룹에 속하지 않은 모든 사용자)

🔷 각 집단에 대해 부여할 수 있는 권한

기호의미설명
rread읽기 (파일 내용, 디렉토리 목록 보기)
wwrite쓰기 (수정, 생성, 삭제)
xexecute실행 (파일 실행 또는 디렉토리 진입)

🔷 기호(symbolic) 방식

  • 예: -rwxr-xr--

    • 2~4번째 문자: 소유자 권한 → rwx

    • 5~7번째 문자: 그룹 권한 → r-x

    • 8~10번째 문자: 기타 사용자 권한 → r--

  • 기호 모드(chmod) 구성 요소:
    chmod [사용자 카테고리 문자][연산자 기호][접근 권한 문자] 파일명

  • 구성 요소별 설명

  1. 사용자 카테고리 문자

    문자의미
    u파일 소유자
    g파일 소유 그룹
    o소유자와 그룹 외 사용자
    a전체 사용자 (all)
  2. 연산자 기호

    기호의미
    +권한 부여
    -권한 제거
    =권한 설정
  3. 접근 권한 문자

    문자의미
    r읽기 권한
    w쓰기 권한
    x실행 권한
#예시
chmod u+x script.sh  # 소유자에게 실행 권한 추가
chmod go-r file.txt  # 그룹과 기타 사용자에게 읽기 권한 제거
chmod a=rw file.txt  # 모든 사용자에게 읽기/쓰기 권한만 부여

🔷 숫자(octal) 방식

  • 각 권한에 숫자를 할당해서 세 자리 숫자로 표시:

    • 읽기(read) = 4

    • 쓰기(write) = 2

    • 실행(execute) = 1

    • 조합 예시

      기호 권한숫자 계산식결과
      rwx4 + 2 + 17
      r-x4 + 0 + 15
      r--4 + 0 + 04

      -rwxr-xr-- 권한은 754로 표현됨

🔷 자주 사용하는 권한 설정

퍼미션의미설명
600소유자만 읽기/쓰기개인 설정파일 (.ssh/id_rsa 등)
644소유자: rw, 그룹/기타: r텍스트파일, HTML, 로그 등
700소유자만 모두 가능 (rwx)개인 스크립트, 실행파일
755소유자: rwx, 그룹/기타: r-x공개 실행파일, 스크립트
777모두에게 모든 권한 (보안상 거의 비추)테스트/임시폴더 (주의!), 공개용 임시폴더 (/tmp 등)

🔷 chown

  • 파일/폴더의 소유자(및 그룹)를 변경한다.
    sudo chown [소유자][:그룹] 파일명

  • 예시

    • 소유자만 변경
      sudo chown john test.txt

    • 소유자와 그룹 변경
      sudo chown john:staff test.txt

    • 폴더와 그 하위 전체 소유자 변경
      sudo chown -R john:john mydir/


📌 리눅스 서비스 관리

🔷 개요

  • 서비스(디몬, Daemon): 시스템 자동화, 보안, 안정성 유지에 중요한 역할

  • 시스템 부팅 시 자동 실행되거나 수동으로 시작·중지되는 백그라운드 프로그램

  • 대표적인 서비스

    • Service / Daemon 예시: 웹서버, 데이터베이스, SSH 등

🔷 서비스 관리 도구

  • systemd (최신, 대부분의 배포판)

    • 시스템의 부팅 과정, 백그라운드 서비스(데몬), 프로세스, 타이머, 소켓, 로그, 사용자 세션 등을 통합적으로 관리하는 핵심 소프트웨어

    • 서비스, 타이머, 소켓, 타겟 등 다양한 단위 관리

    • 명령어설명
      systemctl서비스 및 유닛(단위) 관리
      journalctl로그 확인
      loginctl사용자 세션 및 로그인 관리
      hostnamectl호스트네임(컴퓨터 이름) 관리
      timedatectl시간/날짜 설정 관리
# 예시
systemctl status sshd        # SSH 서비스 상태 조회 
systemctl restart nginx      # nginx 재시작 
journalctl -u httpd          # apache 서비스 로그 확인 
systemctl enable docker      # 부팅 시 docker 자동시작 등록

ps aux | grep -E 'd$' # 백그라운드 데몬 확인

# 시스템에서 실행중인 서비스 확인
systemctl list-units --type=service --state=running
  • SysVinit (구버전)

    • 위치: /etc/init.d/

    • 스크립트 기반 관리

    • service 명령어 지원

⭐ 방화벽(iptables, firewalld) 설정

🔷 firewalld (CentOS, RHEL, Fedora 기본)

sudo systemctl status firewalld 
sudo firewall-cmd --list-all 
sudo firewall-cmd --add-port=80/tcp --permanent 
sudo firewall-cmd --reload

🔷 ufw (우분투 등에서 간편)

sudo ufw enable # 방화벽 활성화
sudo ufw allow 22/tcp # 22번(tcp) 포트 허용하기
sudo ufw status # 상태보기

📌 파일 아카이브와 압축

🔷 데이터 백업, 전송, 저장 공간 최적화 등에 꼭 필요한 필수 기술

🔷 아카이브 (archive)

  • 파일과 디렉터리를 하나의 파일로 묶는 작업

  • 대표 도구: tar, cpio

🔷 압축 (compression)

  • 파일 내용을 알고리즘으로 줄여 저장 공간을 절약

  • 대표 도구: gzip, bzip2, xz, zip

🔷 아카이브 + 압축

  • 여러 파일을 묶고, 동시에 공간도 절약

  • 예시: tar.gz, tar.bz2, tar.xz

  • 형식설명주요 명령어확장자
    tar아카이브 (압축 X)tar.tar
    tar+gzip아카이브 + 압축tar + gzip.tar.gz, .tgz
    tar+bzip2아카이브 + 압축tar + bzip2.tar.bz2
    tar+xz아카이브 + 압축tar + xz.tar.xz
    zip아카이브 + 압축zip, unzip.zip
    gzip단일 파일 압축gzip, gunzip.gz
    bzip2단일 파일 압축bzip2, bunzip2.bz2
    xz단일 파일 압축xz, unxz.xz

📊 압축 방식 비교표

방식압축 속도압축률 (높을수록 좋음)사용 용도
gzip빠름보통일반적인 백업, 전송
bzip2느림높음고압축이 필요할 때
xz매우 느림가장 높음저장 공간이 매우 중요할 때

⭐ 압축 프로그램 관련 명령

1) tar: 파일/디렉터리 묶기 및 압축

  • 아카이브(압축 없음)
tar cvf archive.tar 파일1 디렉터리1 
# c: 생성(create) v: 진행상황 표시(verbose) f: 파일명 지정
  • gzip 방식 압축
tar czvf archive.tar.gz 파일1 디렉터리1 # z: gzip 압축
  • bzip2 방식 압축
tar cjvf archive.tar.bz2 파일1 디렉터리1 # j: bzip2 압축
  • xz 방식 압축
tar cJvf archive.tar.xz 파일1 디렉터리1 # J: xz 압축
  • 아카이브 해제(압축 풀기)
tar xvf archive.tar                     # 압축X 
tar xzvf archive.tar.gz                 # gzip 압축 해제 
tar xjvf archive.tar.bz2                # bzip2 압축 해제 
tar xJvf archive.tar.xz                 # xz 압축 해제 # x: 해제(extract)
  • 일부/특정 파일만 추출
tar xvf archive.tar somefile.txt somefolder/

2) zip/unzip : 아카이브+압축

  • zip 파일 만들기
zip archive.zip 파일1 디렉터리1
  • zip 파일 풀기
unzip archive.zip

3) gzip, bzip2, xz (단일 파일 압축)

  • 압축
gzip filename           # filename.gz 생성, 원본 자동 삭제 
bzip2 filename          # filename.bz2 생성, 원본 자동 삭제 
xz filename             # filename.xz 생성, 원본 자동 삭제
  • 압축 해제
gunzip filename.gz bunzip2 filename.bz2 unxz filename.xz
  • 파일 목록만 확인
tar tvf archive.tar.gz       # 압축 파일 내부의 리스트 확인
  • tar로 아카이브 압축 없이 파일 묶기 및 해제
tar cvf files.tar 파일1 파일2 디렉터리1 
tar xvf files.tar
  • 대용량 파일 분할 압축 (split)
tar czvf - largefolder/ | split -b 700M - archive.tar.gz.part 
# 700MB씩 분할

📌 우분투 패키지 관리 요약

🔷 패키지란?

  • 프로그램, 라이브러리, 문서 등을 하나의 배포 단위로 묶은 것
    .deb, .rpm 등의 형식으로 존재

🔷 Ubuntu 계열 (Debian 계열)은 주로 APT (Advanced Package Tool) 이용

  • 주로 사용하는 명령어
apt
apt-get
apt-cache
dpkg

🔷 RHEL 계열 (Red Hat 계열, CentOS 포함)

  • yum: RHEL/CentOS 7 이하

  • dnf: RHEL/CentOS 8 이상

  • rpm: 패키지 파일 직접 설치/삭제 등에 사용

🔷 apt

  • 우분투의 표준 패키지 관리 시스템. 저장소에서 자동으로 패키지를 다운로드/설치/관리
  • apt는 사용자 친화적으로 메시지도 보기 쉽고, 최신 우분투에서 권장
  sudo apt update                # 패키지 목록(인덱스) 최신화
  sudo apt upgrade               # 설치된 모든 패키지 업그레이드
  sudo apt install 패키지명      # 패키지 설치
  sudo apt remove 패키지명       # 패키지 삭제(설정 파일은 남김)
  sudo apt purge 패키지명        # 패키지와 설정 파일까지 삭제
  sudo apt search 검색어         # 패키지 검색
  sudo apt show 패키지명         # 패키지 상세 정보

  sudo dpkg -i 패키지파일.deb    # .deb 직접 설치
  sudo dpkg -r 패키지명          # 패키지 제거
  sudo dpkg -l                   # 설치된 패키지 목록 표시
  sudo dpkg -L 패키지명          # 패키지의 파일 목록 확인

📌 다양한 프로그램 설치

  • Amazon JDK 21을 deb으로 설치하기
wget https://corretto.aws/downloads/latest/amazon-corretto-21-x64-linux-jdk.deb
sudo apt update && sudo apt install -y java-common
sudo dpkg -i amazon-corretto-21-x64-linux-jdk.deb
java --version
  • nginx를 apt로 설치하기
sudo apt install curl gnupg2 \
ca-certificates lsb-release ubuntu-keyring

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
 | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
 
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
 http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
     | sudo tee /etc/apt/sources.list.d/nginx.list 
     
sudo apt update && sudo apt install -y nginx

sudo systemctl start nginx
sudo systemctl enable nginx

systemctl status nginx     

sudo vi /usr/share/nginx/html/index.html

curl localhost
  • mariadb 10.11 설치하기
sudo apt-get install -y apt-transport-https curl
sudo mkdir -p /etc/apt/keyrings
sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'

sudo vi /etc/apt/sources.list.d/mariadb.sources
# repository 관련 텍스트 붙여넣기

sudo apt update && sudo apt install -y mariadb-server

sudo systemctl start mariadb
sudo systemctl enable mariadb

sudo mariadb-secure-installation
# mariadb 각종 설정 진행

mariadb -u root -h localhost -p mysql

create database cloud2025;
create user cloud2025 identified by 'cloud2025';
grant all privileges on cloud2025.* to cloud2025@'%';
flush privileges;
exit
  • apache tomcat 10 설치
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.24/bin/apache-tomcat-10.1.24.tar.gz

sudo useradd -m -d /opt/tomcat \
-U -s /bin/false tomcat

sudo tar zxf apache-tomcat-10.1.24.tar.gz \
-C /opt/tomcat --strip-component=1

sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod -R u+x /opt/tomcat/bin

# 테스트용 코드 - 실무에서는 제외!
sudo chmod -R o+rx /opt/tomcat/bin
cd /opt/tomcat/bin

sudo ./startup.sh 

sudo ./shutdown.sh
profile
Hodie mihi, Cras tibi

0개의 댓글