하나의 Fedora 인스턴스에서 다른 인스턴스로 설치된 패키지 선택을 어떻게 복사합니까?

하나의 Fedora 인스턴스에서 다른 인스턴스로 설치된 패키지 선택을 어떻게 복사합니까?

나는 일부 패키지를 설치한 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월경부터 시작) 시스템의 경우 다음 질문이 관련됩니다.

다시 찾아봐

이전 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

관련 정보