見出し画像

apt-mirrorサーバー設置



授業で使うUbuntuのapt updateが遅すぎる件

職場では生徒がUbuntuを使い、いわゆるLAMP(Linux,Apahe,MySQL,PHP)を使ったサイト構築の授業を行っている。
その前段ではLANケーブルを作ったり、IPアドレスの仕組みを学習するなど、一応上から下まですべてのレイヤーを網羅することが真の理解につながるしトラブル対応力も上がるだろうと生徒にはかなり負荷をかけ頑張らせている。

サーバーのアップデートでのつまづき

授業なので40人すべてがパソコン(仮想化環境)にサーバーOSとしてUbuntuをインストールするのだが、必須とも言えるOSのアップデートを40人すべて同時に実行すると学校のプアな回線はいっぱいいっぱいになり、まったく進行しない。
アップデートだけで2回の授業が潰れることもある現状をなんとか改善するために調査したところ、apt-mirrorというスクリプトを利用することでローカルにapt用のミラーサーバーを設置することができるらしいので早速興味ある生徒と一緒に取り組むことにした。

サーバー用機材

Ubuntuのアップデートを利用するのは1年の中でせいぜい2ヶ月程度なのでそれ以外の期間は別の学習(遊び)にも使えるようにしようと最新のRaspberryPi 5 の上位モデル8GB版を学校に頼んで購入してもらった。


調べたところミラーサーバーに必要なディスクスペースは最低1TBくらいほしいとのことなので私のお下がりの2TBディスクとUSB外付けハードディスクケースもセットで購入した。

Ubuntu 24.04.1 LTS Serverのインストール

インストールは学校に大量にあった32GBのmicroSDカードにインストールした、ラズパイ5用のSSDもあるようなので今度試してみたい。
インストール自体はネットの資料にいくらでもあるのでここでは省略するが固定IPアドレス192.168.100.100を設定してsshでログインできるようにした。

apt-mirrorのインストール

$ sudo apt install apt-mirror

特に難しいことはなくインストールは完了する。

ミラーリング用のディスクのマウント

32GBのディスクでは全く足りないので外付けHDDをミラー用のディスクとして利用する。マウントポイントはデフォルトの/var/spool/apt-mirrorとすることにする。

$ sudo fdisk -l
  ディスクの確認
$ sudo gdisk /dev/sda (ディスクがsdaとして認識している)
  新しいパーテーションの追加
$ sudo mkfs.ext4 /dev/sda
 ファイルシステムの構築
$ vi /etc/fstab
UUID=追加したディスクの固有ID       /var/spool/apt-mirror   ext4    defaults 0 0
UUIDは $sudo blkidで確認
$ sudo mount -a
$ chown -R apt-mirror:apt-mirror /var/spool/apt-mirror
  ディスクの所有権はapt-mirrorにしておいた。

apt-mirrorの設定ファイル

/etc/apt/mirror.list

############# config ##################
#
set base_path    /var/spool/apt-mirror
#
set mirror_path  $base_path/mirror
set skel_path    $base_path/skel
set var_path     $base_path/var
set cleanscript $var_path/clean.sh
set defaultarch  amd64
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads     20
set _tilde 0
#
############# end config ##############

deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu noble-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu noble-updates main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu noble-proposed main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu noble-backports main restricted universe multiverse

deb-src http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu noble-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu noble-updates main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu noble-proposed main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu noble-backports main restricted universe multiverse

clean http://archive.ubuntu.com/ubuntu

基本的にデフォルトを利用しているが、defaultarchがそのままではarmなのでクライアントの環境に合わせてamd64にした。
また、24.04を利用しているのでコードネームであるnobleになっているか注意する必要がある。

ミラーリング開始

$ sudo apt-mirror

あとはapt-mirrorをルート権限で実施して待つだけである。かなり時間がかかるので退勤前にセットし、翌朝出勤して見てみると終わっていた。
これでミラーリング完了とは楽ちんなものである。プロセスを見るとwgetが10個動いてたのでネットワークにはかなり負荷がかかっただろう。

apache2のインストール

aptのパッケージ配布にはhttpを利用する、資料も多いapache2を利用することにした。

$ sudo apt install apache2

何度も同じ事書くが楽ちんすぎる、昔はソースをダウンロードしてmakeしていたのが嘘みたい。
インストールが終わったら、勝手にapache2 webサーバーが起動していた。

apache2の設定ファイル

設定ファイルは新しいファイルを作り所定のディレクトに入れるだけである。ファイル名はapt-mirror.confとし、/etc/apache2/sites-availableに入れた。簡単

$ cat /etc/apache2/sites-available/apt-mirror.conf
<VirtualHost *:80>
        ServerName 192.168.100.100
        ServerAdmin メールアドレス
        DocumentRoot /var/spool/apt-mirror/mirror/archive.ubuntu.com
        <Directory /var/spool/apt-mirror/mirror/archive.ubuntu.com>
                Options Indexes FollowSymLinks
                AllowOverride None
                Require all granted
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

ServerNameはとりあえずIPアドレス直指定なのでIPアドレスを入れた。
しばらくはこれで運用する。

新しい設定の有効化とapache2の再起動

$ sudo a2ensite apt-mirror.conf
$ sudo systemctl reload apache2

ブラウザで確認

別マシンで http://192.168.100.100/ にアクセスすると以下画像のように見える、ちゃんと動いているようだ

http://192.168.100.100/

以上でサーバー側の設定は終了

クライアント側の設定

※ここから下はクライアント側の作業です。

先程構築したミラーサーバからアップデートパッケージを取得できるように設定追加する。これも簡単で/etc/apt/sources.list.d/に新たにファイルubuntu.listを作成しその中に取得先を記述する。

$ cat /etc/apt/sources.list.d/ubuntu.list
deb http://192.168.100.100/ubuntu noble main
deb http://192.168.100.100/ubuntu noble-updates main
deb http://192.168.100.100/ubuntu noble-security main

設定が終わったので早速apt updateを試してみる。

#sudo apt update
途中省略

08 kB を 1秒 で取得しました (350 kB/s)
パッケージリストを読み込んでいます... 完了
E: http://192.168.100.100/ubuntu/dists/noble-updates/main/dep11/icons-64x64@2.tar の取得に失敗しました  404  Not Found [IP: 192.168.100.100 80]
E: http://192.168.100.100/ubuntu/dists/noble/main/dep11/icons-64x64@2.tar の取得に失敗しました  404  Not Found [IP: 192.168.100.100 80]
E: http://192.168.100.100/ubuntu/dists/noble-security/main/dep11/icons-64x64@2.tar の取得に失敗しました  404  Not Found [IP: 192.168.100.100 80]
E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

エラー発生(泣)

ここでエラーが発生した、icons-64x64@2.tarファイルが無いと言われている。
ファイルが無いとのことなので、多分サーバー側の問題だろうとネットを同じエラーに遭遇した人がいないか調べると同様のエラーで悩んでいる方が結構いることが判明した。
直接ファイルを取得して配置するという方法もあるが、恒久的に直すためにはapt-mirrorスクリプトを更新(バグがある)する必要があるとわかった。
修正用のdiffファイルがあったので久しぶりにpatchを使うとか考えたけど、修正が微々たる量なので直接ファイルを編集することにした。
https://github.com/apt-mirror/apt-mirror/pull/103

--- a/apt-mirror
+++ b/apt-mirror
@@ -484,7 +484,7 @@ sub sanitise_uri
 {
     my $uri = shift;
     $uri =~ s[^(\w+)://][];
-    $uri =~ s/^([^@]+)?@?// if $uri =~ /@/;
+    $uri =~ s/^([^@\/]+)@// if $uri =~ /@/;
     $uri =~ s&:\d+/&/&;                       # and port information
     $uri =~ s/~/\%7E/g if get_variable("_tilde");
     return $uri;

※ここまではクライアントの設定

apt-mirrorスクリプトの書き換え

$ cd /usr/bin/
$ sudo cp apt-mirror apt-mirror.bak
$ vi apt-mirror
当該箇所の書き換え
$ sudo apt update 

今度はエラーもなく終了した。
ついでにapt upgradeも試してうまくいった。
これで来年度の授業でapt upgradeが原因の授業停滞が無くなると嬉しい。
一緒に構築した生徒も良い勉強になったと思う。
めでたし、めでたし

最後に感想

ザザーと一気に書いたが、構築を考えてから実際に稼働するまで2ヶ月位かかった。apt-mirrorはすでにメンテされておらずバグが残ったままなので何かの助けになればと記事にした。
あまり需要は無いかもしれないけど、生徒と一緒に問題を解決できて私はもちろん生徒にとっても刺激的なミッションだったと思う。
あらためてLinuxシステムはよく考えられていて素晴らしい。
このような高性能なOSが無償で使えるとは本当にありがたい。
先人たちへの感謝の気持を忘れないように、これからも私にできる貢献をしようと気持ちを新たにした。

いいなと思ったら応援しよう!