Ubuntu/RHEL 계열 offline apt/yum 패키징

2–3분

오늘은 offline에서도 유용하게 Repositry를 사용할 수 있게 만드는 패키징 방법에 대해서 알아보도록 하겠다.

먼저 간단하게 사용방법을 알아보자

인터넷이 안되는 환경에서 offline 패키징을 해와서 webserver에 올리고 ubuntu나 RHEL이 설치 된 서버에서 각각 배포를 진행하는 형태라고 생각하면 좋을 것 같다.

이런 부분을 진행하기 위해서 인터넷이 되는 환경에서 파일을 다운로드 하는 방법과 apt와 yum을 명령어를 사용하기 위해 metadata를 생성하는 것 까지 진행 해보도록 하겠다.

먼저 Rhel계열 부터 진행하도록 하겠다.

RHEL/centos 계열은 8버전 기준으로 작성

ubuntu는 20.04 버전 기준으로 작성 진행 하도록 하겠습니다.

RHEL – offline Package

먼저 yum 패키징을 하기 위한 yum-utils 패키지 설치를 진행한다.

$ sudo yum install yum-utils createrepo

이후 디렉토리를 하나 생성하여 거기에 파일을 다운로드 진행할 수 있도록 하겠다.

$ sudo mkdir ~/repo
$ cd ~/repo
$ yum download --resolve [패키지명]

이렇게 하면 파일이 다운로드 되게 되는데 이 파일들에 패키지가 여러가지라면 의존성을 맞춰줘야 한다. 그걸 위해서 metadata를 생성해줘야 하는데 아래와 같이 명령어를 입력하면 된다.

$ createrepo ~/repo

이러면 metadata가 생성되게 되고 offline에서도 생성될 수 있게 구성되게 된다.

ubuntu – offline Package

ubuntu는 복잡해서 단순하게 할 수 있도록 shell scrpit를 작성하게 되었다.

패키지를 다운로드 할 수 있도록 패키지 설치를 진행해보도록 하겠다.

$ sudo apt-get update
$ sudo apt-get install dpkg-dev

아래와 같이 패키지 설치를 하고 난 이후에 shell-scrpit를 생성하고 동작 시키면 패키지 다운로드 부터 의존성 까지 한번에 해결되는 process가 생성되게 된다.

cat << 'EOF' > download_and_generate.sh
#!/bin/bash

# Script to download dependencies and generate metadata

# Set the working directory
WORK_DIR="$HOME/local-repo"
mkdir -p $WORK_DIR
cd $WORK_DIR

# Function to download a package and its dependencies
download_deps() {
    local package=$1
    echo "Downloading: $package"
    apt-get download $package 2>/dev/null
    local depends=$(apt-cache depends $package | grep 'Depends' | sed "s/.*Depends: //" | sed 's/<[^>]*>//g' | tr '\n' ' ')
    for dep in $depends
    do
        # Check if the dependency has already been processed
        if ! grep -q "^$dep$" downloaded.txt; then
            echo $dep >> downloaded.txt
            download_deps $dep
        fi
    done
}

# Initialize the file to track downloaded packages
echo "" > downloaded.txt

# Process each package name provided as a command line argument
for pkg in "$@"
do
    if ! grep -q "^$pkg$" downloaded.txt; then
        echo $pkg >> downloaded.txt
        download_deps $pkg
    fi
done

# Use dpkg-scanpackages to create the Packages.gz file
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
echo "Package metadata has been generated."

# Clean up temporary file
rm downloaded.txt

# Print completion message
echo "All tasks have been completed."
EOF

# Grant execute permission to the script
chmod +x download_and_generate.sh
  • WORK_DIR= <어디에 다운로드 할것인지>

그리고 아래와 같이 script를 실행시켜주면 된다.

$ ./download_and_generate <패키지명1> <패키지명2>

위와 같이 script를 실행하면 파일 다운로드 및 의존성까지 같이 다운로드 되게 된다.

이렇게 offline 패키지 까지 알아 봤으니 다음 글에서는 어떻게 사용 할 수 있는 지 알아보도록 하겠다.

이상으로 글을 마치도록 하겠습니다.