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.
- kikadff blogja
- A hozzászóláshoz be kell jelentkezni
- 282 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
És itt jön ki, hogy azért adatbázis-szerűségnek is van haszna a minden csomagról tárolok egy-egy txt-fájlt, amit majd greppelgetek. Hol is volt az a szál, hogy az adatbázis mekkora bloat, míg a sima txt mennyivel jobb...
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Khmm.. "történelmileg így alakult".
- A hozzászóláshoz be kell jelentkezni
-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
- A hozzászóláshoz be kell jelentkezni
Jól hangzik. A repo-kban lévő index.txt-nek van ehhez köze, vagy az eddig is volt? :) Tudsz javasolni valamit, ami csak ellenőrzi, hogy van-e elérhető frissítés és kiírja mik azok? checkupdates jellegű megoldásra gondolok.
- A hozzászóláshoz be kell jelentkezni
nincs. a quirks csomagban van egy db ami alapjan dolgozik. pkg_add -nu
-n Don't actually install a package, just report the steps that
would be taken if it was. Will still copy packages to PKG_CACHE
if applicable.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni