시간이 지남에 따라 일부 패키지를 설치 한 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)에서 동일한 패키지를 선택하는 더 나은 방법을 원합니다. 명시 적으로 언급 된 시스템 A에서 패키지를 설치하고 싶습니다. dnf install
(또는 yum install
) 명령 줄에서-종속성으로 설치된 명령 줄이 아닙니다!
이유가 무엇입니까? 아마도 종속성이 변경 되었기 때문일 수 있습니다. 새 시스템에 오래된 종속성을 설치하고 싶지 않습니다. 또한 패키지를 제거 할 때 자동으로 설치된 종속성 (예 : 고아)도 제거하고 싶을 수 있습니다.
dnf list installed
를 찾았지만 패키지가 명시 적으로 선택되었거나 종속성으로 인해 방금 설치된 경우 표시되지 않습니다.
어떻게합니까? Fedora에서 해당 정보를 얻으시겠습니까?
패키지 선택을 복제하는 Fedora / dnf 방법은 무엇입니까?
답변
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
PS : 위의 코드 등을 다른 배포도 지원하는 user-installed.py
에 입력합니다.
사용자 설치 내역
Fedora 23 이상에서 Dnf는 사용자가 설치 한 모든 패키지를 나열하는
# dnf history userinstalled
명령을 제공합니다. 2016-11 년 기준 , 유용성이 제한됩니다 . 출력을 제어하고 정규화 된 패키지를 인쇄합니다 (예 : 버전 정보 포함).
사용자 설치 제한 사항
사용자 설치 패키지 표시는 Fedora 23-ish 시대 시스템 (2015 년경부터)의 일부 Fedora 버전에서 몇 가지 제한이 있습니다. -11) 다음 문제가 관련됨) :
- GUI를 통해 설치된 패키지는 포함되지 않습니다.
- command-not-found 핸들러를 통해 설치된 패키지는 포함되지 않습니다.
- 기본적으로 설치되는 일부 패키지 (아나콘다에 의해) 포함
Repoquery
구형 Fedora 시스템에서 Dnf, Dnf API 및 dnf history userinstalled
를 사용할 수 없습니다. 대신 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로 저장되어 있습니다. 또는
.
이 명령은 릴리스 21까지의 Fedora에서 작동하지만 예를 들어 릴리스 23에서는 repoquery
명령이 dnf repoquery
로 대체 되었기 때문입니다. 그리고 dnf repoquery
는 %{yumdb_info.reason}
태그를 이해하지 못합니다.
댓글
답변
가장 쉽고 오랫동안 효과가 있었던 방법은 다음과 같습니다.
yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump>
… 선택 항목 가져 오기 / 설정 dpkg 명령 인 AIUI와 매우 유사하게 작동합니다.또한 히스토리를 재생하는 경우 다음을 사용할 수 있습니다.
yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info>
… 직접 파싱하는 대신
답변
slm “의 answer 다음과 같은 yum history
기반 솔루션을 찾았습니다.
모든 yum 설치 트랜잭션에 대한 모든 세부 내역을 가져옵니다 (예 : 업그레이드 없음). , 초기 설치 작업의 일부로 실행 된 항목 제외 (내 시스템의 트랜잭션 1 및 2, 사용자 “System”에 귀속됨) :
$ 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 (내 시스템에서)와 비교 :
method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214
(저는 repoquery 결과를 ugh sort -u)
왜 차이점이 있습니까? repoquery는 트랜잭션 1과 2의 모든 패키지, 즉 Fedora 설치 프로그램에 의해 설치된 모든 패키지를 포함하기 때문입니다. 이것은 repoquery에 언급 된 xorg-x11- drv-mga 및 friends 패키지가 포함 된 이유를 설명합니다.
repoquery-2nd와 yum-history를 비교하면 repoquery-2nd가 더 정확하다는 것을 알 수 있습니다. 이미 제거 된 일부 패키지는 포함하지 않습니다. . 또한 “yum update”작업의 몇 가지 (내 시스템에 2 개) 패키지가 포함되어있는 것 같습니다.
경고
위의 기록 기반 방법은 명시 적으로 설치된 모든 항목 만 나열합니다. 시스템의 전체 수명 동안 패키지. 나중에 트랜잭션에서 제거 된 패키지의 균형을 맞추지 않습니다. 따라서이 방법은 결과를 수동으로 선별해야하며 repoquery
를 사용할 수없는 시스템에서만 사용해야합니다.
댓글
- 두 답변을 최대한 활용하는 좋은 방법입니다. 저는 ‘ 최종 솔루션 +이를 수행하는 다양한 방법의 좋은 비교를 위해 할 수 있다면 +1 이상을 드릴 것입니다.
답변
이전 버전의 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이 패키지가 명시 적으로 설치되었는지 또는 설치되었는지 여부를보고하는 방법에 주목하십시오. 종속성에 필요합니다.이 정보를 구문 분석하고 명시 적으로 설치된 패키지 목록을 가져올 수 있습니다.
댓글
- I ‘
yum history
아이디어를 기반으로 답변을 추가했으며 결과를repoquery
기반 방법과 비교합니다. . 부작용으로 ‘ 내 저장소 답변을 확장했습니다.
답변
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
댓글
- 여기에서 다른 5 개의 답변을 살펴보면 답변에서 무엇이 다른 점을 발견 했습니까? 왜 또는 당신의 대답이 더 나은지 어떻게 에 대한 설명은 전혀 없습니다. 이러한 내용을 포함하는 답변에 대한 설명을 제공하면 좋을 것입니다.
- @StephenRauch,이 명령은 다른 답변에 포함되어 있지 않습니다. ‘ 최근 dnf가 추가 되었기 때문에 ‘.
--userinstalled
스위치는 방금 5 월에 dnf에 추가되었습니다 . 저는 ‘ 테스트를했고 정확한 결과를 제공합니다. 실제로 사용자가 설치하지 않은 ‘ kernel / kernel-core / kernel-modules 패키지를 모듈로합니다. 또한 모든*-debuginfo
패키지도 포함되어 있지만 필요한 경우 쉽게 필터링 할 수 있습니다. - @maxschlepzig, 피드백에 감사하지만 실제로는 답변자에게 답변을 설명하도록 교육 / 촉구하는 약간의 수사 학적 질문입니다.
- @StephenRauch, 충분히 공평하게, 일부 편집은 확실히 적절할 것이며 제가 수락 한 것으로 표시 할 수 있습니다. 대답.
답변
사용자 가 설치 한 패키지를 나열하려면 다음을 시도하십시오. 원 라이너 :
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 : 나중에 패키지를 제거했는지 여부를 표시하지 않습니다.
답변
내가 한 일 (세부 정보를 잊어 버렸습니다. 저는 게으르다. 그래서 …
설치된 모든 패키지 가져 오기 : rpm -qa > file
sed(1)
를 사용하여 버전 번호 등을 제거합니다 (필요한 경우 아키텍처 유지). 제대로하기 위해 몇 번 반복하면 -[0-9.]-[0-9].fc23
또는 이와 유사한 마지막 부분을 아무것도 바꾸고 싶지만 재미있는 버전 “숫자”도 있습니다.
이후 정상적으로 설치하려면 yum -y install $(< file)
(또는 필요에 따라 dnf
)를 수행합니다.
약간의 낙진이 발생합니다. 존재하지 않는 패키지의 ymore 또는 이름이 변경되었거나 다른 것으로 대체되었습니다.
댓글
- 알겠습니다.하지만 이전에 설치 한 모든 패키지를 사용자가 설치 한 패키지로 표시합니다. 목적지 호스트. 원래 종속성으로 만 설치 되었더라도
repoquery ...
를 실행했습니다. ” 잘못된 yumdb querytag ‘ 이유 ‘ 설치된 pkg : HandBrake-cli-0.9.5-1.fc14.x86_64 ”yum localinstall ...
를 사용하여 설치 한 독립 실행 형 RPM 일 수 있습니다. 하지만 그 캠프에 들어간 상당한 양의 패키지가있었습니다.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
는 90 개의 패키지를 반환했습니다.