매번 검색하게 되는 것들
학습 서버를 몇 대 운영하다 보면 같은 문제를 주기적으로 다시 만난다. 그때마다 검색하는 게 싫어서 정리해 둔 것들이다.
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 불일치를 가리킨다. 그래서 메시지를 그대로 검색하기 전에 “직전에 무엇이 바뀌었나”를 먼저 떠올리는 편이 대체로 빠르다.