01. 리눅스 첫걸음

01. 리눅스 첫걸음

1. 리눅스란?

리눅스는 오픈 소스 운영체제로, 컴퓨터 하드웨어와 소프트웨어 사이를 중재하는 기본 시스템 소프트웨어

리눅스의 역사

1991년 8월: 리누스 토르발스가 첫 리눅스 커널 발표
     │
     ▼
1992년: GPL 라이선스 채택 → 오픈 소스 운동 가속화
     │
     ▼
1993년: Debian, Slackware 등 첫 배포판 등장
     │
     ▼
2000년대: 서버 시장 급성장, 안드로이드(리눅스 커널 기반) 등장
     │
     ▼
현재: 서버, 클라우드, IoT, 스마트폰 등 광범위하게 사용

리눅스 활용 분야

분야예시점유율
서버웹 서버, DB 서버, 클라우드약 96% (상위 100만 웹서버)
클라우드AWS, GCP, Azure대부분 리눅스 기반
임베디드라우터, 스마트TV, 자동차광범위
모바일Android약 70% (모바일 OS)
슈퍼컴퓨터TOP500 슈퍼컴퓨터100%

2. 리눅스의 구조

운영체제 계층 구조

┌─────────────────────────────────────────────────────────────────┐
│                     사용자 (User)                                │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │              애플리케이션 (Applications)                  │   │
│   │        (브라우저, 편집기, 게임, 개발도구 등)                │   │
│   └─────────────────────────────────────────────────────────┘   │
│                              ↓                                   │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │                   셸 (Shell)                             │   │
│   │         사용자 명령을 커널에 전달하는 인터페이스             │   │
│   │              (bash, zsh, fish 등)                        │   │
│   └─────────────────────────────────────────────────────────┘   │
│                              ↓                                   │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │                   커널 (Kernel)                          │   │
│   │     • 프로세스 관리  • 메모리 관리  • 파일 시스템           │   │
│   │     • 장치 드라이버  • 네트워크 관리  • 보안                │   │
│   └─────────────────────────────────────────────────────────┘   │
│                              ↓                                   │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │                하드웨어 (Hardware)                        │   │
│   │          (CPU, RAM, 디스크, 네트워크 카드 등)              │   │
│   └─────────────────────────────────────────────────────────┘   │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

커널의 주요 역할

역할설명예시
프로세스 관리프로그램 실행/종료, CPU 시간 분배여러 프로그램 동시 실행
메모리 관리RAM 할당/해제, 가상 메모리프로그램별 메모리 공간 분리
파일 시스템파일/디렉토리 생성, 읽기, 쓰기ext4, XFS 등
장치 드라이버하드웨어와 소프트웨어 연결프린터, USB, 그래픽카드
네트워크네트워크 통신 처리TCP/IP 스택

3. 리눅스의 장단점

장점

┌─────────────────────────────────────────────────────────────────┐
│                      리눅스의 장점                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  [무료/오픈소스]     라이선스 비용 없음, 소스코드 수정 가능        │
│         │                                                        │
│         ▼                                                        │
│  [높은 안정성]      서버 장시간 운영에 적합 (수년간 재부팅 불필요)  │
│         │                                                        │
│         ▼                                                        │
│  [강력한 보안]      권한 체계, SELinux, 빠른 보안 패치            │
│         │                                                        │
│         ▼                                                        │
│  [스크립트 자동화]  셸 스크립트로 반복 작업 자동화                 │
│         │                                                        │
│         ▼                                                        │
│  [풍부한 도구]      개발, 서버 관리용 도구 풍부                    │
│         │                                                        │
│         ▼                                                        │
│  [커뮤니티]         전 세계 개발자 커뮤니티의 지원                  │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

단점

