🐧 리눅스 시스템 관리

Notes / 리눅스 / Rocky · Ubuntu · WSL 진행 중

💿 설치 & 부팅

설치 방식 3종

방식장점한계
WSL (Windows)윈도우 통합·가볍다커널 공유, 1대만 운용
VirtualBox / VMwareVM 다수 동시 기동·네트워크 토폴로지 실습리소스 소비
베어메탈성능·생산 서버초기 구성 비용

WSL 설치

# 관리자 권한 CMD / PowerShell
wsl --install                     # WSL + 최신 Ubuntu 설치
wsl --list --online               # 설치 가능 배포판 확인
wsl --install -d rocky-9          # 다른 배포판 지정 설치
wsl --set-default-version 2       # WSL2 기본화

GRUB 보안 (Rocky)

grub2-set-password                # 부트로더 패스워드 → 싱글 유저 모드 악용 차단
# /boot/grub2/user.cfg 에 해시 저장됨

🐚 쉘 & 환경변수

쉘 설정 파일 — 로그인 vs 인터랙티브

범위로그인 쉘인터랙티브 쉘
사용자별~/.bash_profile · ~/.profile~/.bashrc
시스템 전체/etc/profile · /etc/profile.d/*.sh/etc/bashrc
주로 담는 것PATH·환경변수(한 번만 설정)alias·함수(쉘 뜰 때마다)

변수 명령

VAR=hello                # 일반변수 (현재 쉘에서만 유효)
export VAR               # 환경변수로 승격 → 자식 프로세스에도 전달
set                      # 모든 변수 + 함수 출력
env                      # 환경변수만 출력
echo $PATH               # 실행파일 검색 경로

# PATH 확장 (이번 세션만)
export PATH=$PATH:/opt/myapp/bin

# 영구 등록
echo 'export PATH=$PATH:/opt/myapp/bin' >> ~/.bashrc

경로 표기법

  • 절대경로/부터 시작 (위치 무관): /etc/systemd/system
  • 상대경로 — 현재 위치 기준, / 없이: cd lab · ./shell.sh · ../config
현재 디렉토리 실행: PATH에 .이 없으므로 ./shell.sh처럼 상대경로를 명시해야 실행됨 (보안상 의도된 기본값).

🔐 SSH 키 인증

패스워드보다 안전하고 자동화(CI/CD·앤서블)에 필수. 개인키는 절대 서버에 올리지 않는다.

sequenceDiagram actor C as Client participant S as Server (sshd) Note over C: ssh-keygen 으로 키 쌍 생성
~/.ssh/id_rsa (개인키) + id_rsa.pub (공개키) C->>S: ssh-copy-id user@host
(공개키를 ~/.ssh/authorized_keys 에 등록) C->>S: ssh user@host (접속 요청) S-->>C: 난수 challenge C->>C: 개인키로 서명 (passphrase 필요 시 입력) C->>S: 서명 전송 S->>S: authorized_keys 공개키로 서명 검증 S-->>C: 접속 허용 (암호 없이)

키 쌍 생성 & 배포

# 1) 클라이언트에서 키쌍 생성 (~/.ssh에 id_rsa, id_rsa.pub)
ssh-keygen -t rsa -b 4096 -C "chany@local"

# 2) 공개키를 서버의 ~/.ssh/authorized_keys에 등록
ssh-copy-id -i ~/.ssh/id_rsa.pub admin@192.168.6.10

# 3) 개인키로 접속
ssh -i ~/.ssh/id_rsa admin@192.168.6.10

SSH 파일 퍼미션 규정

대상퍼미션이유
~/.ssh700소유자만 접근
authorized_keys644소유자 쓰기 + 읽기만
개인키 id_rsa600느슨하면 SSH가 거부
주의: MobaXterm은 Advanced SSH Setting → Private Key에 개인키 파일을 넣어야 인증. 개인키 유출 시 즉시 authorized_keys에서 해당 공개키 줄 삭제.

🎯 Runlevel · systemd target

systemd는 전통 SysV의 runleveltarget으로 대체했다.

Runlevelsystemd target용도
0poweroff.target종료
1rescue.target단일 사용자 복구
3multi-user.targetCLI 서버
5graphical.targetGUI 로그인
6reboot.target재부팅
runlevel                                       # 이전·현재 runlevel
systemctl get-default                          # 부팅 시 사용하는 기본 타깃
systemctl set-default multi-user.target        # 다음 부팅부터 CLI 모드
systemctl isolate multi-user.target            # 즉시 전환 (일시적)

👤 사용자 관리

계정 관련 핵심 파일

파일내용
/etc/passwd계정 기본 정보 (UID, 홈, 쉘)
/etc/shadow해시 패스워드 + 에이징(만료·최소/최대일)
/etc/group그룹 정보. 마지막 필드는 2차 그룹 멤버 목록
/etc/gshadow그룹 패스워드 (그룹 가입 인증용)
/etc/default/useradduseradd 기본값 (useradd -D로 조회·수정)
/etc/login.defsuseradd보다 우선 적용. 최소 UID 1000 등
/etc/skel/사용자 생성 시 홈디렉토리에 복사되는 템플릿

자주 쓰는 명령

useradd -m -s /bin/bash -G wheel chany          # 홈 생성·쉘 지정·보조그룹 wheel
passwd chany                                    # 패스워드 설정
usermod -aG docker chany                        # 보조그룹 추가 (-a 필수, 없으면 덮어씀)
chage -l chany                                  # 패스워드 에이징 조회
userdel -r chany                                # 홈까지 삭제
id chany                                        # UID/GID/그룹 확인
su - chany                                      # 로그인 쉘로 전환
sudo -l                                         # 내가 쓸 수 있는 sudo 명령 확인

🛡️ 퍼미션 · 소유권 · umask · SetUID

퍼미션 읽기

-rwxr-xr-- = 파일타입 | 소유자 rwx | 그룹 r-x | other r--

chmod 755 script.sh                # rwxr-xr-x
chmod u+x,g-w file                 # 기호 방식
chown -R chany:devs /data          # 소유자·그룹 재귀 변경
chgrp -R devs /data                # 그룹만 변경

umask — 생성 시 빼고 부여되는 퍼미션

  • 파일 기본 666, 디렉토리 기본 777 (디렉토리 진입 시 x 필요)
  • root umask 0022 → 파일 644, 디렉토리 755
  • 일반 사용자 umask 0002 → 파일 664, 디렉토리 775
  • umask 값이 클수록 보안 강화 (제거되는 퍼미션 多)

특수 비트 — SetUID · SetGID · Sticky

비트숫자의미예시
SetUID4000실행 시 파일 소유자 권한으로 동작/usr/bin/passwd
SetGID2000실행 시 그룹 권한 / 디렉토리는 하위 파일의 그룹 상속공유 디렉토리
Sticky1000디렉토리 내 파일은 소유자만 삭제 가능/tmp
chmod 4755 /usr/local/bin/myapp    # SetUID
chmod 2775 /shared                 # SetGID 디렉토리
chmod 1777 /tmp                    # Sticky

find /home -perm -4000             # SetUID 설정된 파일 전수 조사 (감사용)
find / -perm -2000 -type f
find /tmp -perm -1000 -type d
보안 점검: 루트 소유 SetUID 실행파일은 권한 상승 벡터. 주기적으로 find / -perm -4000 -not -path "/proc/*"로 목록을 추출해 비인가 파일을 식별.

⚙️ 프로세스 & 시그널

ps -ef                    # 전체 프로세스 (System V 스타일)
ps aux                    # BSD 스타일 (%CPU, %MEM 포함)
pstree -p                 # 트리 구조
top / htop                # 실시간 모니터링
jobs                      # 현재 쉘의 백그라운드 작업
& / fg %1 / bg %1 / Ctrl+Z   # 작업 제어

주요 시그널

번호이름동작트랩 가능
1SIGHUP재로드 (설정 파일 재읽기)
2SIGINTCtrl+C 인터럽트
9SIGKILL강제 종료❌ 무시 불가
15SIGTERM정상 종료 요청 (기본)
19SIGSTOP일시 정지
18SIGCONT재개
kill 1234                  # 기본 SIGTERM
kill -9 %5                 # 작업번호 5 강제 종료
kill -1 10000              # SIGHUP → 설정 reload (PID 유지)
pkill -f "nginx"           # 이름 패턴으로 죽이기
killall httpd              # 이름 일치 전부

🤖 데몬 관리 — systemctl

과거 service / chkconfig는 호환용이며 실제는 모두 systemd로 위임된다.

명령동작
systemctl start|stop|restart|reload sshd시작·중지·재시작·reload
systemctl enable|disable sshd부팅 시 자동 시작 on/off
systemctl status sshd상태·최근 로그
systemctl list-units --type=service모든 서비스
systemctl daemon-reloadunit 파일 변경 반영
journalctl -u sshd -f서비스 실시간 로그

socket vs service

  • sshd.socket — 요청이 있을 때만 메모리에 올림 (과거 inetd/xinetd 역할)
  • sshd.service — 상시 상주 데몬 (기본값, .service 생략 가능)

시간 동기화 — chronyd

sudo dnf install chrony
sudo systemctl enable --now chronyd
timedatectl                         # 현재 시간·TZ·NTP 상태
timedatectl set-timezone Asia/Seoul
chronyc sources                     # 참조 NTP 서버 상태

⏰ cron · at — 예약 작업

cron 포맷

#  분   시   일   월   요일  명령
#  0-59 0-23 1-31 1-12 0-7 (0,7=일)
 0  3   *    *    *    /usr/local/bin/backup.sh       # 매일 03:00
 */5 *   *    *    *    /opt/check.sh                  # 5분마다
 0  9   *    *    1-5   /opt/weekday.sh                # 평일 09:00

