시간이 지남에 따라 일부 패키지를 설치 한 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 방법은 무엇입니까?
답변
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 년경)의 경우 다음 문제가 관련됩니다.
- GUI를 통해 설치된 패키지 는 포함되어 있지 않습니다
- 찾을 수없는 명령 핸들러를 통해 설치된 패키지 는 포함되지 않습니다
- 아나콘다에 의해 기본적으로 설치된 일부 패키지 가 포함됩니다
리포 쿼리
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}
.
답변
가장 쉬운 방법은 오랫동안 작동했습니다.
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>
… 직접 파싱하지 않아도됩니다.
답변
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
사용할 수 없었습니다.
답변
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이 종속성에 필요하기 때문에 패키지가 명시 적으로 설치되었는지 또는 설치되었는지보고하는 방법에 주목하십시오. 이 정보를 구문 분석하고 명시 적으로 설치된 패키지 목록을 가져올 수 있습니다.
답변
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
답변
목록 패키지에 당신이 설치 한이 시도 한 줄을 :
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
필요에 따라)를 수행하십시오.
더 이상 존재하지 않거나 이름이 변경되었거나 다른 패키지로 대체 된 패키지가 누락 될 수 있습니다.