1. 문제 상황
EC2 인스턴스에서 Python 패키지를 설치하려고 할 때, 다음과 같은 오류가 발생했다.
ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device
용량이 없다고 하길래 df -h 명령어로 스토리지를 확인해 봤다.
이렇게 /dev/root에 용량이 거의 다 찬 거를 확인했다. 근데 이전에 우리는 250GB 인스턴스를 받은 게 분명한데 이렇게 용량이 없다는 게 말이 안 됐다.
그래서 lsblk 명령어로 확인해 보니 /dev/nvme1n1에 여분 스토리지가 많이 남은 걸 확인했다.
인스턴스 자체는 250GB SSD를 갖고 있지만 현재 /dev/root는 7.6GB로 설정되어 있다. 패키지 설치는 주로 스토리지에 저장되지만, 설치 과정에서 임시 파일을 루트 디렉터리에 저장하는 경우가 많다. 그래서 루트 디렉토리 공간이 부족하면 설치 실패가 뜬것 같다.
2. 문제 해결 - 볼륨 마운트
일단 남아있는 nvme1n1 볼륨을 마운트 해서 사용하면 해결될 것 같다.
1. nvme1n1 디스크를 마운트
먼저, nvme1n1이 포맷되어 있는지 확인해 보자.
sudo file -s /dev/nvme1n1
이 출력 결과로 data라고 나왔다. 이건 포맷되지 않은 상태라 새로운 파일 시스템이 필요하다는 뜻이다.
💡 만약, ext4 filesystem 또는 xfs filesystem이라면 이미 포맷된 상태라 바로 마운트가 가능하다는 뜻이다.
2. nvme1n1 포맷 및 마운트
nvme1n1이 포맷되지 않았던 상황이라 ext4 파일 시스템으로 포맷해 주자.
sudo mkfs -t ext4 /dev/nvme1n1
# 마운트 할 디렉토리 생성
sudo mkdir -p /mnt/data
# nvme1n1을 /mnt/data에 마운트
sudo mount /dev/nvme1n1 /mnt/data
이러면 /mnt/datadptj 232.8GB의 추가 공간을 사용할 수 있게 된다!.
df -h 명령어로 확인해 보면 잘 마운트 됐다.
이제 궁극적으로 문제 원인이었던 패키지 설치 위치를 /dev/nvme1n1로 옮겨주는 작업을 해주자.
3. 문제 해결 - 권한 문제
export TMPDIR=/mnt/data
pip install --cache-dir=/mnt/data/tmp -r requirements.txt
이렇게 작성하고 실행하니 다음과 같은 에러가 떴다.
WARNING: The directory '/mnt/data/tmp' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
이건 현재 /mnt/data/tmp 디렉터리에 소유권이 현재 사용자에게 없어서 pip 캐시를 사용할 수 없다는 경고가 발생한 거다.
그럼 /mnt/data/tmp 디렉터리 권한을 변경해 주자!
우선 /mnt/data/tmp 디렉터리가 존재하는지 확인한다.
ls -ld /mnt/data/tmp
이렇게 쳤을 때 아래와 같이 나오면 디렉터리가 존재하는 것이다.
drwxr-xr-x 2 root root 4096 Nov 18 12:00 /mnt/data/tmp
💡 만약에 디렉터리가 존재하지 않는다면 생성해줘야 한다.
아까 위에서 sudo로 디렉터리를 만들었기 때문에 /mnt/data 디렉터리가 root 소유일 가능성이 놓다. 그래서 현재 로그인한 사용자가 ubuntu라면, ubuntu 계정으로 소유권을 변경해 주자.
sudo mkdir -p /mnt/data/tmp
# 현재 로그인한 사용자를 해당 폴더의 소유자로 변경
sudo chown -R $(whoami):$(whoami) /mnt/data/tmp
이렇게 해주고 일반 사용자가 /mnt/data/tmp를 자유롭게 사용할 수 있도록 권한을 조정해 준다.
sudo chmod -R 777 /mnt/data/tmp
이렇게 해주면 모든 사용자에게 읽기/쓰기/실행 권한을 부여해 준다.
❓ 디렉터리 소유주 변경과 권한 변경이 꼭 필요한 이유는 뭘까??
/mnt/data/tmp 디렉터리의 소유주를 변경하고 권한을 수정한 것은 필수적인 작업이었다.
이유는 다음과 같다:
1. PIP 캐시 디렉터리가 비어 있거나 접근 불가하면, PIP는 기본적으로 /tmp 사용
기본적으로 pip는 패키지를 설치할 때 /tmp 경로에 임시로 파일을 저장한다. 하지만 /mnt/data/tmp를 사용하도록 설정했는데 해당 디렉토리가 root 소유권을 가지고 있거나 권한이 부족하면 pip가 캐시를 비활성화하면서 다시 루트 디렉터리를 사용하려고 시도한다. → No space left on device 발생.
2. 권한 문제 해결
/mnt/data/tmp 디렉토리를 일반 사용자(예: ubuntu)가 접근할 수 있도록 변경해야 pip가 정상적으로 캐시를 사용 가능하다.
- sudo chown -R $(whoami):$(whoami) /mnt/data/tmp
- sudo chmod -R 777 /mnt/data/tmp
위 과정이 없으면 pip가 /mnt/data/tmp을 쓰려고 해도 Permission Denied 오류가 발생하거나 다시 /tmp를 사용하려 시도할 수 있다.
이제 다시 패키지를 설치해 보자.
export TMPDIR=/mnt/data
pip install --cache-dir=/mnt/data/tmp -r requirements.txt
이렇게 해줘도 계속 no space left on device 에러가 뜬다,,,,,,,
3. 문제 해결 - 패키지 다운 경로 수정
일단 위 명령어가 통하지 않았다는 뜻이니 다른 방법으로 진행해 보자.
/mnt/data를 pip의 기본 경로로 설정해 주자
echo 'export PIP_TARGET=/mnt/data/packages' >> ~/.bashrc
echo 'export PIP_CACHE_DIR=/mnt/data/tmp' >> ~/.bashrc
echo 'export PATH=/mnt/data/packages/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
- PIP_TARGET: pip가 설치한 패키지를 저장하는 기본 경로를 변경 → /mnt/data/packages로 설정
- PIP_CACHE_DIR: pip가 다운로드한 패키지를 저장하는 기본 캐시 경로 변경 → /mnt/data/tmp
- PATH: 새롭게 설정한 패키지 경로에서 실행 파일을 찾을 수 있도록 환경 변수 추가
이렇게 하면 패키지가 기본 루트 디렉터리가 아닌 /mnt/data 경로에 설치되도록 강제된다. 결국 루트 디렉터리의 용량 부족 문제를 해결할 수 있었다~~
이렇게 해주니 성공적으로 설치가 완료되었다.
추가적으로 더 해줘야 하는 것들
현재 sudo mount /dev/nvme1n1 /mnt/data 명령어를 사용했는데 이건 인스턴스 재부팅하면 해제가 된다. 그래서 /etc/fstab에 마운트 설정을 추가하는 방법도 함께 하면 더 좋을 것 같다. 이렇게 마운트 설정을 영구적으로 유지하는 방법도 있다.
echo "/dev/nvme1n1 /mnt/data ext4 defaults,nofail 0 2" | sudo tee -a /etc/fstab
'ETC' 카테고리의 다른 글
[GIT] rebase, rebase squash (0) | 2024.08.09 |
---|---|
[GIT] 기본 개념 및 명령어 (0) | 2024.08.07 |
이메일 프로토콜 이해하기: SMTP, POP, IMAP의 기능과 설정 (2) | 2024.01.21 |
Mac M1에서 iTerm2 꾸미기 - 테마 변경, syntax highlighting 적용 (0) | 2023.12.04 |