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/Rocky | RHEL 호환, 안정성 | 서버, 기업 환경 | 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 Linux5. 셸 (Shell)
셸이란?
사용자가 입력한 명령어를 해석하여 커널에 전달하는 명령어 해석기
┌────────────────────────────────────────────────────────────────┐
│ │
│ 사용자 입력 │
│ │ │
│ ▼ │
│ ┌─────────┐ 명령어 ┌─────────┐ 시스템 ┌─────────┐ │
│ │ 터미널 │ ──────────→ │ 셸 │ ──────────→ │ 커널 │ │
│ │(Terminal)│ │ (Shell) │ 호출 │(Kernel) │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ │ │ │ │
│ └───────────────────────┴───────────────────────┘ │
│ 결과 출력 │
│ │
└────────────────────────────────────────────────────────────────┘주요 셸 종류
| 셸 | 전체 이름 | 특징 |
|---|---|---|
| bash | Bourne Again Shell | 리눅스 기본 셸, 가장 널리 사용 |
| zsh | Z Shell | 강력한 자동완성, Oh-My-Zsh 생태계 |
| fish | Friendly Interactive Shell | 사용자 친화적, 구문 강조 |
| sh | Bourne Shell | 가장 기본적인 셸, 스크립트 호환성 |
| dash | Debian 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/zsh6. 로그인과 로그아웃
리눅스의 다중 사용자 시스템
리눅스는 여러 사용자가 동시에 사용하는 것을 전제로 설계된 다중 사용자 시스템
┌─────────────────────────────────────────────────────────────────┐
│ 리눅스 서버 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ 사용자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 옵션 정리
| 옵션 | 설명 | 예시 |
|---|---|---|
-h | halt (종료) | shutdown -h now |
-r | reboot (재부팅) | shutdown -r now |
-c | cancel (예약 취소) | 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.target8. 리눅스 디렉토리 구조
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 contents10. 사용자와 권한
사용자 종류
┌─────────────────────────────────────────────────────────────────┐
│ 리눅스 사용자 종류 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 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 # 간단 도움말