<?xml version='1.0' encoding='utf-8'?>
<!-- -*- DocBook -*- -->
<chapter id="pkg-basics"><title>Conceptos básicos del Sistema de Gestión de Paquetes de Debian</title>
<section id="package"><title>¿Qué es un paquete Debian?</title>
<para>
Los paquetes normalmente contienen todos los archivos necesarios para
implementar un conjunto de órdenes o características relacionadas.  Hay dos
tipos de paquetes Debian:
</para>
<itemizedlist>
<listitem>
<para>
<emphasis>paquetes Binarios</emphasis>, que contienen ejecutables, archivos de
configuración, páginas man/info, información de copyright, y otra
documentación.  Estos paquetes se distribuyen en un <xref
linkend="deb-format"/> específico de Debian; se distinguen normalmente por
tener una extensión de archivo '.deb'.  Los paquetes binarios se pueden
desempaquetar usando la utilidad Debian <literal>dpkg</literal>; se dan
detalles en su página de manual.
</para>
</listitem>
<listitem>
<para>
<emphasis>Paquetes Fuente</emphasis>, que consisten en un archivo
<literal>.dsc</literal> que describe el paquete fuente (incluyendo los nombres
de los siguientes archivos), un archivo <literal>.orig.tar.gz</literal> que
contiene el código fuente original sin modificar en formato tar comprimido con
gzip, y usualmente un archivo <literal>.diff.gz</literal> que contiene los
cambios específicos de Debian al código fuente original.  La utilidad
<literal>dpkg-source</literal> empaqueta y desempaqueta los archivos fuente de
Debian; se dan detalles en su página de manual.
</para>
</listitem>
</itemizedlist>
<para>
La instalación de software por el sistema de paquetes usa "dependencias" que
son cuidadosamente diseñadas por los encargados del paquete.  Estas
dependencias están documentadas en el archivo de <literal>control</literal>
asociado con cada paquete.  Por ejemplo, el paquete que contiene el compilador
de C de GNU (<literal>gcc</literal>) "depende" del paquete
<literal>binutils</literal> que incluye el enlazador y el ensamblador.  Si un
usuario intenta instalar <literal>gcc</literal> sin haber instalado antes
<literal>binutils</literal>, el sistema de paquetes de Debian dará un mensaje
de error avisando de que también necesita <literal>binutils</literal>, e
instalará <literal>gcc</literal> sólo si el usuario acepta instalar
<literal>binutils</literal> primero.  (Sin embargo, esta opción puede ser
anulada por el usuario persistente).  Ver más <xref linkend="depends"/> abajo.
</para>
<para>
Las utilidades de paquetes de Debian se pueden usar para:
</para>
<itemizedlist>
<listitem>
<para>
manipular y gestionar paquetes o partes de paquetes,
</para>
</listitem>
<listitem>
<para>
ayudar al usuario en la fragmentación de paquetes que deben ser distribuidos a
través de un medio de tamaño limitado, como disquetes,
</para>
</listitem>
<listitem>
<para>
ayudar a los desarrolladores en la construcción de archivos de paquetes, y
</para>
</listitem>
<listitem>
<para>
ayudar a los usuarios en la instalación de paquetes que residen en un servidor
de FTP remoto.
</para>
</listitem>
</itemizedlist>
</section>

<section id="deb-format"><title>¿Cuál es el formato de un paquete Debian?</title>
<para>
Un "paquete" Debian, o un archivo Debian, contiene los ejecutables, bibliotecas
y documentación asociada con una forma particular de un programa o conjunto de
programas relacionados.  Normalmente un archivo Debian tiene un nombre que
acaba en <literal>.deb</literal>.  Los detalles del formato de los paquetes
binarios Debian se describen en la página de manual <literal>deb</literal>(5).
Este formato interno está sujeto a cambios, así que use siempre
<literal>dpkg-deb</literal>(1) para manipular archivos <literal>.deb</literal>.
</para>
</section>