crontab -e       # 내 사용자 크론 편집
crontab -l       # 내 크론 조회
crontab -u bob -e  # (root) 타 사용자 크론 편집

at — 1회성 예약

at 23:00
at> /usr/local/bin/once.sh
at> ^D                           # Ctrl+D 로 종료

atq                              # 예약 큐
atrm 3                           # 작업 3 취소

사용자 제한

파일의미
/etc/cron.allow · /etc/at.allow있으면 이 안의 사용자만 허용
/etc/cron.deny · /etc/at.deny목록의 사용자는 거부

allow와 deny 둘 다 있으면 allow가 우선. 한 줄에 한 사용자씩.

# sudo에서 리다이렉트 오류 회피 — tee 사용
echo "chany" | sudo tee -a /etc/at.allow

📜 쉘 스크립트

#!/bin/bash
# backup.sh — 간단 백업 스크립트
set -euo pipefail                   # 오류·미정의 변수·파이프 실패 시 즉시 중단

SRC="/var/www"
DST="/backup/$(date +%F).tar.gz"

if [ ! -d "$SRC" ]; then
  echo "원본 없음: $SRC" >&2
  exit 1
fi

tar czf "$DST" "$SRC"
echo "완료: $DST ($(du -h "$DST" | cut -f1))"
chmod +x backup.sh
./backup.sh                         # 상대경로
/opt/scripts/backup.sh              # 절대경로
sh backup.sh                        # 권한 없어도 쉘 명시로 실행

