디스크 관리는 창고 관리와 같습니다
컴퓨터의 디스크는 창고와 비슷합니다. 파일은 물건이고, 디렉터리는 선반이며, 파일 시스템은 선반을 어떤 규칙으로 정리할지 정한 방식입니다. 창고가 가득 차면 새 물건을 넣을 수 없듯이, 디스크가 가득 차면 로그가 기록되지 않고 패키지 설치가 실패하며 서비스가 멈출 수 있습니다.
Linux에서는 디스크 문제를 해결할 때 먼저 세 가지를 구분해야 합니다.
디스크 장치: 실제 저장 장치입니다. 예:
/dev/sda,/dev/nvme0n1파티션: 디스크를 나눈 구역입니다. 예:
/dev/sda1,/dev/nvme0n1p2마운트 지점: 파티션을 파일 시스템 어딘가에 연결한 위치입니다. 예:
/,/home,/mnt/usb
초보자가 자주 헷갈리는 부분은 디스크가 곧바로 폴더처럼 보이지 않는다는 점입니다. Linux에서는 저장 장치를 특정 디렉터리에 연결해야 그 안의 파일을 읽고 쓸 수 있습니다. 이 연결 작업을 마운트라고 합니다.
AI 생성 이미지
전체 디스크 공간 확인하기: df
시스템 전체의 남은 공간을 볼 때는 df를 사용합니다. df는 disk free의 줄임말로, 마운트된 파일 시스템별 사용량을 보여 줍니다.
df -h-h는 사람이 읽기 쉬운 단위로 출력하라는 뜻입니다. 예를 들어 G, M 같은 단위로 표시됩니다.
더 자세히 파일 시스템 종류까지 보고 싶다면 다음처럼 실행합니다.
df -hT출력은 대략 다음 구조입니다.
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 ext4 50G 31G 17G 65% /
/dev/sda3 ext4 200G 120G 70G 64% /home여기서 중요한 열은 Use%와 Mounted on입니다. Use%가 90%를 넘으면 정리가 필요합니다. Mounted on은 그 공간이 파일 시스템의 어느 위치에 연결되어 있는지 알려 줍니다. /home이 가득 찼다면 사용자의 파일이 원인일 가능성이 크고, /var가 가득 찼다면 로그나 캐시, 데이터베이스 파일을 의심할 수 있습니다.
df를 볼 때는 단순히 전체 디스크가 몇 퍼센트인지보다 어느 마운트 지점이 가득 찼는지를 먼저 확인해야 합니다.
어느 디렉터리가 큰지 찾기: du
df가 창고 전체의 남은 공간을 보여 준다면, du는 특정 선반이나 상자 하나가 얼마나 큰지 보여 줍니다. du는 disk usage의 줄임말입니다.
현재 디렉터리 안의 항목별 용량을 보려면 다음처럼 실행합니다.
cd ~/linux-practice
du -sh *옵션의 의미는 다음과 같습니다.
-s: 하위 항목을 길게 펼치지 않고 합계만 표시합니다.-h: 사람이 읽기 쉬운 단위로 표시합니다.
숨김 파일과 숨김 디렉터리까지 포함해 현재 디렉터리 전체 크기를 보려면 다음 명령을 사용합니다.
du -sh .시스템에서 큰 디렉터리를 찾을 때는 범위를 좁혀야 합니다. 예를 들어 /var 아래에서 1단계 디렉터리별 크기를 보려면 다음처럼 실행합니다.
sudo du -h --max-depth=1 /var--max-depth=1은 한 단계 아래까지만 합계를 보겠다는 뜻입니다. 처음부터 / 전체에 대해 du를 실행하면 시간이 오래 걸리고 권한 오류가 많이 나올 수 있습니다. 먼저 df -h로 가득 찬 마운트 지점을 찾고, 그 위치에서 du로 큰 디렉터리를 좁히는 순서가 안전합니다.
디스크와 파티션 구조 보기: lsblk와 blkid
디스크가 어떻게 나뉘어 있고 어디에 연결되었는지 보려면 lsblk를 사용합니다.
lsblk조금 더 보기 좋게 파일 시스템 종류와 마운트 위치까지 확인하려면 다음처럼 실행합니다.
lsblk -f예시는 다음과 비슷합니다.
NAME FSTYPE LABEL UUID MOUNTPOINTS
sda
├─sda1 vfat 1111-2222 /boot/efi
└─sda2 ext4 aaaa-bbbb-cccc-dddd /
sdb
└─sdb1 ext4 BACKUP 9999-8888 여기서 /dev/sdb1에 MOUNTPOINTS가 비어 있다면, 파티션은 있지만 아직 파일 시스템 어딘가에 연결되지 않은 상태입니다.
blkid는 블록 장치의 UUID와 파일 시스템 종류를 확인할 때 사용합니다.
sudo blkidUUID는 장치의 고유 이름표에 가깝습니다. /dev/sdb1 같은 장치 이름은 부팅 순서나 연결 순서에 따라 바뀔 수 있지만, UUID는 보통 그대로 유지됩니다. 그래서 영구 마운트 설정에서는 장치 이름보다 UUID를 자주 사용합니다.
외부 저장 장치 연결하기: mount
USB 메모리나 외장 디스크를 연결했다고 해서 항상 자동으로 사용할 수 있는 것은 아닙니다. 서버 환경에서는 직접 마운트해야 하는 경우가 많습니다.
먼저 장치를 확인합니다.
lsblk -f예를 들어 새 장치가 /dev/sdb1이고 파일 시스템이 ext4라고 가정하겠습니다. 마운트할 디렉터리를 만듭니다.
sudo mkdir -p /mnt/backup그다음 장치를 디렉터리에 연결합니다.
sudo mount /dev/sdb1 /mnt/backup연결이 되었는지 확인합니다.
df -hT /mnt/backup
ls /mnt/backup여기서 중요한 점은 /mnt/backup 디렉터리 자체가 저장 장치가 아니라는 것입니다. 이 디렉터리는 저장 장치를 붙이는 입구 역할을 합니다. 마운트된 상태에서는 /mnt/backup 안에 쓰는 파일이 실제로 /dev/sdb1 장치에 저장됩니다.
작업이 끝나면 반드시 해제합니다.
sudo umount /mnt/backup명령은 unmount가 아니라 umount입니다. 해제 전에 해당 위치를 사용 중인 터미널이나 프로그램이 있으면 실패할 수 있습니다. 예를 들어 현재 위치가 /mnt/backup인 터미널에서는 해제할 수 없습니다.
cd ~
sudo umount /mnt/backup마운트 해제 없이 USB를 뽑으면 아직 디스크에 기록되지 않은 데이터가 손상될 수 있습니다. 특히 복사 직후에는 반드시 umount가 성공했는지 확인한 뒤 분리합니다.
압축과 아카이브의 차이
백업을 만들 때 자주 나오는 도구가 tar, gzip, zip입니다. 여기서 먼저 구분해야 할 말이 있습니다.
아카이브: 여러 파일과 디렉터리를 하나의 파일로 묶는 것
압축: 파일 크기를 줄이는 것
tar는 원래 여러 파일을 하나로 묶는 도구입니다. 압축은 gzip, xz, zstd 같은 다른 방식과 함께 사용합니다. 그래서 .tar는 묶음 파일이고, .tar.gz는 묶은 뒤 gzip으로 압축한 파일입니다.
~/linux-practice 안에서 간단한 백업 대상을 만들어 보겠습니다.
mkdir -p ~/linux-practice/backup-demo/docs
printf 'hello linuxn' > ~/linux-practice/backup-demo/docs/readme.txt디렉터리를 .tar.gz 파일로 묶고 압축합니다.
cd ~/linux-practice
tar -czvf backup-demo.tar.gz backup-demo/옵션의 의미는 다음과 같습니다.
-c: 새 아카이브를 만듭니다.-z: gzip 압축을 사용합니다.-v: 처리 중인 파일을 화면에 보여 줍니다.-f: 결과 파일 이름을 지정합니다.
압축 파일 안에 무엇이 들어 있는지 풀기 전에 확인할 수 있습니다.
tar -tzvf backup-demo.tar.gz압축을 풀 때는 다음처럼 실행합니다.
mkdir -p restored
tar -xzvf backup-demo.tar.gz -C restored/-C restored/는 압축을 현재 위치가 아니라 restored/ 디렉터리 안에 풀라는 뜻입니다. 압축 파일을 풀기 전에는 항상 목록을 먼저 확인하는 습관이 좋습니다. 압축 파일 안에 절대 경로나 예상 밖의 파일 이름이 들어 있으면 현재 작업 디렉터리를 어지럽힐 수 있습니다.
zip과 unzip 사용하기
Windows나 macOS 사용자와 파일을 주고받을 때는 .zip이 편합니다. Linux에서도 zip과 unzip을 사용할 수 있습니다.
Ubuntu/Debian 계열에서 설치:
sudo apt update
sudo apt install zip unzipFedora/RHEL 계열:
sudo dnf install zip unzipArch 계열:
sudo pacman -S zip unzip디렉터리를 zip 파일로 만들려면 -r 옵션을 사용합니다.
cd ~/linux-practice
zip -r backup-demo.zip backup-demo/내용을 확인합니다.
unzip -l backup-demo.zip압축을 풉니다.
mkdir -p zip-restored
unzip backup-demo.zip -d zip-restored/tar.gz는 Linux 서버 백업에서 자주 쓰이고, zip은 다른 운영체제와 파일을 교환할 때 편합니다. 둘 중 하나만 외우기보다 어떤 상황에서 쓰는지 구분하면 됩니다.
변경된 파일만 동기화하기: rsync
매번 전체 디렉터리를 새로 복사하면 시간이 오래 걸리고 디스크도 낭비됩니다. rsync는 변경된 파일만 골라 복사하는 도구입니다. 백업과 서버 간 동기화에 매우 자주 쓰입니다.
설치가 필요하다면 다음 명령을 사용합니다.
Ubuntu/Debian 계열:
sudo apt install rsyncFedora/RHEL 계열:
sudo dnf install rsyncArch 계열:
sudo pacman -S rsync로컬 백업 예시는 다음과 같습니다.
mkdir -p ~/linux-practice/rsync-backup
rsync -avh ~/linux-practice/backup-demo/ ~/linux-practice/rsync-backup/옵션의 의미는 다음과 같습니다.
-a: 아카이브 모드입니다. 권한, 시간, 디렉터리 구조 등을 최대한 보존합니다.-v: 복사 과정을 보여 줍니다.-h: 용량을 읽기 쉬운 단위로 표시합니다.
여기서 경로 끝의 /가 중요합니다.
rsync -avh source/ target/이렇게 쓰면 source 디렉터리 안의 내용이 target으로 복사됩니다.
rsync -avh source target/이렇게 쓰면 target/source 디렉터리가 만들어질 수 있습니다. rsync를 사용할 때는 명령 실행 전 원본과 대상을 말로 읽어 보세요. 특히 --delete 옵션은 대상에만 있는 파일을 지우므로 조심해야 합니다.
삭제까지 동기화해야 할 때는 먼저 모의 실행을 합니다.
rsync -avh --delete --dry-run ~/linux-practice/backup-demo/ ~/linux-practice/rsync-backup/--dry-run은 실제 변경 없이 무엇을 할지 보여 줍니다. 출력이 예상과 맞을 때만 --dry-run을 빼고 실행합니다.
원격 서버로 백업할 때는 SSH 경로를 사용할 수 있습니다.
rsync -avh ~/linux-practice/backup-demo/ [email protected]:/home/user/backup-demo/원격 백업은 네트워크와 권한, SSH 접속 설정이 함께 필요합니다. 먼저 ssh user@example.com으로 접속되는지 확인한 뒤 rsync를 실행하는 것이 좋습니다.
지웠는데 공간이 안 돌아올 때: lsof
가끔 큰 로그 파일을 삭제했는데도 df -h의 사용량이 줄지 않는 일이 있습니다. 이유는 간단합니다. 어떤 프로세스가 그 파일을 아직 열고 있으면, 디렉터리 목록에서는 사라졌어도 디스크 공간은 완전히 반환되지 않을 수 있습니다.
이 상황은 식당에서 메뉴판은 치웠지만 손님이 아직 접시를 들고 있는 것과 비슷합니다. 파일 이름은 사라졌지만, 프로세스가 파일 손잡이를 놓지 않은 상태입니다.
이때는 lsof로 삭제되었지만 아직 열려 있는 파일을 찾습니다.
설치가 필요하다면 다음과 같이 설치합니다.
sudo apt install lsofFedora/RHEL 계열:
sudo dnf install lsofArch 계열:
sudo pacman -S lsof목적이 "삭제되었지만 아직 열린 파일"을 찾는 것이라면 다음 명령이 유용합니다.
sudo lsof +L1+L1은 링크 수가 1보다 작은 파일, 즉 일반적으로 디렉터리 이름이 사라졌지만 프로세스가 아직 열고 있는 파일을 찾을 때 자주 사용합니다. 환경에 따라 다음처럼 deleted 표시를 검색하는 방식도 볼 수 있습니다.
sudo lsof | grep deleted출력에서 큰 파일을 열고 있는 프로세스의 PID와 명령 이름을 확인합니다. 해결 방법은 무조건 kill -9가 아닙니다. 먼저 해당 프로그램이 로그 파일을 다시 열도록 재시작할 수 있는 서비스인지 확인합니다.
예를 들어 특정 서비스가 원인이라면 다음 흐름으로 접근합니다.
systemctl status 서비스이름
sudo systemctl restart 서비스이름재시작 후 다시 확인합니다.
df -h
sudo lsof +L1서비스 재시작은 접속 중인 사용자나 실행 중인 작업에 영향을 줄 수 있습니다. 운영 서버에서는 어떤 서비스인지, 재시작해도 되는 시간인지 확인한 뒤 진행해야 합니다.
실습 과제
다음 실습은 ~/linux-practice 안에서 진행합니다.
현재 시스템의 마운트 상태를 확인합니다.
df -hT
lsblk -f실습용 디렉터리를 만들고 파일을 생성합니다.
mkdir -p ~/linux-practice/disk-lab/data
printf 'backup testn' > ~/linux-practice/disk-lab/data/a.txt
printf 'linux storagen' > ~/linux-practice/disk-lab/data/b.txt디렉터리 용량을 확인합니다.
du -sh ~/linux-practice/disk-labtar.gz백업을 만들고 목록을 확인합니다.
cd ~/linux-practice
tar -czvf disk-lab.tar.gz disk-lab/
tar -tzvf disk-lab.tar.gzrsync로 다른 디렉터리에 동기화합니다.
mkdir -p ~/linux-practice/disk-lab-copy
rsync -avh ~/linux-practice/disk-lab/ ~/linux-practice/disk-lab-copy/마지막으로 원본과 대상의 파일 목록을 비교합니다.
find ~/linux-practice/disk-lab -type f
find ~/linux-practice/disk-lab-copy -type f문제 해결 시나리오: 서버의 디스크가 95% 찼다
운영 중인 서버에서 디스크 사용량 경고가 왔다고 가정하겠습니다. 당황해서 큰 파일을 바로 지우기보다 다음 순서로 확인합니다.
먼저 어느 마운트 지점이 찼는지 봅니다.
df -hT/var가 가득 찼다면 한 단계씩 좁힙니다.
sudo du -h --max-depth=1 /var
sudo du -h --max-depth=1 /var/log큰 로그 파일을 찾았더라도 바로 삭제하지 않습니다. 어떤 서비스의 로그인지 확인하고, 로그 순환 설정이나 서비스 상태를 함께 봅니다. 이미 삭제했는데 공간이 줄지 않았다면 다음 명령으로 열린 삭제 파일을 확인합니다.
sudo lsof +L1프로세스가 파일을 계속 잡고 있다면 해당 서비스를 안전하게 재시작할 수 있는지 판단합니다. 디스크 문제 해결의 핵심은 빠른 삭제가 아니라 어디가 찼는지, 무엇이 차지하는지, 지워도 되는지, 지운 뒤 공간이 반환되었는지를 순서대로 확인하는 것입니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.