Poniższy artykuł opisuje narzędzie portupgrade - jest to
narzędzie zarządzające portami/paczkami w naszym systemie. Dowiemy się z niego
jak w prosty i szybki sposób aktualizować już zainstalowane porty/paczki, jak
sprawdzać "świeżość" naszych programów, jak instalować nowe porty/paczki poprzez portupgrade itp. Po przeczytaniu tego dokumentu docenisz jak pomocny jest portupgrade w codziennym administrowaniu systemem FreeBSD.
Instalacja portupgrade
Tak jak w przypadku innych portów tak i tu, aby zainstalować
portupgrade wystarczy przejść do jego katalogu i wydać magiczne zaklęcie:
# cd /usr/ports/sysutils/portupgrade
# make install clean
Użyjmy sztuczki z moich poprzednich artykułów i sprawdźmy,
które manuale a w związku z tym i narzędzia zostały zainstalowane:
% pkg_info -xL
portupgrade | grep man
/usr/local/man/man1/pkg_deinstall.1.gz
/usr/local/man/man1/pkg_fetch.1.gz
/usr/local/man/man1/pkg_glob.1.gz
/usr/local/man/man1/pkg_sort.1.gz
/usr/local/man/man1/pkgdb.1.gz
/usr/local/man/man1/portcvsweb.1.gz
/usr/local/man/man1/portsclean.1.gz
/usr/local/man/man1/portsdb.1.gz
/usr/local/man/man1/portupgrade.1.gz
/usr/local/man/man1/portversion.1.gz
/usr/local/man/man5/pkgtools.conf.5.gz
/usr/local/man/man1/pkg_which.1.gz
/usr/local/man/man1/portinstall.1.gz
/usr/local/man/man1/ports_glob.1.gz
Najwyższa pora poświęcić trochę czasu i przejrzeć te manuale.
Będziesz miał obraz jak potężna i elastyczna jest kolekcja portów i odkryjesz
sztuczki o których nigdy nie miałeś pojęcia. Jednakże, nie przerażaj się, jeśli
czujesz się odrobinę przytłoczony ilością dostępnych informacji. W kilku
następnych artykułach, poprowadzę cię za rączkę przez konkretne przykłady, abyś
sam zaczął używać tych narzędzi skutecznie.
Na początek przyjrzymy się strukturze portów, gdzie one lezą w
systemie i jak utrzymać ich aktualność.
Kiedy instalowałeś FreeBSD i zdecydowałeś się ze chcesz
zainstalować kolekcję portów, to katalog /usr/ports i jego zawartość została
utworzone tak jak sobie tego zażyczyłeś. Jeśli wylistujesz zawartość katalogu /usr/ports
spostrzeżesz, że kolekcja ta podzielona jest na podkatalogi tworzące logiczne
kategorie. Jak chociażby podkatalogi dla mail, www i databases. Każdy podkatalog
zawiera podkatalog dla odpowienich aplikacji, więc www ma podkatalogi dla
mozilla i lynx. Każdy z tych katalogów zawiera informacje potrzebne do
zainstalowania tej konkretnej aplikacji. Na przykład:
% ls -F /usr/ports/www/mozilla
./Makefiledistinfo pkg-descr pkg-message
../README.htmlfiles/ pkg-descr.gtk2
Kolekcja portów jest ciągle poddawana procesowi aktualizacji.
Nowe porty dodawane są regularnie, zwykle codziennie. Jeśli jesteś ciekawski i
chcesz zobaczyć rozkład kiedy i jakie porty zostały dodane,
http://www.freshports.org/
stanie się nieocenionym źródłem informacji dla ciebie.
Bardzo dobrze jest mieć taką dynamiczną kolekcję portów, ale
oznacza to ze twoje drzewko portów - tzn. struktura katalogów /usr/ports - może
szybko się zdezaktualizować. Aby utrzymać ją w synchronizacji ze zmianami i być
pewnym, że zawsze masz możliwość zbudowania jakiegokolwiek portu trzeba
zastosować cvsup.
Synchronizacja drzewa portów
Wspominałem już o cvsup dość często. Jeśli jeszcze nie
korzystałeś z cvsup, powinieneś przeczytać
Using CVSup oraz zajrzeć do działu
CVSup. Handbook
jest zdecydowanie najlepszym miejscem, aby zrozumieć cały proces cvsup. Kiedy
będziesz gotowy:
# cd /usr/ports/net/cvsup-without-gui
# make install clean
CVSup można wykorzystać do dwóch rzeczy aktualizacji systemu
operacyjnego jak i i kolekcji portów. Jeśli interesuje cię na razie tylko
utrzymanie portów w synchronizacji, to ten plik to zrobi:
# more /root/cvs-supfile
*default host=cvsup.pl.freebsd.org
*default base=/usr/local/etc/cvsup
*default prefix=/usr
*default release=cvs delete use-rel-suffix compress
ports-all tag=.
Ten plik to argument dla polecenia cvsup uruchomionego z konta
superużytkownika:
# cvsup -g -L 2 ~/cvs-supfile
Jeśli ten plik lub te polecenie nie maja dla ciebie sensu,
zapoznaj się z odpowiednią sekcją w handbook'u o której wspominałem wcześniej.
Zwróć uwagę, że =. (kropka) w linii z ports-all jest ważna, więc upewnij się czy
i twój plik tez ją posiada.
Polecenie cvsup ściągnie wszystkie najnowsze kawałki z
kolekcji portów i dodaje je do twojego drzewa portów. Jest to tego typu komenda,
z której uzyskamy wymierne korzyści jeśli będziemy ją odpalać codziennie, więc
być może zechcesz ją dodać jako zadanie dla cron'a.
Proces cvsup również uaktualni plik /usr/ports/INDEX
(od tłum. jak i /usr/ports/INDEX-5 niezależnie czy korzystamy z gałęzi 4.X czy
5.X). Plik ten zawiera całą listę portów. Aby sprawdzić jak bardzo aktualne mamy
porty, skorzystaj z polecenia (od tłum. bazowanie na tym odczycie nie jest
najlepszym wyjściem; bo INDEX{-5} jest uaktualniany ZTCW tylko 2 razy w miesiącu
a zmiany w kolekcji portów są nanoszone codziennie; po drugie sami możemy sobie
wygenerować ten indeks kiedy tylko chcemy; ):
% ls -l /usr/ports/INDEX
-rw-r--r-- 1 root wheel 3678738 May 17 17:04 INDEX
Na tej maszynie system został postawiony 17 Maja i od tamtego
czasu nie aktualizowałem portów. Jeśli porównam to do mojej głównej maszyny, na
której cvsup jest uruchamiany codziennie:
% ls -l /usr/ports/INDEX
-rw-r--r-- 1 root wheel 3912366 Aug 17 08:50 INDEX
Widać ze rozmiar pliku i w związku z tym ilość portów wzrosła
znacznie w przeciągu tych trzech miesięcy.
Aktualizacja bazy portów
W porządku, w końcu jesteśmy gotowi na portupgrade i jego
zestaw narzędzi. Po każdym cvsup, odpal to polecenie:
# portsdb -Uu
Updating the ports index ...
...
7000.........8000.........9000.........10000 ..... done]
Gdy pierwszy raz skorzystasz z tego polecenia zostanie
utworzona baza INDEX.db w katalogu /usr/ports. Ta baza będzie uaktualnia za
każdym razem, gdy powtórzysz polecenie portsdb po świeżej operacji cvsup. Jeśli
skorzystasz z narzędzia file, zobaczysz, że nie będziesz mógł przejrzeć
zawartości INDEX.db (od. tłum w przeciwieństwie do /usr/ports/INDEX{-5}),
ponieważ nie jest to zwykły plik ASCII:
% file /usr/ports/INDEX.db
/usr/ports/INDEX.db: Berkeley DB 1.85/1.86 (Btree, version 3,
native byte-order)
Jednak kilka narzędzi z pakietu portupgrade będzie korzystać z
tej bazy. Btree wskazuje na typ bazy, której algorytmy zostały zaprojektowane do
szybkiego przeszukiwania dużych ilości danych. Jest to idealne rozwiązanie dla
opasłej kolekcji portów - przekonamy się ze niektóre narzędzia portupgrade są
szybsze i bardziej wydajne niż narzędzia z base systemu prezentowane w
poprzednich artykułach, to właśnie z powodu Btree.
Musisz wykazać się odrobiną cierpliwości bo portsdb potrzebuje
chwilki czasu, aby zakończyć swoje działanie. Gdy skończy, jesteś gotowy by
odpalić portversion i przekonać się czy którykolwiek z zainstalowanych portów
wymaga aktualizacji. Pamiętasz to polecenie?
% portversion -v -l "<"
gqview-devel-1.3.1 < needs updating (port has 1.3.5)
Jeśli komenda ta coś zwróci, to twoim następnych krokiem
będzie aktualizacja tych konkretnych przestarzałych portów. Nie bądź zdziwiony,
gdy będziemy używać portupgrade, wywołując go jako portinstall (od tłum. czyli
do instalacji również nowych portów a nie tylko aktualizacji obecnych)
Aktualizacja portów
W najprostszej postaci, 'portupgrade -a' zaktualizuje
wszystkie (ang. all (-a)) nieaktualne porty. Czasami proces ten może zakończyć
się na portach które odmówią aktualizacji. Ta pozorna anomalia to nie
ograniczenie portupgrade, ale kwestia zależności.
Porty maja dwa typy zależności. Pierwszy zwany jest 'zbuduj
zależność' (ang. build dependency) i wskazuje na inne porty, które muszą zostać
zainstalowane zanim właściwy port pomyślnie zostanie dodany do systemu. Drugi
typ zależności odnosi się do portów, które zależą od tego konkretnego portu,
który chcesz sobie uaktualnić. Z pewnością pamiętasz z ostatniego artykułu, że
pkg_delete nie pozwolił usunąć tych aplikacji, jeśli inne aplikację zależały od
nich.
Jeśli tylko podbijesz numerek aplikacji, ale nie sprawdzisz
czy zależności również wymagają aktualizacji, ostatecznie skończysz z
aplikacjami, które odmówią uaktualnienia. Aby się przed tym zabezpieczyć,
wywołuj portupgrade z dodatkowymi dwoma rekursywnymi przełącznikami czyli:
# portupgrade -arR
Przełącznik '-R' sprawdzi zależności wymagane do kompilacji
portu a '-r' zatroszczy się o aplikacje zależne od portu, który jest
uaktualniany. To ochroni twój system przed przestarzałymi zależności i
niekompatybilnością oprogramowania. Czasami, podczas korzystania z portupgrade
lub któregoś z jego narzędzi, może pojawić się wiadomość z prośbą o 'pkgdb -F'.
Mogłeś zapewne domyślić się po nazwie, że te narzędzie uaktualnia bazę paczek
będących w systemie. Baza ta znajduje się w /var/db/pkg/pkgdb.db. I także tu
baza ta wykorzystuje Btree ze względu na optymalny czas przeszukiwania. Jeśli
kiedykolwiek zostaniesz poproszony o uruchomienie 'pkgdb -F' po prostu zrób to.
Jednakże, z własnej inicjatywy nie przerywaj pracy temu poleceniu bo skończysz z
niespójną bazą. Jeśli jednak znajdziesz się w takiej pechowej sytuacji, to
polecenie naprawi spójność twojej bazy (od tłum. czasami to jest doskonałe
remedium na dziwne zachowanie portupgrade):
# pkgdb -fu
---> Updating the pkgdb
[Rebuilding the pkgdb in /var/db/pkg ...
............................................................ done]
Uruchomienie pkgdb z '-F' pozwoli interaktywnie naprawić bazę
(od tłum. właściwie to skorygować zależności):
# pkgdb -F
---> Checking the package registry database
Stale dependency: mod_php4-4.3.4_4,1 -> apache-1.3.29_1 (www/apache13):
apache-2.0.48_1 (score:57%) ? ([y]es/[n]o/[a]ll) [no] yes
New dependency? (? to help):
[Enter] to skip, [Ctrl]+[D] to delete, [.][Enter] to abort, [Tab]
to complete
Odpalenie pkgdb z przełącznikiem '-F' interaktywnie pozwoli
skorygować tą bazę. To znaczy pkgdb zatrzyma się i zapyta co zamierzasz zrobić,
zanim to wykona. Michael Lucas napisał artykuł wyjaśniający jak odpowiadać na te
zapytania ze strony pkgdb. Jeśli jesteś przesadnie ostrożny, alternatywą może
być '-Fa', czyli pkgdb poprawi tylko te rozbieżności co do których nie będzie
miał żadnych wątpliwości. To wszystko tylko tak brzmi przerażająco, w
rzeczywistości jest inaczej. Jest mało prawdopodobne, że kiedykolwiek będziesz
poproszony o uruchomienie 'pkgdb -F' (od tłum. zamiast 'mało prawdopodobne'
raczej pasuje tu 'czasami'). Aplikacja pkgdb jest wykorzystywana również do
innych celów, i w związku z tym zwana jest tez pkg_which.
Korzystanie z pkg_which
pkg_which (lub pkgdb) można wykorzystać, aby odszukać do
którego portu należy konkretny plik. A oto prosty przykład demonstrujący różnice
między wbudowana komenda which i pkg_which:
% which pkgdb
/usr/local/sbin/pkgdb
Polecenie 'which' jest wykorzystywane do odnalezienia ścieżki
do aplikacji. Natomiast pkg_which jest w stanie powiedzieć mi do którego portu
należy dany plik (od tłum. binarka, manual, plik nagłówkowy ... czyli jeśli coś
przyszło z portem pkg_which powie dokładnie z którym).
% pkg_which pkgdb
portupgrade-20030723
A to polecenie jest równoważne z poprzednim poleceniem:
% pkgdb pkgdb
portupgrade-20030723
A o to następny przykład. Powiedzmy, że myszkujesz w /usr/local/,
jest to struktura katalogów zawierająca pliki wykorzystywane przez zainstalowane
aplikacje. Znalazłeś cala garść plików i nie masz najmniejszego pojęcia skąd one
się wzięły lub do której aplikacji nalezą. To zadanie dla pkg_which. Spójrz na
przykładowy fragment z mojego systemu:
% ls /usr/local/bin |
grep yaf
tryaffix*
yaf-cdda*
yaf-mpgplay*
yaf-splay*
yaf-tplay*
yaf-vorbis*
yaf-yuv*
Jeśli jesteś podobny do mnie, to te pliki całkowicie nic ci
tez nie mówią. Zobaczmy do której aplikacji one nalezą:
% pkg_which *yaf*
ispell-3.2.06_3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
kdemultimedia-3.1.3
Polecenie 'pkg_which' ma kilka pożytecznych opcji. Jedna z
nich to '-o', czyli pochodzenie (ang. origin (-o)). Załóżmy ze nie pamiętasz z
której gałęzi portów wywodzi się kdemultimedia-3.1.3. Spróbuj tego:
% pkg_which -o
kdemultimedia-3.1.3
multimedia/kdemultimedia3
Wyjście wskazuje nazwę podkatalogu z którego ten port został
zbudowany czyli /usr/ports/multimedia/kdemultimedia3. Również opcja '-v' może
się przydać. Jeśli chciałbym się dowiedzieć, które aplikacje KDE mam obecnie
zainstalowane to:
% pkg_which -v kde*
kde-config: kdelibs-3.1.3
kdebugdialog: kdebase-3.1.3
kded: kdelibs-3.1.3
kdeeject: kdebase-3.1.3
kdeinit: kdelibs-3.1.3
kdeinit_shutdown: kdelibs-3.1.3
kdeinit_wrapper: kdelibs-3.1.3
kdepasswd: kdeutils-3.1.3
kdeprintfax: kdebase-3.1.3
kdesktop: kdebase-3.1.3
kdesktop_lock: kdebase-3.1.3
kdessh: kdeutils-3.1.3
kdesu: kdebase-3.1.3
kdesu_stub: kdelibs-3.1.3
kdesud: kdebase-3.1.3
kdevdlg2ui: kdevelop-2.1.5
kdevelop: kdevelop-2.1.5
Jak widać wyjście z polecenia jest dość gadatliwe. Każda linia
pokazuje nazwę aplikacji, później znak : (od tłum. znak pełniący tylko funkcje
ogranicznika), i na końcu nazwa portu z której pochodzi ta aplikacja. A tak przy
okazji to wygląda na to, że na tej maszynie jest KDE w wersji 3.1.3 Zanim
przejdziemy dalej, podsumujmy kroki niezbędne, aby mieć zainstalowane
najświeższe oprogramowanie:
-
uruchom 'cvsup' w celu synchronizacji drzewa portów /usr/ports
-
uruchom portsdb, żeby zaktualizować /usr/ports/INDEX.db
-
użyj portversion, aby ustalic które aplikacje wymagają
aktualizacji
-
wykorzystaj portupgrade do aktualizacji tych aplikacji
Dodatkowe opcje portupgrade
Już wiemy, że 'portupgrade -arR' prawidłowo aktualizuje aplikacje. Dodatkowo
portupgrade dostarcza kilku opcji, które pozwalają skrupulatnie wybrać jakie
aplikacje uaktualnić i jak to zrobić. Jedna z bardziej pożytecznych opcji wtedy,
gdy nie masz stałego łącza to '-F'. Zazwyczaj, kiedy aktualizujesz, portupgrade
korzysta z sieci wtedy gdy potrzebuje pliku a potem rozpoczyna kompilacje. Jeśli
robisz większa aktualizacja jak chociażby KDE, to potrzebuje on, abyś przebywał
online przez parę ładnych godzin. Natomiast to polecenie wyskoczy na chwile do
Internetu i tylko ściągnie wszystkie pliki których potrzebujesz do aktualizacji
portu:
# portupgrade -aFrR
Gdy już zassałeś wszystkie niezbędne pliki, możesz już zerwać
połączenie z siecią i tradycyjnie rozpocząć aktualizacje 'portupgrade -arR'.
Kolejna dostępna opcja to '-n'. Przełącznik ten pokaże co portupgrade zrobi, ale
właściwie bez wykonywania tego tak na prawdę (od tłum. czyli symulacja).
Przydatna opcja, gdy jesteś pełen obaw lub masz podejście paranoika i chcesz
wiedzieć już zawczasu co się stanie z twoim oprogramowaniem. A o to wyjście z
takiej sesji:
# portupgrade -anrR
---> Session started at: Sun, 17 Aug 2003 22:06:00 -0400
...
---> Reporting the results (+:done / -:ignored / *:skipped /
!:failed)
- lang/ruby16 (ruby-1.6.8.2003.04.19)
- net/cvsup-without-gui (cvsup-without-gui-16.1h)
+ lang/ruby16-shim-ruby18
(ruby-shim-ruby18-1.8.0.p2.2003.04.19)
+ databases/ruby-bdb1 (ruby-bdb1-0.1.9)
- sysutils/portupgrade (portupgrade-20030723)
- www/lynx (lynx-2.8.4.1d)
---> Session ended at: Sun, 17 Aug 2003 22:06:02 -0400 (consumed
00:00:02)
Przeanalizujmy ten output. Portupgrade przebrnął przez każdy
zainstalowany port w systemie a wynik umieścił w raporcie. Każda linia raportu
to pochodzenie portu, obecnie zainstalowana wersja i symbol wskazujący czy
wymagana jest aktualizacja czy tez nie. W tym powyższym raporcie tylko dwa porty
wymagają aktualizacji. Są to te których linie zaczynają się od znaku '+'.
Przyrównując ten raport do portversion, wyniki będą podobne, ale przedstawione w
inny sposób:
% portversion -l "<"
ruby-bdb1
ruby-shim-ruby18
Jeśli twoją dewiza jest "ostrożności nigdy za wiele" to do
gustu może ci przypaść opcja '-i' (ang. interactive (-i)) czyli opcja
interakcyjna. Dodając ja do reszty opcji, portupgrade po prostu będzie
zatrzymywał się przed każdym uaktualnianym pakietem. To zatrzymanie będzie
wyglądało tak:
# portupgrade -ianrR
...
---> Upgrading 'ruby-bdb1-0.1.9' to 'ruby-bdb1-0.2.1'
(databases/ruby/bdb1)
OK? [yes]
Domyślna odpowiedź to yes w nawiasach kwadratowych. To znaczy
jeśli klepniesz Enter, to twoja odpowiedz będzie brzmiała [yes] chce, pragnę,
musze ;-). Jeśli jednak zdecydujesz nie uaktualniać tego portu, musisz wpisać
słowo no.
Ostatnią opcje jaka chce omówić to '-l' (ang. log (-l)) czyli
logowanie. Opcja nieoceniona w sytuacji, gdy port odmawia instalacji i wyjście
trzeba przesłać do kogoś innego. Tu na przykład uaktualnienie portu i
skierowanie dodatkowo wyjścia do pliku o nazwie logfile:
# portupgrade -rR
ruby-shim-ruby18 -l logfile
Najprawdopodobniej nie będziesz chciał korzystać z opcji '-l'
i '-a' jednocześnie, szczególnie jeśli masz dużo nieaktualnych portów. Nikt nie
chce brnąć przez logi aż tak duże!
O autorze
Dru Lavigne jest nauczycielem na Willis College w Ottawie. W
swoim "nieistniejącym" wolnym czasie, strzela lub jeździ na rowerze po 'Gatineau
Park'.
O tłumaczeniu
Artykuł ukazał się 2003-08-28 na
ONLamp.com : BSD Devcenter
pod adresem
http://www.onlamp.com/pub/a/bsd/2003/08/28/FreeBSD_Basics.html
Tłumaczenie: KaCzY
kaczy(at)xl.wp.pl
Oryginał tego tłumaczenia znajduje się pod adresem
http://www.freebsd.friko.pl/ShowMe.php?txt=Portupgrade
|
Re: Narzędzie portupgrade - łatwiejsze z Dodane przez KaCzY w dniu - 2004-03-01 19:49:36 | | no widze, ze copy & paste Ci dziala :-) | Re: Narzędzie portupgrade - łatwiejsze z Dodane przez arti w dniu - 2004-03-01 21:49:25 | | Hmmm... no i poczułem się głupio ;-) | Re: Narzędzie portupgrade - łatwiejsze z Dodane przez KaCzY w dniu - 2004-03-02 15:08:06 | | Wystarczy ze dasz link do oryginalnej lokalizacji tlumaczenia a winny twoje zostana Ci odpuszczone :-). | to chyba z pośpiechu :) Dodane przez arti w dniu - 2004-03-02 18:30:20 | Oooo... na śmierć o tym zapomniałem. Wynikło to chyba z pośpiechu. Przy poprzednuch dwóch artach dodałem i tutaj też miało być. Dzięki za zwrócenie uwagi, bo pewnie bym tego nie zauważył ;-) | Re: Narzędzie portupgrade - łatwiejsze z Dodane przez dgrabkow w dniu - 2005-02-19 20:30:41 | | Szybko i sprawnie ;-) |
Tylko zarejestrowani użytkownicy mogą pisać komentarze. Prosze zaloguj się i dodaj komentarz. Powered by AkoComment! |