리눅스(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 장치 …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). 원본을 바꾸면 따라 바뀐다.
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자리로 해석한다.
# 심볼릭 모드 — 대상(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) 안을 명령으로 실행 ·' '메타문자를 일반문자로 ·" "는$ ` \만 특수 취급.
> >> < |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 = 그것을 실행시키는 주체)
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.zip12 · 사용자 관리
리눅스는 역할별로 계정을 나눠 권한을 부여한다(웹 담당, 개발 담당 …). 사용자 정보는 모두 파일로 관리된다 — /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 · 리눅스 부팅 과정
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가 등장했다. 논리 구조는 아래처럼 쌓인다.
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개보다 싼 디스크 여러 개를 묶는 게 경제적이다(질보다 양).
17 · LVM (Logical Volume Manager)
기존 방식은 파일시스템이 디스크 파티션에 직접 붙어 있어, 용량을 늘리려면 포맷·재구성의 수고가 든다. LVM 은 디스크를 PE(Physical Extent)라는 작은 단위로 쪼개 풀(pool)로 관리해, 물리 디스크 경계를 넘어 유연하게(Elastic) 용량을 늘리고 줄인다. (AWS 클라우드 스토리지의 근본 개념)
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 apply21 · 소프트웨어 패키지 관리
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 에서 보기 ↗