![하나의 Fedora 인스턴스에서 다른 인스턴스로 설치된 패키지 선택을 어떻게 복사합니까?](https://linux55.com/image/33888/%ED%95%98%EB%82%98%EC%9D%98%20Fedora%20%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%97%90%EC%84%9C%20%EB%8B%A4%EB%A5%B8%20%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EB%A1%9C%20%EC%84%A4%EC%B9%98%EB%90%9C%20%ED%8C%A8%ED%82%A4%EC%A7%80%20%EC%84%A0%ED%83%9D%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%B3%B5%EC%82%AC%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
나는 일부 패키지를 설치한 Fedora 시스템(A)을 가지고 있습니다. 이제 다른 컴퓨터(B)에 Fedora를 설치하고 그 컴퓨터에 동일한 패키지를 설치하려고 합니다.
데비안 용어로 다음과 같은 작업을 수행하고 싶습니다.
$ dpkg --get-selections > pkg_sel_host_a # on host_a
$ dpkg --set-selections < pkg_sel_host_a # on host_b
하지만 솔직히 말해서 저는 새로운 Fedora 19 시스템에서 동일한 패키지(B)를 선택하는 더 나은 방법을 원합니다. 명령줄 패키지에 명시적으로 언급된 dnf install
(또는 설치하고 싶습니다. yum install
종속성으로 설치된 것!
왜? 종속성이 변경되었을 수 있으므로 새 시스템에 오래된 종속성을 설치하고 싶지 않습니다. 또한 패키지를 제거할 때 필요하지 않은 자동으로 설치된 종속성(예: 고아)도 제거하고 싶습니다.
찾았 dnf list installed
지만 패키지가 명시적으로 선택되었는지 또는 종속성으로 인해 방금 설치되었는지는 표시되지 않습니다.
Fedora에서 이 정보를 어떻게 얻을 수 있나요?
Fedora/dnf의 패키지 선택 복사 방법은 무엇입니까?
답변1
Fedora 26부터 DNFrepoquery
하위 명령 지원사용자가 설치한 모든 패키지를 나열하는 새로운 옵션이 있습니다:
$ dnf repoquery --qf '%{name}' --userinstalled \
| grep -v -- '-debuginfo$' \
| grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst
다른 방법과 비교하여 모든 debuginfo 패키지도 나열합니다. 위 예의 추가 grep은 이를 필터링합니다.
호스트 B에 목록을 설치하려면 다음을 수행하십시오.
$ < pkgs_a.lst xargs dnf -y install
던전 API
최신 Dnf 버전(예: Fedora >= 23)의 경우 Dnf Python API를 통해 패키지 데이터베이스를 쿼리하여 사용자가 설치한 패키지 이름을 얻을 수 있습니다.
$ python3 -c 'import dnf; b = dnf.Base(); b.fill_sack(); \
l = sorted(set(x.name for x in b.iter_userinstalled() \
if not x.name.endswith("-debuginfo") \
and x.name not in \
["kernel-modules", "kernel", "kernel-core", "kernel-devel"] )); \
print("\n".join(l)) ' > pkgs_a.lst
# dnf install $(cat pkgs_a.lst) # on host_b
기본적으로 dnf install
하나 이상의 패키지를 더 이상 사용할 수 없으면 중단합니다. 아니면,dnf강제로 할 수 있다나머지를 모두 설치합니다.
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
첨부된:위의 코드 등을user-installed.py
다른 배포판도 지원합니다.
과거 사용자 설치
Fedora 23 이상에서 Dnf는 다음을 제공합니다.
# dnf history userinstalled
사용자가 설치한 모든 패키지를 나열하는 명령입니다. 2016년 11월 현재,제한된 유용성출력을 제어할 수 있는 방법이 없고 완전한 패키지(예: 버전 정보 포함)를 인쇄하기 때문입니다.
사용자 설치 제한
패키지를 사용자 설치로 표시하는 것은 특정 Fedora 버전에 몇 가지 제한 사항이 있습니다. Fedora 23 시대(2015년 11월경부터 시작) 시스템의 경우 다음 질문이 관련됩니다.
- 설치된 패키지GUI를 통해 포함되지 않음
- 설치된 패키지전달 명령을 찾을 수 없음 처리기가 포함되어 있지 않습니다.
- 기본적으로 설치되는 일부 소프트웨어 패키지(anaconda에서 제공)포함됨
다시 찾아봐
이전 Fedora 시스템에서는 Dnf, Dnf API를 dnf history userinstalled
사용할 수 없습니다.다시 찾아봐대신 예를 들면 다음과 같습니다.
$ repoquery --installed \
--qf '%{n} | %{yumdb_info.reason} | %{yumdb_info.installed_by}' --all \
| awk -F'|' ' $2 ~ /user/ && ($3 != 4294967295) { print $1 }' \
| sort -u > pkgs_a.lst
두 번째 awk 조건은 설치 프로그램이 설치한 패키지를 제외하는 데 사용됩니다. 설치 프로그램의 사용자 ID는 분명히 4294967295로 저장되어 있습니다. 또는 이와 같이 작성할 수도 있습니다 ($3 == 0 || $3 == your-user-id)
.
이 명령은 버전 21 이전의 Fedora에서는 작동하지만 버전 23에서는 작동하지 않습니다. 예를 들어 명령이 repoquery
및 로 바뀌었기 때문입니다 dnf repoquery
.dnf repoquery
라벨을 이해하지 못합니다 %{yumdb_info.reason}
.
답변2
가장 간단하고 효과적인 방법은 다음과 같습니다.
yum-debug-dump => gives file.
yum-debug-restore <file-from-debug-dump>
...get/set select dpkg 명령 AIUI와 매우 유사하게 작동합니다. 또한 기록을 재생하려면 다음을 사용할 수 있습니다.
yum history addon-info last saved_tx => gives file
yum load-tx <file-from-addon-info>
...직접 구문 분석할 필요 없이 말이죠.
답변3
에서 영감을 받다지속 가능한 개발 관리~의답변yum history
나는 다음을 기반으로 다음 솔루션을 생각해 냈습니다 .
초기 설치 프로그램 작업의 일부로 수행된 트랜잭션(내 시스템의 트랜잭션 1 및 2, 사용자 "system"에 귀속됨)을 제외하고 모든 yum 설치 트랜잭션(즉, 업그레이드 없음)에 대한 모든 세부 기록을 가져옵니다.
$ yum history list all | awk -F'|' \
'$4 ~ /Install/ && $2 !~ /System/ {print $1}' \
| xargs yum history info > yum_history
명시적으로 설치된 패키지를 필터링하고 버전 접두사를 잘라냅니다.
$ < yum_history grep '[^-]\<Install\>' | \
awk '{ print $2 }' \
| sed 's/\(-[0-9]\+:\|-[0-9]\+\.[0-9]\|-[0-9]\+-\|-[0-9]\+git\).\+\(\.fc1[1-7]\.\|\.noarch\).*$//' \
| sort > hist_pkg_list
다양한 버전 접미사와 일치하는 추악한 정규식이 필요합니다.
결과는 내 시스템에서 꽤 좋아 보입니다.
그리고다시 찾아봐ansatz(내 시스템에서):
메소드#패키지 ――――――――――――――――――――――――――――― 쿼리 569 레포쿼리-2차 216 냠 역사 214
(sort -u를 통해 repoquery 결과를 파이프합니다)
왜 차이가 있나요? repoquery에는 트랜잭션 1과 트랜잭션 2의 모든 패키지, 즉 Fedora 설치 프로그램이 설치한 모든 패키지가 포함되어 있기 때문입니다. 이것은 repoquery에 언급된 패키지 xorg-x11-drv-mga 및 그 친구들이 포함되어 있는 이유를 설명합니다.
repoquery-2nd와 yum-history를 비교하면 repoquery-2nd가 더 정확하다는 것을 알 수 있습니다. 이는 제거된 일부 패키지를 포함하지 않습니다. 또한 "yum update" 작업의 일부 패키지(내 시스템에서는 2개)가 포함된 것 같습니다.
경고하다
위의 기록 기반 방법은 시스템 수명 동안 명시적으로 설치된 모든 패키지만 나열합니다. 이후 트랜잭션에서 제거되는 패키지의 균형을 맞추지 않습니다. 따라서 이 방법을 사용하려면 결과를 수동으로 관리해야 하며 repoquery
사용할 수 없는 시스템에서만 사용할 수 있습니다.
답변4
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt