본문 바로가기

Linux

Linux cheatsheet

개요

이 글은 리눅스에서 자주 사용되는 기능들과 핵심이 개념에 대해 간략하게 정리한 글이다

개인적으로 리눅스를 이용한 작업 경험을 하면서 이젠 익숙한 것들보단, 항상 쓰려고 하면 잘 기억이 안 나서 찾아보고 사용한 유용했던 기능들을 우선적으로 정리하려 했다

 

앞으로 글은 아래와 같이 카테고리로 나눠서 진행한다

 

  • 파일
  • 파일시스템(+inode)과 마운트
  • 프로세스
  • 부팅
  • 네트워크
  • 로그

 

파일

리눅스는 모든 것이 파일이라는 철학을 바탕으로 설계되었다

파일 개념

  • 파일은 물리적 저장 매체와 관계없이 데이터의 "추상화"된 표현이자
  • 디바이스, 프로세스, 네트워크 연결 등 모든 것의 표현을 파일로 "통일"했으며
  • 각 파일은 속성과 권한(소유자, 그룹, 접근 권한 등)을 포함한 "메타데이터"를 가진다

파일 종류

일반 파일

텍스트, 이미지, 오디오 파일 등으로 (-)로 표시된다

 

디렉터리

파일과 다른 디렉터리를 포함하는 파일로 (d)로 표시된다

 

장치 파일

  • 블록 장치 파일 - 데이터 블록 단위로 입출력을 처리하는 장치인 파일로 (b)로 표시된다
  • 문자 장치 파일 - 바이트 단위로 입출력을 처리하는 장치인 파일로 (c)로 표시된다

파이프

프로세스 간의 통신을 위해 사용되는 특수한 파일로 (p)로 표시된다

  • 익명 파이프 - 부모-자식 프로세스 간 통신에 사용된다
  • 네임드 파이프(FIFO) - 서로 다른 프로세스 간 통신을 위해 사용된다

소켓

네트워크 통신을 위한 파일로 (s)로 표시된다

참고로 AF는 Address Family의 약자로 소켓을 생성할 때, 어떤 주소 체계를 사용할지 지정하는 역할을 한다

  • 인터넷 소켓(AF_INET)
    • 스트림 소켓(SOCK_STREAM) - 신뢰(TCP)할 수 있는 양방향 연결에 사용
    • 데이터그램 소켓(SOCK_DGRAM) - 비연결형(UDP) 소켓으로 빠르고 가벼운 전송에 사용
  • 유닉스 도메인 소켓(AF_UNIX) - 동일 시스템 내 프로세스 간의 고속 통신에 사용
  • 원시 소켓(AF_PACKET) - 네트워크 레벨에서 직접 패킷을 조작 및 전송에 사용

링크

파일에 대한 참조를 제공하는 특별한 파일로 (l)로 표시됨

  • 하드 링크 - 동일한 파일 시스템 내에서 동일한 아이노드 번호를 공유하는 파일
  • 심볼릭 링크 - 원본 파일의 경로를 저장하는 특수한 파일

하드 링크는 원본 파일이 삭제되더라도 동일한 아이노드를 가리키는 다른 링크가 존재하는 한 데이터가 유지되지만, 심볼릭 링크는 원본 파일이 삭제되면 링크가 깨져서 사용할 수 없다

파일 모드

파일 모드란, 세 가지 권한(읽기, 쓰기, 실행)과 각각의 권한을 지정할 대상(파일 소유자, 그룹, 그외 사용자)을 포함한 파일의 속성이다

이때 이를 변경하기 위해서 chmod가 사용되는데, 그 예시는 다음과 같다

 

 

파일시스템(+inode)과 마운트

리눅스의 모든 파일시스템은 기본적으로 유닉스 운영체제에서 유래된 공통의 개념을 바탕으로 구현되었다

그 공통의 개념은 아래와 같다

 

  • 파일inode로 관리된다
  • 디렉터리는 단순히 파일 목록을 가지고 있는 파일이다
  • 특수 파일을 통해 장치에 접근할 수 있다

inode

파일에 대한 메타데이터와 실제 데이터가 존재하는 곳의 주소를 가지는 구조체다

