← Documents

리눅스(Ubuntu) 정리

🐧

한 줄 소개 — OS(리눅스)를 공부하며 Ubuntu 위에서 직접 명령을 쳐 보고 캡처·필기해 둔 노트를 정리한 글이다. 기초(디렉토리·파일·링크·권한·셸·프로세스·압축)부터 고급(사용자·부팅·systemd·디스크/파일시스템·RAID·LVM·스케줄링·백업·네트워크·패키지·로그·NFS/Rsync), 그리고 SSH·서버 운영까지 다룬다. "리눅스는 모든 것을 파일로 관리한다"는 한 문장이 전체를 관통한다. (다이어그램은 직접 그렸고, 인용 블록은 당시 직접 남긴 메모다.)

1 · 들어가며 — 프롬프트와 명령어 구조

터미널의 맨 앞 thlee@DESKTOP:/home$프롬프트(prompt) 라 한다 — 사용자 · 컴퓨터 이름 · 현재 디렉토리 · 권한($ 일반 사용자 / # 관리자)을 표기한다. 관리자(root)로 전환하면 $# 로 바뀐다.

# 기본 문법 — 명령어(프로그램) [옵션] [옵션 인자] [대상(Argument)] ls -al /home # ls=명령, -al=옵션, /home=argument(대상) su - # root 계정으로 전환 ($ → #) exit # 현재 계정 로그아웃 / SSH 연결 종료 sudo apt update && sudo apt upgrade -y # 패키지 목록 갱신 + 업그레이드 sudo reboot # 재시작 sudo vim /etc/ssh/sshd_config # vim 으로 설정 파일 열기
  • 옵션 -(single) vs --(double): 약어냐 단어냐의 차이다. ls -a = ls --all.
  • argument — 명령어에 의해 영향을 받는 파일·디렉토리 등 특정 대상.
  • alias(별명): 자주 쓰는 ll 은 사실 기본 명령이 아니라 ls -alF 의 별명이다. alias 로 직접 만들 수도 있다.

2 · 리눅스 디렉토리 구조

윈도우의 C: · D: 처럼 드라이브가 나뉘는 것과 달리, 리눅스는 최상위 루트 / 하나 아래로 모든 것이 트리로 연결된다. 경로는 절대 경로(/ 부터 전부) 또는 상대 경로(현재 위치 기준)로 쓴다.

/ /bin /etc /home /var /dev /usr 기본 명령 설정 파일(etcetera) 사용자 홈 로그·가변데이터 장치 파일(device) 응용 SW /home/thlee 모든 것은 하나의 루트 / 아래 트리로 연결된다 — 파티션(드라이브)이 나뉘지 않는다
리눅스 파일시스템 계층(FHS) — /bin 명령, /etc 설정, /home 사용자, /var 로그, /dev 장치 …

3 · i-node 와 하드/심볼릭 링크

디스크(SSD·HDD)에 저장된 내용은 파일에 연결돼야 접근할 수 있는데, 여기에 i-node 개념이 들어간다 — 파일의 주소·권한·이름·크기 등이 저장된 테이블(Lookup Table)이다. 파일 데이터에 접근할 때 i-node 테이블을 거쳐 실제 데이터 블록의 위치를 찾는다. (ls -il 로 i-node 번호 확인)

  • 하드 링크(ln origin origin_hl) — 원본과 같은 i-node 를 가리킨다. 마치 얕은 복사(shallow copy)처럼 동작. (일반 cp 복사는 새 i-node = 깊은 복사)
  • 심볼릭 링크(ln -s origin origin_sl) — 윈도우 "바로가기"와 비슷. 새 i-node 를 받지만 그것이 가리키는 것은 원본 경로다(origin_sl -> origin). 원본을 바꾸면 따라 바뀐다.
하드 링크 — 같은 i-node origin origin_hl i-node 29512 같은 데이터 블록 (cp 는 새 i-node = 깊은 복사) 심볼릭 링크 — 경로를 가리킴 origin_sl origin i-node 새 i-node 원본 경로를 참조 (원본 삭제 시 깨짐)
하드 링크는 같은 i-node(=같은 데이터)를, 심볼릭 링크는 원본의 경로를 가리킨다

4 · 디렉토리 명령어

pwd # 현재 작업 디렉토리 확인 cd [dir] / cd .. / cd ~ / cd - # 이동 / 상위 / 홈 / 직전 디렉토리 ls # 목록 ls -a # 숨김 파일(. 으로 시작)까지 ls -l # 권한·소유자·크기·날짜 등 상세 ls -al # 가장 많이 씀 (숨김 + 상세) ls -R # 하위 디렉토리까지 재귀 출력 ls -ld /dir # 디렉토리 '자체'의 정보 mkdir test # 생성 mkdir -p a/b/c/d # -p : 계층 디렉토리를 한 번에 생성 rm -rf dir # 디렉토리 삭제(재귀·강제) mv test goodDir / cp -r src dst # 이동(이름변경) / 복사

ls -al 결과 맨 앞 필드(drwxr-xr--)에서 첫 글자가 d 면 디렉토리, - 면 파일이다. 파일명 앞에 . 만 붙이면 숨김 파일이 된다.

5 · 파일 명령어

touch file # 빈 파일 생성 rm file / mv old new / cp src dst # 삭제 / 이름변경·이동 / 복사 cat passwd # 전체 내용 출력 (cat -n : 줄 번호) head passwd # 앞 10줄 (head -3 : 3줄) tail passwd # 끝 10줄 tail -f /var/log/syslog # ★ 실시간 갱신 — 로그 모니터링에 많이 씀 more passwd # 화면 단위로 보기 (space: 다음 페이지, enter: 한 줄)

6 · 문서 편집기 (vim)

리눅스는 설정을 파일로 하므로 편집기 사용이 잦다. vim모드로 동작한다 — 명령(normal) / 입력(insert) / 명령행(ex).

vim file # 열기 i # 입력 모드 진입 (a: 커서 뒤, o: 아랫줄) Esc # 명령 모드로 복귀 dd / yy / p # 한 줄 삭제 / 복사 / 붙여넣기 /word # 검색 (n: 다음) :w :q :wq :q! # 저장 / 종료 / 저장후종료 / 강제종료(저장 안함) :set nu # 줄 번호 표시

7 · 파일·디렉토리 검색

find /path -name "*.conf" # 이름으로 검색 (-type f/d, -size, -mtime) find / -name sshd_config 2>/dev/null grep "keyword" file # 파일 내용에서 검색 (grep -r : 재귀, -i : 대소문자 무시, -n : 줄번호) which ls / whereis ls # 실행파일 경로 locate file # DB 기반 빠른 검색 (updatedb 로 갱신)

8 · 권한 설정 (Permission)

리눅스는 다중 사용자 환경이라 권한이 가장 기초적인 접근 통제다. 모든 파일·디렉토리가 읽기(r)·쓰기(w)·실행(x) 권한을 가진다. ls -l 첫 필드로 확인하며, 10자리로 해석한다.

권한 해석 — d rwx r-x r-- d rwx r-x r-- 파일 종류(d:디렉토리- :파일) 소유자(u) 관리 그룹(g) 나머지(o) r = 읽기(4) · w = 쓰기(2) · x = 실행(1) · - = 권한 없음 chmod 755 → rwx(7) r-x(5) r-x(5) · 파일 기본 644, 디렉토리 기본 755
맨 앞 1자리(종류) + 9자리(소유자·그룹·기타의 rwx). 8진수로 r=4·w=2·x=1 을 더해 표기
# 심볼릭 모드 — 대상(u/g/o/a) +/- 권한(r/w/x) chmod u+w file # 소유자에게 쓰기 부여 chmod ug+rw file # 소유자·그룹에 읽기/쓰기 # 옥텟(8진수) 모드 — 실무에서 더 자주 씀 chmod 755 script.sh # rwxr-xr-x chmod 644 file.txt # rw-r--r-- chown user:group file # 소유자·그룹 변경

9 · Shell (쉘) — 메타문자와 리다이렉션

은 사용자와 커널 사이에서 입력한 명령을 해석해 OS가 알아듣게 해주는 프로그램이다(bash·sh·csh·tcsh·ksh — bash 가 기본). echo $SHELL 로 확인. $ 는 뒤 문자를 변수로 인식하라는 의미다.

  • 메타문자: ~ 홈 디렉토리 · - 직전 디렉토리 · * 0자 이상 임의 문자 · ? 한 글자 · `cmd`(backtick) 안을 명령으로 실행 · ' ' 메타문자를 일반문자로 · " "$ ` \ 만 특수 취급.
방향 재지정 (Redirection) 명령어 (프로세스) stdin키보드 stdout 모니터 stderr 모니터 < 입력 > 출력 < 입력 재지정 · > 출력을 파일로(>> 추가) · | 앞 명령의 출력을 뒤 명령의 입력으로(파이프)
입출력을 화면·키보드가 아닌 파일·다른 명령으로 돌리는 것 — > >> < |
echo "test" > out.txt # 출력을 파일로 저장 (덮어쓰기) echo "more" >> out.txt # 파일에 추가 command 2> err.log # 표준 에러만 파일로 ps -ef | grep nginx # 파이프 — 앞 출력 → 뒤 입력

10 · Process 제어

프로세스 = 커널에 등록된 Job(메모리에 올라가 실행 중인 프로그램). foreground 에서 도는 것을 process, background 에서 도는 것을 service 라 부르기도 한다. (Program = 디스크의 실행파일, Process = 그것을 실행시키는 주체)

프로세스의 종류 systemd (PID 1) 부모 프로세스 데몬(서비스) 부모 프로세스 자식 프로세스 데몬: 끝에 'd'(mongod) · 부팅 시 커널이 구동 좀비: 종료됐지만 자원 미반납 고아: 부모가 먼저 종료 → systemd 가 입양
부모·자식·데몬·고아(systemd 가 처리)·좀비(자원 미반납) 프로세스
ps # 내가 실행한 프로세스 ps -ef # 시스템 전체 (UID PID PPID … CMD) ps -ef | grep java top / htop # 실시간 자원·프로세스 모니터링 kill -9 [PID] # 강제 종료 (SIGKILL) jobs / fg / bg # 작업 제어 command & # 백그라운드로 실행

11 · 압축 & 아카이브

아카이브(여러 파일을 하나로 묶기, tar)와 압축(gzip 등)은 별개지만 보통 함께 쓴다.

tar -cvf arc.tar dir/ # 묶기(c) , -xvf : 풀기(x) tar -czvf arc.tar.gz dir/ # 묶고 gzip 압축(z) tar -xzvf arc.tar.gz # gzip 해제 + 풀기 gzip file / gunzip file.gz # 단일 파일 압축/해제 zip -r a.zip dir/ / unzip a.zip

12 · 사용자 관리

리눅스는 역할별로 계정을 나눠 권한을 부여한다(웹 담당, 개발 담당 …). 사용자 정보는 모두 파일로 관리된다 — /etc/passwd(계정) · /etc/shadow(암호) · /etc/group(그룹).

# /etc/passwd 한 줄 — : 로 구분된 7개 필드 thlee : x : 1000 : 1000 : 설명 : /home/thlee : /bin/bash #로그인명 비번(→shadow) UID GID 주석 홈 디렉토리 로그인 쉘 useradd -m -s /bin/bash newuser # 사용자 생성(-m 홈 생성) passwd newuser # 비밀번호 설정 (→ /etc/shadow 에 해시 저장) usermod -aG sudo newuser # 그룹 추가 userdel -r newuser # 삭제 su - newuser / sudo command # 전환 / 일시적 관리자 권한

시스템 계정도 함께 들어 있다 — root(최고 권한), daemon(백그라운드 작업), bin, lp(프린트) 등. 끝이 /usr/sbin/nologin 이면 로그인 불가 계정이다.

13 · 리눅스 부팅 과정

부팅 흐름 전원Power On POSTHW 점검 BIOS부팅장치 검색 부트로더GRUB 커널 적재메모리 systemdPID 1 → 필수 SW 런 레벨(0~6) — who -r 로 확인 · init 0(종료) / init 6(재부팅) / init 1(점검 single) GRUB 설정 /boot/grub2/grub.cfg · 부팅 로그 /var/log/boot.log
전원 → POST → BIOS(부팅장치 검색) → GRUB → 커널 → systemd(PID 1)가 나머지 프로그램 실행

14 · systemd

부팅 시 커널이 가장 먼저 실행하는 프로세스(PID 1). 과거 init 이 런 레벨별 rc 스크립트를 순차 실행했다면, systemd 는 가능한 한 병렬로 실행해 부팅을 빠르게 하고, 쉘 스크립트 대신 유닛(unit) 으로 체계적으로 관리한다. 네임서버 설정(systemd-resolved), 네트워크(systemd-networkd) 등 다른 데몬 역할도 대체한다.

유닛기능
service데몬 시작·종료·재시작nginx.service
socket소켓 관리dbus.socket
device장치 관리dev-sda.device
mount마운트 포인트boot.mount
systemctl start|stop|restart|status [unit] systemctl enable [unit] # 부팅 시 자동 시작 systemctl disable [unit] systemctl -t service # 종류별 출력 journalctl -u nginx # 해당 유닛 로그

15 · 디스크 관리 & 파일시스템

디스크 종류는 IDE(구형) · SATA(일반) · SCSI(서버) · NVMe(SSD)로 나뉜다. HDD의 물리 구조(플래터·스핀들 모터·액추에이터 암)는 기계적이라 느릴 수밖에 없고, 그 간극을 메우려 캐시·SSD가 등장했다. 논리 구조는 아래처럼 쌓인다.

섹터 Sector최소 단위 512B 트랙 Track섹터들의 원 실린더 Cylinder트랙들의 원통 파티션 Partition실린더 그룹 점(섹터) → 선(트랙) → 원통(실린더) → 영역(파티션)
디스크 논리 구조 — 섹터(512B)가 모여 트랙, 트랙이 모여 실린더, 실린더 그룹이 파티션
df -h # 파일시스템별 총/사용/가용 용량 du -sh dir # 디렉토리 용량 lsblk / fdisk -l # 블록 장치·파티션 확인 fdisk /dev/sdb # 파티션 생성 mkfs.ext4 /dev/sdb1 # 파일시스템 생성(포맷) mount /dev/sdb1 /mnt # 마운트 (영구: /etc/fstab 에 등록)

실무 메모 — 회사에서 트러블슈팅 중, CPU는 빠른데 HDD가 못 따라가 iowait 이 치솟고 작업이 몰려 hanging 이 걸린 적이 있다(DB 적재 시). CPU·디스크 속도 격차가 곧 병목이 된다는 걸 체감했다.

16 · RAID — 여러 디스크를 하나로

파티션이 하나의 디스크를 나누는 것이라면, RAID(Redundant Array of Independent Disks)는 반대로 여러 디스크를 합쳐 하나처럼 쓰는 기술이다. 비싼 대용량 1개보다 싼 디스크 여러 개를 묶는 게 경제적이다(질보다 양).

RAID 0 — 스트라이핑 A1A3A5A2A4A6 속도 ↑↑안정성 ↓ (1개만 깨져도 전체 손상) RAID 1 — 미러링 A1A2A3A1A2A3 안정성 ↑ (복제본)속도 이득 없음 RAID 5 — 패리티 A1A2ApB1BpB2 속도+안정성 절충최소 3개 · 패리티로 복구
RAID 0(분산=빠름·위험) · RAID 1(복제=안전) · RAID 5(패리티 비트로 복구, 최소 3디스크). 그 외 6·10 등

17 · LVM (Logical Volume Manager)

기존 방식은 파일시스템이 디스크 파티션에 직접 붙어 있어, 용량을 늘리려면 포맷·재구성의 수고가 든다. LVM 은 디스크를 PE(Physical Extent)라는 작은 단위로 쪼개 풀(pool)로 관리해, 물리 디스크 경계를 넘어 유연하게(Elastic) 용량을 늘리고 줄인다. (AWS 클라우드 스토리지의 근본 개념)

LVM 계층 — 물리 디스크 경계를 넘는 논리 볼륨 디스크1 /dev/sda 디스크2 /dev/sdb PV (PE 단위) PV (PE 단위) VG (Volume Group) — 묶음 LV (/, 파일시스템) LV (/home) PV → VG → LV 로 추상화 · PE: 용량 조절의 최소 단위 · 디스크2의 PE 일부를 끌어와 디스크1 용량을 넘는 LV 생성 가능 · 온라인 확장·스냅샷·미러
물리 볼륨(PV)을 PE로 쪼개 볼륨 그룹(VG)으로 묶고, 거기서 논리 볼륨(LV)을 잘라 쓴다 — 물리 경계를 넘는 유연성
pvcreate /dev/sdb /dev/sdc # PV 생성 vgcreate myvg /dev/sdb /dev/sdc # VG 로 묶기 lvcreate -L 50G -n mylv myvg # LV 생성 mkfs.ext4 /dev/myvg/mylv && mount ... lvextend -L +20G /dev/myvg/mylv # 온라인 확장

18 · 작업 스케줄링 (cron · at)

정해진 시각에 반복 실행은 cron, 일회성 예약은 at.

crontab -e # 현재 사용자 크론 편집, crontab -l : 목록 # ┌분 ┌시 ┌일 ┌월 ┌요일 명령 # 0 3 * * * /home/backup.sh # 매일 03:00 실행 */5 * * * * /script.sh # 5분마다 at 22:00 # 오늘 22시 1회 실행 예약

19 · 백업 & 복구

아카이브(tar)·동기화(rsync)·디스크 이미지(dd)로 백업하고, 스케줄링과 결합해 자동화한다.

tar -czvf /backup/home_$(date +%F).tar.gz /home # 압축 백업 rsync -avz /src/ user@host:/backup/ # 증분 동기화 백업(원격) dd if=/dev/sda of=/backup/disk.img bs=4M # 디스크 통째 이미지

20 · 네트워크 설정

현재 네트워크 상태는 ifconfig(구) / ip(신)로 본다. 장치 상태가 UP 이어야 하고, 각 인터페이스의 inet(IP) · netmask · broadcast 를 확인한다(lo 는 루프백 127.0.0.1).

ifconfig / ip addr # 인터페이스·IP 확인 ip link set enp1s0 up # 장치 활성화 ping 8.8.8.8 # 연결 확인 ss -tulpn / netstat -tulpn # 열린 포트·소켓 # Ubuntu 영구 설정: /etc/netplan/*.yaml → sudo netplan apply

21 · 소프트웨어 패키지 관리

Ubuntu(데비안 계열)는 apt/dpkg, RedHat 계열은 yum/dnf/rpm 을 쓴다.

sudo apt update # 패키지 목록 갱신 sudo apt upgrade -y # 설치된 패키지 업그레이드 sudo apt install nginx # 설치 / apt remove nginx : 제거 apt search keyword / apt show nginx dpkg -i pkg.deb / dpkg -l # .deb 직접 설치 / 목록

22 · 리눅스 로그

로그는 /var/log 아래에 쌓인다 — 문제가 생기면 가장 먼저 보는 곳. systemd 환경에선 journalctl 로 통합 조회한다.

/var/log/syslog /var/log/auth.log /var/log/boot.log tail -f /var/log/syslog # 실시간 journalctl -xe # 최근 로그(에러 위주) journalctl -u nginx --since today dmesg # 커널 메시지

23 · NFS & Rsync — 공유와 동기화

  • NFS(Network File System) — 네트워크 너머의 디렉토리를 마치 로컬처럼 마운트해 공유한다. 서버는 /etc/exports 에 공유 대상을 정의한다.
  • Rsync — 변경분만 전송하는 효율적인 (원격) 동기화 도구. 백업·배포에 유용.
# NFS 서버: /etc/exports /srv/share 192.168.0.0/24(rw,sync,no_subtree_check) sudo exportfs -a && sudo systemctl restart nfs-server # 클라이언트 sudo mount -t nfs 192.168.0.10:/srv/share /mnt # Rsync — -a 보존, -v 출력, -z 압축, --delete 동기화 rsync -avz --delete /src/ user@host:/dst/

24 · SSH — 원격 접속과 운영

SSH 로 원격 서버에 안전하게 접속한다. 비밀번호 대신 키 인증(공개키를 서버 ~/.ssh/authorized_keys 에 등록)을 권장한다. 서버 동작은 /etc/ssh/sshd_config 로 설정한다(포트 변경·root 로그인 차단·접속 Banner 등 → 홈 서버 보안의 기본).

ssh user@host -p 22 # 접속 ssh-keygen -t ed25519 # 키 생성 ssh-copy-id user@host # 공개키 등록 sudo vim /etc/ssh/sshd_config # Port / PermitRootLogin no / Banner /etc/issue.net sudo systemctl restart ssh

그 위에 DNS 서버 구축(bind9), 서버 설치/초기 세팅, 방화벽(ufw) 등으로 홈 서버를 운영했다.

25 · Shell Script & 서비스 배포

반복 작업은 쉘 스크립트로 묶고, 서버 프로그램(예: Spring Boot)은 nohup/스크립트로 띄우는 대신 systemd service 로 등록해 자동 시작·재시작·로그를 체계적으로 관리한다.

#!/bin/bash # deploy.sh — 빌드 후 재시작 예시 echo "===== deploy start =====" ./gradlew build sudo systemctl restart myapp echo "===== done ====="
# /etc/systemd/system/myapp.service [Unit] Description=My Spring Boot App After=network.target [Service] ExecStart=/usr/bin/java -jar /app/app.jar Restart=always User=thlee [Install] WantedBy=multi-user.target # 등록 후: sudo systemctl daemon-reload && sudo systemctl enable --now myapp

📓 2022–2023년 제가 리눅스를 직접 공부하고 Ubuntu 에서 실습하며 정리한 개인 학습 노트입니다 · 원본 Notion 에서 보기 ↗