하나의 Fedora 인스턴스에서 다른 패키지로 설치된 패키지 선택을 복제하는 방법은 무엇입니까?


16

시간이 지남에 따라 일부 패키지를 설치 한 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) 명령 줄 에 명시 적으로 언급 된 시스템 A에서 패키지를 설치하고 싶습니다. 의존성으로 설치된 것들!

왜? 아마도 종속성이 변경되었으므로 새 시스템에 오래된 종속성을 설치하고 싶지 않습니다. 또한 패키지를 제거 할 때 필요에 따라 자동으로 설치된 종속성 (예 : 고아)도 제거하려고합니다.

찾았 dnf list installed지만 종속성으로 인해 패키지가 명시 적으로 선택되었거나 설치된 경우 표시되지 않습니다.

Fedora에 대한 정보는 어떻게 얻습니까?

패키지 선택을 복제하는 Fedora / dnf 방법은 무엇입니까?

답변:


12

Fedora 26부터 Dnf repoquery 부속 명령은 모든 사용자 설치 패키지를 나열하는 새로운 옵션을 제공합니다.

$ 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

Dnf 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 년경)의 경우 다음 문제가 관련됩니다.

리포 쿼리

Dnf, Dnf API를 dnf history userinstalled사용할 수없고 사용할 수없는 구형 Fedora 시스템에서는 다음과 같이 repoquery 를 사용할 수 있습니다 .

$ 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)을 해제 -하지만 명령이 있기 때문에, 출시 23에없는 예 repoquery로 대체되었습니다 dnf repoquery. 그리고 태그를 dnf repoquery이해하지 못합니다 %{yumdb_info.reason}.


이 방법으로 모든 것을 얻을 수 있을지 확실하지 않습니다 repoquery .... "설치된 pkg에 대해 잘못된 yumdb querytag '이유': HandBrake-cli-0.9.5-1.fc14.x86_64"
slm

@slm, hm, 핸드 브레이크가 설치된 저장소는 무엇입니까? 리포지토리 설정과 관련이 있습니까?
maxschlepzig

나는 그것을 사용하여 설치 한 독립형 RPM 일 수 있다고 생각합니다 yum localinstall .... 그래도 캠프에 들어간 패키지가 상당히 많았습니다.
slm

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l90 개의 패키지를 반환했습니다.
slm

6

가장 쉬운 방법은 오랫동안 작동했습니다.

yum-debug-dump => gives file.

yum-debug-restore <file-from-debug-dump>

... get / set selections dpkg 명령, AIUI와 매우 유사합니다. 또한 기록을 재생하는 경우 다음을 사용할 수 있습니다.

yum history addon-info last saved_tx => gives file
yum load-tx <file-from-addon-info>

... 직접 파싱하지 않아도됩니다.


3

slm답변에서 영감을 얻은 다음과 같은 yum history기반 솔루션을 생각해 냈습니다 .

초기 설치 관리자 작업의 일부로 실행 된 트랜잭션을 제외하고 모든 yum 설치 트랜잭션 (예 : 업그레이드 없음)에 대한 자세한 기록을 가져옵니다 (시스템의 트랜잭션 1 및 2, 사용자 '시스템'으로 인한).

$ 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

모든 종류의 버전 접미사가 일치하도록 추악한 정규식이 필요합니다.

내 시스템에서 결과가 꽤 좋아 보입니다.

내 시스템 에서 repoquery ansatz 와의 비교 :

방법 # 패키지
――――――――――――――――――――――—――
repoquery 569
repoquery-2nd 216
history 역사 214

(repoquery 결과를 sort -u를 통해 파이프했습니다)

왜 차이점이 있습니까? repoquery는 트랜잭션 1과 2의 모든 패키지, 즉 Fedora 설치 프로그램이 설치 한 모든 패키지를 포함하기 때문입니다. 이것은 repoquery가 언급 된 xorg-x11-drv-mga 및 friends 패키지를 포함하는 이유를 설명합니다.