<section id="pkgname"><title>¿Por qué los nombres de los paquetes Debian son tan largos?</title>
<para>
Los nombres de los paquetes binarios siguen la siguiente convención:
&lt;nombre&gt;_&lt;NúmeroDeVersión&gt;-&lt;NúmeroDeRevisiónDebian&gt;.deb
</para>
<para>
Nótese que <literal>nombre</literal> se supone que es el nombre del paquete.
Como prueba, se puede sacar el nombre de paquete asociado con un archivo Debian
concreto (archivo .deb) de una de las siguientes formas:
</para>
<itemizedlist>
<listitem>
<para>
inspeccionar el archivo "Packages" en el directorio donde se guardaba el
paquete en un servidor de FTP de Debian.  Este archivo contiene un párrafo
describiendo cada paquete; el primer campo del párrafo es el nombre formal del
paquete.
</para>
</listitem>
<listitem>
<para>
usar la orden <literal>dpkg --info nombre_VVV-RRR.deb</literal>.  Esto manda un
mensaje a STDOUT que da, entre otras cosas, el nombre formal del paquete.
</para>
</listitem>
</itemizedlist>
<para>
El componente <literal>VVV</literal> es el número de versión especificado por
el desarrollador original.  Aquí no hay estándares establecidos, así que el
número de versión puede tener formatos tan distintos como "960428" y
"2.7.2.l.3".
</para>
<para>
El componente <literal>RRR</literal> es el número de revisión Debian, y lo
establece el desarrollador Debian (o un usuario individual, si decide construir
el paquete él mismo).  Este número corresponde al nivel de revisión del
paquete debian (que incluye el Makefile específico de Debian, llamado
<literal>debian/rules</literal>, así como el archivo de control Debian,
normalmente llamado <literal>debian/control</literal>).  De este modo, un nuevo
nivel de revisión normalmente significa cambios en el Makefile de Debian, el
archivo de control, los scripts de instalación o desinstalación, o en los
archivos de configuración usados en el paquete.
</para>
</section>

<section id="controlfile"><title>¿Qué es un archivo de control de Debian?</title>
<para>
Se dan detalles sobre el contenido de un archivo de control en el <ulink
url="ftp://ftp.debian.org/debian/doc/package-developer/programmer.ps.gz">manual
del programador de dpkg</ulink>.  Resumiendo, este es un ejemplo de archivo de
control para el paquete hello:
</para>
<screen>
Package: hello
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 472
Maintainer: Santiago Vila &lt;sanvila@debian.org&gt;
Architecture: i386
Version: 2.1.1-4
Depends: libc6 (>= 2.2.4-4)
Description: The classic greeting, and a good example
 The GNU hello program produces a familiar, friendly greeting.  It
 allows non-programmers to use a classic computer science tool which
 would otherwise be unavailable to them.
 .
 Seriously, though: this is an example of how to do a Debian package.
 It is the Debian version of the GNU Project's `hello world' program
 (which is itself an example for the GNU Project).
</screen>
<para>
El campo Package informa del nombre del paquete.  Este es el nombre mediante el
cual el paquete se puede manipular con las utilidades de paquetes de Debian, y
normalmente es parecido (aunque no necesariamente igual) que la primera cadena
de caracteres del nombre del archivo Debian.
</para>
<para>
El campo Version da a la vez el número de versión del desarrollador original
y (como último componente) el nivel de revisión del paquete Debian de este
programa, tal y como se describe en <xref linkend="pkgname"/>.
</para>
<para>
El campo Architecture especifica el procesador para el que fué compilado este
binario en concreto.
</para>
<para>
El campo Depends da una lista de paquetes que tienen que estar instalados para
poder instalar este paquete con éxito.
</para>
<para>
El campo Installed-Size indica cuanto espacio de disco ocupará el paquete
instalado.  Está pensado para que lo usen los programas de instalación para
indicar si existe suficiente espacio de disco para instalar el programa.
</para>
<para>
El campo Maintainer da la dirección de correo electrónico de la persona
actualmente responsable del mantenimiento del paquete.
</para>
<para>
El campo Description da un pequeño resumen de las características del
paquete.
</para>
</section>