inode의 핵심은 아래와 같이 식별자와 메타데이터, 실제데이터로 생각하면 된다

 

  • inode 번호 - 파일을 식별하는 고유한 값
  • 메타데이터 - 파일의 속성, 시간, 권한 등(ls 시, 나타나는 요소들)
  • 실제 데이터 - 실제 데이터는 inode 자체에 저장되지 않고, 데이터 블록(Data Blocks)에 저장된다

아래 이미지를 보면, 실제 데이터 부분은 ext 파일 시스템의 데이터 블록(Data Blocks)을 가리키는 직접/간접 블록들을 통해 데이터를 관리한다

 

파일시스템

파일 시스템은 컴퓨터가 데이터를 저장하고 관리하는 방법을 정의한다

간단히 말해, 파일 시스템은 데이터를 파일과 디렉터리로 구성하고, 이를 저장 장치에 효율적으로 배치하여 접근성과 성능을 최적화한다

 

참고로 ext4 파일시스템은 아래와 같이 생겨먹었다

 

 

 

가상 파일시스템(VFS)은 다양한 파일 시스템을 추상화하고 통합하는 중요한 역할을 한다

 

 

현재 리눅스 가상 파일시스템에서 지원하는 파일시스템의 예시로는 다음과 같이 존재한다

 

  • Disk-based filesystems
    • ext2, ext3, ext4, MINIX, ubifs, VxFS, sysv, ufs, UDF DVD, ISO9669 CD-ROM…
  • Network filesystems
    • nfs, coda, afs, cifs, ncp…
  • Special filesystems
    • cgroups, tmpfs, devtmpfs, proc, sysfs…

특수 파일시스템(Special filesystems)

  • procfs(/proc) - 프로세스와 시스템 정보를 실시간으로 제공한다
  • tmpfs(/tmp) - RAM 기반으로 임시 파일을 저장한다
  • sysfs(/sys) - 하드웨어 장치와 그 속성을 표현한다

마운트 - fdisk과 mount 그리고 mkfs

mount는 운영 체제가 저장 장치(하드 드라이브, USB 메모리 등)를 사용 가능하게 하는 과정으로, 파일 시스템이 있는 장치나 파티션을 특정 디렉터리(마운트 포인트)에 연결하는 작업을 말한다

 

참고로, /etc/fstab 파일에 마운트 할 장치와 마운트 포인트 정보를 기록해 두면 부팅 시 자동으로 처리한다

 

fdisk는 파티션 관리에 사용되는 명령어인데, 파티션을 통해 연결된 장치(/dev/DEVICE)를 구분할 수 있다

이때 mkfs는 연결된 장치의 파일시스템을 생성하는 명령어다

 

가령 디스크를 시스템에 연결(/dev/sdb)하고, 파티션을 나눠서 마운트 시킨다면 아래와 같은 과정을 거칠 것이다

 

  1. 파티션 생성과정 처리 → sudo fdisk /dev/sdb
  2. 새 파티션에 파일시스템 생성 → sudo mkfs.ext4 /dev/sdb1(=생성된 파티션)
  3. 마운트 → sudo mount /dev/sdb1 /mnt/mount_point

 

셸이 제공하는 기능은 크게 명령어 해석, 프로그래밍, 사용자 환경 설정 기능 등으로 구분할 수 있다

셸은 사용자와 커널 사이에서 명령을 해석하여 전달하고, 셸 스크립트를 통해 프로그램도 만들 수 있으며, 사용자 환경을 설정할 수 있는 파일을 바탕으로 로그인 시 초기 환경 설정을 한다

chsh -s

chsh -s는 사용자 로그인 셸을 바꾼다

/etc/shells에 사용 가능한 셸들이 존재하는데, 이들은 chsh -l을 통해 확인할 수 있다

특수문자 사용

특수문자와 기능

* 임의의 문자열을 나타내는 특수문자
?[ ] 한 문자를 나타내는데 사용
- ?는 길이가 1인 임의의 문자
- [ ]는 여러 문자를 나열하거 범위지정
;| 명령과 명령을 연결하는데 사용
- ;는 왼쪽부터 차례대로 실행
- |는 왼쪽 명령의 결과를 오른쪽 명령의 입력으로 전달
“ ” 문자를 감싸 문자열로 만들어줌, 이때 ‘ ’는 특수문자를 문자로 처리함
- echo $SHELL은 문자열 $SHELL을 출력
` ` 문자열을 명령으로 해석하여 실행
- echo “Today is `date`"
>>> 입출력의 방향을 바꾸는 특수문자
- >는 덮어쓰기
- >>는 이어쓰기

 