단점설명대안
학습 곡선CLI 위주로 초보자에게 어려움Ubuntu, Linux Mint 등 사용자 친화적 배포판
상용 소프트웨어 부족MS Office, Adobe 등LibreOffice, GIMP, Wine
게임 지원Windows 게임 대부분 미지원Steam Proton, Wine
하드웨어 호환성일부 최신 하드웨어 드라이버 부족호환성 좋은 하드웨어 선택
한글 지원일부 프로그램 한글 깨짐로케일 설정, 폰트 설치

4. 배포판 (Distribution)

배포판이란?

리눅스 커널 + 셸 + 시스템 도구 + 패키지 관리자 + 응용프로그램을 묶어 사용자가 바로 사용할 수 있게 만든 것

┌─────────────────────────────────────────────────────────────────┐
│                    리눅스 배포판 구성                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐             │
│   │  리눅스 커널  │  │    셸      │  │  시스템 도구  │             │
│   │   (공통)     │  │ (bash 등)  │  │ (ls, cp 등)  │             │
│   └─────────────┘  └─────────────┘  └─────────────┘             │
│                                                                  │
│   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐             │
│   │ 패키지 관리자 │  │   데스크톱   │  │   응용프로그램 │             │
│   │(apt, yum 등)│  │ (GNOME 등) │  │ (Firefox 등) │             │
│   └─────────────┘  └─────────────┘  └─────────────┘             │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

주요 배포판 계열

                    ┌─────────────────┐
                    │   리눅스 커널    │
                    └────────┬────────┘
                             │
         ┌───────────────────┼───────────────────┐
         │                   │                   │
         ▼                   ▼                   ▼
┌────────────────┐  ┌────────────────┐  ┌────────────────┐
│   Red Hat 계열  │  │   Debian 계열   │  │    기타 계열    │
├────────────────┤  ├────────────────┤  ├────────────────┤
│ • RHEL         │  │ • Debian       │  │ • Arch Linux   │
│ • CentOS       │  │ • Ubuntu       │  │ • Gentoo       │
│ • Fedora       │  │ • Linux Mint   │  │ • Slackware    │
│ • Rocky Linux  │  │ • Kali Linux   │  │ • Alpine       │
├────────────────┤  ├────────────────┤  ├────────────────┤
│ 패키지: RPM     │  │ 패키지: DEB     │  │ 다양함          │
│ 관리자: yum/dnf │  │ 관리자: apt     │  │                │
└────────────────┘  └────────────────┘  └────────────────┘

배포판 비교

배포판특징적합한 용도패키지 관리자
Ubuntu사용자 친화적, 큰 커뮤니티데스크톱, 입문자, 개발apt
CentOS/RockyRHEL 호환, 안정성서버, 기업 환경yum/dnf
Debian안정성 최우선, 순수 오픈소스서버, 안정성 중시apt
Fedora최신 기술 빠른 도입개발자, 최신 기술 테스트dnf
Arch Linux롤링 릴리스, 미니멀고급 사용자pacman
Alpine초경량 (약 5MB)컨테이너, 임베디드apk

배포판 선택 가이드

시작하기:
├── 리눅스 처음이다 → Ubuntu Desktop
├── 서버 운영하고 싶다 → Ubuntu Server 또는 Rocky Linux
├── 개발 환경 구축 → Ubuntu 또는 Fedora
└── 보안/해킹 학습 → Kali Linux

고급 사용자:
├── 최신 패키지 원한다 → Arch Linux
├── 직접 커스터마이징 → Gentoo
└── 컨테이너용 경량 OS → Alpine Linux

5. 셸 (Shell)

셸이란?

사용자가 입력한 명령어를 해석하여 커널에 전달하는 명령어 해석기

┌────────────────────────────────────────────────────────────────┐
│                                                                 │
│    사용자 입력                                                   │
│        │                                                        │
│        ▼                                                        │
│   ┌─────────┐    명령어    ┌─────────┐    시스템    ┌─────────┐ │
│   │  터미널  │ ──────────→ │   셸    │ ──────────→ │  커널   │ │
│   │(Terminal)│            │ (Shell) │    호출     │(Kernel) │ │
│   └─────────┘             └─────────┘             └─────────┘ │
│        │                       │                       │       │
│        │                       │                       │       │
│        └───────────────────────┴───────────────────────┘       │
│                           결과 출력                              │
│                                                                 │
└────────────────────────────────────────────────────────────────┘