<section id="conffile"><title>¿Qué es un conffile de Debian?</title>
<para>
Los conffiles son listas de archivos de configuración, normalmente guardadas
en <literal>/etc</literal>, que el sistema de mantenimiento de paquetes no
sobrescribe cuando se actualiza un paquete.  Esto asegura que los valores
locales de los contenidos de estos archivos se conserven, y es una
característica imprescindible para permitir la actualización de paquetes en
un sistema en funcionamiento.  Para determinar exactamente qué archivos se
conservan durante una actualización, ejecute<literal>dpkg --status
paquete</literal>.
</para>
</section>

<section id="maintscripts"><title>¿Qué son los scripts Debian preinst, postinst, prerm, y postrm?</title>
<para>
Estos archivos son scripts ejecutables que se usan automáticamente antes o
después de que se instale un paquete.  Junto con el archivo
<literal>control</literal>, todos estos archivos forman parte de la sección de
"control" de un archivo Debian.
</para>
<para>
Los archivos individuales son:
</para>
<variablelist>
<varlistentry>
<term>preinst</term>
<listitem>
<para>
Este script se ejecuta antes de que se desempaquete el contenido del archivo
Debian (".deb").  Muchos scripts 'preinst' detienen los servicios de los
paquetes que se actualizan hasta que su instalación o actualización se
completa (después de la ejecución exitosa del script 'postinst').
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>postinst</term>
<listitem>
<para>
Este script normalmente completa cualquier configuración necesaria en el
paquete <literal>nombre</literal> una vez que <literal>nombre</literal> ha sido
desempaquetado de su archivo Debian (".deb").  A veces, los scripts 'postinst'
piden al usuario datos, y/o le advierten de que si acepta los valores por
defecto, tendrá que acordarse de volver atrás y reconfigurar dicho paquete.
Muchos scripts 'postinst' ejecutan las órdenes necesarias para empezar o
reanudar un servicio una vez que el nuevo paquete ha sido instalado o
actualizado.  <emphasis>Es una buena idea el repasar el contenido de un script
'postinst' en busca de consejos de configuración cuando se instale un paquete
por primera vez.</emphasis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>prerm</term>
<listitem>
<para>
Este script normalmente detiene cualquier demonio asociado con un paquete.  Se
ejecuta antes de borrar los archivos asociados a un paquete.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>postrm</term>
<listitem>
<para>
Este script normalmente modifica enlaces u otros archivos asociados con
<literal>nombre</literal>.  (Ver notas sobre <xref linkend="virtual"/>).
</para>
</listitem>
</varlistentry>
</variablelist>
<para>
Todos los archivos de control se pueden encontrar en
<literal>/var/lib/dpkg/info</literal>.  Los archivos importantes para el
paquete <literal>nombre</literal> empiezan con el nombre "nombre" y tienen
extensiones "preinst", "postinst", etc., como corresponda.  El archivo
<literal>nombre.list</literal> en dicho directorio enumera todos los archivos
que se instalaron con el paquete <literal>nombre</literal>.  (Nótese que la
localización de estos archivos es información interna de dpkg; no se debe
confiar en ella.)
</para>
</section>