참고로 표준 입출력 장치의 파일 디스크립터는 다음과 같다

  • 0 - stdin
  • 1 - stdout
  • 2 - stderr

셸 변수와 환경 변수

셸 변수는 현재 셸에서만 사용되고, 서브 셸로는 전달되지 않는다

환경 변수는 서브 셸로 전달된다

변수 출력

  • set - 셸 변수와 환경 변수를 모두 출력
  • env - 환경 변수만 출력

변수 설정과 해제

  • 변수명=문자열 - 셸 변수 등록
  • export 변수명=문자열 - 환경 변수 등록
  • unset 변수명 - 변수 해제

셸 스크립트

#!/bin/bash

 

셰뱅(#!)을 통해 스크립트를 실행할 때 어떤 셸을 사용할지 명시할 수 있다

 

bash는 POSIX 호환 셸이어서 가볍고 다양한 시스템에서 사용 가능해서 주로 사용된다

셰뱅을 사용하지 않으면, 스크립트를 실행할 때 기본 셸이 사용되거나, 사용자가 명령어를 직접 호출해야 한다

 

# 셰뱅이 없는 경우, 직접 셸 지정
bash myscript.sh

# 셰뱅이 있는 경우
./myscript.sh

 

프로세스

  • Process - 실행 중인 프로그램의 인스턴스를 의미
  • Process Group - 관련된 프로세스들의 집합으로, 하나의 작업 단위로 취급
  • Session - 하나 이상의 프로세스 그룹을 포함하는 단위, 터미널 제어를 통해 사용자 입력을 처리 가능

ps

ps(process status) 명령은 현재 시스템에서 실행 중인 프로세스의 정보를 표시하는 데 사용된다

 

  • ps aux - 모든 사용자와 프로세스를 나열(BSD 스타일)
  • ps -ef - 모든 사용자와 프로세스를 나열(UNIX 스타일)

pgrep

pgrep 명령은 주어진 패턴과 일치하는 프로세스의 PID를 찾는 데 사용된다

  • ps -fp pgrep [NAME]

상태코드와 추가 플래그

ps 명령어 결과의 STAT 열은 각 프로세스의 상태를 나타내며, 프로세스의 현재 동작 상태에 대한 정보를 제공한다

 

상태 코드와 의미

R Running or runnable
S Sleeping
D Uninterruptible sleep
T Stopped
Z Zombie
X Dead

 

추가 플래그와 의미

< High-priority
N Low-priority
L has pages Locked in memory
s Session leader process
I Multi-threaded process
+ In the foreground process group

kill과 pkill

시그널은 Unix-like 운영 체제에서 프로세스 간에 통신하거나 프로세스의 상태를 알리기 위해 사용되는 비동기적 이벤트다

 

특정 시그널을 받으면 운영 체제에서 미리 정의된 기본 동작을 수행하는데, 사용자 정의 핸들러를 통해 프로세스는 시그널에 대해 자신만의 동작을 정의할 수 있다

 

기본적으로 SIGKILL(9)는 강제 종료 신호, 프로세스를 즉시 종료시키고, SIGTERM(15)는 종료 신호로 프로세스에 종료 요청을 보내서 프로세스가 종료할 수 있도록 할 기회를 제공한다

 

killpkill 명령은 기본적으로 SIGTERM(15)을 보내기에 종료가 안될 수 있는데, SIGKILL(9)을 인자로 사용하면 바로 종료시킬 수 있다

  • kill -9 [PID]
  • pkill -9 [NAME]

&와 jobs 그리고 nohup

명령을 실행할 때, 뒤에 &를 붙이면 백그라운드에서 수행된다

ctrl+Z를 통해 현재 실행 중인 포그라운드 작업을 일시 중지(중단)하고, 대기 상태로 전환할 수 있다

jobs를 통해 현재 현재 셸에서 관리되고 있는 작업 목록을 볼 수 있으며, %N로 특정 작업 번호를 지정하여 bgfg와 함께 사용할 수 있다

nohup

  • nohup [COMMAND] &

 

nohup(no hang up)은 로그아웃 후에도 프로세스가 계속 실행되도록 하는데, &를 붙이면 백그라운드에서 실행되면서 로그아웃 후에도 계속 실행되게 한다

 

도커 컨테이너로 작업하는 경우는 잘 사용 안 하겠지만, 그냥 바로 리눅스에서 서버 같은 프로그램을 돌릴 때, 해당 명령어를 사용해야 ssh로 접속하고 종료하는 경우에도 계속 돌아갈 수 있다

crontab

crontab은 주기적으로 자동으로 명령어나 스크립트를 실행할 수 있도록 예약하는데 사용되는 작업 스케줄러다

crontab 파일 내, 작업을 등록하면 해당 설정에 알맞게 작업을 수행시켜 주는데, 이때 작업이 수행될 시간을 설정하는 부분의 내용은 다음과 같다(*은 매번을 의미)

# 분(0~59) 시(0~23) 일(1~31) 월(1~12) 요일(0~6) 작업내용
*/5 * * * * /home/hs/duckdns/duckduckgo.sh

 

  • crontab -l
    • 현재 crontab 설정 파일을 볼 수 있다
    • crontab -l > back.txt, back.txt에 백업 후, 이를 바탕으로 복원도 가능하다
  • crontab -e
    • -e(edit) 옵션을 통해 crontab 파일을 수정할 수 있다
  • crontab -r
    • 현재 사용자의 crontab 파일을 삭제

 

부팅

InitSystemd리눅스에서 시스템을 부팅하고 기본 프로세스를 관리하는 시스템 초기화 프로그램이다

 

Init은 전통적인 리눅스 부팅 프로세스 관리자로, 직렬 처리 방식으로 각 서비스를 순차적으로 실행하므로, 병렬 처리를 지원하지 않아 부팅 속도가 느리다

Systemd는 Init의 대체 시스템으로, 병렬 처리, 빠른 부팅 시간, 서비스 의존성 관리 등 다양한 기능을 개선한 현대적인 시스템 및 서비스 관리자

Systemctl

데몬 프로세스는 백그라운드에서 실행되는 프로세스로, 사용자가 직접 상호작용하지 않으며, 시스템에서 지속적으로 실행되어 특정 기능을 제공하는 역할이다

 

Systemd는 이러한 데몬 프로세스를 시작과 중지 그리고 재시작하는 역할을 하는데, Systemctl은 Systemd의 서비스와 프로세스를 제어하고 관리하기 위한 명령어 도구

주요 기능

  • sudo systemctl start [SERVICE]
  • sudo systemctl enable/disable [SERVICE]
    • 부팅 시, 자동 시작 설정/해제
  • sudo systemctl stop/restart [SERVICE]
  • sudo systemctl status [SERVICE]

 

네트워크

이 부분에서는 네트워크 계층과 연관해서 사용되는 명령어들을 간략하게 정리한다

TCP/IP 4계층

4) 응용 계층 (Application Layer)

  • curl - URL을 통해 데이터 전송 및 수신

