[ 자급자족 홈랩 만들기 II ] APT Mirror 구축

by ANTIBIOTICS posted Sep 30, 2026
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

이전의 Stratum1 NTP 구축은 예상치 못한 문제로 잠깐 보류하고... 일단 다음 단계부터 진행하겠습니다.

 

제 장비들은 모두 Debian 계열을 사용합니다.

가령 데스크탑과 노트북은 Pop!_OS를 사용하고, 라즈베리파이들은 DietPi로 통일되어 있습니다.

 

그런데 패키지 업데이트를 할때마다 매번 데비안 공식 저장소에서 받으면 중복 트래픽이 발생합니다.

인터넷 연결이 끊기면 아예 업데이트를 할 수 없게 됩니다.

 

그래서 내부망에 APT Mirror를 구축하려고 합니다.

내부망은 운이 좋으면 1Gbps 대역폭을 통째로 사용할 수 있으니 약간 기대가 됩니다.

 


 

▶ 준비물 - 하드웨어

 

444be153-dee0-4b86-9e40-d55092354e76.jpeg

 

라즈베리파이 4B 4gb + Sandisk E30 1tb 입니다.

 

라즈베리파이 4B 4gb는 솔직히... 아깝습니다.

I/O위주라 CPU가 대부분 놀테니까요.

 

Sandisk E30은 객관적으로 썩 좋은 외장 SSD는 아닙니다.

내부적으로 WD Green SN350급이 사용되었다고 알고 있습니다.

 

그런데 APT Mirror 용도에서는 이게 중요하지 않습니다.

어차피 읽기 성능만 잘 나오면 되니까요.

 

작년에 할인할 때 라즈베리파이는 8만원, E30은 4만원대에 구입했는데...

지금 메모리 가격이 정신이 나가버려서 그런지 같은 구성으로 맞추려면 40만원 가까이 깨진다는게 어이가 없네요.

 

 


 

▶ 준비물 - 배경 지식

 

데비안 패키지 관리 도구로는 dpkg와 apt가 있습니다.

이건 넘어가고...

 

APT Mirror를 만드는 데는 (제가 찾아본 한에서는) apt-cacher-ng, apt-mirror, debmirror 같은 툴이 있습니다.

 

apt-cacher-ng의 철학은 심플합니다.

가령, 클라이언트 A가 패키지 something.deb를 받으면 apt-cacher-ng가 중간에서 캐시해두고, 이후 클라이언트 B가 같은 패키지를 요구하면 자신이 가진 캐시를 제공합니다.

 

apt-mirror와 debmirror는 사실 큰 차이가 있는지 잘 모르겠습니다.

 

찾아본 바로는 apt-mirror는 설정이 단순한 편이고, debmirror는 조금 더 세밀하게 설정할 수 있는것 같습니다.

하지만 제가 실제로 사용해본게 아니므로 여기서는 말을 아끼겠습니다.

 

둘 다 Debian 저장소를 통째로 로컬에 복제해두고, 클라이언트가 something.deb를 요구하면 자신이 가진 복사본을 제공한다는 점은 동일합니다.

 

[Debian Wiki] AptCacherNg

[unix.com] apt-mirror(1) debian man page 

[Debian Manpages] debmirror - Debian partial mirror script, with ftp, http or rsync and package pool support

 

저는 실제로 사용하는 아키텍처만 복제하면 되니 debmirror를 사용해보겠습니다.

 

 


 

▶ 1단계 - 저장소 복제 

 

저는 이 글을 베이스로 제가 삽질한 내용을 약간씩 추가하겠습니다.

[TOBANET] CREATE YOUR OWN DEBIAN MIRROR WITH DEBMIRROR

 

 

mirror1.png

 

sudo apt update

sudo apt full-upgrade

 

시스템 패키지를 업데이트합니다.

 

 

mirror2.png

 

lsblk

 

디스크에 충분한 용량이 있는지 확인합시다.

 

저는 /boot/firmware와 /가 각각 sda1과 sda2로 나뉘어 있고, sda2는 931G를 사용할 수 있군요.

복제 범위에 따라 다르겠지만 최소 500gb 정도는 확보해두는게 좋겠습니다.

 

