OpenBSD elérhető csomagfrissítések ellenőrzése, telepítése

OpenBSD-n ha futtatom a pkg_add -u parancsot a telepített csomagok frissítéséhez, csomagok számától függően, de percekig dolgozik mire megtudom, hogy nincs frissítendő csomag. Miért?

solene blogolt erről. A pkg_add -u úgy működik (ha jól értem), hogy a telepített csomagot ellenőrzi a szerveren, ftp-vel letölti a bináris elejét amit becsövez menet közben a gunzip-be, hogy kinyerje a gzip header-ből az aláírást (hivatalos csomag-e), valamint az infót a verzióról, függőségekről. Ezek alapján eldönti, hogy kell-e frissíteni a csomagot, ha igen, akkor letölti az egészet és frissíti, ha nem, akkor ugrik a következő telepített csomagra. Így végig megy egyenként az összes telepített csomagon.

Érdekesség még, hogy az OpenBSD fél évente jelentkezik egy kiadással, ekkor a ports-ból elkészülnek a bináris csomagok is, amik (7.1 release esetén) a /pub/OpenBSD/7.1/packages repo-ban érhetők el. Ez a repo viszont release után nem módosul. Ha egy csomaghoz biztonsági, vagy bug fix miatt frissítés érkezik, akkor azok a pub/OpenBSD/7.1/packages-stable repo-ba kerülnek. Így a pkg_add ezt a két repo-t ellenőrzi frissítésekért.

A fenti blogjában solene a pkg_add sebességét mérte különböző beállításokkal. A default beállítások szerint a pkg_add https eléréssel használja a repo url-t, valamint az ftp-t használja a letöltésekhez. A default url címe az /etc/installurl fájlban van:

$ cat /etc/installurl                                                    
https://cdn.openbsd.org/pub/OpenBSD

A pkg_add ebből alakítja ki a teljes elérési útvonalat, ami ilyen lesz:

https://cdn.openbsd.org/pub/OpenBSD/%v/packages-stable/%a/:https://cdn.openbsd.org/pub/OpenBSD/%v/packages/%a/

Először a packages-stable repo-ban keres, ha ott nem találja a csomagot, akkor a packages repo-ban ellenőrzi. A blog szerint http url-t használva gyorsabb a pkg_add. A FETCH_CMD környezeti változóval, pedig a letöltéshez használt eszköz írható felül, solene a curl-t használta, amivel szintén sebesség növekedést ért el.

Mivel a packages repo sosem változik, ezért a következő ötlete, hogy a frissítések keresésekor azt a repo-t felesleges ellenőrizni, elég csak a packages-stable repo-ban megnézni, hogy van-e újabb verzió a telepített csomagból. A PKG_PATH környezeti változóval megadható, hogy csak a packages-stable repo-ban keressen.

 

Ezek alapján megnéztem nálam (telepített csomagok száma 334, ebből 17-hez van frissítés a packages-stable repo-ban, de minden csomag up2date) milyen eredmények születnek:

1. Alapértelmezett beállítás: https + ftp:

$ time doas pkg_add -u 
quirks-5.5 signed on 2022-08-25T13:08:28Z
    3m41.34s real     0m19.79s user     0m12.20s system

2. http (/etc/installurl szerkesztve) + ftp:

$ time doas pkg_add -u                              
quirks-5.5 signed on 2022-08-25T13:08:28Z
    1m56.75s real     0m15.30s user     0m10.90s system

Wow! Majdnem fele idő.

3. http + curl

$ export FETCH_CMD="/usr/local/bin/curl -L -s -q -N"
$ time doas pkg_add -u 
quirks-5.5 signed on 2022-08-25T13:08:28Z
    1m23.56s real     0m15.74s user     0m11.36s system

4. http + curl + csak -stable repo:

$ export FETCH_CMD="/usr/local/bin/curl -L -s -q -N"
$ export PKG_PATH="http://cdn.openbsd.org/pub/OpenBSD/$(uname -r)/packages-stable/$(uname -p)/"
$ time doas pkg_add -u 2>&1 | grep -v "^Couldn't find updates for "
quirks-5.5 signed on 2022-08-25T13:08:28Z
    0m10.54s real     0m01.76s user     0m00.56s system

Itt a pkg_add ad egy hibaüzenetet azokhoz a csomagokhoz (317 az esetemben), amiket nem talál a packages-stable repo-ban. Várt jelenség, a grep -v rejti el ezt a visszajelzéset.

 

Egyébként solene ezek alapján készített egy pkgupdate nevű pkg_add wrapper-t, ugyanazt hozza, mint a 4-es pont. Annyi trükk még van a script-jében, hogy első lépésként elmenti a repo csomaglistáját, amit összehasonlít a korábbi példánnyal, ha nincs változás, akkor a pkg_add már le sem fut megkeresni a frissítendő csomagot. Ha már van cache, azaz már van mivel hasonlítani a csomaglistát, akkor egy pillanat alatt végez:

$ time doas pkgupdate 
Updating using http:// protocol
No changes on the mirror.
    0m00.50s real     0m00.01s user     0m00.01s system

 

A 3m41s -hez képest egész jó eredmény.

Hozzászólások

Meglepve látom, hogy van olyan csomagkezelő, ami nem alapból valamilyen listából vagy metaadatból dolgozik. Felteszem, hogy ennek valami oka lehet, mert azért ez amúgy elég alap dolog szerintem.

Nem is lenne itt szerintem ~nagy különbség, ha text fájlból dolgozna az OpenBSD-s pkg_add. Itt valamiért az a metódus, hogy _minden_ telepített csomag repo-ban lévő verziójába beletölt és kitömörít a szükséges infókért. Eleve gyorsabb lenne, ha először egy text fájlban csak ellenőrzi, hogy a repo-ban van-e frissebb verzió a telepített csomagból, majd amelyikből van, csak azokat töltené le és ellenőrizné, hogy aláírt csomag-e. Biztos van valami oka, miért így működik, mindenesetre fura.

-current-ben mar van es 7.2 -ben lesz metadata db:

robert@x395:~> time doas pkg_add -u 
quirks-6.29 signed on 2022-08-29T17:15:32Z
    0m08.52s real     0m06.64s user     0m00.21s system

PKG_PATH csak -stable repo-ra állítása környezeti változóban kinyírja a pkg_info-t, nem ad találatot a keresésekre, csak azokra amik a -stable repo-ban vannak. Szóval az felejtős, vagy csak valami egyéni wrapper script-ben érdemes használni.