저는 다음 Linux 배포판을 실행하고 있습니다.
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
들어가서 aptitude
보니 내가 설치한 1,425개의 패키지가 더 이상 사용되지 않기 때문에 모두 제거된다는 메시지가 표시됩니다. 내가 생각할 수 있었던 것은 내가 실수로 잘못된 키를 눌렀을 수도 있다는 것뿐이었습니다 aptitude
.
이 문제를 올바르게 해결하려면 어떻게 해야 합니까?
미리 감사드립니다.
폴리스티렌: 내 /etc/sources.list
파일과 /etc/sources.list.d
디렉터리가 변경되지 않았습니다.
폴리페닐렌 설파이드: 이제 나는 이것이 나에게 전체 패키지가 아니라 단지 절반에 불과하다는 것을 깨달았습니다. 그러나 일반적으로 표준 Linux 패키지입니다.
구매력 평가: aptitude keep-all
실행시 오류 메시지는 생성되지 않지만 문제가 해결되지는 않습니다. 그러나 GUI로 이동하여 aptitude
패키지에서 더하기 기호( )를 클릭하면 +
"다음 패키지를 현재 버전으로 유지"를 선택할 수 있는 "검사" 대화 상자로 이동합니다. 해당 옵션을 선택하면 패키지가 더 이상 제거 대상으로 표시되지 않습니다. 그러나 패키지가 1,400개가 넘으므로 모든 패키지에 수동으로 태그를 지정하고 이 대화 상자를 탐색하려면 시간이 오래 걸립니다. 하나의 명령으로 이러한 모든 패키지에 대해 이러한 일이 발생하도록 하는 방법이 있습니까?
답변1
dpkg 데이터베이스(in /var/lib/dpkg/status
) 스토리지고의로패키지 상태가 같은 줄에 있습니다.현재의설명된 상태dpkg(1)
. 따라서 설치된 패키지에는 다음 예와 유사한 항목이 있습니다.
# dpkg -s hello| egrep '^(Package|Status|Architecture):'
Package: hello
Status: install ok installed
Architecture: amd64
도구를 사용하여 삭제 의도를 설정하면 다음과 같이 표시됩니다.
# dpkg -s hello| egrep '^(Package|Status|Architecture):'
Package: hello
Status: deinstall ok installed
Architecture: amd64
대신 패키지를 삭제해야 합니다 purge
.deinstall
선택한 다른 패키지 또는 전체 패키지 그룹에 대한 변경 사항을 트리거하는 중요한 패키지를 선택(제거용)할 수 있습니다.
이를 수행할 수 있는 도구에는 고대 dselect
, aptitude
하위 수준 dpkg --set-selections
또는apt-mark
. 후자는 사용하기 쉽지만 여전히 변경된 내용을 확인하는 데 사용할 수 없으며(위와 deinstall
비교 되지 않으므로 installed
) 한 번에 하나의 작업만 수행할 수 있으므로 여러 개를 복구할 때 매우 느립니다. 타임스. dpkg --set-selections
한 번의 호출로 이 작업을 수행할 수 있으므로 선호됩니다.
다중 아키텍처를 사용하면 모든 것이 조금 더 복잡해지며 Architecture
두 아키텍처에 두 번 설치된 패키지를 구별하기 위해 값을 검색해야 합니다. 스키마는 all
실제 스키마가 없는 패키지에도 작동합니다.
cancel-changes.awk
다음은 현재 상태와 호환되는 인텐트를 설정하는 스크립트 입니다 : to fit dpkg --set-selections
.
#!/usr/bin/awk -f
/^Package:/ { package=$2; newintent="none" }
/^Status: (purge|deinstall) ok installed$/ { newintent="install" }
/^Status: install ok config-files$/ { newintent="deinstall" }
/^Status: install ok not-installed$/ { newintent="purge" }
/^Architecture:/ { package=package ":" $2 }
/^$/ && newintent != "none" { print package, newintent }
실제로 스크립트를 제공하기 전에 스크립트의 출력을 확인해야 합니다 dpkg --set-selections
. Debian(및 Ubuntu)의 향후 버전에서는 내부 형식이 변경될 수 있습니다.
이것은 피해자 패키지를 테스트하기 위한 Debian 10의 사용 예입니다 hello
.
# apt-get install hello
[...]
# apt-mark remove hello
Selected hello for removal.
# dpkg -l hello
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-==================================
ri hello 2.10-2 amd64 example package based on GNU hello
# cancel-changes.awk < /var/lib/dpkg/status
hello:amd64 install
# cancel-changes.awk < /var/lib/dpkg/status | dpkg --set-selections
# dpkg -l hello
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-==================================
ii hello 2.10-2 amd64 example package based on GNU hello
답변2
좋아요 문제를 해결할 수 있었지만 그것이 실제 해결책인지 아니면 더 깊고 근본적인 문제를 덮는 "반창고"인지는 알 수 없습니다. 이게 내가 한 일이야...
apt install
먼저 삭제 표시된 패키지 중 하나를 사용하여 작업을 시도했습니다 . 성공했고 출력의 각 줄에 여러 패키지가 포함된 나머지 1,400개 이상의 패키지 목록을 제공했습니다.
패키지 목록을 파일에 복사하고 각 줄 앞에 접두사를 붙인 apt install
다음 셸을 통해 실행했습니다.
그러면 이러한 모든 패키지가 "자동"에서 "수동"으로 변환됩니다.
그런 다음 실행했는데 aptitude keep-all
이제 모든 패키지가 더 이상 "사용되지 않음"으로 표시되지 않습니다.
이렇게 해서 다행이지만 처음에 이 문제가 어떻게 발생했는지 여전히 혼란스럽습니다. 앞서 언급한 것처럼 내 시스템에 수정 apt
해야 할 또 다른 보다 근본적인 문제가 있는지는 알 수 없습니다 .aptitude