Maskované balíčky HOWTO

Z Gentoo Linux Wiki

Přejít na: navigace, hledání

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

  1. Instalace: emerge flagedit
  2. 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"
V jiných jazycích