Posts Ubuntu 서버 운영하면서 반복해서 만난 문제들
Post
Cancel

Ubuntu 서버 운영하면서 반복해서 만난 문제들

매번 검색하게 되는 것들

학습 서버를 몇 대 운영하다 보면 같은 문제를 주기적으로 다시 만난다. 그때마다 검색하는 게 싫어서 정리해 둔 것들이다.

apt lock이 걸렸을 때

1
E: Could not get lock /var/lib/dpkg/lock-frontend

대부분은 백그라운드에서 unattended-upgrades가 돌고 있는 것이다. 바로 락 파일을 지우는 해법이 많이 보이는데, 진짜로 다른 프로세스가 패키지를 설치 중이면 dpkg 데이터베이스가 깨진다. 먼저 확인부터 한다.

1
2
sudo lsof /var/lib/dpkg/lock-frontend
ps aux | grep -E 'apt|dpkg' | grep -v grep

정상 프로세스면 끝날 때까지 기다린다. 대개 1~2분이다. 프로세스가 정말로 없는데 락만 남아 있으면 그때 정리한다.

1
2
sudo rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock /var/lib/apt/lists/lock
sudo dpkg --configure -a

dpkg --configure -a를 같이 하는 게 중요하다. 락이 남았다는 건 설치가 중간에 끊겼다는 뜻이고, 그 상태에서 다음 설치를 하면 의존성이 꼬인다.

캐시 메모리가 다 찼을 때

free -h에서 available이 아니라 free만 보고 “메모리가 없다”고 판단하기 쉽다. buff/cache는 필요하면 커널이 알아서 회수하므로 대개 문제가 아니다. 그래도 학습 전에 정리하고 싶으면:

1
2
sync
echo 3 | sudo tee /proc/sys/vm/drop_caches

sync를 먼저 해야 한다. 안 그러면 아직 디스크에 안 쓴 더티 페이지가 버려질 수 있다. 그리고 이건 성능을 올리는 조치가 아니라 측정을 위한 조치다. 캐시를 비우면 다음 데이터 로딩은 오히려 느려진다. 데이터 로딩 속도를 공정하게 재려고 할 때만 쓴다.

NFS 마운트

학습 데이터를 한 곳에 두고 여러 노드에서 읽을 때 쓴다.

서버 쪽:

1
2
3
sudo apt install -y nfs-kernel-server
echo "/export/dataset 172.16.10.0/24(ro,sync,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -ra

클라이언트 쪽:

1
2
sudo apt install -y nfs-common
sudo mount -t nfs 172.16.10.90:/export/dataset /mnt/dataset

부팅 시 자동 마운트는 /etc/fstab에 넣되 옵션을 꼭 확인한다.

1
172.16.10.90:/export/dataset  /mnt/dataset  nfs  ro,soft,timeo=100,retrans=3,_netdev  0 0

soft_netdev가 중요하다. 기본값인 hard로 두면 NFS 서버가 죽었을 때 클라이언트의 I/O가 무한 대기에 빠지고, 그 프로세스는 kill -9로도 안 죽는다. 학습 데이터처럼 읽기 전용이면 soft로 두고 실패를 오류로 받는 편이 낫다. _netdev가 없으면 네트워크가 올라오기 전에 마운트를 시도해서 부팅이 타임아웃까지 멈춘다.

큰 디스크에서 작은 디스크로 복제

dd로 통째로 뜨는 방법은 대상 디스크가 더 클 때만 된다. 줄여서 옮겨야 하면 파티션을 먼저 줄이고 파일시스템 단위로 복사한다.

1
2
3
4
5
6
7
# 1) 원본 파일시스템 점검 후 축소
sudo e2fsck -f /dev/sda1
sudo resize2fs /dev/sda1 200G

# 2) 파티션 테이블 조정 (parted/fdisk)
# 3) 파일 단위 복사 — 속성·하드링크·희소파일 보존
sudo rsync -aAXH --info=progress2 /mnt/src/ /mnt/dst/

rsync-aAXH가 핵심이다. -A는 ACL, -X는 확장 속성, -H는 하드링크다. 이걸 빼고 복사하면 겉보기에는 멀쩡한데 도커 이미지 레이어나 conda 환경처럼 하드링크를 많이 쓰는 디렉터리가 용량이 몇 배로 불어난다.

복사 후에는 UUID가 바뀌므로 /etc/fstab과 부트로더 설정을 갱신해야 한다.

1
sudo blkid

이걸 빼먹으면 부팅이 initramfs 프롬프트에서 멈춘다.

SSH 공개키 등록

1
2
ssh-keygen -t ed25519 -C "dnchoi@workstation"
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@172.16.10.100

ssh-copy-id가 안 되는 환경(비밀번호 로그인 차단 등)에서는 직접 붙인다.

1
cat ~/.ssh/id_ed25519.pub | ssh user@host 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'

권한이 틀리면 키가 있어도 무시된다. 그리고 로그에는 “Authentication failed”만 남아서 권한 문제라는 것이 안 드러난다. 서버 쪽 /var/log/auth.log를 보면 bad ownership or modes 라고 정확히 나온다.

WSL2에서 0x800701bc

1
Error: 0x800701bc WSL 2 requires an update to its kernel component

WSL2 커널이 안 깔렸거나 오래된 것이다. 마이크로소프트가 배포하는 커널 업데이트 패키지를 설치하고 기본 버전을 2로 지정한다.

1
2
3
wsl --update
wsl --set-default-version 2
wsl --shutdown

wsl --shutdown을 빼면 이미 떠 있는 배포판이 옛 커널을 계속 쓴다. GPU 패스스루를 쓰는 경우 특히 이 단계에서 걸린다.

요약

여기 모아둔 것들의 공통점이 하나 있다. 증상 메시지가 원인을 가리키지 않는다. 락 오류는 백그라운드 업데이트를, 인증 실패는 파일 권한을, 부팅 정지는 UUID 불일치를 가리킨다. 그래서 메시지를 그대로 검색하기 전에 “직전에 무엇이 바뀌었나”를 먼저 떠올리는 편이 대체로 빠르다.

This post is licensed under CC BY 4.0 by the author.