Najpierw upewniamy się, że mamy zainstalowany commandline'owy interpreter języka php5:
				
					sudo apt-get install php5-cli
				
				
				Następnie pobieramy listę wszystkich pakietów dostępnych w repozytorium Ubuntu:
				
					apt-cache pkgnames > pkg_list.txt
				
				Teraz lista pakietów znajduje się w pliku pkg_list.txt.
				
Mając listę pakietów, możemy zacząć je pobierać przy pomocy następującego skryptu ubuntu-repo-download.php:
<?php
$lines = file('pkg_list.txt');
foreach ($lines as $pkg) {
    $pkg = trim($pkg);
    $cmd = "apt-get download $pkg";
    echo $cmd . "\n";
    system($cmd);
}
				Skrypt ten pobiera wszystkie pakiety z listy do bieżącego katalogu. Uruchamiamy go poleceniem:
				
				php5 ubuntu-repo-download.php
				
				
Jeśli dużo pakietów pobrało się do bieżącego katalogu, możemy zatrzymać pobieranie (Ctrl+C) i rozdzielić je na podkatalogi o nazwach składających się z pierwszych liter pobranych pakietów. Robimy to przy pomocy skryptu ubuntu-repo-split-files-into-subdirectories.php:
<?php
$srcdir = "/mnt/sdb1/repository";
$destdir = "/mnt/sdb1/repository";
if (is_dir($srcdir)) {
    $files = scandir($srcdir);
    foreach ($files as $file) {
        if (is_file("$srcdir/$file")) {
            $letter = $file{0};
            if (!is_dir("$destdir/$letter")) {
                mkdir("$destdir/$letter");
            }
            if (is_dir("$destdir/$letter")) {
                echo "Moving file: $file\n";
                rename("$srcdir/$file", "$destdir/$letter/$file");
            }
        }
    }
}
					Przed wywołaniem skryptu musimy ustawić poprawne wartości zmiennych $srcdir
					i $destdir na katalog zawierający pobrane pakiety. Skrypt wywołujemy poleceniem:
					
						php5 ubuntu-repo-split-files-into-subdirectories.php
					
				
Następnie - przed kontynuacją pobierania dalszych pakietów - musimy uaktualnić listę pakietów do pobrania. Możemy to zrobić przy pomocy skryptu ubuntu-repo-check-if-downloaded.php
<?php
$repo_dir = "/mnt/sdb1/repository";
$lines = file('pkg_list.txt');
$content = "";
$counter = 0;
foreach ($lines as $pkg) {
    $pkg = trim($pkg);
    $letter = $pkg{0};
    $cmd = "ls " . $repo_dir . "/" . $letter . "/" . $pkg . "_* 2>/dev/null";
    //echo $cmd . "\n";
    $result = system($cmd);
    if (!empty($result)) {
        echo $pkg." is already downloaded\n";
        $counter += 1;
    } else {
        $content .= $pkg . "\n";
    }
}
file_put_contents('pkg_list.txt', $content);
					Skrypt ten działa na strukturze katalogów zbudowanej przez poprzedni skrypt (ubuntu-repo-split-files-into-subdirectories.php).
					Przed jego wywołaniem musimy ustawić poprawną ścieżkę zmiennej $repo_dir.
					Wywołujemy go poleceniem:
					
						php5 ubuntu-repo-check-if-downloaded.php
					
				
Czasami może się zdarzyć, że niektóre pakiety nie pobrały się poprawnie - figurują w katalogu repozytorium jako pliki o zerowej długości. Korygujemy to skryptem ubuntu-repo-remove-empty-files.php:
<?php
$dir = "/mnt/sdb1/repository";
$files = scandir($dir);
foreach ($files as $file) {
    if (is_file("$dir/$file")) {
        if (filesize("$dir/$file") == 0) {
            echo "Removing file: $dir/$file\n";
            unlink("$dir/$file");
        }
    }
    if (is_dir("$dir/$file")) {
        $pkgs = scandir("$dir/$file");
        foreach ($pkgs as $pkg) {
            if (is_file("$dir/$file/$pkg")) {
                if (filesize("$dir/$file/$pkg") == 0) {
                       echo "Removing file: $dir/$file/$pkg\n";
                    unlink("$dir/$file/$pkg");
                }
            }
        }
    }
}
					Przed wywołaniem skryptu musimy zadbać o poprawne ustawienie zmiennej $repo_dir.
					Skrypt wywołujemy poleceniem:
					
						php5 ubuntu-repo-remove-empty-files.php
					
					Po usunięciu pustych plików ponownie tworzymy listę pakietów do pobrania i ponawiamy pobieranie.
				
Gdy już wszystkie pakiety zostały pobrane tworzymy z nich repozytorium. W tym celu zakładamy katalog /var/www/repository a w nim podkatalogi /var/www/repository/repo_01 .. /var/www/repository/repo_09. Każdy z katalogów repo_0x powinien zawierać symlinki do trzech jednoliterowych katalogów zawierających pakiety. Na przykład katalog /var/www/repository/repo_01 powinien zawierać symlinki do katalogów a, b, c. Katalog /var/www/repository/repo_02 powinien zawierać symlinki do katalogów d, e, f. I tak dalej.
					Na koniec dla każdego katalogu /var/www/repository/repo_01 do /var/www/repository/repo_09 wchodzimy
					do jego wnętrza i wywołujemy polecenie tworzące spis paczuszek:
					dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
					Jest to dość czasochłonny proces.
				
					Gdy już stworzyliśmy wszystkie spisy Packages.gz, na komputerze klienckim dodajemy do pliku
					/etc/apt/sources.list wpisy pozwalające korzystać z naszego repo:
					
						deb http://localhost/repository/repo_01 /repo_01
				
						deb http://localhost/repository/repo_02 /repo_02
						...
						deb http://localhost/repository/repo_02 /repo_09