CentOS 8 하나의 패키지 여러 버전을 관리하는 dnf module(모듈) 명령어 사용법

RHEL/CentOS 8 의 패키지 관리자인 dnf 는 OS 를 구성하기 위한 필수적인 패키지를 제공하는 BaseOS 저장소외에 나머지 패키지들은 AppStream 이라고 부르는 개별 저장소들로 나뉘어져 있습니다.


AppStream 은 module 과 패키지를 제공하는데 module 은 해당 패키지와 패키지가 의존하는 전체 패키지 묶음을 의미합니다. 즉 PHP 모듈은 PHP 패키지와 PHP 패키지가 의존하는 다른 패키지(예: PHP MySQL 드라이버, GD 드라이버등)를 의미합니다.


하나의 모듈은 여러 개의 Stream 을 가질수 있으며 예로 NodeJS 는 10, 12, 14 Stream 을 가질 수 있습니다.

이로 인해 dnf 는 기존과는 달리 하나의 패키지의 여러 버전을 설치할 수 있습니다.

즉 사용자는 rvm(Ruby Version Manager) 이나 nvm(Node Version Manager) 같은 언어별 패키지 매니저가 없어도 Ruby 2.6, 2.7, 3.0 을 동시에 설치할 수 있으며 PHP 나 Python, NodeJS 도 여러 버전을 동시에 설치할 수 있습니다.

모듈 정보 보기

목록 보기

dnf 의 module 명령어 뒤에 list 옵션을 주면 등록된 전체 모듈의 목록을 볼 수 있습니다.

$ dnf module list
      

Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs)
Name                     Stream                      Profiles                                               Summary                            
nginx                          1.14 [d][e]                          common [d]                          nginx webserver                        
nginx                          1.16                                 common [d]                          nginx webserver                        
nginx                          1.18                                 common [d]                          nginx webserver  
nodejs                   10 [d][e]                   common [d], development, minimal, s2i                  Javascript runtime                 
nodejs                   12                          common [d], development, minimal, s2i                  Javascript runtime                 
nodejs                   14                          common [d], development, minimal, s2i                  Javascript runtime
ruby                  2.5 [d]                  common [d]                  An interpreter of object-oriented scripting language                
ruby                  2.6                      common [d]                  An interpreter of object-oriented scripting language                
ruby                  2.7                      common [d]                  An interpreter of object-oriented scripting language   

하나의 패키지에 여러 버전이 표시되는 것을 확인할 수 있으며 버전은 Stream 항목에 나타납니다.


만약 특정 패키지의 모듈을 보려면 list 옵션뒤에 패키지 명을 입력하면 되며 다음은 nodejs 의 모듈 목록만 표시합니다.

$ dnf module list nodejs

Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs)
Name                     Stream                      Profiles                                               Summary                            
nodejs                   10 [d][e]                   common [d], development, minimal, s2i                  Javascript runtime                 
nodejs                   12                          common [d], development, minimal, s2i                  Javascript runtime                 
nodejs                   14                          common [d], development, minimal, s2i                  Javascript runtime                 

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

하단의 Hint 부분을 보면 d 는 default, e 는 enabled, x 는 disabled, i 는 installed 의 약자인 것을 알수 있습니다.

즉 위의 nodejs 모듈은 10 버전이 default 이고 활성화되어 있습니다.


상세 정보 보기

module info 명령으로 모듈의 상세 정보를 볼 수 있습니다. 상세 정보에는 Architecture, 저장소, 의존성, 프로파일등이 포함되며 다음은 nodejs 모듈의 상세 정보를 표시합니다.

$ dnf module info nodejs

Last metadata expiration check: 0:32:46 ago on Sun 20 Dec 2020 06:55:55 PM KST.
Name             : nodejs
Stream           : 10
Version          : 3320200819201945
Context          : 601d93de
Architecture     : x86_64
Profiles         : default [d], development, minimal
Default profiles : default
Repo             : fedora-modular
Summary          : Javascript runtime
Description      : Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
Requires         : platform:[f33]
Artifacts        : http-parser-0:2.9.4-3.module_f33+9545+0a04377d.src
                 : http-parser-0:2.9.4-3.module_f33+9545+0a04377d.x86_64
                 : http-parser-debuginfo-0:2.9.4-3.module_f33+9545+0a04377d.x86_64
                 : http-parser-debugsource-0:2.9.4-3.module_f33+9545+0a04377d.x86_64