주요 셸 종류

전체 이름특징
bashBourne Again Shell리눅스 기본 셸, 가장 널리 사용
zshZ Shell강력한 자동완성, Oh-My-Zsh 생태계
fishFriendly Interactive Shell사용자 친화적, 구문 강조
shBourne Shell가장 기본적인 셸, 스크립트 호환성
dashDebian Almquist Shell경량, 스크립트 실행용

프롬프트 구조

# 일반 사용자 프롬프트
user@hostname:~$
│    │        │ │
│    │        │ └── $ : 일반 사용자
│    │        └──── ~ : 현재 디렉토리 (홈 디렉토리)
│    └───────────── @ 뒤: 호스트명 (컴퓨터 이름)
└────────────────── @ 앞: 사용자명

# 루트(관리자) 프롬프트
root@hostname:/etc#
                   └── # : 루트 사용자 (관리자 권한)

셸 확인 및 변경

# 현재 셸 확인
$ echo $SHELL
/bin/bash

# 사용 가능한 셸 목록
$ cat /etc/shells
/bin/sh
/bin/bash
/bin/zsh
/usr/bin/fish

# 셸 변경 (재로그인 필요)
$ chsh -s /bin/zsh

6. 로그인과 로그아웃

리눅스의 다중 사용자 시스템

리눅스는 여러 사용자가 동시에 사용하는 것을 전제로 설계된 다중 사용자 시스템

┌─────────────────────────────────────────────────────────────────┐
│                     리눅스 서버                                   │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│    ┌────────┐   ┌────────┐   ┌────────┐   ┌────────┐           │
│    │ 사용자A │   │ 사용자B │   │ 사용자C │   │  root  │           │
│    │  SSH   │   │  SSH   │   │ 콘솔   │   │ 콘솔   │           │
│    └───┬────┘   └───┬────┘   └───┬────┘   └───┬────┘           │
│        │            │            │            │                 │
│        └────────────┴────────────┴────────────┘                 │
│                           │                                     │
│                    ┌──────┴──────┐                              │
│                    │    커널     │                              │
│                    └─────────────┘                              │
│                                                                  │
│    → 각 사용자는 독립된 환경에서 작업                              │
│    → 파일 권한으로 다른 사용자 파일 보호                           │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

로그인 방법

# 콘솔 로그인 (직접 연결된 터미널)
hostname login: username
Password: ********  (입력해도 화면에 표시 안됨)

# SSH 원격 로그인
$ ssh username@192.168.1.100
$ ssh username@example.com

# 다른 사용자로 전환
$ su - username        # 해당 사용자로 전환 (비밀번호 필요)
$ sudo -i              # 루트로 전환 (본인 비밀번호)

로그아웃

# 방법 1: exit 명령어 (권장)
$ exit

# 방법 2: logout 명령어 (로그인 셸에서만)
$ logout

# 방법 3: 단축키
Ctrl + D

로그아웃의 중요성

로그아웃하지 않으면?
┌─────────────────────────────────────────────────────────────────┐
│                                                                  │
│  [보안 위험]                                                     │
│  • 다른 사람이 내 계정으로 명령 실행 가능                          │
│  • 민감한 정보 노출                                               │
│                                                                  │
│  [리소스 낭비]                                                    │
│  • 불필요한 메모리/CPU 점유                                       │
│  • 세션 유지에 시스템 자원 사용                                    │
│                                                                  │
│  [세션 관리]                                                      │
│  • 동시 접속 제한에 걸릴 수 있음                                   │
│  • 유휴 세션이 계속 남아있음                                       │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

7. 시스템 종료와 재부팅

shutdown 명령어

# 기본 문법
shutdown [옵션] [시간] [메시지]

# 즉시 종료
$ sudo shutdown now

# 즉시 종료 (다른 방법)
$ sudo shutdown -h now

# 10분 후 종료
$ sudo shutdown -h +10

# 특정 시간에 종료 (오후 11시 30분)
$ sudo shutdown -h 23:30

# 종료 예약 취소
$ sudo shutdown -c

# 재부팅
$ sudo shutdown -r now

# 메시지와 함께 종료 (다른 사용자에게 알림)
$ sudo shutdown -h +5 "시스템 점검으로 5분 후 종료됩니다"

shutdown 옵션 정리

옵션설명예시
-hhalt (종료)shutdown -h now
-rreboot (재부팅)shutdown -r now
-ccancel (예약 취소)shutdown -c
now즉시 실행shutdown -h now
+분N분 후 실행shutdown -h +10
HH:MM지정 시간에 실행shutdown -h 23:30

다른 종료/재부팅 명령어

# 즉시 종료
$ sudo poweroff
$ sudo halt
$ sudo init 0

# 즉시 재부팅
$ sudo reboot
$ sudo init 6

# systemd 사용 (최신 배포판)
$ sudo systemctl poweroff
$ sudo systemctl reboot

런레벨 (Runlevel)

┌─────────────────────────────────────────────────────────────────┐
│                     리눅스 런레벨                                │
├──────┬──────────────────────────────────────────────────────────┤
│ 레벨  │ 설명                                                     │
├──────┼──────────────────────────────────────────────────────────┤
│  0   │ 시스템 종료 (halt)                                        │
│  1   │ 단일 사용자 모드 (복구 모드)                                │
│  2   │ 다중 사용자 (네트워크 없음)                                 │
│  3   │ 다중 사용자 + 네트워크 (CLI, 서버용)                        │
│  4   │ 사용자 정의                                                │
│  5   │ 다중 사용자 + 네트워크 + GUI (데스크톱용)                    │
│  6   │ 재부팅 (reboot)                                           │
└──────┴──────────────────────────────────────────────────────────┘

# 현재 런레벨 확인
$ runlevel
N 5

# systemd 기반 시스템
$ systemctl get-default
graphical.target

8. 리눅스 디렉토리 구조

FHS (Filesystem Hierarchy Standard)

리눅스의 표준 디렉토리 구조

/                          # 루트 디렉토리 (최상위)
├── bin/                   # 기본 명령어 (ls, cp, mv 등)
├── sbin/                  # 시스템 관리 명령어 (shutdown, fdisk 등)
├── etc/                   # 시스템 설정 파일
│   ├── passwd             # 사용자 정보
│   ├── shadow             # 비밀번호 (암호화)
│   ├── fstab              # 파일시스템 마운트 설정
│   └── ssh/               # SSH 설정
├── home/                  # 사용자 홈 디렉토리
│   ├── user1/
│   └── user2/
├── root/                  # 루트 사용자 홈 디렉토리
├── var/                   # 가변 데이터 (로그, 캐시 등)
│   ├── log/               # 시스템 로그
│   └── www/               # 웹 서버 파일
├── tmp/                   # 임시 파일 (재부팅 시 삭제)
├── usr/                   # 사용자 프로그램
│   ├── bin/               # 사용자 명령어
│   ├── lib/               # 라이브러리
│   └── share/             # 공유 데이터
├── opt/                   # 추가 설치 프로그램
├── dev/                   # 장치 파일
│   ├── sda                # 첫 번째 하드디스크
│   ├── null               # 널 장치
│   └── tty                # 터미널
├── proc/                  # 프로세스 정보 (가상 파일시스템)
├── sys/                   # 시스템 정보 (가상 파일시스템)
├── mnt/                   # 임시 마운트 지점
├── media/                 # 이동식 미디어 마운트 지점
└── boot/                  # 부트로더, 커널 이미지

