학습 개요
본 학습 가이드는 Linux 환경에서 디스크 관리, 서비스 실행, 스케줄링 작업을 다루는 핵심 기술을 다룹니다. 5일간의 체계적인 학습을 통해 실전에서 즉시 활용 가능한 기술력을 확보할 수 있습니다.
학습 기간: 5일
1일차: 디스크 파티셔닝과 파일시스템 기초
1.1 파티션 도구 활용
Linux에서 디스크 파티션은 시스템 설치 후 용량 변경이나 다중 드라이브 구성 시 필수적인 작업입니다. 먼저 기본 명령어를 살펴보겠습니다.
# 블록 디바이스 확인
lsblk
# 디스크 전체 정보 조회
sudo fdisk -l
# GPT 파티션 테이블 확인
sudo parted -l
1.2 fdisk를 활용한 MBR 파티션 생성
传统的 MBR 방식을 사용해야 하는 경우 fdisk 유틸리티가 적합합니다. 실습을 위해 가상 디스크 이미지를 생성하고 진행합니다.
# 가상 디스크 이미지 생성 (2GB)
sudo fallocate -l 2G /tmp/vdisk1.img
# 루프백 디바이스 연결
sudo losetup -fP /tmp/vdisk1.img
DEVICE=$(sudo losetup -l | grep vdisk1.img | awk '{print $1}')
# fdisk 실행
sudo fdisk $DEVICE
# 주요 명령어:
# m - 도움말 표시
# p - 현재 파티션 현황
# n - 새 파티션 생성
# d - 파티션 삭제
# t - 파티션 타입 변경
# w - 저장 후 종료
# q - 저장 없이 종료
연습 문제: 주 파티션 512MB, 확장 파티션 512MB, 논리 파티션 1GB를 생성해보세요.
1.3 parted를 활용한 GPT 파티션 생성
대용량 디스크(2TB 이상)를 사용하거나 UEFI 시스템에서는 GPT 파티션 테이블이 필요합니다.
# 3GB GPT 디스크 이미지 생성
sudo fallocate -l 3G /tmp/vdisk2.img
sudo losetup -fP /tmp/vdisk2.img
DEVICE2=$(sudo losetup -l | grep vdisk2.img | awk '{print $1}')
# interactive 모드로 parted 실행
sudo parted $DEVICE2
# 주요 명령어:
# mklabel gpt # GPT 테이블 생성
# mkpart primary ext4 0% 1GB # 첫 번째 주 파티션
# mkpart primary ext4 1GB 2GB # 두 번째 파티션
# mkpart primary ext4 2GB 100% # 세 번째 파티션
# print # 파티션 현황 확인
# rm 1 # 첫 번째 파티션 삭제
# quit # 종료
비대화형 명령어로 실행하려면 다음 방법을 사용합니다:
# 스크립트 기반 파티션 생성
sudo parted $DEVICE2 mklabel gpt
sudo parted $DEVICE2 mkpart primary ext4 0% 1GB
sudo parted $DEVICE2 mkpart primary ext4 1GB 2GB
sudo parted $DEVICE2 mkpart primary ext4 2GB 100%
sudo parted $DEVICE2 print
2일차: 파일시스템 생성 및 마운트 관리
2.1 다양한 파일시스템 생성
Linux는 다양한 파일시스템을 지원합니다. 대표적인 파일시스템을 실습해봅니다.
# 파일시스템 생성
sudo mkfs.ext4 ${DEVICE2}p1 # ext4 파일시스템
sudo mkfs.xfs ${DEVICE2}p2 # XFS 파일시스템
sudo mkfs.btrfs ${DEVICE2}p3 # Btrfs 파일시스템
# 파일시스템 정보 확인
sudo blkid ${DEVICE2}p1
sudo file -s ${DEVICE2}p1
2.2 마운트 작업 수행
# 마운트 포인트 생성
sudo mkdir -p /mnt/storage{1,2,3}
# 개별 마운트 실행
sudo mount ${DEVICE2}p1 /mnt/storage1
sudo mount ${DEVICE2}p2 /mnt/storage2
sudo mount -o compress=zstd ${DEVICE2}p3 /mnt/storage3
# 마운트 옵션 설명:
# rw/ro - 읽기쓰기/읽기전용
# noatime - 접근시간 업데이트 비활성화
# nodiratime - 디렉토리 접근시간 업데이트 비활성화
# defaults - 기본 옵션(rw,suid,dev,exec,auto,nouser,async)
2.3 자동 마운트 설정
시스템 부팅 시 자동으로 마운트되도록 /etc/fstab 파일을 편집합니다.
# fstab 백업
sudo cp /etc/fstab /etc/fstab.backup
# UUID 확인
sudo blkid ${DEVICE2}p1
# fstab 편집
sudo vim /etc/fstab
# 다음 형식으로 추가:
# UUID=xxxxxx /mnt/storage1 ext4 defaults 0 2
# UUID=xxxxxx /mnt/storage2 xfs defaults 0 2
# UUID=xxxxxx /mnt/storage3 btrfs defaults,compress=zstd 0 2
# 설정 검증
sudo mount -a
sudo mount | grep /mnt/storage
2.4 마운트 해제 및 문제 해결
# 기본 마운트 해제
sudo umount /mnt/storage1
# 지연 마운트 해제 (사용 중일 때)
sudo umount -l /mnt/storage2
# 강제 마운트 해제
sudo umount -f /mnt/storage3
# 디바이스 사용 중 오류 해결
sudo fuser -m /mnt/storage1 # 점유 프로세스 확인
sudo lsof /mnt/storage1 # 열린 파일 확인
sudo fuser -km /mnt/storage1 # 점유 프로세스 강제 종료
3일차: 디스크 모니터링 및 부팅 시 자동 실행
3.1 디스크 사용량 분석
# df 명령어 활용
df -h # 사람이 읽기 쉬운 형식
df -i # inode 사용량 확인
df -Th # 파일시스템 타입 표시
df --output=source,target,size,used,avail,pcent # 출력 필드 선택
df -x tmpfs -x devtmpfs # 특정 파일시스템 제외
# du 명령어 활용
du -sh /var/log # 디렉토리 총 크기
du -h --max-depth=1 /home # 1단계 하위 디렉토리 크기
du -ah /etc | sort -rh | head -20 # 가장 큰 20개 파일
du -csh * # 현재 디렉토리 합계
3.2 ncdu 활용
ncdu는 curses 기반의 대화형 디스크 사용량 분석 도구입니다.
# 설치
sudo apt install ncdu
# 사용 예시
ncdu /var/log # 디렉토리 스캔
ncdu -x / # 파일시스템 경계 제한
ncdu -o /tmp/result.txt /home # 결과 파일로 내보내기
3.3 systemd 기반 서비스 관리
# 서비스 목록 조회
systemctl list-units --type=service --all
systemctl list-unit-files --type=service | grep enabled
# 서비스 상태 제어
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
sudo systemctl status nginx
sudo systemctl is-active nginx
sudo systemctl is-enabled nginx
# 부팅 시 자동 실행 설정
sudo systemctl enable nginx
sudo systemctl disable nginx
sudo systemctl mask nginx # 모든 시작 방법 차단
sudo systemctl unmask nginx # 차단 해제
# 서비스 의존성 확인
systemctl list-dependencies nginx
systemctl list-dependencies nginx --reverse
4일차: systemd 고급 기능 및 스케줄링
4.1 사용자 정의 서비스 생성
백업 서비스를 systemd로 구현하는 방법을 알아봅니다.
# 서비스 스크립트 작성
cat > /usr/local/bin/daily-backup.sh << 'EOF'
#!/bin/bash
BACKUP_TARGET="/var/backup"
SOURCE_PATH="/home/$USER/documents"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_TARGET
tar -czf $BACKUP_TARGET/backup_$TIMESTAMP.tar.gz $SOURCE_PATH 2>/dev/null
# 7일 이상 된 백업 파일 삭제
find $BACKUP_TARGET -name "backup_*.tar.gz" -mtime +7 -delete
logger -t "daily-backup" "Backup finished at $(date)"
EOF
sudo chmod +x /usr/local/bin/daily-backup.sh
서비스 정의 파일 생성:
sudo vim /etc/systemd/system/backup.service
[Unit]
Description=Scheduled Backup Service
After=network.target
Requires=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/daily-backup.sh
User=root
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
타이머 생성:
sudo vim /etc/systemd/system/backup.timer
[Unit]
Description=Execute backup task daily
[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=3600
[Install]
WantedBy=timers.target
타이머 활성화:
sudo systemctl daemon-reload
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
# 타이머 목록 확인
systemctl list-timers --all
4.2 cronie 활용
전통적인 cron 방식을 활용한 스케줄링도 매우 유용합니다.
# 사용자 크론 작업 관리
crontab -e # 편집
crontab -l # 목록 확인
crontab -r # 전체 삭제
# 시스템 크론
sudo vim /etc/crontab
sudo vim /etc/cron.d/app-task
# 크론 디렉토리 구조
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/
크론 표현식 연습:
# 테스트 스크립트
cat > /tmp/check-cron.sh << 'EOF'
#!/bin/bash
echo "Execution time: $(date)" >> /tmp/cron-test.log
EOF
chmod +x /tmp/check-cron.sh
# 다양한 스케줄 설정
(crontab -l 2>/dev/null; echo "*/5 * * * * /tmp/check-cron.sh") | crontab -
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/bin/updatedb") | crontab -
(crontab -l 2>/dev/null; echo "0 0 * * 0 /sbin/shutdown -r now") | crontab -
5일차: 종합 실습 및 문제 해결
5.1 모니터링 시스템 구축
이제까지 배운 내용을 종합하여 실제 환경에서 사용할 수 있는 모니터링 시스템을 구축합니다.
# 프로젝트 디렉토리 구성
mkdir -p ~/ops-project/{scripts,logs,config}
cd ~/ops-project
# 디스크 모니터링 스크립트
cat > scripts/disk-monitor.sh << 'EOF'
#!/bin/bash
ALERT_THRESHOLD=80
LOG_OUTPUT="$HOME/ops-project/logs/disk-monitor.log"
df -h | grep -E '^/dev/' | while read line; do
usage_pct=$(echo $line | awk '{print $5}' | sed 's/%//')
mount_point=$(echo $line | awk '{print $6}')
if [ $usage_pct -ge $ALERT_THRESHOLD ]; then
message="$(date): ALERT - $mount_point usage: $usage_pct%"
echo "$message" >> $LOG_OUTPUT
logger -t "disk-monitor" "$message"
fi
done
echo "$(date): Monitoring check finished" >> $LOG_OUTPUT
EOF
chmod +x scripts/disk-monitor.sh
systemd 서비스 및 타이머 정의:
# 서비스 파일
cat > config/disk-monitor.service << 'EOF'
[Unit]
Description=Disk Usage Monitoring Service
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash $HOME/ops-project/scripts/disk-monitor.sh
User=$USER
[Install]
WantedBy=multi-user.target
EOF
# 타이머 파일
cat > config/disk-monitor.timer << 'EOF'
[Unit]
Description=Disk monitoring every 10 minutes
[Timer]
OnBootSec=5min
OnUnitActiveSec=10min
Unit=disk-monitor.service
[Install]
WantedBy=timers.target
EOF
# 배포
sudo cp config/disk-monitor.service /etc/systemd/system/
sudo cp config/disk-monitor.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable disk-monitor.timer
sudo systemctl start disk-monitor.timer
정리 스크립트:
cat > scripts/cleanup.sh << 'EOF'
#!/bin/bash
# 임시 파일 정리
find /tmp -type f -mtime +7 -delete
find /var/tmp -type f -mtime +30 -delete
# 오래된 로그 파일 정리
find /var/log -name "*.log" -type f -mtime +30 -delete
find $HOME/ops-project/logs -name "*.log" -type f -mtime +7 -delete
# 패키지 캐시 정리
sudo apt-get autoremove -y
sudo apt-get autoclean -y
echo "$(date): Cleanup finished" >> $HOME/ops-project/logs/cleanup.log
EOF
chmod +x scripts/cleanup.sh
크론 설정:
cat > config/maintenance-cron << 'EOF'
# 시스템 정리 (매일凌晨 4시)
0 4 * * * /bin/bash $HOME/ops-project/scripts/cleanup.sh
# 일일 백업 (매일凌晨 2시)
0 2 * * * /bin/bash $HOME/ops-project/scripts/daily-backup.sh
# 주간 서비스 재시작 (매주 월요일凌晨 3시)
0 3 * * 1 /usr/bin/systemctl restart nginx
EOF
crontab config/maintenance-cron
5.2 문제 해결 시나리오
# 시나리오 1: 디스크 공간 고갈
# 테스트 파일 생성
dd if=/dev/zero of=/mnt/storage1/heavyfile bs=1M count=1024
# 확인 및 정리
df -h /mnt/storage1
sudo rm /mnt/storage1/heavyfile
# 시나리오 2: 서비스 장애
# 서비스 중지 및 상태 확인
sudo systemctl stop disk-monitor.timer
systemctl list-timers --all | grep disk-monitor
sudo journalctl -u disk-monitor.service --since today
# 시나리오 3: 크론 문제排查
# 크론 로그 확인
sudo grep CRON /var/log/syslog | tail -20
# 스크립트 직접 실행 테스트
bash -x $HOME/ops-project/scripts/disk-monitor.sh
# 시나리오 4: 마운트 실패
# 마운트 해제 후 오류 상황 재현
sudo umount /mnt/storage1
sudo mount /dev/nonexistent /mnt/storage1 2>&1
# 시스템 로그 확인
sudo dmesg | tail -20
sudo journalctl -xe
핵심 기술 체크리스트
디스크 관리:
- fdisk로 MBR 파티션 생성 가능
- parted로 GPT 파티션 생성 가능
- mkfs로 ext4/XFS/Btrfs 파일시스템 생성 가능
- mount/umount 명령熟练 사용
- /etc/fstab으로 자동 마운트 설정 가능
- df/du/lsblk/ncdu로 모니터링 가능
서비스 관리:
- systemctl 기본 명령어 숙지
- 부팅 시 자동 실행 설정 가능
- 사용자 정의 systemd 서비스 작성 가능
- journalctl로 로그 분석 가능
- 서비스 의존성 파악 가능
스케줄링:
- 크론 표현식 작성 가능
- 사용자/시스템 크론 설정 가능
- systemd timer 구현 가능
- 타스크 실행 상태 모니터링 가능
- at 명령 활용 가능
실무 활용 팁
디스크 관리 팁
# UUID 활용 (장치명보다 안정적)
sudo blkid
# LVM 활용 (확장성)
sudo pvcreate /dev/sdb1
sudo vgcreate volume-group /dev/sdb1
sudo lvcreate -L 10G -n logical-volume volume-group
# 성능 테스트
sudo hdparm -Tt /dev/sda
sudo dd if=/dev/zero of=/tmp/test bs=1M count=1024
서비스 관리 팁
# 의존성 확인
systemctl list-dependencies nginx.service --reverse
# 병렬起動 최적화
sudo systemctl edit nginx.service
# After=network-online.target 추가
# 리소스 제한
# 서비스 파일에 추가:
# LimitNOFILE=65535
# LimitNPROC=65535
스케줄링 팁
# 중복 실행 방지 (flock 활용)
*/5 * * * * /usr/bin/flock -n /tmp/task.lock /path/to/script.sh
# 실행 시간 로깅
*/5 * * * * /usr/bin/time -p /path/to/script.sh >> /var/log/execution.log 2>&1
# 이메일 알림
MAILTO="admin@example.com"
0 2 * * * /path/to/backup.sh