Spkg jsem předevčírem dostal do stavu, kdy jsou všchny důležité vlasntosti naimplementované a už chybělo jen testování na spoustě balíčků. No a už nechybí. :)

Upgrade a instalace potřebovaly znovu otestovat a tak jsem nainstaloval z DVD Slackware-10.1 všechny balíčky z kategorií a, ap, d, l a n. To dává po instalaci 295 balíků zhruba 1GB dat (70 tisíc souborů). Instaloval jsem pomocí `installpkg` a `spkg -i` a následně porovnal výstup příkazu `tree -psufiga` a `find . -type f | xargs md5sum`. Na první pohled to nevypadalo moc nadějně. Instalace pomocí spkg vytvořila mnoho symlinků navíc oproti installpkg, ale to bylo způsobeno tím že v installpkg je chyba, protože ldconfig se nespouští pro adresář do kterého se instaluje (/root), ale vždy pro kořenový adresář. Což není moc platné. Po spuštění `ldconfig -r /root` a opětovném porovnání výstupu psufigy, už bylo vše pozitivnější.

Defakto se pouze lišily velikosti adresářů, protože spkg při instalaci či upgrade, pokud již instalovaný soubor existuje, nejprve vytvoří dočasný soubor a až po dokončení zpracování tgz balíku všechny cílové soubory nahradí. Vytvářením dočasných souborů nám o něco nakynou adresáře ve kterých se tyto soubory vytvářejí. Pokud pak dojde k přerušení instalace/upgrade uživatelem, nebo nesplněním nějaké podmínky pak se prostě odstraní všechny soubory které byly do té doby vytvořeny a vše je jako před instalací. Čili je možně bezpečně přerušit dlouho trvající upgrade mnoha balíků bez obav o konzistenci zrovna upgradovaného balíku a prostě pokračovat později. Cílem vývoje samozřejmě nebylo aby si člověk mohl po zahájení upgrade v 8 hodin ho mohl ve 12 přerušit a pokračovat ráno, ale upgrade balíků výrazně zrychlit. :-)

Upgrade test probíhal tak, že jsem provedl upgrade zmíněných kategorií z slackware-10.1 na slackware-10.2 přímo z DVD. V řeči příkazů, tedy:

`ROOT=/root1 upgradepkg {a,ap,d,l,n}/*.tgz` a pomocí spkg `spkg -u -v -r /root2 {a,ap,d,l,n}/*.tgz`

Poté jsem opět porovnal výstupy psufigy a md5sumu pro /root1 a /root2. Výstup těchto příkazů byl. bez neočekávaných rozdílů, kromě jednoho souboru, který je vytvářen instalačním skriptem bindu (/etc/rndc.key) a má být pro každou instalaci jiný.

Nakonec jsem udělal remove test, abych ověřil že `spkg -d` funguje stejně jako `removepkg`. Opět s porovnáním stavu adresářů /root1 a /root2. Test spočíval v odstranění všech balíků ze skupiny d.

Co nebylo stejné byly časy potřebné pro provedení potřebných operací. Tady jsou čísla:

Příkaz | REAL | USER | SYS
--- | --- | --- | ---
`ROOT=/root1 installpkg {a,ap,d,l,n}/*.tgz` | 16m4s | 7m42s | 3m11s
`spkg -i -v -r /root2 {a,ap,d,l,n}/*.tgz` | 3m41s | 54s | 38s
`ROOT=/root1 upgradepkg {a,ap,d,l,n}/*.tgz` | 33m50s | 18m30s | 6m45s
`spkg -u -v -r /root2 {a,ap,d,l,n}/*.tgz` | 4m39s | 0m50s | 0m40s
`ROOT=/root1 removepkg `cat pkglist`` | 6m6s | 3m43s | 1m3s
`spkg -d -v -r /root2 `cat pkglist`` | 11.8s | 0.67s | 1.18s

Rozdíl oproti testům v mém předchozím příspěvku je v tom, že jsem tentokrát spouštěl instalaci z DVD, kde jsou přítomné soubory s popisem balíku, takže skripty installpkg a upgradepkg měly nyní o něco snažší práci než v předchozím případě, kdy jsem je spouštěl z mého mirroru slackware-current na disku, kde ony soubory nemám. A spkg měl o něco komplikovanější práci, protože jsem nepoužil parametr --no-ldconfig, takže ldconfig se spouštěl po každém nainstalovaném balíku. Spustit ldconfig trvá zhruba 100ms, takže to dává 30s zbytečně navíc pro jak installpkg tak spkg. Ovšem je rozdíl jestli je to 30s z 16m, nebo 30s z 3m40s. Při použití spkg DVD-ROM mechanika seekovala jak o život, takže by se někde v jejím okolí dalo hledat úzké herdlo. ;-)

Malá poznámka na závěr pro ty co stále chtějí používat pkgtools. Spkg trpí stejným problémem jako pkgtools a to tím, že databáze balíčků čítá např. na mém systému 600 malých souborů. A z těchto 600 souborů je potřeba před zahájením upgrade načíst seznam souborů, které jsou v systému nainstalovány. To na mém systému, který už zažil upgrade zhruba 1400 balíčků trvá zhruba 12s, když ty soubory ještě nejsou v cache. Tento čas lze poměrně dobře srazit (u mě na 3s - z toho 800ms je dáno čistě zpracováním obsahu souborů - tj. omezeno výkonem procesoru, čili zrychlení se pohybuje někde v řádu 5x) pomocí drobné "defragmentace" adresářů /var/log/packages a /var/log/scripts. Zde je program defrag.sh:

    #!/bin/sh -e
    rm -rf /var/log/packages~ /var/log/scripts~
    cp -a /var/log/packages /var/log/packages~
    cp -a /var/log/scripts /var/log/scripts~
    rm -rf /var/log/packages /var/log/scripts
    mv /var/log/packages~ /var/log/packages
    mv /var/log/scripts~ /var/log/scripts

Nechce k tomu někdo dopsat grafické rozhraní s kostičkama a progressbarem?

Tímto se spkg velmi přiblížil k verzi 1.0. Ještě to budu nějaký čas používat kde budu moct, a mám v plánu vytvoření testsuite složené z mnoha speciálně vytvořených balíčků, které otestují co nejvíc cest v kódu. Dále je potřeba přidat pár drobných volitelných vlastností, jako je v pkgtools např. upgradepkg --install-new nebo --reinstall. A nakonec bude třeba zaktualizovat dokumentaci.

Nemá někdo nápad na užitečnou vlastnost, která v pkgtools chybí? Napadá mě příkaz --check, který by zkontroloval dané blaíčky a zobrazil soubory, které byly změněny či odstraněny po instalaci balíčku.

Homepage projektu je: http://spkg.megous.com.