주요 디렉토리 상세

디렉토리용도주요 파일/내용
/bin필수 명령어ls, cp, mv, cat, bash
/sbin시스템 관리 명령어shutdown, mount, fsck
/etc설정 파일passwd, fstab, hosts
/home사용자 홈개인 파일, 설정
/var가변 데이터로그, 메일, 캐시
/tmp임시 파일재부팅 시 삭제됨
/usr사용자 프로그램응용프로그램, 라이브러리
/dev장치 파일하드디스크, USB, 터미널
/proc프로세스 정보CPU, 메모리 정보

9. 기본 명령어

디렉토리 탐색

# 현재 위치 확인
$ pwd
/home/user

# 디렉토리 이동
$ cd /var/log         # 절대 경로로 이동
$ cd log              # 상대 경로로 이동
$ cd ..               # 상위 디렉토리로 이동
$ cd ~                # 홈 디렉토리로 이동
$ cd -                # 이전 디렉토리로 이동

# 디렉토리 내용 보기
$ ls                  # 기본 목록
$ ls -l               # 상세 정보 (권한, 크기, 날짜)
$ ls -a               # 숨김 파일 포함
$ ls -la              # 상세 + 숨김 파일
$ ls -lh              # 사람이 읽기 쉬운 크기 표시
$ ls -lt              # 시간순 정렬

ls -l 출력 해석

$ ls -l
-rw-r--r-- 1 user group 4096 Dec 25 10:30 file.txt
│├──┤├──┤├─┤  │   │     │      │           │
│ │   │   │   │   │     │      │           └── 파일명
│ │   │   │   │   │     │      └── 수정 날짜/시간
│ │   │   │   │   │     └── 파일 크기 (바이트)
│ │   │   │   │   └── 그룹
│ │   │   │   └── 소유자
│ │   │   └── 링크 수
│ │   └── 기타 사용자 권한 (r--)
│ └── 그룹 권한 (r--)
└── 소유자 권한 (rw-)

d = 디렉토리, - = 일반 파일, l = 심볼릭 링크
r = 읽기, w = 쓰기, x = 실행

파일/디렉토리 생성 및 삭제

# 디렉토리 생성
$ mkdir dirname           # 디렉토리 생성
$ mkdir -p a/b/c          # 중첩 디렉토리 한번에 생성

# 빈 파일 생성 / 수정 시간 갱신
$ touch filename

# 파일 삭제
$ rm filename             # 파일 삭제
$ rm -i filename          # 삭제 전 확인
$ rm -f filename          # 강제 삭제 (확인 없음)

# 디렉토리 삭제
$ rmdir dirname           # 빈 디렉토리만 삭제
$ rm -r dirname           # 디렉토리와 내용물 함께 삭제
$ rm -rf dirname          # 강제로 디렉토리 삭제 (주의!)

파일 복사 및 이동

# 복사
$ cp source dest          # 파일 복사
$ cp -r srcdir destdir    # 디렉토리 복사 (재귀적)
$ cp -i source dest       # 덮어쓰기 전 확인
$ cp -p source dest       # 권한, 시간 정보 유지

# 이동 / 이름 변경
$ mv oldname newname      # 이름 변경
$ mv file /path/to/dest   # 파일 이동
$ mv -i source dest       # 덮어쓰기 전 확인

파일 내용 보기

# 전체 내용 출력
$ cat filename

# 페이지 단위로 보기
$ less filename           # 스크롤 가능 (q로 종료)
$ more filename           # 기본 페이저

# 앞/뒤 일부만 보기
$ head filename           # 앞 10줄
$ head -n 20 filename     # 앞 20줄
$ tail filename           # 뒤 10줄
$ tail -f filename        # 실시간 모니터링 (로그 확인용)

도움말 확인

# 매뉴얼 페이지 (상세)
$ man ls

# 간단한 도움말
$ ls --help