<section id="priority"><title>¿Qué es un paquete Requerido/Importante/Estandar/Opcional/Extra?</title>
<para>
Cada paquete Debian recibe una <emphasis>prioridad</emphasis> por los
responsables de la distribución, como ayuda al sistema de mantenimiento de
paquetes.  Las prioridades son:
</para>
<itemizedlist>
<listitem>
<para>
<emphasis role="strong">Requerido</emphasis> Los paquetes requeridos son
necesarios para el correcto funcionamiento del sistema.  Esto incluye todas las
herramientas necesarias para reparar defectos del sistema.  No se deben
eliminar estos paquetes o su sistema puede volverse totalmente inestable y
probablemente ni siquiera será capaz de usar dpkg para volver a poner las
cosas en su sitio.  Sistemas con sólo los paquetes requeridos probablemente no
son utilizables, pero tienen la suficiente funcionalidad para permitir al
administrador del sistema arrancarlo e instalar más programas.
</para>
</listitem>
<listitem>
<para>
Los paquetes <emphasis role="strong">importantes</emphasis> están presentes en
cualquier sistema parecido a Unix.  Aquí se encuentran los paquetes sin los
que el sistema no funcionará correctamente.  Esto <emphasis>NO</emphasis>
incluye Emacs, X11, TeX o cualquier otra aplicación grande.  Estos paquetes
sólo constituyen la infraestructura base.
</para>
</listitem>
<listitem>
<para>
Los paquetes <emphasis role="strong">estándar</emphasis> son los típicos en
cualquier sistema Linux, incluyendo un sistema en modo carácter razonablemente
pequeño, aunque no muy limitado.  Se instalará por defecto si los usuarios no
seleccionan nada más.  No incluye demasiadas aplicaciones mayores, aunque
incluye Emacs (que es más una pieza de la infraestructura que una aplicación)
y una parte razonable de Tex y Latex (si es que es posible usarlos sin X).
</para>
</listitem>
<listitem>
<para>
Los paquetes <emphasis role="strong">opcionales</emphasis> incluyen todos los
que razonablemente se desearía instalar a no ser que no se sepa lo que son o
exijan requisitos especiales.  Esto incluye X11, una distribución completa de
TeX, y montones de aplicaciones.
</para>
</listitem>
<listitem>
<para>
Los paquetes <emphasis role="strong">extra</emphasis> tienen conflictos con
otros de mayor prioridad, o es sólo probable que se usen si ya se sabe lo que
son, o tienen requisitos especiales.
</para>
</listitem>
</itemizedlist>
</section>

<section id="virtual"><title>¿Qué es un paquete virtual?</title>
<para>
Un paquete virtual es un nombre genérico que se aplica a uno cualquiera de un
conjunto de paquetes, los cuales proveen todos ellos de una funcionalidad
básica similar.  Por ejemplo, los programas <literal>tin</literal> y
<literal>trn</literal> son lectores de noticias los dos, y por tanto satisfacen
por igual cualquier dependencia de un programa que necesite un lector de
noticias en el sistema para funcionar o ser útil.  Se dice que ambos proveen
el "paquete virtual" llamado <literal>lector de noticias</literal>.
</para>
<para>
Igualmente, <literal>smail</literal> y <literal>sendmail</literal> proveen
ambos de la funcionalidad de un agente de transporte de correo.  También se
dice que ambos proporcionan el paquete virtual "agente de transporte de
correo".  Si cualquiera de ellos está instalado, cualquier programa que exija
la instalación de un <literal>agente de transporte de correo</literal> se
dará por satisfecho con la existencia de este paquete virtual.
</para>
<para>
Debian proporciona un mecanismo mediante el cual, si más de un paquete que
permita el mismo paquete virtual se instala en un sistema, los administradores
del sistema pueden marcar uno como el paquete preferido.  La orden importante
es <literal>alternativas de actualización</literal>, y se describe con detalle
en la sección de <xref linkend="diverse"/>.
</para>
</section>

<section id="depends"><title>¿A qué se refieren al decir que un archivo Depende/Recomienda/Sugiere/Entra en conflicto/Reemplaza/Proporciona otro paquete?</title>
<para>
El sistema de paquetes Debian tiene un conjunto de "dependencias" diseñadas
para indicar (mediante un único indicador) el nivel al que puede operar un
Programa A independientemente de la existencia del Programa B en un sistema
dado:
</para>
<itemizedlist>
<listitem>
<para>
El paquete A <emphasis>depende</emphasis> del paquete B si B tiene que estar
instalado obligatoriamente para que funcione A.  En ese caso, la versión de
dependencia normalmente es un límite inferior, de modo que A depende de
cualquier versión de B más reciente que alguna versión especificada.
</para>
</listitem>
<listitem>
<para>
El paquete A <emphasis>recomienda</emphasis> al paquete B, si el responsable
del paquete considera que la mayoría de usuarios no querrán A sin tener la
funcionalidad permitida por B.
</para>
</listitem>
<listitem>
<para>
El paquete A <emphasis>sugiere</emphasis> al paquete B si B contiene archivos
que están relacionados con (y normalmente mejoran) la funcionalidad de A.
</para>
</listitem>
<listitem>
<para>
El paquete A <emphasis>Entra en conflicto</emphasis> con el paquete B cuando A
no funcionará si B está instalado en el sistema.  La mayoría de las veces
los conflictos son casos en los que A contiene archivos que son una mejora
respecto a los que contiene B.  Los "Conflictos" se combinan frecuentemente con
"reemplazos".
</para>
</listitem>
<listitem>
<para>
El paquete A <emphasis>reemplaza</emphasis> al paquete B cuando archivos
instalados por B son borrados y (en algunos casos) sobrescritos por archivos en
A.
</para>
</listitem>
<listitem>
<para>
El paquete A <emphasis>proporciona</emphasis> al paquete B cuando todos los
archivos y la funcionalidad de B se incorporan en A.  Este mecanismo
proporciona un modo de que los usuarios con espacio de disco reducido instalen
la parte del paquete A que realmente necesitan.
</para>
</listitem>
</itemizedlist>
<para>
Información más detallada sobre estos temas se puede encontrar en el <ulink
url="ftp://ftp.debian.org/debian/doc/package-developer/programmer.ps.gz">ftp://ftp.debian.org/debian/doc/package-developer/programmer.ps.gz</ulink>.
</para>
</section>