가능하다면 파일시스템에 quota를 걸어두는것도 좋을듯 합니다.

 

 

mirror3.png

 

sudo apt install debmirror debian-archive-keyring gnupg gpgv rsync apache2 patch ed

 

필요한 패키지를 설치합니다.

 

Apache2는 미러를 HTTP로 제공하기 위해 필요합니다.

저는 apache가 익숙하지만 nginx로 진행해도 문제는 없습니다.

 

patch와 ed는 필수는 아닌데... 제 경우에는 없으면 경고가 발생했습니다.

가능하면 그냥 같이 설치해줍시다.

 

 

mirror4.png

 

mkdir /srv/mirror

 

미러로 사용할 /srv/mirror 디렉토리를 생성합니다.

 

 

mirror5.png

 

groupadd mirror

 

mirror 그룹도 만들어줍니다.

 

 

mirror6.png

 

useradd -d /srv/mirror -g mirror mirror

 

mirror 그룹 소속으로, /srv/mirror를 홈 디렉토리로 쓰는 mirror 사용자를 만들어줍니다.

 

 

mirror7.png

 

chown -R mirror:mirror /srv/mirror

 

/srv/mirror를 mirror 사용자에게 넘겨줍니다.

 

 

mirror8.png

 

chsh -s /bin/bash mirror

su mirror

cd

 

mirror 사용자의 기본 셸을 bash로 변경하고, 계정을 전환합니다.

 

 

mirror9.png

 

ls -lh /usr/share/keyrings/debian-archive*

 

아카이브 서명용 공개키가 존재하고, 퍼미션이 777인지 확인해봅시다.

debian-archive-keyring.gpg 파일이 있어야합니다.

 

없다면 아래 명령으로 다시 설치합니다.

 

sudo apt install --reinstall debian-archive-keyring gpgv

 

 

mirror10.png

 

debmirror \
--host=deb.debian.org \
--root=/debian \
--method=https \
--dist=trixie,trixie-updates,trixie-backports \
--section=main,contrib,non-free,non-free-firmware \
--arch=arm64,armhf \
--nosource \
--keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
--progress \
/srv/mirror/debian

 

이제 stable debian 저장소를 복제합니다.

 

각 옵션 의미는 다음과 같습니다.

 

  • --host=deb.debian.org : 원격 저장소 서버를 지정합니다.
  • --root=/debian : 원격 저장소 서버에서 /debian 경로를 사용합니다.
  • --method=https : 다운로드할 때 HTTPS를 사용합니다.

 

즉, 이 세 옵션이 가리키는 원본 저장소 경로는 https://deb.debian.org/debian/이 됩니다.

 

  • --dist=trixie,trixie-updates,trixie-backports : 복제할 Debian 배포판을 지정합니다. 제 경우에는 Debian13 기본 저장소, 중요 업데이트, 백포트 저장소를 지정했습니다.
  • --section=main,contrib,non-free,non-free-firmware : 복제할 컴포넌트를 지정합니다. Debian 자유 소프트웨어 패키지, 자유 소프트웨어가 아닌 기타 패키지, 비자유 펌웨어 등을 가져옵니다.
  • --arch=arm64,armhf : 복제할 CPU 아키텍처를 지정합니다. 저는 라즈베리파이에 사용할 것이므로 64비트 ARM, 32비트 ARM을 지정했습니다. x86-64에서 사용한다면 amd64를 추가할 수 있습니다.
  • --nosource : .deb가 아닌 소스 패키지는 제외합니다.
  • --keyring=/usr/share/keyrings/debian-archive-keyring.gpg : 아카이브 서명용 공개키를 지정합니다.
  • --progress : 다운로드 진행 상황을 출력합니다.
  • /srv/mirror/debian : 마지막 옵션으로, 복제한 저장소를 저장할 로컬 디렉터리입니다.

 

 

mirror11.png

 

여기까지 정상적으로 진행되었다면... 이렇게 뭔가 잔뜩 다운받기 시작합니다.

이 작업은 네트워크 환경에 따라서 몇시간 이상 걸릴 수도 있습니다.

 

내부적으로 rsync를 사용하므로 ctrl+c로 중단했다가 나중에 다시 시작해도 됩니다.

저는 이 상태 그대로 가만히... 놔두겠습니다.

 