repoquery-2nd와 yum-history를 비교하면 repoquery-2nd가 더 정확하다는 것을 알 수 있습니다. 이미 제거 된 패키지는 포함되어 있지 않습니다. 또한 'yum update'-operations의 일부 (내 시스템에 2 개) 패키지가 포함되어 있습니다.

경고

위의 이력 기반 방법은 시스템의 전체 수명 동안 명시 적으로 설치된 모든 패키지 만 나열합니다. 이후 트랜잭션에서 제거 된 패키지의 균형을 맞추지 않습니다. 따라서이 방법은 결과를 수동으로 선별해야하며 시스템에서만 repoquery사용할 수 없었습니다.


두 답변을 최대한 활용하는 좋은 방법! 최종 솔루션을 제공 할 수 있다면 +1 이상을 제공하고 다양한 방법을 비교할 수 있습니다.
slm

2

Fedora (14)의 이전 버전이 있으므로 yum에 기능이 적은 버전이 포함되어 yum있지만 yum history기능을 살펴볼 수도 있습니다. 나는 당신이 그 명령에서 원하는 정보를 얻을 수 있다고 생각합니다.

역사 목록

$ sudo yum history list
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
ID     | Login user             | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
   862 | System <unset>         | 2013-07-12 18:00 | Install        |    1   
   861 | System <unset>         | 2013-07-09 03:11 | Install        |    1   
   860 | System <unset>         | 2013-07-01 13:40 | Install        |    1   
   859 | System <unset>         | 2013-06-29 22:07 | Install        |    1   
   858 | System <unset>         | 2013-06-25 22:33 | Install        |    1 P<
   857 | System <unset>         | 2013-06-23 22:28 | Update         |    1 >E
   856 | System <unset>         | 2013-06-23 21:33 | Install        |    1   
   ...

숫자 목록을 다음으로 전달하여 첫 번째 트랜잭션으로 돌아갈 수 있습니다 yum history list.

$ sudo yum history list `seq 1 10`
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
ID     | Login user             | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
    10 | Sam M. (local) <saml>  | 2010-12-18 23:23 | Install        |    2   
     9 | Sam M. (local) <saml>  | 2010-12-18 23:15 | Install        |   38   
     8 | Sam M. (local) <saml>  | 2010-12-18 23:12 | Install        |    1   
     7 | Sam M. (local) <saml>  | 2010-12-18 23:09 | Install        |    1  <
     6 | Sam M. (local) <saml>  | 2010-12-18 22:37 | Install        |    1 > 
     5 | Sam M. (local) <saml>  | 2010-12-18 21:57 | Install        |    1   
     4 | System <unset>         | 2010-12-18 21:21 | Install        |    5   
     3 | System <unset>         | 2010-12-18 21:18 | Install        |    4   
     2 | System <unset>         | 2010-12-18 21:10 | Install        |    3   
     1 | System <unset>         | 2010-12-18 19:14 | Install        | 1189

역사 정보

다음은 첫 번째 yum 트랜잭션의 일부로 설치된 것을 보여줍니다.

$ sudo yum history info 1 | less
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
Transaction ID : 1
Begin time     : Sat Dec 18 19:14:05 2010
Begin rpmdb    : 0:da39a3ee5e6b4b0d3255bfef95601890afd80709
End time       :            19:42:43 2010 (1718 seconds)
End rpmdb      : 1189:8c21e9e377c3ebdee936916208f74232d5d6235f
User           : System <unset>
Return-Code    : Success
Transaction performed with:
Packages Altered:
    Dep-Install ConsoleKit-0.4.2-3.fc14.x86_64
    Dep-Install ConsoleKit-libs-0.4.2-3.fc14.x86_64
    Dep-Install ConsoleKit-x11-0.4.2-3.fc14.x86_64
    Dep-Install GConf2-2.31.91-1.fc14.x86_64
    Dep-Install GConf2-gtk-2.31.91-1.fc14.x86_64
    Dep-Install ModemManager-0.4-4.git20100720.fc14.x86_64
    Install     NetworkManager-1:0.8.1-10.git20100831.fc14.x86_64
    Dep-Install NetworkManager-glib-1:0.8.1-10.git20100831.fc14.x86_64
    Install     NetworkManager-gnome-1:0.8.1-10.git20100831.fc14.x86_64
    Install     NetworkManager-openconnect-0.8.1-1.fc14.x86_64

