🐧 리눅스 시스템 관리
💿 설치 & 부팅
설치 방식 3종
| 방식 | 장점 | 한계 |
|---|---|---|
| WSL (Windows) | 윈도우 통합·가볍다 | 커널 공유, 1대만 운용 |
| VirtualBox / VMware | VM 다수 동시 기동·네트워크 토폴로지 실습 | 리소스 소비 |
| 베어메탈 | 성능·생산 서버 | 초기 구성 비용 |
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
.이 없으므로 ./shell.sh처럼 상대경로를 명시해야 실행됨 (보안상 의도된 기본값).
🔐 SSH 키 인증
패스워드보다 안전하고 자동화(CI/CD·앤서블)에 필수. 개인키는 절대 서버에 올리지 않는다.
~/.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 파일 퍼미션 규정
| 대상 | 퍼미션 | 이유 |
|---|---|---|
~/.ssh | 700 | 소유자만 접근 |
authorized_keys | 644 | 소유자 쓰기 + 읽기만 |
개인키 id_rsa | 600 | 느슨하면 SSH가 거부 |
authorized_keys에서 해당 공개키 줄 삭제.
🎯 Runlevel · systemd target
systemd는 전통 SysV의 runlevel을 target으로 대체했다.
| Runlevel | systemd target | 용도 |
|---|---|---|
| 0 | poweroff.target | 종료 |
| 1 | rescue.target | 단일 사용자 복구 |
| 3 | multi-user.target | CLI 서버 |
| 5 | graphical.target | GUI 로그인 |
| 6 | reboot.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/useradd | useradd 기본값 (useradd -D로 조회·수정) |
/etc/login.defs | useradd보다 우선 적용. 최소 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
| 비트 | 숫자 | 의미 | 예시 |
|---|---|---|---|
| SetUID | 4000 | 실행 시 파일 소유자 권한으로 동작 | /usr/bin/passwd |
| SetGID | 2000 | 실행 시 그룹 권한 / 디렉토리는 하위 파일의 그룹 상속 | 공유 디렉토리 |
| Sticky | 1000 | 디렉토리 내 파일은 소유자만 삭제 가능 | /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
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 # 작업 제어
주요 시그널
| 번호 | 이름 | 동작 | 트랩 가능 |
|---|---|---|---|
| 1 | SIGHUP | 재로드 (설정 파일 재읽기) | ✅ |
| 2 | SIGINT | Ctrl+C 인터럽트 | ✅ |
| 9 | SIGKILL | 강제 종료 | ❌ 무시 불가 |
| 15 | SIGTERM | 정상 종료 요청 (기본) | ✅ |
| 19 | SIGSTOP | 일시 정지 | ❌ |
| 18 | SIGCONT | 재개 | ✅ |
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-reload | unit 파일 변경 반영 |
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단계
- 파티션 생성 —
fdisk /dev/sdb(대용량·GPT는parted/gdisk) - 파일시스템 생성 —
mkfs -t ext4 /dev/sdb1/mkfs.xfs /dev/sdb2 - 마운트 포인트 생성 —
mkdir /mnt/data - 마운트 —
mount /dev/sdb1 /mnt/data(리부팅 시 해제됨) - 영구 등록 —
/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
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단 구조.
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 (축소 불가)
mdadm --stop /dev/md0 → mdadm --zero-superblock /dev/sdX1 후 pvcreate 재시도.
🗃️ RAID — mdadm 소프트웨어 RAID
여러 디스크를 하나의 논리 장치로 묶어 성능·가용성을 확보. Linux에서는 mdadm으로 소프트RAID를 구성한다.
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)
데이터를 블록 단위로 분할 병렬 기록. 디스크 1개라도 죽으면 전체 데이터 소실.
RAID 1 (Mirror)
동일 데이터를 2개 이상 디스크에 동시에 기록. 읽기 병렬로 성능 ↑.
RAID 5 (Stripe + Parity)
패리티를 분산 저장. 디스크 1개 장애 시 복구 가능. 쓰기 시 패리티 계산 오버헤드.
RAID 6 (Double Parity)
패리티를 이중으로 보관. 대용량 어레이에서 재구축 중 2차 장애 대비.
RAID 10 (1+0, Stripe of Mirrors)
미러 페어를 스트라이프. 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
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 — 초과 불가, 즉시 쓰기 거부
- XFS는
quotacheck불필요 —xfs_quota전용 툴 사용
📦 tar · 압축
tar 옵션 조합
| 옵션 | 의미 |
|---|---|
c | create (묶기) |
x | extract (풀기) |
t | list (내용만 조회) |
v | verbose |
f | 파일명 지정 (항상 마지막) |
z / j / J | gzip / 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 # 내용 조회
압축 명령 비교
| 압축 | 해제 | 확장자 | 특징 |
|---|---|---|---|
| gzip | gunzip | .gz | 빠름·범용 |
| bzip2 | bunzip2 | .bz2 | 중간 속도·높은 압축률 |
| xz | unxz | .xz | 최고 압축률·느림 |
| zip | unzip | .zip | Windows 호환·파일명 필수 |
📥 패키지 관리
고수준 — 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)
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
🕸️ HTTP / 웹서버
웹서버는 클라이언트 요청에 HTML·이미지 등 리소스를 HTTP 프로토콜로 응답한다. 기본 포트 TCP 80, HTTPS는 TCP 443.
대표 웹서버
| 프로그램 | 특징 |
|---|---|
| Apache (httpd) | 모듈 풍부·.htaccess·프로세스/스레드 모델 |
| Nginx | 이벤트 기반·고동시성 리버스 프록시 기본 |
| IIS | Windows 전용·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 를 탭으로 전환하며 연습하세요.
🎯 핵심 정리 — 시험/면접 포인트
- 쉘 설정 파일: 로그인(
.bash_profile·PATH) vs 인터랙티브(.bashrc·alias). 시스템 전역은/etc/profile·/etc/bashrc. - export하지 않은 변수는 자식 프로세스에 전달되지 않는다.
- SSH 키 퍼미션:
~/.ssh=700,authorized_keys=644,id_rsa=600. 너무 열면 sshd가 거부. - systemd 기본 target: CLI 서버는
multi-user.target(=runlevel 3), GUI는graphical.target(=5). - useradd 우선순위:
/etc/login.defs>/etc/default/useradd. 최소 UID 1000. - umask: root 0022 → 파일 644·디렉토리 755. 값이 클수록 보안 ↑.
- 특수비트: SUID 4000(passwd) · SGID 2000(공유디렉토리 그룹상속) · Sticky 1000(/tmp).
- SIGHUP(1)은 설정 재로드, SIGKILL(9)은 무시 불가 강제종료, SIGTERM(15)은 정상종료 요청(기본).
- systemctl reload는 PID 유지하며 설정만 재적용. restart는 PID가 바뀐다.
- at/cron 제어: allow와 deny 동시 존재 시 allow가 우선.
- fstab 편집 후
mount -a로 반드시 검증 — 오타 시 재부팅 실패. - LVM 3계층: PV(디스크) → VG(풀) → LV(볼륨).
lvextend + resize2fs/xfs_growfs로 무중단 확장. - RAID 레벨: 0=속도 · 1=미러 · 5=1개 장애 허용 · 6=2개 허용 · 10=고성능 HA. RAID는 백업이 아니다.
- 쿼터 Soft vs Hard: Soft는 grace 기간 동안 초과 허용, Hard는 즉시 차단.
- tar 옵션:
c묶기·x풀기·zgzip·jbzip2·Jxz.f는 항상 마지막. - NFS vs Samba: Linux↔Linux는 NFS(2049) · Windows 끼면 Samba(445).
- FTP Passive가 기본 — 방화벽·NAT 환경에서 Active는 데이터 세션이 막힌다.
- tee로 sudo 리다이렉트:
echo ... | sudo tee -a /etc/...(쉘이 먼저 리다이렉트를 평가해 sudo 효과가 무력화되는 문제 회피). - firewalld --permanent로 저장 후
--reload, 아니면 재부팅 시 설정 소실. - URI ⊃ URL + URN — URL은 위치 기반, URN은 이름 기반 식별자.