Maskované balíčky HOWTO
Z Gentoo Linux Wiki
Obsah |
[editovat] Úvod
Zaprvé, testovací/unstable balíček, pozná se podle masked by ~keyword.
Maskováno klíčovým slovem - např. ~x86 - znak vlnovky maskuje daný balíček, jako nestabilní na architektuře x86.
| Ukázka maskování pomocí ~keyword |
# emerge gnome-extra/gdesklets-core '''Calculating dependencies''' !!! all ebuilds that could satisfy "gnome-extra/gdesklets-core" have been masked. !!! possible candidates are: - gnome-extra/gdesklets-core-0.26 (masked by: ~keyword) - gnome-extra/gdesklets-core-0.26.1 (masked by: ~keyword) !!! Error calculating dependencies. Please correct. |
Zadruhé tvrdě maskované - nebezpečný, problémový apod. balíček,
pozná se podle masked by: package.mask.
Jde o balíček u nějž jsou známy nějaké problémy, či jehož instalace vyžaduje extra-speciální postup.
| Ukázka Hard Masked balíčku |
# emerge -pv filewatcher These are the packages that I would merge, in order: Calculating dependencies !!! All ebuilds that could satisfy "filewatcher" have been masked. !!! One of the following masked packages is required to complete your request: - app-admin/filewatcher-2.4.3 (masked by: ~x86 keyword) - app-admin/filewatcher-2.4.0 (masked by: ~x86 keyword) For more information, see MASKED PACKAGES section in the emerge man page or refer to the Gentoo Handbook. |
[editovat] Maskované klíčovým slovem
(Masked by keyword)
Nyní používaný způsob je zapsat balíček (i s kategorií) do souboru /etc/portage/package.keywords přičemž je možné specifikovat určitou verzi pomocí větší, menší, rovná se.
Například jedním z těchto příkazů:
echo "gnome-extra/gdesklets-core" >> /etc/portage/package.keywords echo "=gnome-extra/gdesklets-core-2.10.9" >> /etc/portage/package.keywords echo "<=gnome-extra/gdesklets-core-2.10.9" >> /etc/portage/package.keywords
| Poznámka: V package.keywords není potřeba architekturu uvádět, pokud si nepřejete odmaskovat balíček pro jinou, než tu vaši. Ale je doporučené vždy architekturu uvádět! |
Pokud emerge hlásí, že balíček je maskován pomocí "~* keyword", je třeba ho brát doslova a použít např.:
echo "~gnome-extra/gdesklets-core-2.10.9 ~*" >> /etc/portage/package.keywords
Nebo při používání crossdev pro sestavování balíčků pro více architektur.
echo "~gnome-extra/gdesklets-core-2.10.9 ~*" >> /etc/portage/package.keywords/cross-i686-pc-linux-gnu
Je třeba zaměnit i686-pc-linux-gnu v cross-i686-pc-linux-gnu na odpovídající požadované architektuře.
Po zapsání do package.keywords, lze použít emerge např. takto:
emerge =gnome-extra/gdesklets-core-2.10.9
Více informací lze nalézt v package.keywords_TIP.
| Poznámka:
Na příkazové řádce Vám muže ulehčit práci nástroj app-portage/flagedit na správu záznamů v packages.keywords. Ukázka: flagedit gnome-extra/gdesklets-core -- +~x86 Dále např. pro KDE existuje grafický nástroj app-portage/kuroo. Více o podobných nástrojích v Grafické_nástavby_TIP |
[editovat] Starý způsob (nedoporučené)
ACCEPT_KEYWORDS="~x86" emerge gnome-extra/gdesklets-core
Toto je nedoporučovaný způsob, dostupný pouze z historických důvodů. Nepoužívejte ho. Více viz diskuse na anglickém fóru proč není dobré ACCEPT_KEYWORDS .... v podstatě jde o to, že emerge -u world by mohl přeinstalovat na starší verzi, pokud nemá nikde uveden ACCEPT_KEYWORDS (použitý pouze jako shellová proměnná při instalaci tzn. již zapomenutý), čímž by mohlo dojít klidně i k vážnému poškození systému. Volba -U (instalovat pouze novější verze) je také nedoporučená z dobrého důvodu - pokud bylo např. zjišteno, že daná verze balíčku je chybná a byla v portage zamaskována, emerge by se měl vrátit ke starší verzi, -U tomuto chování vždy zabrání.
[editovat] Maskované chybějícím klíčovým slovem
Běžně k tomuto dochází při instalaci balíčku, který nebyl vůbec na dané architektuře testován. Pro povolení instalace tohoto balíčku, jej přidejte i s "~*" do souboru package.keywords.
Například:
echo "net-ftp/vsftpd -* ~*" >> /etc/portage/package.keywords
Pokud máte CVS balíček označovaný verzí 9999 lze provést následující
echo "media-gfx/retina **" >> /etc/portage/package.keywords
Pamatujte si že instalace na netestované architektuře nemusí vůbec fungovat!
[editovat] Tvrdě maskované
(Hard Masked)
Tvrdě maskované balíčky se odmaskují přidáním do souboru /etc/portage/package.unmask. Syntaxe tohoto souboru se pouze liší od package.keywords pouze malinko:
echo "=app-admin/filewatcher-2.4.0" >> /etc/portage/package.unmask
Toto by mělo odmaskovat verzi 2.4.0 balíčku app-admin/filewatcher. Pro odmaskování všech verzí uveďte pouze celý název balíčku:
echo "app-admin/filewatcher" >> /etc/portage/package.unmask
Samozřejmě je možné použít i znaménka větší, menší.
Je velmi běžné, že tvrdě maskovaný balíček je také označen jako testovací/unstable. Takže je potřeba jej uvést do obou souborů - package.unmask i package.keywords.
[editovat] Ruční tvrdé zamaskování
Občas se může vyskytnout potřeba zabránit instalaci balíčku či jeho určité verzi.
To může být situace, například, když chyba v ebuildu zabrání úspěšnému provedení príkazu stylu emerge --update --deep world.
Je možné zamaskovat (a tím přeskočit) daný balíček jeho uvedením do /etc/portage/package.mask např. takto:
echo "=sys-apps/file-4.17-r1" >> /etc/portage/package.mask
Způsob zápisu je stejný jako u výše zmiňovaného package.unmask.
[editovat] Jednoduché úpravy /etc/portage/package.keywords
[editovat] flagedit
- Instalace: emerge flagedit
- Použití: flagedit <balíček> -- +<klíčové slovo>, například flagedit dev-util/libconf -- +~x86
[editovat] gimme
Ukázkový skript na instalaci balíčků maskovaných pomocí ~arch.
| Soubor: /usr/bin/gimme |
#!/bin/bash
################## gimme version 0.5.4 ##################
# Skript pridavajici nazvy balicku do package.keywords. #
# Vytvoril Tekmanx, prepsal Hackeron preprepsal Gherald #
# a jeste upravil D. Watzke #
#########################################################
source /sbin/functions.sh
[[$EUID != 0]] && {
eerror "Nejsi root!"
exit 1
}
[[-z "$1"]] && {
eerror "Prosim uved nazev balicku (napr. gimme <balicek>)"
exit 1
}
[[-d /etc/portage]] || mkdir -p /etc/portage
# Ziskat cely nazev balicku
FQN=$(ACCEPT_KEYWORDS="~x86" emerge -p $1 | grep "$1" | grep 'ebuild ' | tail -n2 | \
head -n1 | sed -e 's/\[ebuild.......\]\ //' -e 's/\[[[:digit:]].*\]//' -e 's/-[[:digit:]].*$//')
# Nejspis je tu zadny nebo vice jak jeden balicek odpovidajici $1
# takze at si s tim poradi uzivatel
[[-z "$FQN"]] && emerge $@ -a; exit
if grep -q "^ *[\>\<=]*$FQN *" /etc/portage/package.keywords; then
ewarn "/etc/portage/package.keywords jiz obsahuje \"$EXISTING\""
emerge $@ -a; exit
else
einfo "Pridavam $FQN do package.keywords a poustim emerge za 5 sekund."; sleep 5
echo $FQN >> /etc/portage/package.keywords
emerge $@ -a
fi
|
Tohle uložit do "gimme" v /usr/bin/ a provést: chmod 755 /usr/bin/gimme
Nyní lze skript používat např. takto: gimme gdesklets-core
[editovat] Skript na práci s /etc/portage/package.unmask
Skript na odmaskování balíčků, tvrdě maskovaných přes /usr/portage/profiles/package.mask
| Soubor: /usr/local/bin/unmask |
#!/bin/bash
#
# Tento skript odmaskuje balicek tvrde maskovany aktualnim profilem
#
# Nejdrive najdeme co je ve skutecnosti maskovano
# v /usr/portage/profiles/package.mask a nasledne pridame
# odpovidajici zaznam do /etc/portage/package.unmask
#
#
# Vytvoril drax@sweon.net
source /sbin/functions.sh
[ "$UID" -ne "0" ] && eerror "Nejsi root!" && exit
[ -z "$1" ] && eerror "Prosim uved nazev balicku (napr. unmask kde-base/kode)" && exit
[ ! -d /etc/portage ] && einfo Vytvarim adresar /etc/portage" && mkdir /etc/portage
if [ "$(grep "$1"-[0-9] /etc/portage/package.unmask 2>/dev/null)" ]; then
ewarn "$1 je uz v package.unmask uveden!"
else
PKG_LINE="$(grep "$1"-[0-9] /usr/portage/profiles/package.mask 2>/dev/null)"
if [ ! $PKG_LINE ]; then
PKG_LINE="$(grep "$1" /usr/portage/profiles/package.mask 2>/dev/null)"
fi
if [ ! $PKG_LINE ]; then
ewarn "Nepovedlo se nalezt $1 v /usr/portage/profiles/package.mask" && exit 1
else
ebegin "Pridavam $1 do package.unmask"
echo $PKG_LINE >> /etc/portage/package.unmask
eend $?
fi
fi
|
Opět, umístěte soubor unmask do /usr/local/bin a proveďte:
chmod 755 /usr/local/bin/unmask
Nyní můžete použít skript např. takto:
unmask kde-base/kode # tato verze skriptu unmask pozaduje plny nazev balicku, vcetne kategorie
Je také možné ho kombinovat s gimme, např.:
unmask kde-base/kode && gimme kode
[editovat] Odmaskování velkých skupin souvisejících balíčku
Od Portage verze 2.1, může být mnoho z /etc/portage/package.* souborů místo toho adresáři. Soubory obsažené v těchto adresářích portage automaticky bere jako jeden.
Speciálně je to výhodné pro modulární X, který má skoro 300 balíčků na odmaskování. Takže je možné zkopírovat odmaskovávací seznam pro modulární X do /etc/portage/package.keywords/xorg (a případně do /etc/portage/package.unmask/xorg) namísto do /etc/portage/package.keywords, což velmi výrazně usnadní správu těchto souborů.
[editovat] Skript na odmaskování všech závislostí
| Soubor: /bin/gimme-everything |
#!/bin/bash
#
# Tento skript odmaskuje vse maskovane danym klicovym slovem
#
# Vyuziva _flagedit_ na odstraneni klicoveho slova
# Pouziti: /bin/gimme-everything "=gnome-2.14.2" "+~amd64"
# Prominte ze to je pouze na jednom radku, ale bylo to tak stvoreno ;)
#
# autor: mmazurek[at]wallix.com
while true; do
if emerge -p "$1" | grep '!!! All ebuilds'; then
emerge -p "$1" | grep '!!! All ebuilds' | while read line; do
n=$(echo $line | sed -e "s/.*\"\(.*\)\".*/\\1/");
flagedit "$n" -- "$2";
done;
else
break;
fi;
done
|
[editovat] Skript na odmaskování všech závislostí (2)
Jiný skript na odmaskování všech závislostí, který nepotřebuje flagedit.
| Soubor: /sbin/unmask |
#!/usr/bin/perl -w
use strict;
sub emerge
{
my $package = shift;
$_ = `emerge -pv "${package}" 2>&1`;
if(m/^- (\S+) \(masked by:.*package.mask/mi) {
print "Odmaskovavam ${1} v package.unmask\n";
print UNMASK "=${1}\n";
return 1;
}
if(m/^- (\S+) \(masked by:.*keyword/mi) {
print "Odmaskovavam ${1} v package.keywords\n";
print KEYWORDS "=${1}\n";
return 1;
}
if(m/^!!! masked or don't exist:\n(\S+)/mi) {
while(emerge($1) != 0){}
return 1;
}
return 0;
}
open(UNMASK, ">>/etc/portage/package.unmask");
open(KEYWORDS, ">>/etc/portage/package.keywords");
our $package = $ARGV[0];
$package =~ s/"/\\"/g;
while(emerge($package) != 0){}
print "Hotovo\n";
close(UNMASK);
close(KEYWORDS);
|
Použití:
unmask ">media-video/mplayer-1.0_rc1"