meme.jpg

mirror12.png

 

40368초동안 8161.97 KiB/s로 339697 MiB를 다운로드했다고 합니다.

단순 계산해보면... 11시간 12분동안 약 8.3MB/s 속도로 356GB를 다운로드했습니다.

 

/srv/mirror는 333G를 사용하고 있군요.

 

 

mirror13.png

 

debmirror \
--host=deb.debian.org \
--root=/debian-security \
--method=https \
--dist=trixie-security \
--section=main,contrib,non-free,non-free-firmware \
--arch=arm64,armhf \
--nosource \
--keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
--progress \
/srv/mirror/debian-security

 

아직 디스크에 여유 공간이 있으니 이번에는 debian-security를 복제하겠습니다.

debian-security는 stable debian에서 보안 업데이트가 있는 패키지가 우선적으로 올라오는 저장소입니다.

 

debian-security는 아예 https://deb.debian.org/debian-security/라는 다른 경로를 사용하므로 --root와 --dist, 로컬 경로 옵션들을 수정해줍니다.

 

여기서 로컬 경로를 /srv/mirror/debian-security로 정확하게 입력했는지 다시 확인하도록 합시다.

저는 명령을 복붙하다가 기존 stable debian 경로인 /srv/mirror/debian를 잘못 입력해서 미러가 섞일뻔했습니다;

 

 

mirror14.png

 

debian-security 복제도 완료되었습니다.

약 38분간 27GB를 가져왔다고 하는군요.

 

 


 

▶ 2단계 - HTTP 설정

 

이제 로컬에 저장소 복제본이 생겼으니, 이 복제본을 HTTP로 제공하는 정적 사이트를 설정해보겠습니다.

 

아까 설치한 Apache2를 그대로 사용하겠습니다.

 

mirror15.png

vi /etc/apache2/sites-available/repo.conf

 

<VirtualHost *:80>
    ServerName repo.home
    DocumentRoot /srv/mirror

    <Directory /srv/mirror>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

 

apache 설정 파일을 추가합니다.

저는 여기서 repo.conf라는 파일에 repo.home이라는 이름으로 만들겠습니다.

 

DocumentRoot는 /srv/mirror로 지정합니다.

Indexes는 필수적이진 않으나 관행상(?) 추가해주고, FollowSymLinks는 미러 내부에 symlink가 존재할 수도 있으니 일단 켜두겠습니다.

 

 

mirror16.png

 

sudo a2dissite 000-default

sudo a2ensite repo

sudo systemctl reload apache2

 

apache의 기본 사이트인 000-default는 비활성화하고 repo를 활성화합니다.

 

 

mirror17.png

 

curl -I http://127.0.0.1/debian/dists/trixie/InRelease

 

이제 방금 만든 사이트가 로컬에서 정상 작동하는지 확인해봅니다.

 

200 OK가 나오면 됩니다.

 

 

mirror18.png

 

가능하면 이렇게 내부망의 다른 장치에서도 접속이 가능한지 확인해봅니다.

 

 


 

▶ 3단계 - APT UPDATE 테스트

 

mirror19.png

sudo vi /etc/apt/sources.list

 

deb http://localhost/debian trixie main contrib non-free non-free-firmware
deb http://localhost/debian trixie-updates main contrib non-free non-free-firmware
deb http://localhost/debian-security trixie-security main contrib non-free non-free-firmware
deb http://localhost/debian trixie-backports main contrib non-free non-free-firmware

 

#deb https://deb.debian.org/debian trixie main contrib non-free non-free-firmware
#deb https://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
#deb https://deb.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
#deb https://deb.debian.org/debian trixie-backports main contrib non-free non-free-firmware

 

이제 sources.list에서 원격 저장소 주소를 모두 deb.debian.org에서 localhost로 바꿔보겠습니다.

 

 

mirror20.png

 

sudo apt update

 

이렇게 로컬 APT 미러를 통해 정상적으로 업데이트 확인이 완료되었습니다.

 

mirror21.png

 

이렇게 어떤 패키지 하나를 설치해도 deb.debian.org의 원격 저장소가 아닌 locahost의 로컬 미러에서 가져오는 것을 볼 수 있죠.