Linux 디스크 관리 및 시스템 서비스 학습 가이드

학습 개요

본 학습 가이드는 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

7월 10일 21:04에 게시됨