# 명령어 위치 확인
$ which python
/usr/bin/python

# 명령어 설명 (짧게)
$ whatis ls
ls (1) - list directory contents

10. 사용자와 권한

사용자 종류

┌─────────────────────────────────────────────────────────────────┐
│                      리눅스 사용자 종류                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │                    root (슈퍼유저)                         │  │
│  │  • UID: 0                                                 │  │
│  │  • 모든 권한 보유                                          │  │
│  │  • 시스템 전체 관리                                         │  │
│  │  • 프롬프트: #                                             │  │
│  └───────────────────────────────────────────────────────────┘  │
│                            │                                     │
│       ┌────────────────────┼────────────────────┐               │
│       ▼                    ▼                    ▼               │
│  ┌─────────┐         ┌─────────┐         ┌─────────┐           │
│  │ 일반유저 │         │ 일반유저 │         │시스템유저│           │
│  │ (user1) │         │ (user2) │         │ (www)   │           │
│  │UID:1000+│         │UID:1001 │         │UID:1-999│           │
│  │프롬프트:$│         │         │         │(서비스용)│           │
│  └─────────┘         └─────────┘         └─────────┘           │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

sudo 사용

# sudo: 일반 사용자가 관리자 권한으로 명령 실행
$ sudo command

# 예시
$ sudo apt update         # 패키지 목록 갱신
$ sudo systemctl restart nginx

# 루트 셸로 전환
$ sudo -i
$ sudo su -

# 현재 사용자 확인
$ whoami
$ id
uid=1000(user) gid=1000(user) groups=1000(user),27(sudo)

파일 권한

# 권한 구조
-rwxr-xr-x
│└┬┘└┬┘└┬┘
│ │  │  └── 기타(other): r-x (읽기, 실행)
│ │  └── 그룹(group): r-x (읽기, 실행)
│ └── 소유자(user): rwx (읽기, 쓰기, 실행)
└── 파일 유형 (- 파일, d 디렉토리)

# 권한 숫자 표현
r = 4, w = 2, x = 1
rwx = 4+2+1 = 7
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4

예: -rwxr-xr-- = 754

권한 변경

# chmod: 권한 변경
$ chmod 755 script.sh     # rwxr-xr-x
$ chmod 644 file.txt      # rw-r--r--
$ chmod +x script.sh      # 실행 권한 추가
$ chmod -w file.txt       # 쓰기 권한 제거
$ chmod u+x,g-w file      # 소유자 +x, 그룹 -w

# chown: 소유자 변경
$ sudo chown user:group file
$ sudo chown -R user:group dir/  # 재귀적

# chgrp: 그룹 변경
$ sudo chgrp group file

요약

구분핵심 내용
리눅스오픈소스 운영체제, 서버/클라우드에서 압도적 점유율
커널OS의 핵심, 하드웨어와 소프트웨어 중재
배포판커널 + 도구 + 앱 패키지 (Ubuntu, CentOS 등)
명령어 해석기 (bash가 기본)
디렉토리 구조FHS 표준 (/, /home, /etc, /var 등)
기본 명령어ls, cd, pwd, cp, mv, rm, mkdir
사용자root(관리자), 일반 사용자, 시스템 사용자
권한rwx (읽기/쓰기/실행), 소유자/그룹/기타

자주 쓰는 명령어 빠른 참조

# 탐색
pwd                 # 현재 위치
ls -la              # 상세 목록
cd /path            # 이동

# 파일 조작
cp src dest         # 복사
mv old new          # 이동/이름변경
rm file             # 삭제
mkdir dir           # 디렉토리 생성

# 내용 보기
cat file            # 전체 출력
less file           # 페이지 단위
head/tail file      # 앞/뒤 일부

# 시스템
sudo command        # 관리자 권한 실행
shutdown -h now     # 종료
reboot              # 재부팅

# 도움말
man command         # 매뉴얼
--help              # 간단 도움말