úterý 14. ledna 2014

Hledání souborů v instalačních balících Ubuntu

Občas je potřeba dohledat balík, který obsahuje konkrétní soubor potřebný pro zprovoznění něčeho jiného, případně který balík zanesl do systému to, či ono. Třeba na vás nějaký instalátor, či kompilátor začne sypat názvy modulů, které mu chybí. Napsal jsem pár tipů, které jsem při letmém studiu tématu objevil...





dpkg

dpkg je základním nástrojem pro správu balíků v systémech založených na Debianu. Proto nám dá odpověď na otázky týkající se nainstalovaných balíků, jako třeba s kterým se do systému dostal konkrétní soubor, pokud se tedy kopíroval přímo z balíku.

$ dpkg -S gee-1.0.vapi
libgee-dev: /usr/share/vala/vapi/gee-1.0.vapi

Cesta k souboru musí být buď celá, nebo žádná, přičemž v případě vyhledávání podle názvu souboru bez cesty, nemusí být název kompletní. dpkg každopádně hledá přesný řetězec, žádné regulární výrazy neumí.

Když už jsem u dpkg, zmíním ještě jak vypsat všechny soubory, které se s konkrétním balíkem nainstalovaly a aby to bylo zajímavější, vyhodím z toho adresáře:

$ dpkg -L balík | while read line; do [ -f "$line" ] && echo $line; done


dlocate

dlocate umí v podstatě to samé, co dpkg s přepínači -l a -S, ale umí to zhruba 10x rychleji (řádově 0.03 s vs 0.3 s), seřazené podle abecedy a navíc umí používat regulární výrazy, k čemuž mu dopomáhá klasický grep.

$ sudo apt-get install dlocate

Jak už název napovídá, pracuje na stejném principu jako locate, tedy používá databázi, která se jednou denně aktualizuje z cronu. Vyhledávání pak může vypadat například takto:

$ dlocate -S 'gee.*vapi$'
libgee-dev: /usr/share/vala/vapi/gee-1.0.vapi

Ruční aktualizaci databáze provedete příkazem:

$ sudo update-dlocatedb

apt-file

apt-file je napsaný v Perlu a doplňuje sadu nástrojů rodinky apt. Není v základní instalaci, ale je k mání v repozitáři universe:

$ sudo apt-get install apt-file

Po instalaci vám pravděpodobně vyskočí okno s možností aktualizace systémové cache aplikace, nebo můžete udělat aktualizaci ručně:

$ sudo apt-file update

Aktualizaci také nemusíte spouštět pod rootem, ale můžete si nechat udělat uživatelskou cache v $HOME. Vyhledávání pak vypadá podobně jako v předchozích případech, ale prohledávají se balíky ze všech repozitářů, které byly při předchozí aktualizaci načteny do cache, takže si naopak můžete dohledat balík, který je třeba doinstalovat, abyste mohli daný soubor využívat. To je ostatně daleko častější požadavek, než hledat balíky k již nainstalovaným souborům.

$ apt-file search -x 'gee.*vapi$'
libgee-dev: /usr/share/vala/vapi/gee-1.0.vapi

Přepínač -x zajistí použití výrazu jako regulárního.

apt-cache

apt-cache zajišťuje vytahování informací týkajících se dostupných balíků. S parametrem (příkazem) search prohledává jména a popisy balíků, show zas ukáže podrobnosti konkrétního balíku. Zajímavý je i příkaz policy, který ukáže dostupné verze balíku, včetně zdrojů a jejich priorit. Také se dozvíte, zda je nainstalován a případně v jaké verzi:

$ apt-cache policy firefox
firefox:
  Installed: 26.0+build2-0ubuntu0.13.10.2
  Candidate: 26.0+build2-0ubuntu0.13.10.2
  Version table:
 *** 26.0+build2-0ubuntu0.13.10.2 0
            500 http://cz.archive.ubuntu.com/ubuntu/ saucy-updates/main amd64 Packages
            500 http://security.ubuntu.com/ubuntu/ saucy-security/main amd64 Packages
            100 /var/lib/dpkg/status
     24.0+build1-0ubuntu1 0
            500 http://cz.archive.ubuntu.com/ubuntu/ saucy/main amd64 Packages

Jak je vidět, aktuální verzi firefoxu můžete nalézt hned ve dvou repozitářích. Zobrazená je i cesta k repozitáři, v běžném emulátoru terminálu bývá klikací, tak si ho můžete prošmejdit ve výchozím webovém prohlížeči.

Reverzní závislosti

Dalším zajímavým nástrojem apt-cache je příkaz rdepends, který zjistí všechny balíky závisející na jiném balíku. Sice už nejde o soubor, ale tématicky to není úplně mimo a rozhodně je to užitečné. Například:

apt-cache rdepends consolekit

apt-get

Jen tak pro zajímavost. Přesnou adresu, na které se nachází balík, který by byl aktuálně instalován, můžete vytáhnout ze simulace downloadu:

$ apt-get download --print-uris balík

To, že se balík skutečně nestáhne a jen vytiskne použitou adresu, velikost a hash, zajišťuje přepínač --print-uris.

Závěrem

Manuálové stránky příkazů zmíněných, i nezmíněných, skrývají další (ne)tušené možnosti, občas se vyplatí do nich nakouknout. Pokud máte nějaké vlastní tipy k tématu, rád je uvidím v komentářích.


4 komentáře:

  1. Perfektní souhrn, já používám jen zlomek toho všeho, hlavně proto, že nerad instaluju "nadbytečné" věci. Udělal jsem si ale skript, který vezme soubor, a vypíše k němu všechny informace a la typ, odkud se vzal, náhled atd, to používám často.

    OdpovědětVymazat
  2. Nic světoborného ;)
    http://paste.ubuntu.com/6749518/

    OdpovědětVymazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.