3) 전송 계층 (Transport Layer)

  • ss - 소켓 통계 조회, 네트워크 연결 상태 확인
    • ss -t - TCP 소켓만 출력
    • ss -u - UDP 소켓만 출력
    • ss -l - 리스닝 소켓만 출력
    • ss -p - 각 소켓에 연결된 프로세스 정보 출력
    • ss -a - 모든 소켓 정보 출력
  • netstat - 네트워크 연결, 라우팅 테이블, 인터페이스 통계 등을 조회

2) 인터넷 계층 (Internet Layer)

  • ip addr - IP 주소 확인 및 설정
  • ip route - 라우팅 테이블 설정 및 관리
  • ip neigh - 네트워크 ARP 테이블 관리
  • mtr - ping과 traceroute의 기능을 결합한 도구, 실시간 네트워크 경로 및 성능 확인
  • ping - 대상 호스트와의 연결 상태 확인
  • traceroute - 데이터 패킷이 경유하는 경로 추적

1) 네트워크 인터페이스 계층 (Network Interface Layer)

  • ip link - 네트워크 인터페이스 관리 (활성화/비활성화, 설정 등)
  • ifconfig - 네트워크 인터페이스 설정 및 상태 확인

SSH

네트워크를 통해 안전하게 통신할 수 있도록 암호화 제공하는 셸로, 공개 키 기반 인증을 수행한다