여러 스트림에서 정보를 보여주므로 원하는 버전 스트림만 표시할 경우 모듈명 뒤에 버전 스트림을 명시하면 됩니다. 다음은 nodejs 의 12 버전 스트림의 상세 정보만 출력합니다.

$ dnf module info nodejs:12


Last metadata expiration check: 0:35:03 ago on Sun 20 Dec 2020 06:55:55 PM KST.
Name             : nodejs
Stream           : 12
Version          : 3320200916130557
Context          : 601d93de
Architecture     : x86_64
Profiles         : default [d], development, minimal
Default profiles : default
Repo             : fedora-modular
Summary          : Javascript runtime
Description      : Node.js is a platform built on Chrome''s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

표시 항목에 Profiles 가 있는데 모듈 설치시에 프로파일을 지정할 수 있습니다.

모듈 활성화

특정 Stream 의 module 을 활성화하려면 다음과 같이 enable 뒤에 모듈명과 스트림을 적어주면 됩니다.

dnf module enable NAME:STREAM


다음 명령은 nodejs 모듈의 Stream 12 버전을 활성화합니다.

$ sudo dnf module enable nodejs:12


가끔 다음과 같은 에러가 나고 모듈이 활성화되지 않는 경우가 있습니다.

The operation would result in switching of module 'nodejs' stream '10' to stream '12' Error: It is not possible to switch enabled streams of a module.
It is recommended to remove all installed content from the module, and reset the module using 'dnf module reset <module_name>' command. After you reset the module, you can install the other stream.


그러면 다음과 같이 module 을 reset 해주고 다시 활성화해주면 됩니다.

$ sudo dnf module reset nodejs
$ sudo dnf module enable nodejs:12


이제 다시 module list 를 실행하면 12 Stream 이 활성화된 것을 볼 수 있습니다.

$ dnf module list nodejs

Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs)
Name                      Stream                   Profiles                                                Summary                             
nodejs                    10 [d]                   common [d], development, minimal, s2i                   Javascript runtime                  
nodejs                    12 [e]                   common [d], development, minimal, s2i                   Javascript runtime                  
nodejs                    14                       common [d], development, minimal, s2i                   Javascript runtime

모듈 설치

모듈을 설치하려면 module install 명령어 뒤에 모듈명과 스트림, 또는 프로파일을 기술하면 됩니다. 스트림이나 프로파일 생략시 기본 값을 사용합니다.

$ dnf module install NAME
$ dnf module install NAME:STREAM
$ dnf module install NAME/PROFILE
$ dnf module install NAME:STREAM/PROFILE

다음은 nodejs12 버전의 minimal 프로파일을 설치합니다.

$ dnf module install nodejs:12/minimal

Dependencies resolved.
==========================================================================================================================================================
 Package                         Architecture          Version                                                        Repository                     Size
==========================================================================================================================================================
Downgrading:
 nodejs                          x86_64                1:12.18.4-1.module_f33+10186+5d5ca84d                          fedora-modular                 96 k
 nodejs-docs                     noarch                1:12.18.4-1.module_f33+10186+5d5ca84d                          fedora-modular                2.9 M
 nodejs-full-i18n                x86_64                1:12.18.4-1.module_f33+10186+5d5ca84d                          fedora-modular                7.8 M
 nodejs-libs                     x86_64                1:12.18.4-1.module_f33+10186+5d5ca84d                          fedora-modular                 12 M
 npm                             x86_64                1:6.14.6-1.12.18.4.1.module_f33+10186+5d5ca84d                 fedora-modular                3.4 M
Installing module profiles:
 nodejs/minimal                                                                                                                                          
Enabling module streams:
 nodejs                                                12                                                                                                

Transaction Summary
==========================================================================================================================================================
Downgrade  5 Packages

Total download size: 27 M
Is this ok [y/N]: 


모듈 삭제

삭제는 module remove 명령 뒤에 삭제할 모듈명을 지정해 주면 됩니다.

$ dnf module remove nodejs:12

Dependencies resolved.
==========================================================================================================================================================
 Package                              Architecture                        Version                              Repository                            Size
==========================================================================================================================================================
Disabling module profiles:
 nodejs/minimal                                                                                                                                          

Transaction Summary
==========================================================================================================================================================

Is this ok [y/N]: 



같이 보기


Ref