패키지가 반쯤 깨져 dnf remove 가 실패하거나, chmod -R 을 잘못 걸어 시스템 파일 권한이 뒤집힌 상황을 되돌릴 때 쓰는 rpm 의 저수준 기능이다. 정상 경로로 해결되지 않을 때만 쓴다.
sudo dnf remove PACKAGE
sudo dnf reinstall PACKAGE
sudo dnf distro-sync PACKAGE
RPM 데이터베이스가 손상돼 실패한다면 먼저 데이터베이스를 손본다.
sudo rpm --rebuilddb
sudo dnf clean all
# 의존성 검사 없이 제거
sudo rpm -e --nodeps PACKAGE
# 삭제 스크립트까지 건너뛴다. 스크립트가 실패해 제거가 막힐 때
sudo rpm -e --noscripts --nodeps PACKAGE
# 어떤 일이 벌어지는지 먼저 본다
sudo rpm -e --test -vv PACKAGE
같은 이름의 패키지가 여러 버전 설치돼 있으면 전체 이름으로 지정한다.
rpm -qa | grep PACKAGE
sudo rpm -e PACKAGE-1.2.3-4.el9.x86_64
--nodeps 는 그 패키지를 필요로 하는 다른 패키지를 그대로 둔 채 지운다. glibc, systemd, python3 같은 기반 패키지에 쓰면 시스템이 부팅하지 못하는 상태가 된다. rpm -q --whatrequires 로 무엇이 매달려 있는지 먼저 본다.
rpm -q --whatrequires PACKAGE
--noscripts 로 지우면 설정 파일 정리, 서비스 중지, 사용자 삭제 같은 뒷정리가 실행되지 않는다. 남은 흔적은 직접 확인한다.
rpm -ql PACKAGE # 삭제 전에 파일 목록을 받아 둔다
파일은 남기고 RPM 데이터베이스의 등록만 없애야 하는 경우가 있다. 같은 소프트웨어를 소스로 다시 설치하면서 패키지 흔적만 없앨 때다.
sudo rpm -e --justdb --nodeps PACKAGE
chmod · chown 을 잘못 걸었을 때 패키지가 정의한 원래 값으로 되돌린다.
# 특정 패키지
sudo rpm --setperms PACKAGE
sudo rpm --setugids PACKAGE
# 무엇이 달라졌는지 먼저 본다
rpm -V PACKAGE
rpm -V 출력의 각 문자는 차례로 S(크기), M(모드), 5(체크섬), D(장치), L(링크), U(소유자), G(그룹), T(시각), P(capabilities) 가 달라졌음을 뜻한다. M 이나 U·G 만 보인다면 권한 복원으로 해결된다.
전체 패키지에 적용한다.
sudo rpm -qa | while read -r pkg; do
sudo rpm --setperms "$pkg"
sudo rpm --setugids "$pkg"
done
--setugids 는 주의가 필요하다. 관리자가 의도적으로 바꾼 소유자까지 되돌린다. 보통은 --setperms 만으로 충분하다.
rpm --setperms 는 패키지에 속한 파일만 다룬다. /etc 아래의 설정 파일 중 패키지 소유가 아닌 것, 사용자 홈 디렉터리, 데이터 디렉터리는 복원되지 않는다.
권한과 별개로 SELinux 레이블이 어긋났다면 따로 복원한다.
# 무엇이 다른지 확인
sudo restorecon -Rvn /etc
# 실제 적용
sudo restorecon -Rv /etc
전체를 다시 라벨링해야 한다면 재부팅이 필요하다.
sudo touch /.autorelabel
sudo reboot
파일 수에 따라 오래 걸리며 그동안 서비스가 올라오지 않는다.