기본적으로 키는 ~/.ssh 디렉터리에 존재하는 키를 가지고 알아서 각 명령어들을 수행한다는 점을 알아둬야 한다

공개키 등록과 접속

공개키를 이용한 접속을 위해서, 우선 클라이언트에서 공개키/개인키를 생성하고, 공개키를 복사한다

이때 서버에 일단 로그인을 할 수 있어야 한다

 

이렇게 서버에 공개키가 등록되었다면, 이후엔 그냥 알아서 키를 통해 로그인을 수행할 수 있다

 

  • ssh-keygen -t rsa -b 4096 -C "email@example.com"
    • RSA 4096 비트 키 쌍을 생성, 주석은 이메일 주소
  • ssh-copy-id user@server_ip
    • 또는 다음과 같이 직접 공개키를 서버의 authorized_keys 파일에 직접 추가할 수 있다
    • cat ~/.ssh/id_rsa.pub | ssh user@server_ip 'cat >> ~/.ssh/authorized_keys
  • ssh user@server_ip

공개키 접속만 허용

서버에 공개키가 등록되었다면, 굳이 비밀번호를 통한 로그인 옵션을 설정할 필요가 없다

서버에서 다음과 같이 sshd_config 파일을 열어서 비밀번호 인증 옵션을 비활성화하고 재시작한다

 

  • sudo nano /etc/ssh/sshd_config
    • PasswordAuthentication no
  • sudo systemctl restart sshd

 

로그

로그 파일(/var/log)

리눅스에서는 다양한 로그 파일이 /var/log 디렉터리에 저장된다

로그 파일은 일반적으로 텍스트 형식으로 되어 있어 cat, less, tail 등의 명령어를 사용해 쉽게 읽을 수 있다

저널 시스템(journalctl)

systemd를 사용하는 경우 저널 시스템을 통해 로그를 관리한다

로그파일과 다르게 로그가 메타데이터와 함께 바이너리로 저장되어 비교적 필터링과 검색이 용이하며 용량이 적다

명령어

  • 전체 로그
    • journalctl
  • 특정 서비스 로그
    • journalctl -u [SERVICE]
  • 실시간 로그 보기
    • journalctl -f
  • 날짜로 필터링
    • journalctl --since "2023-10-01" --until "2023-10-08”

 

기타

GNU

GNU(GNU's Not Unix)는 리차드 스톨먼이 시작한 프로젝트로, 자유 소프트웨어 운동의 일환으로 Linux 커널을 사용한 완전한 운영 체제를 만들기 위한 필수 유틸리티라이브러리를 제공한다

Package Manager

  • debpkg - deb 패키지 파일을 다루는 도구로, 주로 개별 패키지를 수동으로 설치하거나 제거하는 데 사용한다
  • apt(Advanced Package Tool) - debpkg를 쉽게 사용할 수 있도록 고수준 패키지 관리 시스템이다
  • snap - 컨테이너화된 소프트웨어 패키지를 관리하는 시스템으로, 배포판과 독립적으로 실행되는 패키지를 제공한다

GUI

비교적 최근에 개발된 Wayland가 성능이 더 좋으나 호환성에선 아직 X시스템에 부족하다

 

  • X Window System - 복잡한 클라이언트-서버 모델을 사용하여 구현했다
  • Wayland - 단순하고 직접적인 컴포지터 방식을 채택하여 구현했다

tar

tar(tape archive)는 여러 파일이나 디렉터리를 묶어 파일로 처리하는데 사용된다

이런 작업은 압축이 아니라 ‘파일’로 만들어 여러 요소들을 이동시키는데 효율적으로 만든다

 

.tar 파일에 .gzip 같이 압축을 수행하여 .tar.gzip 같은 형태로 파일이 업로드 되어있는 것을 많이 봤는데, 이는 .tar가 압축이 아닌 파일이기에 파일에 압축을 한 것이다

 

마무리

이번학기에 리눅스 수업을 듣게 되면서 한번 미리 정리해 놓으면 좋겠다는 생각했는데

최근 라즈베리파이나 젯슨나노를 이용할 일들이 있었다

이때 유용하게 사용되었던 것들을 기억해내며 최대한 정리해 보았다