자주 쓰는 문법 요약

구문예시
조건문if [ $? -eq 0 ]; then ... fi
반복for f in *.log; do ... done
명령 치환NOW=$(date +%s)
인자$0 스크립트명 · $1..$9 인자 · $# 개수 · $@ 전체
종료 코드exit 0 성공 · $? 직전 명령 종료 코드

💾 디스크 추가 → 사용 가능까지 5단계

  1. 파티션 생성fdisk /dev/sdb (대용량·GPT는 parted / gdisk)
  2. 파일시스템 생성mkfs -t ext4 /dev/sdb1 / mkfs.xfs /dev/sdb2
  3. 마운트 포인트 생성mkdir /mnt/data
  4. 마운트mount /dev/sdb1 /mnt/data (리부팅 시 해제됨)
  5. 영구 등록/etc/fstab에 기입 후 mount -a로 검증

/etc/fstab 6 필드

# 장치명                  마운트포인트  타입   옵션                      덤프  fsck
UUID=abcd-1234           /            xfs    defaults                   0     0
/dev/mapper/rl-swap      none         swap   defaults                   0     0
/dev/sdb1                /mnt/data    ext4   defaults,usrquota,noatime  0     2
192.168.6.3:/var/nfs     /mnt/nfs     nfs    defaults                   0     0
안전 검증 패턴: fstab 수정 후 반드시 mount -a를 돌려 오타 여부를 점검. 오타가 있으면 재부팅이 실패해 시스템이 올라오지 않는다.

swap 추가 — 파일 방식

dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap defaults 0 0' >> /etc/fstab

📚 LVM — 논리 볼륨 관리

물리 디스크 경계를 넘어 유연하게 볼륨을 확장·축소할 수 있는 계층. PV → VG → LV 3단 구조.

