존재하다이 문제설치 명령의 최종 대상에 대한 패키지를 찾는 동안 발생한 문제를 설명했습니다 /usr/bin/rename
. dpkg -S /usr/bin/rename
결과는 나오지 않았지만 처음에 그것이 링크라는 것을 발견한 후 일반적인 해결책을 찾았습니다.
/usr/bin/rename
그것이 /etc/alternatives/rename
나에게 방법을 알려 주기 때문에이것특정 링크는 admin 에 의해 관리됩니다 update-alternatives
.
이 지식이 없으면 어떤 패키지가 실제로 심볼릭 링크를 설치하는지 어떻게 알 수 있나요? 이를 수행하는 간단한 명령이 없는 경우 어떤 명령이 심볼릭 링크를 설정하는지 알아내는 일반적인 전략은 무엇입니까?
답변1
dpkg -S
심볼릭 링크는 패키지에서 추출된 파일만 보기 때문에 어떤 패키지가 설치되었는지 알 수 있는 방법이 없습니다. 이 정보는 의 설명서 *.list
에서 /var/lib/dpkg/info/*.list
.
Debian 시스템의 각 파일은 하나의 패키지에서만 소유할 수 있습니다. 설치하려는 패키지에 다른 패키지에서 이미 제공한 파일이 포함되어 있는 경우 다음 중 하나가 발생합니다.
dpkg
두 번째 패키지 설치가 거부됩니다.dpkg
두 번째 패키지가 설치되기 전에 첫 번째 패키지가 제거됩니다(두 번째 패키지가Breaks
첫 번째 패키지와 OR 관계를 지정하는 경우).Conflicts
dpkg
두 번째 패키지를 설치하기 전에 더 이상 파일을 제공하지 않는 최신 버전으로 첫 번째 패키지를 업그레이드하십시오(두 번째 패키지가 /Conflicts
및 첫 번째 패키지Breaks
와의 관계를 지정하는 경우).Replaces
dpkg
두 번째 패키지는 첫 번째 패키지와 함께 설치되며, 두 번째 패키지에서 제공하는 파일로 이를 덮어씁니다(두 번째 패키지가Replaces
첫 번째 패키지에 대한 관계를 지정하는 경우).
분명히 이것은 실제로 여러 패키지에 동일한 명령이 주어지고 동시에 설치되는 것을 허용하지 않습니다.alternatives
데비안 시스템이러한 패키지는 파일에 대해 다른 이름을 제공합니다. 예를 들면 다음과 같습니다.
host ~ # dpkg -S /usr/bin/prename
perl: /usr/bin/prename
패키지 postinst
스크립트( /var/lib/dpkg/info/perl.postinst
)는 이를 대안으로 등록합니다.
# util-linux has an alternate rename
update-alternatives --install /usr/bin/rename rename /usr/bin/prename 60 \
--slave /usr/share/man/man1/rename.1.gz rename.1.gz \
/usr/share/man/man1/prename.1.gz
dpkg -S
그렇기 때문에 알려지지 않았습니다 /usr/bin/rename
.
이 지식이 없으면 어떤 패키지가 실제로 심볼릭 링크를 설치하는지 어떻게 알 수 있습니까?
데비안 패키지할 수 있는심볼릭 링크를 제공하므로 심볼릭 링크(또는 다른 이유로 생성된 심볼릭 링크)가 아닌 한 alternatives
정상적으로 작동합니다.postinst
dpkg -S
시스템의 경우 alternatives
심볼릭 링크 경로를 따르십시오.
host ~ # dpkg -S $(readlink -f /usr/bin/rename)
perl: /usr/bin/prename
물론 이는 잘못된 결론으로 이어질 수 있습니다. 예를 들어 패키지가 postinst
다른 파일에서 제공하는 파일에 대한 심볼릭 링크를 생성하는 경우입니다. 이 경우 책임이 있는 패키지를 알아낼 수 있는 일반적인 방법은 없습니다. 파일에 grep
핑을 보내는 등 몇 가지 검색 작업을 수행해야 합니다.*.postinst