리눅스/CentOS

DNF와 YUM의 차이점

씨실과 날실 2020. 2. 26. 09:00


안내

앞으로 상당 기간에 걸쳐 RPM 기반 리눅스 배포판을 위한 패키지 관리도구 DNF에 대해 연재하게 되었습니다.

이 연재는 레드햇 계열 리눅스를 처음 접하는 분들을 위해 초심자가 꼭 알야야 하거나 또는 알면 유용한 것들을 선별하여 내용을 작성하였습니다.

잘못된 정보가 있다면 댓글로 제보해주시면 감사하겠습니다.


연재 항목은 다음과 같습니다.

2020/01/13 - [리눅스/CentOS] - DNF 명령 - DNF 명령 연재 목록

2020/01/18 - [리눅스/CentOS] - DNF 패키지 기본 관리 명령 1 - 패키지 설치(install), 제거(remove), 재설치(reinstall), 자동 제거(autoremove), 패키지 제거와 설치 동시 수행(swap)

2020/01/19 - [리눅스/CentOS] - DNF 패키지 기본 관리 명령 2 - 패키지 정보(Info), 목록(List), 종속성 목록(Deplist), 문제점 검사(Check), 그룹 관련 명령(Group), 작업 표시(Mark), 검색(Search), 조건 검색(Provides)

2020/01/23 - [리눅스/CentOS] - DNF 패키지 버전 관리 - 패키지 업그레이드(Upgrade), 최소 업그레이드(Upgrade-Minimal), 다운그레이드(Downgrade), 업데이트 정보(Updateinfo), 업데이트 확인(Check-Update)

2020/01/27 - [리눅스/CentOS] - DNF 명령 관리 - 명령 별명(Alias), 대화식 쉘(Shell), 도움말(Help)

2020/01/30 - [리눅스/CentOS] - DNF 트랜잭션 관리 - 트랜잭션 이력(History)

2020/02/01 - [리눅스/CentOS] - DNF 저장소 관리 - 저장소 정보(Repolist), 저장소 내 임시 파일 정리(Clean), 저장소 메타 데이터 캐시 생성(Makecache), 저장소 쿼리 명령(Repoquery), 저장소 패키지 명령(Repository-Packages)

2020/02/03 - [리눅스/CentOS] - DNF 배포판 동기화 - 배포판 동기화(Distro-Sync)

2020/02/05 - [리눅스/CentOS] - DNF 모듈 관리 - 모듈 관리(Module)

2020/02/09 - [리눅스/CentOS] - DNF 명령줄 옵션 연재 목록

2020/02/11 - [리눅스/CentOS] - DNF 명령줄 분류별 옵션 - [01] 패키지 관리

2020/02/13 - [리눅스/CentOS] - DNF 분류별 명령줄 옵션 - [02] 환경 설정

2020/02/15 - [리눅스/CentOS] - DNF 분류별 명령줄 옵션 - [03] 부가 기능

2020/02/17 - [리눅스/CentOS] - DNF 분류별 명령줄 옵션 - [04] 정보 확인

2020/02/20 - [리눅스/CentOS] - DNF 환경 설정[구성] 파일(dnf.conf) [main] 섹션 옵션

2020/02/22 - [리눅스/CentOS] - DNF 저장소 옵션(Repo Options)과 저장소 변수(Repo Variables)

2020/02/24 - [리눅스/CentOS] - 유용한 DNF 플러그인

2020/02/26 - [리눅스/CentOS] - DNF와 YUM의 차이점



YUM과 비교하여 DNF CLI의 변화 목차

--skip-broken 옵션

Upgrade 명령과 Update 명령의 기능 동일화

clean_requirements_on_remove 구성 설정 활성화 기본값화

resolvedep 명령 제거

deplist 명령 제거

제외 및 저장소 제외 설정을 모든 작업에 적용

YUM’s conf의 지시어 includepkgs를 include로 변경

dnf provides /bin/<file>의 불완전한 지원

skip_if_unavailable 설정이 기본적으로 활성화 가능

overwrite_groups 구성 설정 삭제 및 항상 비활성화된 것처럼 작동하는 함수 구성

mirrorlist_expire 구성 삭제

mirrorlist 저장소 옵션에서 metalink 미인식

alwaysprompt 삭제

upgrade_requirements_on_install 삭제

dnf history rollback 확인 삭제

 yum swap 없이 패키지 교체

CLI에서 종속성 처리 세부 사항 미표시

dnf provides가 YUM 명령 문서를 바탕으로 컴파일

대역폭 제한

installonlypkgs 구성 옵션

Delta RPM 파일의 사용

