시스템에 현재 설치된 응용 프로그램은 몇 가지 요인에 의존합니다. 주요한 요인은 운영 체제 설치 중 선택된 소프트웨어 패키지 그룹에 의존합니다. 다른 요인은 시스템이 사용 중인 이후에 수행된 작업에 의존합니다.
시스템 관리자로서 루틴 업무 중 하나는 소프트웨어 관리입니다. 이는 일반적으로 다음을 포함합니다:
새로운 소프트웨어 설치
소프트웨어 제거
이미 설치된 소프트웨어 업데이트
Linux 기반 시스템에 소프트웨어를 설치하는 방법은 여러 가지가 있습니다. 소스에서 설치하거나 미리 컴파일된 바이너리에서 설치할 수 있습니다. 후자의 방법은 훨씬 더 간단하지만 맞춤 설정할 수 있는 기능은 적습니다. 미리 컴파일된 바이너리에서 설치할 때 대부분의 작업이 이미 완료된 상태입니다. 그래도 원하는 특정 소프트웨어의 이름과 위치를 알아야 합니다.
거의 모든 소프트웨어는 C 또는 "C++" 프로그래밍 언어 소스 파일로 제공됩니다. 소스 프로그램은 일반적으로 소스 파일의 아카이브로 배포됩니다. 보통 tar 또는 gzip 또는 bzip2로 압축된 파일입니다. 즉, 압축되어 있는지 또는 단일 번들로 제공됩니다.
대부분의 개발자는 소스 코드를 GNU 표준에 맞게 작성하여 다른 사람과 공유하기 쉽게 만들었습니다. 또한 패키지가 모든 UNIX 또는 UNIX 유사 시스템 (예: Linux)에서 컴파일될 수 있음을 의미합니다.
RPM은 Rocky Linux, Fedora, Red Hat Enterprise Linux (RHEL), openSuSE, Mandrake 등과 같은 Red Hat 기반 배포판에서 응용 프로그램(패키지)을 관리하기 위한 기본 도구입니다.
Linux 배포판에서 소프트웨어를 관리하는 데 사용되는 응용 프로그램을 패키지 관리자라고 합니다. 예를 들면:
레드햇 패키지 관리자(rpm). 패키지는 " .rpm" 확장자를 가집니다.
Debian 패키지 관리 시스템(dpkg). 패키지는 " .deb" 확장자를 가집니다.
RPM 명령에 대한 일부 인기 있는 명령행 옵션과 구문은 다음과 같습니다:
rpm
사용법 : rpm [OPTION...]
패키지 쿼리
쿼리 옵션 (-q 또는 --query와 함께 사용):
-c, --configfiles 모든 구성 파일 나열
-d, --docfiles 모든 문서 파일 나열
-L, --licensefiles 모든 라이선스 파일 나열
-A, --artifactfiles 모든 아티팩트 파일 나열
--dump 기본 파일 정보 덤프
-l, --list 패키지 내의 파일 나열
--queryformat=QUERYFORMAT 다음 쿼리 형식 사용
-s, --state 나열된 파일의 상태 표시
패키지 확인
확인 옵션 (-V 또는 --verify와 함께 사용):
--nofiledigest 파일 다이제스트를 확인하지 않음
--nofiles 패키지 내의 파일을 확인하지 않음
--nodeps 패키지 종속성을 확인하지 않음
--noscript 검증 스크립트 실행하지 않음
패키지 설치, 업그레이드 및 제거
설치/업그레이드/제거 옵션:
--allfiles 건너뛸 수 있는 구성을 포함하여 모든 파일을 설치
-e, --erase=<package>+ 패키지 삭제
--excludedocs 문서 설치하지 않음
--excludepath=<path> 경로 <path>로 시작하는 파일 건너뛰기
--force --replacepkgs --replacefiles의 약어
-F, --freshen=<packagefile>+ 이미 설치된 경우 패키지 업그레이드
-h, --hash 패키지 설치 시 해시 마크 출력 (-v와 함께 사용)
--noverify --ignorepayload --ignoresignature의 약어
-i, --install 패키지 설치
--nodeps 패키지 종속성 확인하지 않음
--noscripts 패키지 스크립트 실행하지 않음
--percent 패키지 설치 시 백분율 출력
--prefix=<dir> 패키지를 <dir>로 이동 (재배치 가능한 경우)
--relocate=<old>=<new> 경로 <old>에서 <new>로 파일 이동
--replacefiles 패키지 간 파일 충돌 무시
--replacepkgs 패키지 이미 존재하는 경우 재설치
--test 설치하지 않고 동작 여부 확인
-U, --upgrade=<packagefile>+ 패키지 업그레이드
--reinstall=<packagefile>+ 패키지 재설치
Rocky Linux 패키지를 얻을 수 있는 다양한 옵션이 있습니다. 신뢰할 수 있는 [또는 신뢰할 수 없는] 저장소에서 직접 다운로드할 수 있습니다. 배포 ISO에서 가져올 수도 있습니다. nfs, git, https, ftp, smb, cifs 등의 프로토콜을 사용하여 중앙 공유 위치에서 가져올 수도 있습니다. 궁금한 경우 다음 공식 웹 사이트를 보고 원하는 패키지에 해당하는 저장소를 탐색할 수 있습니다.
https://download.rockylinux.org/pub/rocky/8.8/
손상되거나 오염된 파일을 다운로드하거나 종료할 수 있습니다. 다운로드한 wget 패키지의 무결성을 확인할 수 있습니다. 다음을 입력하세요:
$ rpm -K wget-*.rpm
wget-1.19.5-10.el8.x86_64.rpm: digests signatures OK
출력된 "digests signatures OK" 메시지는 패키지가 정상임을 나타냅니다.
우리는 악의적으로 다운로드한 패키지를 고의로 변경해 볼 것입니다. 원본 패키지에 어떤 것을 추가하거나 제거함으로써 이를 수행할 수 있습니다. 원래 패키지 제작자가 의도하지 않은 방식으로 패키지를 변경하는 것은 패키지를 손상시킬 것입니다. 우리는 echo 명령을 사용하여 "haha"라는 문자열을 패키지에 추가하여 파일을 변경할 것입니다. 다음 명령어를 입력하세요:
$ echo haha >> wget-1.19.5-10.el8.x86_64.rpm
이제 rpm의 -K 옵션을 사용하여 패키지의 무결성을 다시 확인해 보세요. 유형:
$ rpm -K wget-*.rpm
wget-1.19.5-10.el8.x86_64.rpm: DIGESTS SIGNATURES NOT OK
매우 다른 메시지가 출력됩니다. "DIGESTS SIGNATURES NOT OK" 출력은 해당 패키지를 사용하거나 설치하지 말아야 함을 명확히 알려줍니다. 더 이상 신뢰할 수 없습니다.
rm 명령을 사용하여 손상된 wget 패키지 파일을 삭제하고 dnf를 사용하여 새로운 복사본을 다운로드하세요. 다음을 입력하세요:
시스템에 소프트웨어를 설치하려고 할 때 "의존성 실패" 문제가 발생할 수 있습니다. 특히 시스템에서 응용 프로그램을 수동으로 관리하는 저수준 RPM 도구를 사용할 때 이러한 문제가 흔히 발생합니다.
예를 들어, "abc.rpm" 패키지를 설치하려고 하면 RPM 설치 프로그램이 의존성 실패에 대해 에러를 표시할 수 있습니다. "abc.rpm" 패키지를 설치하려면 다른 패키지 "xyz.rpm"이 먼저 설치되어야 한다는 메시지가 나타날 수 있습니다. 응용 프로그램은 거의 항상 다른 소프트웨어나 라이브러리에 의존합니다. 시스템에 필요한 프로그램이나 공유 라이브러리가 이미 설치되어 있지 않은 경우, 해당 의존성을 해결하기 위해 필요한 사전 작업을 수행해야 합니다.
저수준 RPM 도구는 종종 애플리케이션 간의 종종 애플리케이션 간의 상호 의존성에 대해 알고 있습니다. 그러나 일반적으로 문제를 해결하기 위해 필요한 응용 프로그램이나 라이브러리를 어떻게 어디에서 가져와야 하는지 알지 못합니다. 달리 말하면 RPM은 무엇과 어떻게를 알고 있지만 어디서 질문에 답할 수 있는 기본 제공 기능이 없습니다. 이때 dnf, yum 등의 도구가 도움을 줄 수 있습니다.
wget 애플리케이션을 설치해 보세요. RPM의 -ivh 명령 줄 옵션을 사용합니다. 유형:
$ rpm -ivh wget-*.rpm
error: Failed dependencies:
libmetalink.so.3()(64bit) is needed by wget-*
의존성 문제가 발생했습니다! 위 예시 출력에서는 wget이 "libmetalink.so.3"이라는 라이브러리 파일이 필요하다고 알려줍니다.
참고사항
위 테스트의 출력에 따르면 wget-.rpm 패키지를 설치하려면 libmetalink-.rpm 패키지가 설치되어야 합니다. 즉, libmetalink는 wget-.rpm 설치의 선행 조건입니다. "nodeps" 옵션을 사용하여 강제로 wget-.rpm 패키지를 설치할 수도 있지만, 이는 일반적으로 권장되지 않는 방법입니다.
RPM은 누락된 부분에 대한 힌트를 유용하게 제공했습니다. rpm은 무엇과 방법을 알고 있지만 반드시 위치를 알 필요는 없다는 것을 기억할 것입니다. 따라서 dnf 도구를 사용하여 누락된 라이브러리를 제공하는 패키지 이름을 찾아보겠습니다. 다음을 입력하세요:
$ dnf whatprovides libmetalink.so.3
...<TRUNCATED>...
libmetalink-* : Metalink library written in C
Repo : baseos
Matched from:
Provide : libmetalink.so.3
출력에서 누락된 라이브러리를 제공하는 libmetalink 패키지를 다운로드해야 합니다. 특히 64비트 버전의 라이브러리가 필요합니다. 별도의 도구인 dnf를 호출하여 데모용 64비트(x86_64) 아키텍처에 맞는 패키지를 찾아 다운로드하도록 하겠습니다. 다음을 입력하세요:
dnf download --arch x86_64 libmetalink
이제 작업 디렉토리에 적어도 2개의 rpm 패키지가 있어야 합니다. ls 명령을 사용하여 확인하세요.
누락된 libmetalink 종속성을 설치하세요. 다음을 입력하세요:
$ sudo rpm -ivh libmetalink-*.rpm
종속성이 설치되었으므로 이제 원래 목표인 wget 패키지를 설치할 수 있습니다. 다음을 입력하세요:
$ sudo rpm -ivh wget-*.rpm
참고사항
RPM은 트랜잭션을 지원합니다. 이전 연습에서 원하는 패키지뿐만 아니라 해당 패키지가 의존하는 모든 패키지와 라이브러리를 포함하는 단일 RPM 트랜잭션을 수행할 수 있었습니다. 아래와 같은 단일 명령으로 충분합니다:
$ rpm -Uvh wget-*.rpm libmetalink-*.rpm
이제 진실의 순간입니다. wget 프로그램을 옵션 없이 실행하여 설치되었는지 확인해 보세요. 다음을 입력하세요:
$ wget
작동 중인 wget을 살펴보겠습니다. wget을 사용하여 커맨드 라인에서 인터넷에서 파일을 다운로드해 보겠습니다. 다음을 입력하세요:
wget https://kernel.org
이렇게 하면 kernel.org 웹사이트의 기본 index.html 파일이 다운로드됩니다!
wget 애플리케이션에 포함된 모든 파일 목록을 확인하기 위해 rpm을 사용하세요.
wget 패키지에 포함된 문서를 확인하기 위해 rpm을 사용하세요.
wget 패키지에 설치된 모든 실행 파일 목록을 확인하기 위해 rpm을 사용하세요.
wget을 설치하기 위해 libmetalink 패키지를 설치해야 했습니다. 이제 명령줄에서 libmetalink을 실행해 보세요. 다음 명령어를 입력하세요:
$ libmetalink
-bash: libmetalink: command not found
Rocky Linux 프로젝트에서 패키지 서명에 사용되는 GPG 키는 프로젝트 웹사이트, FTP 사이트, 배포 미디어, 로컬 소스 등 다양한 소스에서 얻을 수 있습니다. RL 시스템의 키링에 적절한 키가 누락된 경우, 로컬 RL 시스템으로부터 Rocky Linux의 공개 키를 가져오기 위해 rpm의 --import 옵션을 사용할 수 있습니다. 다음과 같이 실행하세요: sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
질문:
패키지를 설치할 때 rpm -Uvh와 rpm -ivh의 차이점은 무엇인가요?
rpm의 매뉴얼 페이지를 참조하세요.
RPM을 사용하여 패키지를 제거하는 정확하고 올바른 방법은 해당 패키지와 종속성을 함께 제거하는 것입니다. libmetalink 패키지를 제거하려면 이에 의존하는 wget 패키지도 제거해야 합니다. 다음 명령어를 입력하세요:
$ sudo rpm -e libmetalink wget
참고사항
libmetalink에 의존하는 패키지를 깨뜨리고 시스템에서 강제로 패키지를 제거하려면 rpm의 --nodeps 옵션을 다음과 같이 사용할 수 있습니다 -
$ sudo rpm -e --nodeps libmetalink 즉, 모든 종속성을 무시합니다. ii. 위의 내용은 시스템에서 패키지를 강제로 제거하는 방법을 보여주기 위한 것입니다. 이것이 필요한 경우가 있을 수 있지만 일반적으로 좋은 습관은 아닙니다.
이렇게 하는 경우가 있을 수 있지만, 좋은 관행은 아닙니다. iii. 다른 설치된 패키지인 "abc"가 의존하는 패키지 "xyz"를 강제로 제거하면 패키지 "abc"를 사용할 수 없거나 어느 정도 손상될 수 있습니다.
DNF는 RPM 기반 Linux 배포판을 위한 패키지 관리자입니다. 이는 인기 있는 YUM 유틸리티의 후속 제품입니다. DNF는 YUM과의 호환성을 유지하며 두 유틸리티는 매우 유사한 명령줄 옵션과 구문을 공유합니다.
DNF는 Rocky Linux와 같은 RPM 기반 시스템에서 소프트웨어를 관리하는 많은 도구 중 하나입니다. rpm과 비교하여 이러한 상위 도구들은 패키지의 설치, 제거, 조회를 단순화하는 데 도움을 줍니다. 이러한 도구는 RPM 시스템이 제공하는 기본 프레임워크를 사용합니다. 그래서 먼저 RPM을 사용하는 방법을 이해하는 것이 유용합니다.
DNF(그리고 이와 유사한 도구)는 RPM을 감싸는 래퍼(wrapper) 역할을 하며, RPM이 제공하지 않는 추가 기능을 제공합니다. DNF는 패키지 및 라이브러리 종속성을 처리하는 방법을 알고 있으며, 구성된 저장소를 자동으로 활용하여 대부분의 문제를 해결할 수 있습니다.
dnf 유틸리티와 함께 자주 사용되는 옵션은 다음과 같습니다:
사용법: dnf [options] COMMAND
주요 명령어 목록:
alias 명령 별칭을 나열하거나 생성합니다. autoremove 원래 종속성으로 설치된 모든 불필요한 패키지를 제거합니다. check 패키지 데이터베이스에 문제가 있는지 확인합니다. check-update 사용 가능한 패키지 업그레이드를 확인합니다. clean 캐시된 데이터를 제거합니다. deplist [사용되지 않음, repoquery --deplist 사용] 패키지의 종속성과 해당 패키지를 제공하는 패키지를 나열합니다. distro-sync 설치된 패키지를 최신 버전으로 동기화합니다. downgrade 패키지를 다운그레이드합니다. group 그룹 정보를 표시하거나 사용합니다. help 도움말 메시지를 표시합니다.
module 모듈과 상호작용합니다.
repoquery 키워드와 일치하는 패키지를 검색합니다. repository-packages 지정된 저장소의 모든 패키지에 대해 명령을 실행합니다. search 지정된 문자열에 대한 패키지 세부 정보를 검색합니다. shell 대화형 DNF 쉘을 실행합니다. swap 제거 및 하나의 스펙을 설치하기 위한 대화형 DNF 모드를 실행합니다. updateinfo 패키지에 대한 알림을 표시합니다. upgrade 시스템에 설치된 패키지 또는 패키지를 업그레이드합니다. upgrade-minimal 시스템에 영향을 주는 문제를 해결하는 '최신' 패키지만 업그레이드합니다.
이전 연습에서 wget 유틸리티를 제거한 상태라고 가정하고, 다음 단계에서 dnf를 사용하여 패키지를 설치해 보겠습니다. rpm을 사용하여 wget를 설치할 때 필요한 2-3 단계 과정을 dnf를 사용하면 1 단계로 단순화할 수 있습니다. dnf가 종속성을 자동으로 해결해 줄 것입니다.
먼저, 시스템에서 wget과 libmetalink가 제거되었는지 확인해 보세요. 다음 명령어를 입력하세요:
$ sudo rpm -e wget libmetalink
제거한 후에 CLI에서 wget을 실행하면 wget: command not found와 같은 메시지가 표시됩니다.
위의 명령에서 사용된 "-y" 옵션은 dnf가 수행할 작업을 확인하기 위한 "[y/N]" 프롬프트를 억제합니다. 대신, 자동으로 "yes" (y)로 가정합니다.
DNF는 "환경 그룹" 옵션을 제공하여 시스템에 새로운 기능 세트를 추가하는 것을 간편하게 할 수 있습니다. 해당 기능을 추가하려면 일반적으로 몇 가지 패키지를 개별적으로 설치해야 할 수도 있지만, dnf를 사용하면 원하는 기능의 이름이나 설명만 알고 있으면 됩니다. dnf를 사용하여 사용 가능한 모든 그룹을 나열해 보세요. 다음을 입력하세요:
$ dnf group list
"Development Tools" 그룹/기능에 관심이 있습니다. 그룹에 대해 자세한 정보를 얻어보겠습니다. 다음을 입력하세요:
$ dnf group info "Development Tools"
나중에 "Development Tools" 그룹에 포함된 몇 가지 프로그램이 필요할 것입니다. 다음을 실행하여 "Development Tools" 그룹을 dnf를 사용하여 설치해 보세요:
대부분의 응용 프로그램은 사용자가 활성화 또는 비활성화할 수 있는 기능을 가지고 있습니다. 이는 소스 코드에 액세스하고 해당 소스 코드를 통해 설치할 수 있는 장점 중 하나입니다. 응용 프로그램이 가지고 있는 설정 가능한 기능을 제어할 수 있습니다. 이는 미리 컴파일된 이진 파일로부터 패키지 매니저가 설치하는 모든 것을 받아들이는 것과 대조적입니다.
일반적으로 소프트웨어를 구성할 수 있는 스크립트는 "configure"라는 이름으로 알맞게 지정됩니다.
ls 명령을 다시 사용하여 현재 작업 디렉토리(pwd)에 configure라는 파일이 있는지 확인하세요.
hello 프로그램에서 활성화하거나 비활성화할 수 있는 모든 옵션을 보려면 다음을 입력하세요:
$ ./configure --help
질문:
명령의 출력에서 "--prefix" 옵션은 무엇을 합니까?
구성 스크립트가 제공하는 기본 옵션에 만족한다면 다음을 입력하세요: 다음을 입력하세요:
$ ./configure
참고사항
구성 단계가 원활하게 진행되었기를 바랍니다. 이제 컴파일 단계로 넘어갈 수 있어야 합니다.
구성 단계에서 오류가 발생한 경우, 오류의 원인을 확인하기 위해 출력의 뒷부분을 주의 깊게 살펴보아야 합니다. 오류는 때때로 자명하고 수정하기 쉽습니다. 예를 들어, 다음과 같은 오류가 발생할 수 있습니다:
configure: error: no acceptable C compiler found in $PATH
위의 오류는 시스템에 C 컴파일러(gcc 등)가 설치되어 있지 않거나, 컴파일러가 PATH 변수에 포함되어 있지 않은 경우를 의미합니다.
whereis 명령을 사용하여 시스템에서 hello 프로그램이 있는 위치를 확인하세요. 다음 명령어를 입력하세요:
$ whereis hello
hello 응용 프로그램을 실행하여 어떤 일이 발생하는지 확인해보세요. 다음을 입력하세요:
$ hello
hello를 다시 실행하고 --help 옵션을 사용하여 할 수 있는 다른 작업을 확인하세요.
sudo를 사용하여 슈퍼유저로 hello를 다시 실행하세요. 다음을 입력하세요:
$ sudo hello
!!! !!!
일반 사용자도 프로그램을 사용할 수 있도록 일반 사용자로서 프로그램을 테스트하는 것은 좋은 실천 방법입니다. 이진 파일의 권한이 잘못 설정되어 슈퍼유저만 프로그램을 사용할 수 있는 경우가 있을 수 있습니다. 물론 일반 사용자도 프로그램을 사용할 수 있도록 원하는 경우입니다.