flowchart LR subgraph DISK["물리 디스크"] SDB["/dev/sdb"] SDC["/dev/sdc"] SDD["/dev/sdd"] end subgraph PV["Physical Volume"] PV1["PV: sdb1"] PV2["PV: sdc1"] PV3["PV: sdd1"] end subgraph VG["Volume Group vg_data"] VGP["PE Physical Extent 풀"] end subgraph LV["Logical Volume"] LV1["lv_home
50G"] LV2["lv_app
30G"] LV3["lv_backup
20G"] end SDB --> PV1 --> VGP SDC --> PV2 --> VGP SDD --> PV3 --> VGP VGP --> LV1 VGP --> LV2 VGP --> LV3 LV1 --> FS["mkfs.xfs · mount /home"]

생성 파이프라인

# 1) 파티션 생성 후 Linux LVM 타입(8e)으로 지정
fdisk /dev/sdc      # n → t → 8e → w

# 2) Physical Volume
pvcreate /dev/sdc1 /dev/sdd1 /dev/sde1
pvs                 # 요약 / pvdisplay 상세

# 3) Volume Group
vgcreate gdn11 /dev/sdc1 /dev/sdd1 /dev/sde1
vgs

# 4) Logical Volume
lvcreate -L 5G -n data gdn11        # /dev/gdn11/data 생성
lvs

# 5) 파일시스템 & 마운트
mkfs.ext4 /dev/gdn11/data
mkdir /home/data
mount /dev/gdn11/data /home/data

# 6) fstab 등록
echo '/dev/gdn11/data  /home/data  ext4  defaults,usrquota  0 0' >> /etc/fstab
mount -a

확장 — 서비스 중단 없이

vgextend gdn11 /dev/sdf1           # VG에 디스크 추가
lvextend -L +10G /dev/gdn11/data   # LV 확장
resize2fs /dev/gdn11/data          # ext4 파일시스템 확장
xfs_growfs /home/data              # xfs는 xfs_growfs (축소 불가)
"excluded by a filter" 오류: 이전 RAID 서명이 남아있을 때 발생. mdadm --stop /dev/md0mdadm --zero-superblock /dev/sdX1pvcreate 재시도.

🗃️ RAID — mdadm 소프트웨어 RAID

여러 디스크를 하나의 논리 장치로 묶어 성능·가용성을 확보. Linux에서는 mdadm으로 소프트RAID를 구성한다.

flowchart TB subgraph RAID0["RAID 0 · 스트라이핑"] R0A["Disk1
A1 · A3 · A5"] R0B["Disk2
A2 · A4 · A6"] end subgraph RAID1["RAID 1 · 미러링"] R1A["Disk1
A1 · A2 · A3"] R1B["Disk2
A1 · A2 · A3 사본"] end subgraph RAID5["RAID 5 · 분산 패리티"] R5A["Disk1
A1 · B2 · Cp"] R5B["Disk2
A2 · Bp · C1"] R5C["Disk3
Ap · B1 · C2"] end subgraph RAID10["RAID 10 · 미러 + 스트라이프"] M1["Mirror1
A1 · A1"] M2["Mirror2
A2 · A2"] M1 --- M2 end RAID0 -.->|"용량↑ 속도↑ · 내결함성 無 · 최소 2"| R0N["특징"] RAID1 -.->|"안전 · 용량 절반 · 최소 2"| R1N["특징"] RAID5 -.->|"용량 N-1 · 1개 장애 허용 · 최소 3"| R5N["특징"] RAID10 -.->|"속도+안전 · 용량 절반 · 최소 4"| R10N["특징"]

RAID 0 (Stripe)

최소 2개 · 용량 100% · 내결함성 ❌ · 성능 ▲▲

데이터를 블록 단위로 분할 병렬 기록. 디스크 1개라도 죽으면 전체 데이터 소실.

RAID 1 (Mirror)

최소 2개 · 용량 50% · 내결함성 ▲ (n-1) · 성능 ▲(읽기)

동일 데이터를 2개 이상 디스크에 동시에 기록. 읽기 병렬로 성능 ↑.

RAID 5 (Stripe + Parity)

최소 3개 · 용량 (n-1)/n · 내결함성 디스크 1개 · 성능 ▲

패리티를 분산 저장. 디스크 1개 장애 시 복구 가능. 쓰기 시 패리티 계산 오버헤드.

RAID 6 (Double Parity)

최소 4개 · 용량 (n-2)/n · 내결함성 디스크 2개 · 성능 ▲

패리티를 이중으로 보관. 대용량 어레이에서 재구축 중 2차 장애 대비.

RAID 10 (1+0, Stripe of Mirrors)

최소 4개(짝수) · 용량 50% · 내결함성 각 미러당 1개 · 성능 ▲▲

미러 페어를 스트라이프. DB처럼 랜덤 쓰기가 많은 워크로드에 최적.

mdadm 운용

# RAID 5 생성 — 3개 디스크
mdadm --create /dev/md0 --level=5 --raid-devices=3 \
      /dev/sdc1 /dev/sdd1 /dev/sde1

cat /proc/mdstat                   # 재구축 진행률
mdadm --detail /dev/md0            # 상세 상태

# 파일시스템 & 마운트
mkfs.xfs /dev/md0
mkdir /srv/raid
mount /dev/md0 /srv/raid

# 구성 영구 저장 — 부팅 시 자동 조립
mdadm --detail --scan >> /etc/mdadm.conf

# 장애 시뮬레이션·교체
mdadm /dev/md0 --fail /dev/sdd1
mdadm /dev/md0 --remove /dev/sdd1
mdadm /dev/md0 --add /dev/sdf1     # 핫스페어 투입 → 자동 재구축

# 어레이 해체 (LVM 전환 전 필수)
mdadm --stop /dev/md0
mdadm --zero-superblock /dev/sdc1 /dev/sdd1 /dev/sde1
RAID ≠ 백업: RAID는 하드웨어 장애 가용성을 올릴 뿐, 실수로 rm 한 파일이나 랜섬웨어는 모든 디스크에 그대로 반영된다. 별도 백업 전략이 필수.

📊 사용자 쿼터

특정 파티션에서 사용자·그룹별 저장 용량파일 개수를 제한. 호스팅·다중 사용자 서버에서 필수.

활성화 단계

# 1) fstab에 usrquota / grpquota 옵션 추가
# /dev/sdh1  /mnt/mp1  ext4  defaults,usrquota,grpquota  0 0
systemctl daemon-reload
mount -o remount /mnt/mp1

# 2) 쿼터 DB 생성
quotacheck -aumg       # a:전체 u:사용자 m:강제 g:그룹

# 3) 쿼터 ON
quotaon -auv

# 4) 사용자별 제한 설정
edquota -u chany
#   파일시스템     blocks   soft   hard    inodes  soft  hard
#   /dev/sdh1         0    50000  60000      0     500   600

# Grace Period 확인·수정
edquota -t

# 현재 상태 조회
repquota -a
quota -u chany

# 복제 — 한 사용자 설정을 다른 사용자에 동일하게
edquota -p chany bob alice
  • soft limit — 초과 가능하지만 grace period 후 자동 감축
  • hard limit — 초과 불가, 즉시 쓰기 거부
  • XFSquotacheck 불필요 — xfs_quota 전용 툴 사용

📦 tar · 압축

tar 옵션 조합

옵션의미
ccreate (묶기)
xextract (풀기)
tlist (내용만 조회)
vverbose
f파일명 지정 (항상 마지막)
z / j / Jgzip / bzip2 / xz 동시 압축
tar cvf archive.tar /etc              # 묶기만
tar czf archive.tar.gz /etc           # gzip 압축
tar cjf archive.tar.bz2 /etc          # bzip2
tar cJf archive.tar.xz /etc           # xz (최강 압축률)

tar xzf archive.tar.gz -C /tmp        # /tmp로 풀기
tar tzf archive.tar.gz                # 내용 조회

압축 명령 비교

압축해제확장자특징
gzipgunzip.gz빠름·범용
bzip2bunzip2.bz2중간 속도·높은 압축률
xzunxz.xz최고 압축률·느림
zipunzip.zipWindows 호환·파일명 필수

📥 패키지 관리

고수준 — dnf / apt

# Rocky / RHEL / Fedora
dnf search nginx
dnf install -y nginx
dnf update
dnf remove nginx
dnf list installed
dnf history                   # 설치/삭제 이력
dnf repolist

# Ubuntu / Debian
apt-get update
apt-get install -y nginx
apt-get upgrade
apt-get remove nginx
dpkg -l                       # 설치된 패키지 목록

저수준 — rpm

옵션의미
-i설치
-U업그레이드(없으면 설치)
-e삭제
-qa모든 설치 패키지
-qc <pkg>설정 파일 목록
-qf <path>파일 소유 패키지
-ql <pkg>설치된 파일 목록
--nodeps의존성 무시(위험)

소스 컴파일 3단계

./configure --prefix=/usr/local      # 의존성 점검·Makefile 생성
make                                 # 컴파일
sudo make install                    # /usr/local/...에 복사

# 제거 (권장)
sudo make uninstall                  # 없는 프로젝트 많음 → checkinstall로 .rpm/.deb 포장 추천

🌐 네트워크 & 방화벽

IP·라우팅 진단

ip addr                # NIC·IP 전수 조회 (신규 표준)
ip route               # 라우팅 테이블
ip -s link             # NIC 통계
ss -tnlp               # 리스닝 TCP + 프로세스 (netstat 대체)
ss -tnp                # ESTABLISHED 연결
ping -c 4 8.8.8.8
traceroute google.com
dig naver.com          # DNS 질의
curl -I https://example.com
nmcli connection       # NetworkManager

firewalld (Rocky) · ufw (Ubuntu)

flowchart LR NET([외부 네트워크]) --> PRE["PREROUTING
DNAT"] PRE --> RT{라우팅 결정} RT -->|"로컬 대상"| IN["INPUT
필터링"] IN --> LOCAL["로컬 프로세스"] LOCAL --> OUT["OUTPUT
필터링"] RT -->|"포워딩"| FWD["FORWARD
필터링"] FWD --> POST["POSTROUTING
SNAT · 마스커레이드"] OUT --> POST POST --> NETOUT([외부로])
# firewalld
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-service=nfs
firewall-cmd --reload

# ufw
ufw enable
ufw allow 22/tcp
ufw allow from 192.168.0.0/24 to any port 3306
ufw status verbose

🔗 파일 공유 서비스

4종 비교

서비스프로토콜/포트사용처
FTP (vsftpd)TCP 21 / 20레거시 업/다운로드
NFSTCP 2049Unix/Linux 간 디렉토리 공유
Samba (SMB/CIFS)TCP 445 · 139 · UDP 137/138Windows ↔ Linux 공유
SCP / SFTPTCP 22 (SSH)보안·자동화·개별 전송

FTP — Active vs Passive

  • Active: 데이터 세션을 서버가 클라이언트로 역접속 → 클라이언트 방화벽/NAT에 자주 차단됨
  • Passive: 클라이언트가 데이터 세션도 서버로 접속 → 현대 기본값
chroot jail: FTP/SFTP 사용자가 자기 홈 밖으로 벗어나지 못하게 루트를 가상 고정하는 보안 기법. vsftpd의 chroot_local_user=YES.
flowchart LR subgraph CLI["NFS / Samba 클라이언트"] LNX["Linux Client
mount -t nfs"] WIN["Windows Client
\\server\share"] end subgraph SRV["파일 서버"] NFSD["nfsd
/etc/exports
TCP·UDP 2049"] SMBD["smbd · nmbd
/etc/samba/smb.conf
TCP 445"] STORE[("/data
공유 디렉터리")] NFSD --> STORE SMBD --> STORE end LNX -->|NFSv4| NFSD WIN -->|SMB3| SMBD LNX -.크로스 클라이언트.-> SMBD

NFS — 서버 설정 예

sudo dnf install nfs-utils
mkdir /var/nfs && chmod 777 /var/nfs

# /etc/exports
/var/nfs   192.168.6.0/24(rw,sync,no_root_squash)

systemctl enable --now nfs-server
exportfs -rav                              # 재로드·조회
firewall-cmd --permanent --add-service=nfs
firewall-cmd --reload

# 클라이언트
sudo dnf install nfs-utils
sudo mount -t nfs 192.168.6.3:/var/nfs /mnt/nfs
# fstab: 192.168.6.3:/var/nfs  /mnt/nfs  nfs  defaults,_netdev  0  0

NFS 마운트 옵션

옵션동작
fg (기본)첫 마운트 실패 시 즉시 중단
bg백그라운드에서 재시도
hard타임아웃에도 무한 재시도 (데이터 일관성 최우선)
soft타임아웃 시 오류 반환 (부팅 진행 보장)
_netdev네트워크가 올라온 후 마운트 (부팅 멈춤 예방)

Samba — Windows 공유

sudo dnf install samba samba-client cifs-utils

# /etc/samba/smb.conf
# [global]
#   workgroup = WORKGROUP
#   hosts allow = 192.168.6.
# [share]
#   path = /var/samba
#   public = yes
#   writable = yes

mkdir /var/samba && chmod 777 /var/samba
smbpasswd -a chany                        # 삼바 사용자 등록
systemctl enable --now smb nmb
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload

# 리눅스에서 윈도우 공유 마운트
smbclient -L //192.168.3.101 -U chany     # 공유 목록
mount -t cifs //192.168.3.101/share /mnt/smb \
      -o username=chany,password=...,uid=1000,gid=1000

🕸️ HTTP / 웹서버

웹서버는 클라이언트 요청에 HTML·이미지 등 리소스를 HTTP 프로토콜로 응답한다. 기본 포트 TCP 80, HTTPS는 TCP 443.

대표 웹서버

프로그램특징
Apache (httpd)모듈 풍부·.htaccess·프로세스/스레드 모델
Nginx이벤트 기반·고동시성 리버스 프록시 기본
IISWindows 전용·ASP.NET 통합

URI · URL · URN

  • URI: 리소스를 식별하는 문자열의 상위 개념 (URL + URN)
  • URL: 프로토콜+위치를 포함한 접근 주소 — https://host/path
  • URN: 위치 무관 이름 — urn:isbn:0-395-36341-1

Apache 빠른 기동 (Rocky)

sudo dnf install httpd
sudo systemctl enable --now httpd
firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --reload
echo "<h1>Hello</h1>" | sudo tee /var/www/html/index.html
curl http://localhost/

🕹️ 실습 터미널

브라우저에서 돌아가는 시뮬레이터는 별도의 실습 페이지로 분리했습니다. Docker · Linux · Cisco IOS · Kubernetes 를 탭으로 전환하며 연습하세요.

→ Linux 실습 쉘 열기

🎯 핵심 정리 — 시험/면접 포인트

  1. 쉘 설정 파일: 로그인(.bash_profile·PATH) vs 인터랙티브(.bashrc·alias). 시스템 전역은 /etc/profile·/etc/bashrc.
  2. export하지 않은 변수는 자식 프로세스에 전달되지 않는다.
  3. SSH 키 퍼미션: ~/.ssh=700, authorized_keys=644, id_rsa=600. 너무 열면 sshd가 거부.
  4. systemd 기본 target: CLI 서버는 multi-user.target (=runlevel 3), GUI는 graphical.target (=5).
  5. useradd 우선순위: /etc/login.defs > /etc/default/useradd. 최소 UID 1000.
  6. umask: root 0022 → 파일 644·디렉토리 755. 값이 클수록 보안 ↑.
  7. 특수비트: SUID 4000(passwd) · SGID 2000(공유디렉토리 그룹상속) · Sticky 1000(/tmp).
  8. SIGHUP(1)설정 재로드, SIGKILL(9)무시 불가 강제종료, SIGTERM(15)정상종료 요청(기본).
  9. systemctl reload는 PID 유지하며 설정만 재적용. restart는 PID가 바뀐다.
  10. at/cron 제어: allow와 deny 동시 존재 시 allow가 우선.
  11. fstab 편집 후 mount -a로 반드시 검증 — 오타 시 재부팅 실패.
  12. LVM 3계층: PV(디스크) → VG(풀) → LV(볼륨). lvextend + resize2fs/xfs_growfs로 무중단 확장.
  13. RAID 레벨: 0=속도 · 1=미러 · 5=1개 장애 허용 · 6=2개 허용 · 10=고성능 HA. RAID는 백업이 아니다.
  14. 쿼터 Soft vs Hard: Soft는 grace 기간 동안 초과 허용, Hard는 즉시 차단.
  15. tar 옵션: c묶기·x풀기·zgzip·jbzip2·Jxz. f는 항상 마지막.
  16. NFS vs Samba: Linux↔Linux는 NFS(2049) · Windows 끼면 Samba(445).
  17. FTP Passive가 기본 — 방화벽·NAT 환경에서 Active는 데이터 세션이 막힌다.
  18. tee로 sudo 리다이렉트: echo ... | sudo tee -a /etc/... (쉘이 먼저 리다이렉트를 평가해 sudo 효과가 무력화되는 문제 회피).
  19. firewalld --permanent로 저장 후 --reload, 아니면 재부팅 시 설정 소실.
  20. URI ⊃ URL + URN — URL은 위치 기반, URN은 이름 기반 식별자.