.srpm파일과 존재하지 않는 패키지에 대한 미동작

더 이상 사용되지 않는 패키지에 설치하도록 패키지 승격

--installroot 옵션의 동작

트랜잭션 테이블 표시 후 다운로드 기능 지원 여부

List 명령의 모든 대안 저장소 내 패키지 표시

yum-langpacks 하위 명령 제거


--skip-broken 옵션

install 명령에서 쓰는 경우

--skip-broken옵션은  --setopt=strict=0별칭입니다. 두 옵션 모두 DNF와 함께 사용하면 전체 작업이 실패하는 오류를 일으키지 않고 사용 불가능한 패키지 또는 DNF에 대한 종속성이 깨진 패키지를 건너 뛸 수 있습니다.

이 동작은 dnf.conf 파일에서 기본값으로 설정할 수 있습니다. 

[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True

위 예시는 CentOS 8 설치 후 /etc/dnf/dnf.conf 파일의 수정 전 모습입니다.

위 파일에 strict 구성을 아래와 같이 추가해주시면 패키지 install 작업 시 --skip-broken옵션이 자동으로 수행됩니다.

strict=False

참고로 이 --skip-broken옵션은 현재 install 명령에서만 적용됩니다.

upgrade 명령에서

과거 YUM에서는 사용 불가능한 패키지 또는 종속성이 깨진 패키지를 건너 뛸 필요가 있는 경우 따로 --skip-broken 옵션을 사용해야 했습니다. 그러나 DNF에서는 패키지를 업그레이드할 경우 해당 옵션이 자동으로 수행되므로 따로 --skip-broken 옵션을 적을 필요 없습니다.

참고

트랜잭션에서 최신 버전의 패키지만 사용하려면 --best 옵션을 사용하면 됩니다.

참고로 이 --best 옵션은 dnf.conf 파일에서 기본값으로 설정되어 있습니다.


Upgrade 명령과 Update 명령의 기능 동일화

모든 형태(옵션 사용)의 dnf update 명령과 dnf upgrade 명령은 그 수행 과정과 결과는 완전히 동일합니다. DNF는 업그레이드 명령으로 upgrade를 기본값으로 설정하고 있으며 update는 upgrade의 별칭입니다.

참고

YUM에서 yum upgrade 명령은 yum --obsoletes update 명령과 동일합니다.

즉, YUM에서 update와 upgrade는 별개의 명령입니다.


clean_requirements_on_remove 구성 설정 활성화 기본값화

/etc/dnf/dnf.conf

clean_requirements_on_remove=True

clean_requirements_on_remove 스위치는 위처럼 DNF에서 기본값으로 True로 설정되어 있어 사용자가 따로 설정하지 않아도 기본적으로 활성화되어 있습니다. 반대로 YUM의 경우 이것이 기본값이 비활성화로 설정되어 있습니다.

따라서 DNF에서 패키지를 제거(remove 명령)하는 경우 YUM에 비해 보다 많은 패키지가 자동으로 제거될 수 있음에 유념해야 합니다.


resolvedep 명령 제거

DNF에서 resolvedep 명령은 제거되었습니다. YUM 버전의 resolvedep 명령은 단지 과거 호환성 유지를 위한 이유로 유지됩니다.

만약 사용자가 특정 파일을 제공하는 패키지를 찾고자 한다면 dnf provides 명령을 사용하면 됩니다.


deplist 명령 제거

패키지의 종속성을 찾기위한 YUM deplist 명령의 대안은 dnf repoquery --deplist입니다.

그렇다고 사용자 입장에서 deplist를 사용하지 못하는 것은 아닙니다. 단지 자체 명령이 제거되고 dnf deplist 명령은 dnf repoquery --deplist 명령의 별칭(Alias)으로 존재하게 되는 것입니다. 즉 dnf deplist 명령을 입력하면 DNF가 자동으로 dnf repoquery --deplist 명령으로 치환하여 작동한다는 뜻입니다.


제외 및 저장소 제외 설정을 모든 작업에 적용

YUM의 경우 install update( + upgrade) 명령에서만 제외 및 저장소 제외 옵션을 지원했습니다. 그러나 DNF는 이것을 삭제와 나열하는 모든 작업까지로 확장 지원하게 되었습니다.

예시는 다음과 같습니다.

Flask 패키지를 제외한, 설치된 모든 python-f * 패키지 목록을 보고자 하는 경우

dnf -x '*flask*' list installed 'python-f*'


YUM 환경 설정 파일의 지시어 includepkgs는 DNF의 include와 동일

YUM의 환경 설정 파일 파일 내 [main] 섹션과 저장소 설정 파일(.repo)에서 쓰이던 includepkgs 지시어는 DNF의 include와 동일합니다.

YUM은 지시어로 include와 includepkgs 를 가지고 있습니다. 그런데 이 두 지시어는 명백히 다른 기능을 가집니다. DNF의 지시어 include는 YUM의 includepkgs 지시어와 역할이 같습니다.


dnf provides /bin/<file>의 불완전한 지원

Fedora 시스템에 / bin 디렉터리가 없고 파일이 설치되지 않은 상태에서 UsrMove(= Move all to /usr) 작업 후, /bin은 filesystem 패키지가 /usr/bin을 가리키도록 만든 심볼릭 링크일 뿐입니다.

심볼릭 링크를 실제 경로로 설정해주면 제대로 작동할 것 같지만 그렇지 않습니다.

올바르게 수행하기 위해서는 아래처럼 실제 경로를 입력해주어야 하빈다.

[study@localhost ~]$ dnf provides /usr/bin/

일부 배포판에서 skip_if_unavailable 설정이 기본적으로 활성화

일부 배포판에서는 DNF 환경 설정 파일에서 skip_if_unavailable=True 구성이 기본적으로 설정되어 있습니다.
이유는 종종 타사 저장소를 사용할 수 없기 때문입니다. 관련 저장소 환경 설정 파일에 이 설정이 없으면 YUM은 저장소 동기화 오류로 즉시 중지됩니다.

overwrite_groups 구성 옵션 삭제 및 항상 비활성화된 것처럼 작동

overwrite_groups 구성 옵션이 삭제되었습니다. DNF는 동일한 그룹 ID를 가진 여러 그룹을 볼 때 그룹의 내용을 병합합니다.

mirrorlist_expire 구성 삭제

DNF는 메타데이터와 미러리스트를 만료하는데 metadata_expire를 사용하게 되었습니다. 따라서 기존의 mirrorlist_expire 구성 옵션이 필요없게 되어 해당 옵션을 삭제했습니다.

mirrorlist 저장소 옵션에서 metalink 미인식

yum.conf (5)의 다음 부분은 더 이상 mirrorlist 옵션에 적용되지 않습니다.

metalink가 설정되지 않은 상태에서 mirrorlist URL에 "metalink"라는 단어가 포함된 경우  mirrorlist의 값이 metalink에 복사되는 비정상 작동 때문입니다.

이와 관련하여 관련 저장소 구성 파일이 수정되었습니다.

보다 자세한 내용은 Fedora의 관련 버그 948788을 참조하시기 바랍니다.


alwaysprompt 삭제

구성을 단순화하기 위해 지원되지 않게 되었습니다.

upgrade_requirements_on_install 삭제

명료하지 않은 의미를 가진 구성 옵션였기에 삭제함으로써 환경 구성을 단순화하였습니다.

이제 시스템 내 모든 패키지를 사용 가능한 최신 버전으로 업그레이드하려면 dnf upgrade만 입력해주시면 됩니다.

dnf history rollback 확인 삭제

DNF는 다른 패키지 관리자의 사용을 허용합니다. 따라서 RPMDB의 모든 변경 사항이 트랜잭션 histoty 기록에 저장되는 것은 아닙니다.

따라서 이러한 상황이 발생하더라도 DNF는 정상적으로 작동합니다. 그래서 force 옵션이 더 이상 필요하지 않습니다.

 yum swap 없이 패키지 교체 가능

때때로 설치된 패키지를 제거하고 다른 패키지로 교체하여 동일한 기능을 제공하는 동시에 이러한 기능에 따라 다른 패키지는 설치 상태를 유지해야하는 경우가 있습니다.

패키지 데이터베이스의 일관성을 일시적으로 깨서 한 번의 트랜잭션으로 제거 및 설치를 수행하여 수행 할 수 있습니다.

DNF에서 이러한 트랜잭션을 설정하는 일반적인 방법은 dnf shell을 사용하거나 --allowerasing 스위치를 사용하는 것입니다.

예를 들어 C 패키지(P 필요)를 삭제하지 않고 A 패키지 (P 제공)를 B 패키지 (P 제공, A와 충돌)로 바꾸고 싶다고 할 때 다음의 명령을 사용하면 됩니다.

[study@localhost ~]$ sudo dnf --allowerasing install B
이 명령은 yum swap A B와 같습니다.

DNF는 스왑 명령을 제공하지만 dnf 스왑 A B 구문만 지원됩니다.


CLI에서 종속성 처리 세부 사항 미표시

YUM은 종속성 해결 과정에서 아래와 같은 문구를 출력합니다.

---> Package rubygem-rhc.noarch 0:1.16.9-1.fc19 will be an update
--> Processing Dependency: rubygem-net-ssh-multi >= 1.2.0 for package: rubygem-rhc-1.16.9-1.fc19.noarch
DNF는 이와 같은 정보를 출력하지 않습니다.

기술적으로 다음과 같은 이유가 있습니다. 첫 번째로 DNF의 depsolver는 항상 업데이트 후보에 대한 모든 종속성을 고려하기 때문에 이에 대한 정보를 보여주게 되면 출력이 매우 길어지기 때문입니다.

두 번째로, 이 결과는 YUM 에서도 특히 대규모 트랜잭션의 경우 지나친 정보량으로 사용자를 매우 혼란스럽게 만듭니다. 정보 획득으로 인한 이점보다 과한 정보로 야기되는 혼란으로 발생하는 해가 더 큽니다.


dnf provides는 YUM 명령 문서를 준수


[study@localhost ~]$ yum provides sandbox
예를 들어 위와 같은 명령을 실행했다고 가정해봅시다. 사실 이것은 명령 문법을 엄격히 적용한다면 올바른 명령은 아닙니다. 그러나 YUM은 사용자 친화적으로 설계되어 추가 휴리스틱을 적용하여 사용자가 sandbox라는 문구를 사용한 의도를 결정합니다.

예를 들어 PATH 환경 변수의 항목을 순차적으로 적용하여 일부 패키지에서 제공한 파일과 일치하는지 확인합니다.

 DNF는 YUM의 후신이긴 하지만 YUM의 이러한 작동 방식은 따르지 않습니다. DNF는 명령 문법을 엄격히 따지므로 일반적으로 아래와 같이 실행해주어야 합니다.


[study@localhost ~]$ dnf provides /usr/bin/sandbox

또는

[study@localhost ~]$ dnf provides '*/sandbox'


대역폭 제한

DNF는 YUM에서 사용된 조절 및 옵션을 지원합니다.

그러나 YUM과는 달리, DNF는 여러 다운로드가 동시에 실행되면 총 다운로드 속도가 조절됩니다. YUM에서는 다운로더가 각기 다른 프로세스로 실행되었기 때문에 이러한 작업이 불가능했습니다.


installonlypkgs 구성 옵션

YUM과 비교하여 DNF는 installonlypkgs 구성 옵션의 목록 값을 DNF 기본값에 추가합니다. 즉 기존값은 그대로 존재한 채로 installonlypkgs 구성 옵션의 내용이 추가로 기본값에 적용되는 것입니다.  반면에 YUM은 옵션값이 기본값을 대체합니다.

Delta RPM 파일의 사용

deltarpm 옵션은 Delta RPM 파일 사용 여부를 제어합니다.

YUM과 비교하여 DNF는 deltarpm_percentage를 지원하지 않으며 대신 deltarpm 사용이 적절한 지 결정하기 위해 최적의 DRPM / RPM 비율값을 선택합니다.


.srpm파일과 존재하지 않는 패키지에 대한 미동작

로컬 .srpm파일에서 설치 작업을 요청하는 명령이 실행되면 DNF가 오류와 함께 종료 됩니다.

[study@localhost ~]$ sudo $ dnf install fdn-0.4.17-1.fc20.src.rpm tour-4-6.noarch.rpm
Error: Will not install a source rpm package (fdn-0.4.17-1.fc20.src).

DNF가 이렇게 작동하는 이유는 프로그램이 CLI 명령을 완전히 이행할 수 없는 경우 오류와 함께 종료해야 한다는 명제에 따른 것입니다.

이러한 작동 방색은 사용 가능한 패키지와 일치하지 않는 패키지 사양에도 동일하게 적용됩니다.

이에 반해 YUM은 이 경우 경고만 출력하고 "tour"패키지 설치를 계속합니다.



구 패키지 대신 신 패키지가 자동으로 설치되지 않음

DNF는 패키지 Y가 패키지 X의 후신이라고 해서 패키지 X의 설치 요청을 패키지 Y에 대한 설치 요청으로 자동으로 대체해 수행하지 않습니다.

그러나 YUM은 obsoletes 구성 옵션이 활성화되어 있는 경우 신 패키지에 대한 설치로 자동으로 변경하여 실행합니다. 그러나 적절히 문서화되어 있지 않고 시스템에 해로울 수 있으므로 권장하지는 않습니다.


--installroot 옵션의 동작

DNF는 보다 예측 가능한 installroot 동작을 제공합니다.

DNF는 --config 명령줄 옵션과 다르게 경로를 처리합니다. 이 경로는 항상 호스트 시스템과 관련이 있습니다 (YUM은 이 경로를 installroot와 결합합니다.).

Reposdir is also handled slightly differently, if one path of the reposdirs exists inside of installroot, then repos are strictly taken from installroot

Reposdir는 또한 약간 다르게 처리되는데, 만약 reposdir의 하나의 경로가 installroot의 내부에 존재한다면 repos는 installroot에서 엄격하게 가져옵니다.

YUM은 reposdir에서 각 경로를 개별적으로 테스트하고 존재하는 경우 installroot 경로를 사용합니다.


트랜잭션 테이블 표시 후 다운로드 기능 지원 여부

DNF는 트랜잭션 테이블을 표시한 후 다운로드 기능을 제공하지 않습니다. 사용자에게 트랜잭션을 계속할지 여부만 묻습니다.

List 명령의 모든 대안 저장소 내 패키지 표시

DNF는 모든 저장소의 모든 패키지를 나열합니다. 즉, 저장소 이름이 다른 동명의 패키지가 중복하여 표시될 수 있습니다. 이는 사용자에게 선호하는 저장소를 선택할 수있는 가능성을 제공하기 때문입니다.

yum-langpacks 하위 명령 제거

번역은 core DNF의 일부가 되어 더 이상 개별 언어팩을 관리할 필요가 없어졌습니다.

따라서 다음과 같은 하위 명령이 제거되었습니다.

langavailable / langinstall / langremove / langlist / langinfo




YUM 플러그인과 비교한 DNF 플러그인 변경


Original YUM toolDNF command/optionPackage
yum checkdnf repoquery --unsatisfieddnf
yum-langpacks dnf
yum-plugin-aliasesdnf aliasdnf
yum-plugin-auto-update-debug-infooption in debuginfo-install.confdnf-plugins-core
yum-plugin-changelog dnf-plugins-core
yum-plugin-coprdnf coprdnf-plugins-core
yum-plugin-fastestmirrorfastestmirror option in dnf.confdnf
yum-plugin-fs-snapshot dnf-plugins-extras-snapper
yum-plugin-local dnf-plugins-core
yum-plugin-merge-conf dnf-plugins-extras-rpmconf
yum-plugin-prioritiespriority option in dnf.confdnf
yum-plugin-remove-with-leavesdnf autoremovednf
yum-plugin-show-leaves dnf-plugins-core
yum-plugin-tmprepo--repofrompath optiondnf
yum-plugin-tsflagstsflags option in dnf.confdnf
yum-plugin-versionlock python3-dnf-plugin-versionlock
yum-rhn-plugin dnf-plugin-spacewalk


아직 포팅되지 않은 플러그인들

 yum-plugin-filter-data,

 yum-plugin-keys,

 yum-plugin-list-data,

 yum-plugin-post-transaction-actions,

 yum-plugin-protectbase,

 yum-plugin-ps,

 yum-plugin-puppetverify,

 yum-plugin-refresh-updatesd,

 yum-plugin-rpm-warm-cache,

 yum-plugin-upgrade-helper,

 yum-plugin-verify




YUM 유틸리티와 비교한 DNF 플러그인 변경


Original YUM toolNew DNF commandPackage
debuginfo-installdnf debuginfo-installdnf-plugins-core
find-repos-of-installdnf list installeddnf
needs-restartingdnf tracerdnf-plugins-extras-tracer
package-cleanupdnf list, dnf repoquerydnf, dnf-plugins-core
repoclosurednf repoclosurednf-plugins-extras-repoclosure
repodiffdnf repodiffdnf-plugins-core
repo-graphdnf repographdnf-plugins-extras-repograph
repomanagednf repomanagednf-plugins-extras-repomanage
repoquerydnf repoquerydnf
reposyncdnf reposyncdnf-plugins-core
repotrackdnf download –resolve –alldepsdnf-plugins-core
yum-builddepdnf builddepdnf-plugins-core
yum-config-managerdnf config-managerdnf-plugins-core
yum-debug-dumpdnf debug-dumpdnf-plugins-extras-debug
yum-debug-restorednf debug-restorednf-plugins-extras-debug
yumdownloaderdnf downloaddnf-plugins-core


package-cleanup 대체에 대한 상세표

package-cleanup --dupesdnf repoquery --duplicates
package-cleanup --leavesdnf repoquery --unneeded
package-cleanup --orphansdnf repoquery --extras
package-cleanup --problemsdnf repoquery --unsatisfied
package-cleanup --cleandupesdnf remove --duplicates
package-cleanup --oldkernelsdnf remove --oldinstallonly
package-cleanup --oldkernels --keep=2dnf remove $(dnf repoquery --installonly --latest-limit=-2)