<section id="pre-depends"><title>¿Qué significa Pre-Dependencia?</title>
<para>
"Pre-Dependencia" es una dependencia especial.
</para>
<para>
En el caso de la mayoría de paquetes, <literal>dpkg</literal> extraerá el
contenido del archivo correspondiente (p.ej., su archivo
<literal>.deb</literal>) tanto si los archivos de los que depende existen en el
sistema como si no.  Desempaquetar significa que <literal>dpkg</literal>
extraerá los archivos del paquete que se espera que queden instalados en el
sistema de ficheros, y los pondrá en su localización correspondiente.  Si el
paquete <emphasis>depende</emphasis> de la existencia de otro paquete no
instalado en el sistema, <literal>dpkg</literal> se negará a completar la
instalación ejecutando su orden "configure" hasta que los otros paquetes se
instalen.
</para>
<para>
Pero para algunos paquetes, <literal>dpkg</literal> se negará incluso a
desempaquetar los archivos hasta que se resuelvan las dependencias.  Se dice de
esos paquetes que "Pre-dependen" de la presencia de algún otro paquete.  El
proyecto Debian proporcionó este mecanismo para permitir la actualización
segura de sistemas en formato <literal>a.out</literal> a formato
<literal>ELF</literal>, donde el orden en que se instalan los paquetes era
crítico.  Información más detallada sobre el uso de estos términos se puede
encontrar en el <ulink
url="ftp://ftp.debian.org/debian/doc/package-developer/programmer.ps.gz">Manual
del Programador de Debian</ulink>.
</para>
</section>

<section id="pkgstatus"><title>¿Qué significa desconocido/instalar/quitar/borrar/conservar en el estado del paquete?</title>
<para>
Estas marcas indican lo que el usuario desea hacer con un paquete (ya sea
mediante las acciones del usuario en la sección "Select" de
<literal>dselect</literal>, o por las llamadas directas del usuario a
<literal>dpkg</literal>).  Sus significados son:
</para>
<itemizedlist>
<listitem>
<para>
desconocido - el usuario no ha dicho si quiere el paquete
</para>
</listitem>
<listitem>
<para>
instalar - el usuario ha dicho que quiere instalar o actualizar el paquete
</para>
</listitem>
<listitem>
<para>
quitar - el usuario quiere desinstalar el paquete, pero sin borrar cualquier
fichero de configuración que exista.
</para>
</listitem>
<listitem>
<para>
Borrar - el usuario quiere eliminar completamente el paquete, incluyendo
ficheros de configuración.
</para>
</listitem>
<listitem>
<para>
conservar - el usuario no quiere procesar este paquete, quiere mantener la
versión actual con su estado actual, cualquiera que sea.
</para>
</listitem>
</itemizedlist>
<section id="s6.11.1"><title>¿Dónde puedo encontrar información detallada sobre la creación de paquetes Debian?</title>
<para>
Ver <xref linkend="debiandocs"/>.
</para>
</section>

</section>

</chapter>