yum이 종속성에 필요하기 때문에 패키지가 명시 적으로 설치되었는지 또는 설치되었는지보고하는 방법에 주목하십시오. 이 정보를 구문 분석하고 명시 적으로 설치된 패키지 목록을 가져올 수 있습니다.


귀하의 yum history아이디어를 기반으로 답변을 추가 했으며 결과를 repoquery기반 방법 과 비교합니다 . 부작용으로 repoquery 답변을 확장했습니다.
maxschlepzig

1
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt

1
여기에있는 다른 5 가지 답변을 살펴보면 답변과 다른 점이 무엇입니까? 또는 어떻게 대답이 더 나은지에 대한 설명은 전혀 없습니다 . 이러한 것들을 다루는 답변에 대한 설명을 제공 할 수 있다면 좋을 것입니다.
Stephen Rauch

@StephenRauch,이 명령은 최근 dnf 추가이기 때문에 다른 답변에 포함되지 않습니다. --userinstalled스위치는 단지 한 월 DNF에 추가 . 나는 그것을 테스트했으며 정확한 결과를 제공합니다. 실제로 사용자 설치되지 않은 커널 / 커널 코어 / 커널 모듈 패키지 또한 모든 *-debuginfo패키지 가 포함되어 있지만 필요한 경우 쉽게 필터링 할 수 있습니다.
maxschlepzig

@maxschlepzig, 피드백 주셔서 감사하지만 이것은 실제로 대답을 설명하는 답변을 교육 / 프롬프트하려고 노력하는 약간의 수사적 질문이었습니다.
Stephen Rauch

@StephenRauch, 충분히 공평하게, 일부 편집은 확실히 적절할 것이고 내가 받아 들인 대답으로 표시 할 수있게 할 것입니다.
maxschlepzig

0

목록 패키지에 당신이 설치 한이 시도 한 줄을 :

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e 's/command_line = (.*)/yum \1/g'"

결과:

# yum-userinstall
     yum install bind-utils
     yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
     yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
     yum install lsof
     yum install nano
     yum install nfs-utils libnfsidmap
     yum install nmap-ncat
     yum install openscap-scanner
     yum install open-vm-tools

PS1 : 의존성을 보이지 않습니다

PS2 : 알파벳순으로 정렬

PS3 : 나중에 패키지를 제거한 경우 표시되지 않습니다


-1

내가 한 일 (세부 사항을 잊어 버렸고 게으른 부랑자이므로 ...

설치된 모든 패키지를 가져옵니다. rpm -qa > file

사용 sed(1)버전 번호를 제거 및 (필요한 경우, 구조를 유지)하세요. 이를 위해서는 몇 번의 반복 작업이 필요했습니다. 마지막 스트레치 -[0-9.]-[0-9].fc23또는 이와 유사한 것을 아무것도 바꾸지 않고 싶지만 재미있는 버전 "숫자"도 있습니다.

정상적으로 설치 한 후 yum -y install $(< file)(또는 dnf필요에 따라)를 수행하십시오.

더 이상 존재하지 않거나 이름이 변경되었거나 다른 패키지로 대체 된 패키지가 누락 될 수 있습니다.


그러나 이전에 설치된 모든 패키지는 대상 호스트에서 사용자가 설치 한 것으로 표시됩니다. 원래 종속성으로 만 설치된 경우에도 마찬가지입니다.
maxschlepzig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.