Base de Conocimiento Base de Conocimiento

« Volver a Inicio

Estructuras Linux

SPARC VS. X86#

Los procesadores sparc, así como los procesadores x86, son dos claros exponentes de las distintas concepciones que se pueden obtener para la solución de problemas. Mientras que los procesadores x86 (llamados así por la compatibilidad hacia atrás dentro de la misma familia de circuitos) son elaborados con respecto de las especificaciones de arquitectura de juegos de instrucciones CISC (Complex Instruction Set Computer o Computadora con juego de instrucciones complejo), los sparc se elaboran con respecto de las especificaciones RISC (Reduced Instruction Set Computer o Computadora con juego de instrucciones reducido) I y II.

Cada una de las arquitecturas de juego de instrucciones (ISA – Instruction Set Architecture) tiene ventajas y desventajas, y dependerá del proveedor de la solución la determinación del uso de cualquiera de ellas con respecto a sus análisis de prestaciones, desempeño, viabilidad, factibilidad o costos asociados a la implementación. Por ejemplo: un procesador con tecnología RISC requiere de un menor juego de instrucciones para la ejecución de mandatos, siendo una de las razones por la cual el desempeño de las aplicaciones elaboradas para esta plataforma sea muy estable, pero ocasionando que muchos de los compiladores disponibles para ella no hagan uso pleno de las capacidades del chip. Con los procesadores CISC obtenemos un juego de instrucciones amplisimo y, como en el caso de la familia IA32 (x86), con compatibilidad hacia atrás para con procesadores mas viejos de 4, 8 y 16 bits, lo que nos permite hacer uso de sistemas de legado (legacy) en procesadores actuales, pero así mismo obtenemos cierto desperdicio en las capacidades propias de la circuitería. En la familia de procesadores IA64 (Itanium) se ofrecen circuitos con mayores prestaciones, pero perdiendo la compatibilidad hacia atrás con otros productos.

Específicamente para los sistemas Sparc (32 y 64 bits), el sistema operativo suele ser Solaris de Sun, el cual solamente encontrabamos disponible para esta arquitectura. Sin embargo, y atendiendo (y entendiendo) la demanda del mercado informático, Sun libera, primero, su versión de Solaris 9 para arquitectura x86, permitiendo el uso de este sistema de una manera mas amplia. Posteriormente, libera una parte de su código, surgiendo de esta manera el sistema OpenSolaris para plataformas x86 y permitiendo con ello una gran retroalimentación por parte de la comunidad de desarrolladores interesados en aportar su tecnología a esta plataforma abierta.

Red Hat, proveedor de sistemas GNU/Linux para el mercado corporativo, distribuye una versión comercial de herramientas pública y libremente disponibles, pero añadiendo mejoras y compartiendo los resultados con el mismo método. Linux es un sistema operativo por demás versátil, ya que su naturaleza modular permite incrustarlo en diminutos circuitos.

(por ejemplo: relojes, circuitos de control), hardware de legado (por ejemplo: equipo viejo 80386, 80486), PDA's, SmartPhones, ruteadores, equipos de alta disponibilidad, así como ser un sistema operativo que está disponible para prácticamente cualquier arquitectura ISA actualmente (ARM, IA32, IA64, Sparc, Alpha, x86-64, por nombrar algunas). En particular, Red Hat Enterprise Linux se encuentra disponible tanto para plataformas IA32, IA64, x86-64, así como Sparc.

En cuestión de compatibilidad y conformidad con respecto de estándares, los sistemas Unix (y en particular Solaris) cumplen completamente los requerimientos del estándar POSIX (Portable Operating System Interface – Interfaz de Sistema Operativo Portable), mientras que las distribuciones Linux, que si bien no cumplen en su totalidad los requerimientos de dicho estándar si los cubren ampliamente, logrando con ello un gran nivel de afinidad con respecto de los comandos especificados en POSIX y que nos permite como usuarios obtener prácticamente los mismos resultados con los mismos comandos en ambas plataformas. De manera análoga, el crecimiento que ha tenido Linux, así como su gran adopción en entornos productivos, de escritorio y de desarrollo, ha ocasionado que haya sistemas novedosos, o actualizaciones de viejos sistemas, que por sus características de funcionamiento impiden su directa compilación y ejecución en entornos ajenos a los que fueron creados. Viendo esta peculiaridad, se desarrolla una especificación de conformidad para aplicaciones Linux, llamada LSB (Linux Standar Base – Base Estándar Linux) que viene a complementar lo ofrecido por POSIX. Las versiones de Unix, tanto comerciales como abiertas (BSD), que adopten cierta compatibilidad con la LSB, permitirán la adopción de herramientas y aplicaciones desarrolladas para Linux en un entorno de trabajo Unix. Solaris implementa LSB en su versión 2.0.

Con esto, una de las situaciones que podemos observar es la diversificación de tecnologías, mas que ofrecernos una divergencia, nos están dando la capacidad de converger en un punto donde tanto la compatibilidad como la interoperabilidad entre los distintos sistemas nos ofrecen un amplio espectro para la oferta de soluciones.

EL SISTEMA DE JERARQUÍA DE FICHEROS#

El Filesystem Hierarchy Standard (Estándar de Jerarquía de Sistema de Ficheros) o FHS define los directorios principales y sus contenidos en el sistema operativo LinuxGNU/Linux y otros sistemas de la familia Unix. Se diseñó originalmente en 1994 para estandarizar el sistema de archivos de las distribuciones GNU/Linux, basándose en la tradicional organización de directorios de los sistemas Unix. En 1995 se amplió el ámbito del estándar a cualquier Unix que se adhiriese voluntariamente.

Todos los archivos y directorios aparecen bajo el directorio raíz /, aunque se encuentre en distintos dispositivos físicos. Ejemplos de directorios definidos por FHS incluyen:

/bin/ Ordenes esenciales, binarios para todos los usuarios (cat, ls, cp...). /dev/ Dispositivos. /home/ Directorios de datos de los usuarios. /etc/ Ficheros de configuración del sistema. /lib/ Librerías esenciales para los binarios de /bin y /sbin. /var/ Ficheros variables utilizados por programas instaladas, como logs y archivos temporales. /opt/ Paquetes de programas de aplicaciones estáticos. /sbin/ Binarios de superusuario esenciales (init, route, ifup..). /proc/ Sistema de archivos que documenta el estado del núcleo (kernel), principalmente archivos de texto (tiempo, red...), estos archivos permiten conocer y cambiar ciertos parámetros del núcleo sin necesidad de reiniciar el sistema. /media/ Sistemas de archivos montados temporalmente. /mnt/ Sistemas de archivos montados temporalmente (obsoleto).

CODIFICACIÓN LITTLE-ENDIAN VS BIG-ENDIAN#

El término endianness (finalización) se refiere a la técnica adoptada para el ordenamiento de los bytes (y anteriormente, de bits) dentro de las distintas localidades de memoria de un equipo de cálculo, a nivel físico (hardware). Esto ocasiona que el sistema operativo de dicho dispositivo tenga que asimilar dicho método de ordenamiento para la ejecución, lectura y movimiento de la información dentro de los distintos elementos de almacenamiento del equipo.

Existen 3 técnicas de finalización, y la adopción de esta depende del análisis de requerimientos del fabricante. La técnica de big-endian (el extremo mayor finaliza primero) acomoda los bytes dependiendo del tamaño de la palabra, colocando en primera instancia la última palabra de la instrucción y, en última instancia, la primera palabra. Por ejemplo, para ordenar la instrucción 0x666973676c656173 en un equipo con un tamaño de palabra de 32 bits mediante big-endian, obtendremos:

...0x61730x6c650x73670x6669...

incremento de localidades -->

Algunas arquitecturas de microprocesadores que utilizan este tipo de ordenamiento son los procesadores de Motorola, PowerPC y Sparc (aún cuando para la versión 9 adopta la técnica mixed-endian). La técnica little-endian (también denominado como el “formato Intel”) coloca las palabras de las instrucciones de modo incremental, sin modificar su ordenamiento, simplificando en muchas ocasiones los accesos a pilas y localidades de memoria por parte de los algoritmos y programas ensamblados. Para ejemplificar, la misma instrucción arriba utilizada:

...0x66690x73670x6c650x6173...

incremento de localidades -->

La técnica de middle-endian, denominada tambien bi-endian o mixed-endian, es una mezcla de las dos anteriores, combinando el posicionamiento en memoria de las palabras de instrucción o datos. Algunos procesadores que utilizan este método de posicionamiento son los ARM, PowerPC (excepto el PPC970/G5), DEC Alpha, Sparc v9, MIPS, PA-RISC y los IA64. El ordenamiento mediante middle-endian en la instrucción dada, con un tamaño de palabra de 32 bits posiciona, contando a partir del byte más significativo, el 2do byte primero, luego el 1ro, luego el 4to y finalmente el 3ro:

...0x73670x66690x61730x6c65...

incremento de localidades -->

El uso de cada técnica es determinada por el fabricante de la arquitectura, siendo la elección tomada con respecto del hardware.

ALMACENAMIENTO DE DATOS DE APLICACIÓN#

Sea cual fuere el método de finalización (endianness) proporcionado por la arquitectura, la lectura de los datos e instrucciones deberá ser transparente para las aplicaciones ya que será el sistema operativo quien interactue con el hardware y proporcione la interfaz para la aplicación. De igual manera, el sistema de archivos (filesystem) actuará de manera independiente al método de finalización proporcionado, siendo afectadas todas aquellas aplicaciones que trabajen con datos en crudo (raw data), con las cuales se deberá tener cuidado en la migración de los datos implicados en la operación ya que deberán sufrir una actualización de formato si es que se debiera cambiar método de finalización, aunque generalmente estos datos no son transferibles entre arquitecturas. Al utilizar un mismo sistema operativo (ya sea Sun Solaris o Red Hat Enterprise Linux) en cualquiera que sea la arquitectura, el acceso a los datos deberá ser transparente para las aplicaciones que hagan uso de estos.

DIFERENCIA ENTRE COMPILADORES#

Cada plataforma tiene cierta predilección hacia el compilador o compiladores que utilizará como recomendados, ya sea por el grado de optimización que se obtiene en las aplicaciones derivadas, o en las prestaciones específicas de la herramienta. En los últimos años, muchos Unix comerciales han echado mano de los compiladores libres gracias a la gran adaptabilidad que este tipo de herramientas presentan, no dejando de lado las herramientas propias del sistema.

Por ejemplo Solaris 10 trae consigo varias herramientas que proporcionan un entorno parecido a Linux, para su uso por parte de los desarrolladores de aplicaciones y sin perder de vista la inclusión de su propia suite de desarrollo mediante el Sun Developer Studio 11, el cual trae consigo los compiladores propuestos por el proveedor. Algunas de las herramientas que podemos encontrar en Solaris 10 y que nos permiten trabajar con un entorno parecido a Linux son:

CategoríaHerramienta
Set de mandatos GNUComandos especificados en el estándar POSIX, proveyendo portabilidad de los comandos entre las plataformas
Interprete de mandatos (shell)Bash
Guiones (scripting)Bash, Perl, Python, Tcl/Tk, gawk, sed
Entornos gráficosGNOME, KDE, GTK+
Compiladores y librerías de ejecuciónC, C++, G77, glibc ...
Herramientas de desarrollo de softwareLd, ldd, lorder, ar, elmdump, Gmake, ant, nm, gprof, RCS, CVS
Herramientas de depuraciónGdb, DDB
Servicios WebApache, Tomcat, JBoss
Servicios JavaSun JRE, Sun JDK

En Linux se cuenta con una amplisima gama de herramientas para el desarrollo de soluciones, obligando a cada distribución a elegir un cierto número de estas e implementarlas como un juego por defecto, o recomendado para dicha distribución. Por ejemplo, distribuciones como Debian GNU/Linux tiene como filosofía el proveer la mayor cantidad de aplicaciones para cualquiera de sus usuarios, delegando a estos la tarea de elección de las herramientas a utilizar mediante la presunción de que los usuarios saben que herramientas necesitan (o la obligación de los mismos a documentarse). Por otro lado, distribuciones basadas en Red Hat Enterprise proveen un juego de herramientas mas reducido (sin dejar de ser amplio) orientadas hacia servidores de aplicaciones y servicios de uso genérico, contando además con cierto nivel de preconfiguración y seguridad de la plataforma, así como de proveer un cierto número de aplicaciones que facilitan la administración del propio sistema.

Cualquier distribución GNU/Linux es capaz de desempeñar las mismas tareas que cualquiera otra, pero depende de la capacidad y habilidad del operador del sistema para la puesta en marcha de las aplicaciones y de la interacción de esta con todo el sistema.

CONSTRUCCIÓN DE APLICACIONES#

Una de las particularidades de los sistemas GNU/Linux es la instalación y puesta en marcha de aplicaciones a partir del código fuente de estas, mediante un proceso de compilación que si bien es particular para cada sistema, permite identificar una serie de pasos “base” para la construcción de la aplicación (favor de referirse a la documentación específica de dicha aplicación). Cabe mencionar que, para la instalación de programas mediante este método, es indispensable contar con las herramientas de desarrollo necesarias para la compilación de la aplicación.

Dependiendo de la distribución y versión con la cual contemos, lo mínimo requerido será un compilador (pej. gcc, gcc-c++), herramientas de autoconfiguración (automake, make, m4), depuradores (pej. bison) así como las librerías de desarrollo requeridas para la aplicación (pej. ncurses, gtk, gtk+, kdelibs, gtk#, etc)

El primer paso es el obtener el código fuente de la aplicación deseada, regularmente en un formato tar comprimido (denominado tarball). Este tarball regularmente contiene el código fuente de la aplicación, así como las instrucciones para su compilación e instalación además de otros objetos requeridos para el funcionamiento del sistema (imágenes, ficheros de configuración, definición de rutas, etc). Hay que descomprimir dicho tarball en el directorio de fuentes de aplicaciones (regularmente /usr/src) mediante el comando:

# tar xvfz paquete-version-release.tar.gz
Esto nos da como resultado una carpeta conteniendo toda la información requerida para la construcción del paquete. Una vez leida la documentación del sistema procedemos a cambiarnos al directorio recién creado, donde configuraremos los parámetros de compilación específicos para la aplicación, como puede ser la ruta de instalación, banderas de compilación (optimización), arquitectura, etc. Por ejemplo:

# cd paquete-version-release

  1. ./configure --with-package=/path/to/package \

--enable-widget \ --disable-gizmo \ --with-x=29 \ --with-blah-blah-blah CFLAGS="-O1 -g -mcpu=i686 -L/usr/unlikely/lib \ -I/usr/unlikely/include -Wl,-R/usr/unlikely/lib" }}}

Debemos estar atentos a los distintos mensajes que arroje el proceso, ya que este nos indicará algunos fallos o advertencias durante la configuración del paquete. Procedemos ahora a la construcción (compilación) del paquete mediante al comando:

 # make 
Este es en si el proceso de compilación. En este paso detectaremos paquetes faltantes requeridos (dependencias) para el uso de nuestro paquete. Nuevamente estaremos atentos a la salida del procedimiento, para detectar componentes faltantes o errores y advertencias originados. Si el procedimiento finaliza de manera correcta (sin errores y atendiendo las advertencias), procedemos a la instalación:
# make install 

Nota: Si planea desinstalar esta aplicación, no elimine la carpeta en la cual compiló o construyó la misma, ya que esta carpeta contiene la información de instalación del paquete y solamente tendremos que recurrir al siguiente mandato para desinstalarla

# make uninstall 

EMPAQUETAMIENTO DE APLICACIONES#

RPM Package Manager (o RPM, originalmente llamado Red Hat Package Manager) es una herramienta de administración de paquetes pensada básicamente para GNU/Linux. Es capaz de instalar, actualizar, desinstalar, verificar y solicitar programas. RPM es el formato de paquete de partida del Linux Standard Base (LSB).

Originalmente desarrollado por Red Hat para Red Hat Linux, en la actualidad muchas distribuciones Linux lo usan, dentro de los cuales las más destacadas son: Fedora Linux, Mandriva Linux, SuSE Linux, Conectiva Linux, Ubuntu Linux y otros más sencillos como Sabios Linux. También se ha portado a otros sistemas operativos.

RPM es un formato orientado hacia la facilidad de administración de los paquetes instalados en un equipo GNU/Linux, proveyendo de un sistema precompilado para cierto entorno objetivo (target). Para la instalación de un paquete RPM es necesario que nuestra distribución GNU/Linux tenga capacidad para el uso de dicho formato (como los arriba comentados). Al proveer un sistema binario (previamente compilado) ya no es necesario contar con un entorno de desarrollo como el requerido por los tarballs. Además, RPM nos provee de una base de datos de las aplicaciones instaladas bajo este formato, permitiendonos administrar de mejor manera el control de versiones de las aplicaciones, automatización de actualizaciones, consultas a la base de datos para consultas sobre dependencias de otras aplicaciones, redituandonos en reducción de esfuerzo, tiempos y costos originados por la instalación de paquetería en nuestro sistema.

La sintáxis básica para la instalación de un paquete en formato RPM es:

# rpm –install paquete-version-release.rpm

Además de poder efectuar distintas tareas con el mismo mandato (mayor información, 'man rpm')

# rpm -iv paquete-version-release.rpm #Instala el paquete, con información de salida
# rpm -Uv paquete-version-release.rpm#Actualiza el paquete, con información de salida.
# rpm -qp paquete-version-release.rpm #Solicita mayor información sobre el paquete no instalado
# rpm -q paquete #Solicita información sobre el paquete previamente instalado via rpm
# rpm -e paquete#Desinstala un paquete previamente instalado via rpm
# rpm -e –nodeps paque#Desinstala el paquete sin importar sus codependencias

Aún cuando el formato RPM nos provee una muy sencilla herramienta para la administración de paquetería, aún debemos lidiar con la resolución de dependencias para nuestros paquetes.

Red Hat nos provee de herramientas que facilitan aún más la administración de nuestro sistema. Mediante la suscripción a RHN, Red Hat nos proporciona un servicio de actualizaciones y de adquisición de paquetería muy sencillo y basado en su formato RPM. Para Red Hat Enterprise Linux 4 (RHEL4) la herramienta se llama up2date, para la versión Red Hat Advanced Server 5 (RHAS5) se utiliza la herramienta YUM.

Ambas herramientas (up2date y yum) tienen una funcionalidad similar: a través de depósitos contenedores de paquetes en formato RPM precompilados para nuestro sistema facilitar la actualización, instalación y remoción de paquetería, así como el cálculo y resolución de depedencias de manera automática.

# up2date -i paquete

  1. yum install paquete
  2. yum remove paquete }}}

MANEJO DE DISPOSITIVOS#

En Linux, todo es representado mediante ficheros. Esto incluye al hardware. Es decir, cada componente de hardware conectado a nuestro equipo será representado mediante un fichero dentro de nuestro mismo sistema. Todas las representaciones estarán contenidas dentro de la carpeta /dev de nuestro sistema de ficheros. Por ejemplo:

/dev/hda#Disco PATA, maestro del primer bus
/dev/hda1#Disco duro, maestro de primer bus, primera partición
/dev/sdc2 #Unidad de almacenamiento SCSI, USB o SATA, tercer bus, segunda partición
/dev/cdrom#Nemónico para unidad de almacenamiento óptica
/dev/ttyS0#Puerto de transmisión en serie
/dev/mice#Nemónico para dispositivo apuntador (mouse)

Estos ficheros solamente contienen información sobre el vínculo (nodos) entre el hardware y el sistema operativo. Es decir, como habremos de utilizar dichos dispositivos.

Sin embargo, contamos con otros ficheros que solamente estarán disponibles en nuestro sistema en tiempo de ejecución. /proc es un sistema de ficheros que se crea al vuelo, y el cual contiene la infomación sobre los procesos en ejecución dentro de nuestro entorno de trabajo. Dentro de este sistema de ficheros podremos encontrar información sobre cómo está siendo aprovechado nuestros recursos. Por ejemplo:

/proc/cpuinfo#Información sobre los procesadores y sus núcleos (frec. de reloj, memoria
/proc/meminfo#caché, flops, arquitectura, etc.)
/proc/diskstats#Información detallada sobre el uso de la memoria

NIVELES DE EJECUCIÓN#

Es En sistemas GNU/Linux y otras versiones de Unix, init es el programa encargado de llevar la estación al nivel de ejecución en que se desea que opere. Init es el primer proceso en ejecución después del la carga del Kernel e implementa dos sistemas de inicio: System V, o BSD-Like. Estos sistemas especifican los guiones (scripts) de arranque para inicializar los diferentes servicios, programas o registros que sean necesarios para que el sistema funcione como el usuario quiere o como el administrador estableció.

En los sistemas GNU/Linux se especifican hasta 7 niveles de ejecución (también conocidos como runlevels o niveles de corrida). En las distribuciones Red Hat, así como en la gran mayoría de distribuciones, la especificación de los niveles de ejecución son como sigue:

Nivel de ejecución 0#

Halt. Este nivel de ejecución se encarga de detener todos los procesos activos en el sistema, enviando a la placa madre una interrupción para el completo apagado del equipo.

Nivel de ejecución 1#

Single. Nivel de ejecución monousuario, sin acceso a servicios de red. Este nivel es regularmente utilizado en tareas de mantenimiento del sistema, y el usuario que ejecuta es root.

Nivel de ejecución 2#

Al igual que el nivel de ejecución monousuario, pero con funciones de red y compartición de datos mediante nfs.

Nivel de ejecución 3#

Sistema multiusuario, con capacidades plenas de red, sin entorno gráfico. Este nivel de ejecución es el recomendado para sistemas de servidor, ya que evita la carga innecesaria de aplicaciones consumidoras de recursos.

Nivel de ejecución 4#

Nivel especificado, pero no se utiliza.

Nivel de ejecución 5#

Al igual que el nivel de ejecución 3, pero con capacidades gráficas. Ideal para entornos de escritorio.

Nivel de ejecución 6#

Reboot. Este nivel de ejecución se encarga de detener todos los procesos activos en el sistema, enviando a la placa madre una interrupción para el reinicio del equipo.

Los guiones de ejecución de mandatos especificos de cada nivel de ejecución se encuentran almacenados en las carpetas /etc/rc{0..6}.d/, siendo únicamente enlaces simbólicos hacia los guiones específicos de las distintas aplicaciones.

Es decir, cuando elegimos entrar a nuestro sistema en cierto nivel de ejecución (por ejemplo, 3), los guiones init que se ejecutarán son los que se encuentren en la carpeta /etc/rc3.d/. El nombre del guión de ejecución se compone básicamente de tres elementos: si el nombre del guión comienza con una letra 'K', se está especificando que para ese nivel de ejecución específico el guión dará de baja (matar, o kill) los procesos iniciados por dicho guión. Por el contrario, si el nombre

del guión comienza por la letra 'S' dicho guión iniciará (start) dicha tarea. Además, estos guiones se ejecutan en orden alfabético, por lo que hay que determinar cual es el orden de ejecución mediante la inclusión de un número de dos dígitos después de la primera letra del nombre del guión. El tercer elemento del nombre del guión especifica en si mismo el nombre del servicio o tarea con la cual se va a trabajar. Ejemplo:

lrwxrwxrwx  1 root root 19 oct 26  2005 K99readahead -> ../init.d/readahead 
lrwxrwxrwx 1 root root 25 oct 26 2005 K99readahead_early -> ../init.d/readahead_early lrwxrwxrwx 1 root root 23 oct 26 2005 S00microcode_ctl -> ../init.d/microcode_ctl lrwxrwxrwx 1 root root 18 oct 26 2005 S06cpuspeed -> ../init.d/cpuspeed }}}

LOS MANDATOS CHKCONFIG Y SERVICE#

Red Hat, al ser una distribución orientada al mercado de servidores corporativos, se ha esforzado en proporcionar herramientas útiles para el manejo de los servicios que habremos de utilizar. Este es el caso de las herramientas chkconfig y service.

El mandato service (ubicado en /sbin) ejecuta el servicio enviado como primer parámetro, con la funcionalidad enviada como segundo. Es decir:

# service kudzu stop#Detiene la ejecución del servicio 'kudzu”.
# service named start#Invoca el servidor de resolución de nombres para su inicio
# service squid restart#Apaga completamente el servicio squid, para posteriormente volver a levantarlo
# service httpd reload#Recarga la configuración del servidor web, sin necesidad de apagarlo previamente
# service network status#Nos indica el estatus del servicio de red
# service –status-all#Nos indica el estatus de todos los servicios disponibles

A diferencia de service, chkconfig (también localizado en /sbin) nos permite controlar la ejecución de servicios entre reinicios del equipo. Es decir, es el responsable de administrar dentro de la carpeta /etc/rcx.d si un guión se ejecuta (S), o se apaga (K) en determinado nivel de ejecución:

# chkconfig kudzu off#Indica que el servicio kudzu no estará disponible para ningún nivel de ejecución.
# chkconfig httpd on#Indica que el servidor web estará disponible para todos los niveles de ejecución especificados para dicho servicio
# chkconfig –level 35 squid on#Indica que el servidor proxy squid estará disponible únicamente para los niveles de ejecución 3 y 5
# chkconfig –list#Lista todos los servicios configurados, así como su estado predeterminado en cada nivel de ejecución

SHELL DE COMANDOS#

Bash es un shell de Unix (intérprete de comandos de Unix) escrito para el proyecto GNU. Su nombre es un acrónimo de bourne-again shell (otro shell bourne) — haciendo un juego de palabras (born-again significa renacimiento) sobre el Bourne shell (sh), que fue uno de los primeros shells importantes de Unix. Hacia 1978 el shell Bourne era el shell distribuido con el Unix Version 7. Stephen Bourne, por entonces investigador de los Laboratorios Bell, escribió el shell Bourne original . Brian Fox escribió el shell bash en 1987. En 1990, Chet Ramey se convirtió en su principal desarrollador. bash es el shell por defecto en la mayoría de sistemas GNU/Linux (viene como intérprete de mandatos por defecto de las distribuciones Red Hat), además de Mac OS X Tiger, y puede ejecutarse en la mayoría de los sistemas operativos tipo Unix. También se ha portado a Microsoft Windows por el proyecto Cygwin.

La mayoría de los shell scripts (guiones de órdenes) Bourne pueden ejecutarse por bash sin ningún cambio, con la excepción de aquellos scripts de shell Bourne que hacen referencia a variables especiales de Bourne o que utilizan una orden interna de Bourne. La sintaxis de órdenes de bash incluye ideas tomadas desde el Korn Shell (ksh) y el C Shell (csh), como la edición de la línea de órdenes, el historial de órdenes, la pila de directorios, las variables $RANDOM y $PPID, y la sintaxis de substitución de órdenes POSIX: $(...). Cuando se utiliza como un intérprete de órdenes interactivo, bash proporciona autocompletado de nombres de programas, nombres de archivos, nombres de variables, etc, cuando el usuario pulsa la tecla TAB.

La sintaxis de bash tiene muchas extensiones que no proporciona el shell Bourne. Varias de las mencionadas extensiones se enumeran a continuación.

Acceso a los parámetros#

Los scripts de bash reciben los parámetros que le pasa la shell como $1, $2, ..., $n. Podemos saber cuantos hemos recibido con el símbolo $#.

Por ejemplo, si nuestro script necesita dos parámetros pondremos:

if [ $# -lt 1 ]; then 
echo "Necesitas enviar dos parametros" exit 0 fi }}}

Matemáticas con enteros#

Una gran limitación del shell Bourne es que no puede realizar cálculos con enteros sin lanzar un proceso externo. En cambio, un proceso bash puede realizar cálculos con enteros utilizando la orden ((...)) y la sintaxis de variables $[...] de la siguiente manera:

VAR=55 #Asigna el valor entero 55 a la variable VAR.
((VAR = VAR + 1))#Suma uno a la variable VAR. Observe la ausencia del carácter '$'.
((++VAR))#Otra forma de sumar uno a VAR. Preincremento estilo C.
((VAR++)) #Otra forma de sumar uno a VAR. Postincremento estilo C.
echo $
[
VAR 22
]
#Multiplica la variable VAR por 22 y substituye la orden por el resultado.
echo $((VAR 22))#Otra forma de realizar lo mismo.

La orden ((...)) también se puede utilizar en sentencias condicionales, ya que su código de retorno es 0 o 1 dependiendo de si la condición es cierta o falsa:

if ((VAR == Y * 3 + X * 2)) 
then echo Si fi ((Z > 23)) && echo Si }}}

La orden ((...)) soporta los siguientes operadores relacionales: '==', '!=', '>', '<', '>=', y '<='.

Un proceso bash no puede realizar cálculos en coma flotante. Los únicos shell Unix capaces de esto son el Korn Shell (versión de 1993) y el zsh (a partir de la versión 4.0).

Redirecciones de Entrada/Salida#

La sintaxis de bash permite diferentes formas de redirección de entrada/salida de las que el Shell Bourne tradicional carece. bash puede redirigir la salida estándar y los flujos de error estándar a la vez utilizando la sintaxis:

orden &> archivo 

que es más simple que teclear la orden Bourne equivalente, "orden > archivo 2>&1". Desde la versión 2.05b, bash puede redirigir la entrada estándar desde una cadena utilizando la siguiente sintaxis (denominada "here strings"):

orden <<< "cadena a leer como entrada estándar" 

Si la cadena contiene espacios en blanco, deben utilizarse comillas.

Ejemplo: Redirige la salida estándar a un archivo, escribe datos, cierra el archivo y reinicia stdout

# hace que el descriptor de archivo 6 sea una copia de stdout (descriptor archivo 1) 
exec 6>&1

  1. abre el archivo "test.data" para escritura

exec 1>test.data

  1. genera algún contenido

echo "data:data:data"

  1. recupera stdout original, al hacer que sea una copia del descriptor de archivo 6

exec 1>&6

  1. cierra el descriptor de archivo 6

exec 6>&- }}}

Abre y cierra archivos #

# abre el archivo test.data para lectura 
exec 6<test.data

  1. lee hasta el final del archivo

while read -u 6 dta do echo "$dta" done

  1. cierra el archivo test.data

exec 6<&-

Captura la salida de órdenes externas

  1. ejecuta 'find' y guarda los resultados en VAR
  2. busca nombres de archivos que terminan con la letra "h"

VAR=$(find . -name "h") }}}

PROGRAMACIÓN DE TAREAS#

En el sistema operativo Unix, cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta programas a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora en la que deben hacerlo se especifican en el archivo crontab.

Cron se podría definir como el "equivalente" a Tareas Programadas de Windows. Los usuarios habilitados para crear su archivo crontab se especifican en el archivo cron.allow. De manera análoga, los que no lo tienen permitido figuran en /etc/cron.d/cron.deny, o /etc/cron.deny, dependiendo de la versión de unix.

Formato del archivo crontab Archivo crontab de ejemplo:

SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/

  1. run-parts

01 root nice -n 19 run-parts /etc/cron.hourly 50 0 root nice -n 19 run-parts /etc/cron.daily 22 4 0 root nice -n 19 run-parts /etc/cron.weekly 42 4 1 root nice -n 19 run-parts /etc/cron.monthly }}}

Para agregar, quitar o modificar tareas, hay que editar el crontab. Esto se hace con la orden crontab -e, que abrirá el editor definido en la variable de entorno EDITOR y cargará el archivo crontab correspondiente al usuario que está logueado.

Cada vez que se ejecuta el crontab, se envía un mail al usuario que aparece en la variable de entorno MAILTO, si está habilitado, indicándole la tarea realizada.

El formato de configuración de cron es muy sencillo.

  • El símbolo Numeral "#" es un comentario, todo lo que se encuentre después de ese carácter no será ejecutado por cron.
  • El momento de ejecución se especifica de acuerdo con la siguiente tabla:

1.Minutos: (0-59)

2.Horas: (0-23)

3.Días: (1-31)

4.Mes: (1-12)

5.Día de la semana: (0-6), siendo 1=Lunes, 2=Martes, ... 6=sábado y 0=Domingo

  • Para especificar todos los valores posibles de una variable se utiliza un asterisco ().
  • La última columna corresponde al path absoluto del binario o script que se quiere ejecutar.

Por ejemplo:

 30 10 * * 1 /usr/bin/who >> /home/quien.tex 

Ejecuta la orden who todos los lunes a las 10:30 y guarda la salida en el archivo quien.tex

Para especificar dos o más valores en cada variable, estas deben estar separadas por comas, siguiendo con el ejemplo anterior:

    0,30 * * * 1 /usr/bin/who >> /home/quien.tex 

Ejecuta la orden who todos los lunes cada media hora y guarda la salida en el archivo quien.tex

Si queremos que se ejecute cada 15 minutos sería

    0,15,30,45 * * * * /usr/bin/who >> /home/quien.tex 
ó
    */15 * * * * /usr/bin/who >> /home/quien.tex 

En este ejemplo veremos como pasarle mas de un comando al cron y de paso como puede programarse una descarga:

 30 21 * * * cd /media/sda7/dexter/distributions/isos;wget http://hola.com/archivo_a_descargar.loquesea 

Este otro es para programar el apagado de la PC. En este caso todos los sábados a las 9:30 pm.

   30 21 * * 6 /sbin/shutdown -h now 

CONFIGURACIÓN DE INTERFACES DE RED#

Configurar los parámetros de red en una estación de trabajo GNU/Linux o un servidor no es realmente complicado. Solamente requerirá de algunos conocimientos básicos sobre redes y cualquier editor de texto simple.

Procedimientos #

Detección y configuración del hardware#

La detección del hardware es realizada o bien por el programa de instalación, o bien a través de kudzu, un servicio que inicia con el sistema y que se encarga de detectar y configurar los dispositivos de hardware instalados. En términos generales, no hace falta configurar parámetro alguno mientras los dispositivos de red sean compatibles y exista un controlador para la versión del núcleo (kernel) ejecutado.

Si acaso no fuese detectado el dispositivo de red debido a la ausencia de kudzu, es posible configurar todo manualmente. La marca de la tarjeta de red es lo que menos interesa, lo que es importante es que se determine con exactitud que chipset utiliza la tarjeta de red. Esto puede determinarse examinando físicamente la tarjeta de red o bien examinando a detalle la salida en pantalla que se obtiene al ejecutar el siguiente mandato:

# lspci | grep Ethernet 

Lo anterior devuelve una salida similar a la siguiente (en el caso de una tarjeta 3Com 905 C)

Ethernet controller: 3Com Corporation 3c905C-TX [Fast Etherlink] (rev 120). 

Debe modificarse con un editor de textos el fichero /etc/modules.conf (núcleos de la serie 2.4) o /etc/modprobe.conf (núcleos de la serie 2.6). Debe verificarse que el módulo correspondiente a la tarjeta de red realmente este especificado de forma correcta. Ejemplo:

alias eth0 3c59x 

Si se realizó alguna edición de este fichero, deberá de ejecutarse el siguiente mandato, a fin de actualizar dependencias:

# depmod -a 

Si utiliza un núcleo de la serie 2.4.x o 2.6, la lista de módulos existentes en el sistema que se pueden utilizar para distintos chipset de distintos modelos de tarjetas de red se puede obtener listando el contenido del directorio /lib/modules/

[
versión del núcleo
]
/kernel/drivers/net/. Ejemplo:

# ls /lib/modules/`uname -r`/kernel/drivers/net/ 

Asignación de parámetros de red#

Nombre del anfitrión (HOSTNAME)#

Debe modificarse con un editor de textos el fichero /etc/hosts, y debe verificarse que este diferenciado el eco o retorno del sistema del nombre del sistema, el cual deberá estar asociado a una de las direcciones IP, específicamente la que esté asociado a dicho nombre en el servidor del sistema de nombres de dominio (DNS) si se cuenta con uno en la red local. Ejemplo:

127.0.0.1  localhost.localdomain  localhost 
192.168.1.50 nombre.dominio nombre }}}

Se debe establecer un nombre para el sistema. Este deberá ser un FQDN (acrónimo de Fully Qualified Domain Name o Nombre de Dominio Plenamente Calificado) resuelto por un servidor de nombres de domino (DNS) o bien. En el caso de sistemas sin conexión a red o sistemas caseros, sea resuelto localmente en el fichero /etc/hosts. De tal modo, el nombre del anfitrión (hostname) del sistema se definirá dentro del fichero /etc/sysconfig/network del siguiente modo:

NETWORKING=yes 
HOSTNAME=nombre.dominio }}}

Dirección IP, máscara de subred y puerta de enlace#

Debe modificarse con cualquier editor de textos, y verificar que sus parámetros de red sean los correctos, el fichero localizado en la ruta /etc/sysconfig/network-scripts/ifcfg-eth0. Ejemplo:

DEVICE=eth0 
ONBOOT=yes BOOTPROTO=static IPADDR=192.168.1.50 NETMASK=255.255.255.0 GATEWAY=192.168.1.254 }}}

Los parámetros anteriores son proporcionados por el administrador de la red local en donde se localice la máquina que está siendo configurada, o bien definidos de acuerdo a una planificación previamente establecida. El administrador de la red

deberá proporcionar una dirección IP disponible (IPADDR) y una máscara de la subred (NETMASK).

Servidores de nombres#

Debe modificarse con un editor de textos /etc/resolv.conf, donde se establecerán los servidores del sistema de resolución de nombres de dominio (DNS). Ejemplo:

nameserver 192.168.1.254 
nameserver 192.168.1.1 }}}

Agregar encaminamientos (rutas) adicionales#

Si se requiere establecer encaminamientos adicionales para obtener conectividad con otras redes, se pueden generar ficheros para cada interfaz que sea necesario, en donde se establecen los valores para puerta de enlace, red a la que se quiere acceder y la máscara de subred correspondiente. Los ficheros se deben generar dentro del directorio /etc/sysconfig/network-scripts/ como route-

[
interfaz
]
y deben llevar el siguiente formato:

GATEWAY0=xxx.xxx.xxx.xxx 
ADDRESS0=xxx.xxx.xxx.xxx NETMASK0=xxx.xxx.xxx.xxx }}}

Por citar un ejemplo, imaginemos que nos encontramos dentro de la red 192.168.1.0 y se requiere establecer conectividad con las redes 192.168.2.0 y 192.168.3.0, con máscaras 255.255.255.0, a través de las puertas de enlace o enrutadores o encaminadores con dirección IP 192.168.2.1 y 192.168.3.1, correspondientemente para cada red citada, a través de la primera interfaz Ethernet del sistema (eth0). La configuración de /etc/sysconfig/network-scripts/route-eth0 sería la siguiente:

GATEWAY0=192.168.2.1 
ADDRESS0=192.168.2.0 NETMASK0=255.255.255.0 GATEWAY1=192.168.3.1 ADDRESS1=192.168.3.0 NETMASK1=255.255.255.0 }}}

Función de Reenvío de paquetes para IP versión 4#

Si se tiene planeado implementar un NAT o DNAT, se debe habilitar el reenvío de paquetes para IP versión 4. Esto se realiza en el fichero /etc/sysctl.conf cambiando net.ipv4.ip_forward = 0 por net.ipv4.ip_forward = 1:

net.ipv4.ip_forward = 1 

Comprobaciones

Después de hacer configurado todos los parámetros de red deseados, solo deberá de ser reiniciado el servicio de red, ejecutando lo siguiente:

# service network restart 
Basta solamente comprobar si hay realmente conectividad. Puede ejecutarse el mandato ping hacia cualquier dirección de la red local para tal fin.
# ping 192.168.1.254 
Las interfaces y la información de las mismas se puede examinar utilizando:
# ifconfig 
Los encaminamientos se pueden comprobar utilizando:
# route -n 
Para comprobar si hay resolución de nombres, se puede realizar una consulta hacia los servidores DNS definidos para el sistema, utilizando:
# host algún.dominio 

Alta de direcciones IP virtuales#

El alta de direcciones IP es verdaderamente simple. Basta definir solamente la dirección IP, máscara de subred y el nombre del dispositivo. El fichero se genera igualmente con el nombre del dispositivo con el prefijo ifcfg-. Ejemplo del contenido del fichero /etc/sysconfig/network-scripts/ifcfg-eth0:0 que corresponde al primer dispositivo virtual del primer dispositivo ethernet:

DEVICE=eth0:0 
IPADDR=192.168.2.254 NETMASK=255.255.255.0 }}}

La comprobación, al ejecutar el mandato 'ifconfig', deberá regresar algo como lo siguiente:

eth0      Link encap:Ethernet  HWaddr 00:01:02:03:04:05 
inet addr:192.168.1.254 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:264830 errors:0 dropped:0 overruns:0 frame:0 TX packets:255396 errors:0 dropped:0 overruns:0 carrier:0 collisions:348 txqueuelen:1000 RX bytes:42375618 (40.4 MiB) TX bytes:20306080 (19.3 MiB) Interrupt:11 Base address:0xd000

eth0:0 Link encap:Ethernet HWaddr 00:01:02:03:04:05 inet addr:192.168.2.254 Bcast:192.168.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:11 Base address:0xd000

lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:2590 errors:0 dropped:0 overruns:0 frame:0 TX packets:2590 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3327899 (3.1 MiB) TX bytes:3327899 (3.1 MiB) }}}

GESTIÓN DE USUARIOS#

Una cuenta de usuario contiene las restricciones necesarias para impedir que se ejecuten mandatos que puedan dañar el sistema -programas troyanos como el Bliss-, se alteren accidentalmente la configuración del sistema, los servicios que trabajan en el trasfondo, los permisos y ubicación de los archivos y directorios de sistema, etc.

Procedimientos#

Generalmente el paso que procede a una instalación de GNU/Linux es la creación de cuantas de usuario. Existen distintos métodos, todos son sencillos y permiten crear una cuenta con su propio directorio de trabajo y los archivos necesarios.

Actualmente se existen recursos como el programa instalador de Red Hat Linux y programas que funcionan desde un entorno gráfico, como es Linuxconf y Webmin, y recursos que funcionan en modo de texto o desde una ventana terminal, como son los mandatos tradicionales, useradd y passwd, y algunos otros programas, como YaST y la versión correspondiente de Linuxconf o Webmin.

Creando una cuenta en el modo de texto: useradd y passwd#

Este procedimiento puede realizarse de forma segura tanto fuera de X Window como desde una ventana terminal en el entorno gráfico del que se disponga. Fue el método comúnmente utilizado antes de la aparición de programas como YaST y Linuxconf. Sin embargo aún resulta útil para la administración de servidores, cuando no se tiene instalado X Window, no se tienen instalados YaST o Linuxconf -o las versiones de estos que se han instalado no trabajan correctamente-, o bien se tienen limitaciones o problemas para utilizar un entorno gráfico.

Lo primero: la orden useradd#

El primer paso para crear una nueva cuenta consiste en utilizar el mandato useradd del siguiente modo:

# useradd nombre_del_usuario 

Lo segundo: la orden passwd#

Después de crear la nueva cuenta con useradd o que sigue a continuación es especificar una contraseña para el usuario. Determine una que le resulte fácil de recordar, que mezcle números, mayúsculas y minúsculas y que, preferentemente, no contenga palabras que se encontrarían fácilmente en el diccionario. Existen otras recomendaciones más, por lo que es conveniente leer, antes de continuar, los comentarios finales acerca de la seguridad incluidos en este mismo artículo.

Aunque el sistema siempre tratará de prevenirlo cuando se escoja una mala contraseña, el sistema no le impedirá que lo haga. Especificar una nueva contraseña para un usuario, o bien cambiar la existente, se puede realizar utilizando el mandato passwd del siguiente modo:

# passwd nombre_del_usuario 

El sistema solicitará entonces que proceda a teclear la nueva contraseña para el usuario y que repita ésta para confirmar. No verá el echo, por seguridad, el sistema no mostrará los caracteres tecleados, por lo que debe hacerlo con cuidado. Si se considera que tal vez se cometieron errores de tecleado, puede presionarse las veces que sean necesarias la tecla <Backspace> o <Retroceso>. De cualquier forma el sistema le informará si coincide o no lo tecleado.

Este procedimiento también puede utilizarse para cambiar una contraseña existente.

Opciones avanzadas#

En muchos casos pueden no ser necesarios, pero si se esta administrando un servidor o estación de trabajo, o bien se es un usuario un poco más experimentado, y se quiere crear una cuenta con mayores o menores restricciones, atributos y/o permisos, pueden utilizarse las siguientes opciones de useradd:

-c comment Se utiliza para especificar el archivo de comentario de campo para la nueva cuenta.

-d home dir Se utiliza para establecer el directorio de trabajo del usuario. Es conveniente, a fin de tener un sistema bien organizado, que este se localice dentro del directorio /home.

-e expire date Se utiliza para establecerla fecha de expiración de una cuenta de usuario. Esta debe ingresarse en el siguiente formato: AAAA-MM-DD.

-g initial group Se utiliza para establecer el grupo inicial al que pertenecerá el usuario. De forma predeterminada se establece como único grupo 1. Nota: el grupo asignado debe de existir.

-G group,

[
...
]
Se utiliza para establecer grupos adicionales a los que pertenecerá el usuario. Estos deben separarse utilizando una coma y sin espacios. Esto es muy conveniente cuando se desea que el usuario tenga acceso a determinados recursos del sistema, como acceso a la unidad de disquetes, administración de cuentas PPP y POP. Nota: los grupos asignado deben de existir.

-m Se utiliza para especificar que el directorio de trabajo del usuario debe ser creado si acaso este no existiese, y se copiaran dentro de este los archivos especificados en /etc/skel.

-s shell Se utiliza para establecer el Shell que podrá utilizar el usuario. De forma predeterminada, en Red Hat™ Linux y Fedora Core, se establece bash como Shell predefinido.

-u uid Se utiliza para establecer el UID, es decir, la ID del usuario. Este debe ser único. De forma predeterminada se establece como UID el número mínimo mayor a 99 y mayor que el de otro usuario existente. Cuando se crea una cuenta de usuario por primera vez, como ocurre en Red Hat Linux y Fedora Core generalmente se asignará 500 como UID del usuario. Los UID entre 0 y 99 son reservados para las cuentas de los servicios del sistema.

Ejemplo:

    useradd -u 500 -d /home/stratus -G floppy,pppusers,popusers fulano 

Lo anterior creará una cuenta de usuario llamada fulano, que se encuentra incluido en los grupos floppy, pppusers y popusers, que tendrá un UID=500, utilizará Bash como intérprete de mandatos y tendrá un directorio de trabajo en /home/fulano.

Existen más opciones y comentarios adicionales para el mandato useradd, estas se encuentran especificadas en los manuales -Man pages-. Para acceder a esta información, utilice el mandato man useradd desde una ventana terminal. Eliminar una cuenta de usuario.

En ocasiones un administrador necesitará eliminar una o más cuentas de usuario. Este es un procedimiento principalmente utilizado en servidores y estaciones de trabajo a los cuales acceden múltiples usuarios. Para tal fin nos valdremos del mandato userdel. La sintaxis básica de userdel es la siguiente:

# userdel nombre_del_usuario 
Si se desea eliminar también todos los archivos y sub-directorios contenidos dentro del directorio de trabajo del usuario a eliminar, se debe agregar la opción -r:
# userdel -r nombre_del_usuario 

Manejo de Grupos#

Alta de grupos#

# groupadd grupo-que-sea 

Alta de grupos de sistema#

Un grupo de sistema es aquel que tiene un número de identidad de grupo (GID) por debajo del 500. Regularmente se asigna automáticamente el número de identidad de grupo más bajo disponible.

# groupadd -r grupo-que-sea 

Baja de grupos#

# groupdel grupo-que-sea 

Asignación de usuario existentes a grupos existentes.

# gpasswd -a usuario-que-sea grupo-que-sea 

SEGURIDAD POR PERMISOS#

Comandos chroot, chown, chgrp#

En un sistema multiusuario seguro se deben definir permisos para el acceso a los distintos ficheros, carpetas, binarios, dispositivos, etc. Linux no es la excepción, y podemos cambiar estos permisos a través de los comandos chmod, chown y chgrp.

Aún cuando los distintos sistemas, servicios o programas que tengamos instalados en nuestro equipo contengan una descripción sobre los permisos de los distintos elementos que lo conforman (y que requiere para un correcto funcionamiento), podremos modificarlos para amoldarlos a nuestras necesidades específicas, como puede ser la compartición de ficheros en un entorno mixto de sistemas operativos, o el acceso restringido a ciertas áreas de nuestro servidor.

El la ilustración anterior podemos identificar la descripción de algunos ficheros de un sistema dado. Los datos que nos ocupan en este tema están contenidos en la primera columna, en la cual se describen los permisos de nuestra información. En dicha columna, cada línea está representada por un conjunto de 10 caracteres.

El primer caractér nos indica que tipo de fichero estamos manejando:

  • - (guión medio) : Se trata de un fichero regular (datos)
  • b : Describe un fichero especial de dispositivos de bloque. Es decir, describe a algún dispositivo de almacenamiento que puede ser aleatoriamente accedido (ej. /dev/hd si se cuenta con discos pata, o /dev/sd si se cuenta con discos sata).
  • c : Describe un fichero especial de tipo caractér, es decir, describe algún dispositivo periférico, cuyo acceso es de modo serial (ej. /dev/input)
  • d : Este fichero es un fichero especial con función de directorio. Es una carpeta.
  • l : Enlace simbólico, un atajo suave hacia otro fichero dentro de nuestro mismo sistema de ficheros.
  • p: Tubería (pipe) tipo FIFO, o tubería nombrada (named pipe). Fichero de control para el acceso a procesos recurrentes en el sistema, para uso interno de procesos.
  • s : Zócalo (socket). Igualmente, para el uso interno de procesos, pero con la capacidad del envío de mensajes entre dichos procesos.

Los siguientes 9 caracteres establecen los permisos sobre el fichero. La notación utilizada es:

  • - : El permiso está deshabilitado en esta casilla
  • r : Permiso de solo lectura. Esto nos permite solamente abrir dicho fichero para leerlo, pero no podremos modificarlo ni eliminarlo.
  • w : Permisos de solo escritura. Esto nos permite modificar el documento, incluso eliminarlo. Si se utiliza en conjunto con el permiso de solo lectura, en el fichero podremos obtener permisos de lectura y escritura exclusivas.
  • x : Permiso de ejecución. Esto nos permite darle atributos de ejecución a nuestro fichero, por ejemplo, algún guión (script) administrativo.

Dividiremos estos 9 caracteres en 3 juegos de 3 elementos cada uno. Cada juego tiene un comportamiento idéntico en cuanto al establecimiento de los permisos.

  • El primer grupo describe los permisos del propietario (u – usuario) del fichero.
  • El segundo grupo de caracteres describe los permisos del grupo (g – grupo) al que pertenece el fichero.
  • El tercer grupo describe los permisos que cualquier otro usuario (o – otros) tendrá sobre el fichero o carpeta.

Cada juego de permisos está dado en un estricto orden: lectura, escritura y ejecución (rwx).

Si algún permiso NO se encuentra dado, entonces se deberá sustituir por un guión medio (-). Por ejemplo, si un para un fichero queremos tener los permisos de lectura y ejecución, pero NO de escritura, lo veríamos como (r-x)

Cada uno de los permisos tiene un valor numérico, y pueden ser acumulativos para cada uno de los juegos de permisos. Es decir:

0 : Ningún permiso dado ( --- )

1 : Permiso de ejecución ( --x )

2 : Permiso de escritura ( -w- )

3 : Permisos de escritura y de ejecución ( -wx )

4 : Permiso de lectura ( r-- )

5 : Permisos de lectura y de ejecución ( r-x )

6 : Permisos de lectura y escritura ( rw- )

7 : Permisos de lectura, escritura y ejecución ( rwx )

Dichos valores no son arbitrarios. De hecho, cada uno de estos valores no está dado en el sistema numérico decimal, sino que debe ser leído en un sistema numérico octal (base 8). Podemos realizar el cálculo de cada juego de permisos, si consideramos a cada uno de estos juegos como un digito octal representado de manera binaria (base 2), teniendo a la izquierda nuestro bit más significativo (MSB), y a la derecha el bit menos significativo (LSB), como se muestra en la siguiente tabla:

Lectura
(r)
Escritura
(w)
Ejecución
(x)
ConversiónResultado
0202020x22 + 0x21 + 0x20 = 08 + 08 + 0808
0202120x22 + 0x21 + 1x20 = 08 + 08 + 1818
0212020x22 + 1x21 + 0x20 = 08 + 28 + 0828
0212120x22 + 1x21 + 1x20 = 08 + 28 + 1838
1202021x22 + 0x21 + 0x20 = 48 + 08 + 0848
1202121x22 + 0x21 + 1x20 = 48 + 08 + 1858
1212021x22 + 1x21 + 0x20 = 48 + 28 + 0868
1212121x22 + 1x21 + 1x20 = 48 + 28 + 1878

El comando chmod es nuestra herramienta para modificar el modo (change mode) en el que se encuentra nuestro fichero (los permisos con los que este cuenta). Su sintáxis básica es sencilla:

# chmod [OPCIONES] OCTAL nombredefich.ero 

  1. chmod [OPCIONES] MODO nombredefich.ero }}}

Es decir, si queremos que el fichero “archivo.txt” tenga permisos de lectura y escritura para el propietario y grupo, pero solamente de lectura para cualquier otro usuario, ejecutamos el comando de la siguiente manera:

# chmod 664 archivo.txt

  1. chmod 764 carpeta}}}

Si queremos hacer lo mismo, pero para una carpeta completa, le indicamos que lo queremos hacer recursivamente (opción -R):

# chmod -R 664 carpeta #El comando aplica a la carpeta y sus contenidos
# chmod -R 664 carpeta/#Con la diagonal al final, el comando solo afecta al contenido de la carpeta
# chmod -R 664 .#Cambia los permisos para todos los ficheros y carpetas
# chmod -R 664 .#Contenidos en la ruta actual

NOTA: Una carpeta debe tener el permiso de ejecución activo si es que queremos ejecutar dicha carpeta (entrar en ella). Debemos darle el permiso de ejecución, al menos (dependiendo de su configuración) al propietario de dicha carpeta.

Es frecuente en foros de discusión sobre programación de sitios web (aunque no exclusivo de estos) encontrar respuestas como: “... es que no tienes permisos de lectura... necesitas cambiar los permisos en tu carpeta, ejecuta 'chmod 666 ' para que puedan leer tus ficheros...” o, los que se dieron cuenta de que necesitan el permiso de ejecución indican “... ejecuta 'chmod 777' y listo...”. Como se puede apreciar, con respuestas como la primera podemos hacer inaccesible una carpeta (o serie de carpetas) ya que no tenemos permiso de ejecutarlas, y con respuestas como la segunda ponemos en un SERIO PROBLEMA de seguridad tanto a nuestra aplicación, como a nuestros datos.

Si deseamos, por ejemplo, asegurarnos de que toda la información contenida en 'carpeta' tenga permiso de lectura y escritura para su propietario, ejecutamos:

# chmod -R u+rw carpeta/

El signo '+' indica que queremos adicionar dichos permisos, pero sin alterar cualquier otro permiso previamente establecido. Análogamente, con el signo '-' removemos algún permiso:

# chmod -R o-wx carpeta

Podemos también hacer varios movimientos en una sola línea:

# chmod u+rw,g-wx,o-rwx,g+r *.png 

NOTA: Recuerde que los nemónicos “u, g, o” representan al usuario propietario, grupo, otros. El nemónico “a” agrupa a estos tres (a = all, todos)

Algunas veces nos será más cómodo utilizar la notación octal sobre la nemónica, dependiendo de las necesidades que tengamos en el momento así como de la costumbre que obtengamos al manejar el mandato. Ningún método es preferible sobre el otro.

¿QUE ES LSB?#

La Base Estándar para Linux (Linux Standard Base, abreviado LSB), es un proyecto conjunto de varias Distribuciones de Linux bajo la estructura organizativa del Free Standards Group con el objeto de crear y normalizar la estructura interna de los sistemas operativos derivados de Linux. La LSB está basada en la Especificación POSIX, la Especificación Única de UNIX (Single UNIX Specification) y en varios otros estándares abiertos, aunque extiende éstos en ciertas áreas.

El objetivo de la LSB es desarrollar y promover un conjunto de estándares que aumentarán la compatibilidad entre las distribuciones de Linux y permitirán que los programas de aplicación puedan ser ejecutados en cualquier sistema que se adhiera a ella. Además, la LSB ayudará a coordinar esfuerzos tendentes a reclutar productores y proveedores de programas que creen productos originales para Linux o adaptaciones de productos existentes.

Mediante un proceso de certificación es posible obtener la conformidad a la LSB de un producto. Dicha certificación la lleva a cabo el Open Group en colaboración con el Free Standards Group (Grupo de Estándares Libres).

Como ejemplo, la LSB especifica: librerías estándar, un conjunto de órdenes y utilerías que extienden el estándar POSIX, la estructura jerárquica del sistema de archivos, los niveles de ejecución, y varias extensiones al sistema gráfico X Window.

La LSB ha sido criticada por no considerar aportaciones de proyectos externos a la esfera de influencia de las compañías miembros, especialmente del proyecto Debian. Por ejemplo, la LSB especifica que los programas deberían ser distribuidos en el formato RPM de Red Hat, el cual fue inventado mucho después del formato de empaquetado deb del proyecto Debian. Es muy poco probable que los programadores del proyecto Debian cambien su formato, el cual consideran superior a RPM, (al igual que otros programadores). Sin embargo, la mayor parte de la crítica recibida por este tema surge del malentendido en la sugerencia de este uso obligado del formato RPM: el estándar no dicta cuál formato de empaquetado debe ser usado por el sistema operativo, sino solamente que un formato de empaquetado debe ser soportado de manera que los paquetes de otros programadores puedan ser instalados en un sistema que sigue el estándar LSB. Debido a que Debian incluye soporte a la LSB en forma opcional (en la versión 3.0 "woody" y en la versión 3.1 "sarge"), este tópico desaparece al ser examinado cuidadosamente (esto es, el usuario final sólo necesita usar el programa alien en Debian para transformar e instalar el paquete en formato RPM en el formato nativo). En otras áreas la operación de la LSB es menos controvertida, y ha sido recibida con considerable gratitud.

INTRODUCCIÓN A LOS SISTEMAS GRÁFICOS#

JDS, Gnome, KDE#

Existen distintas ofertas para la ejecución de entornos gráficos dentro de los distintos sistemas tanto Linux, como Unix, la mayoría tomando como sistema base el servidor de gráficos Xorg, un derivado libre del sistema de gráficos X11.

Java Desktop System#

Sun Java Desktop System, es un Entorno de escritorio para Solaris desarrollado por Sun Microsystems, que anteriormente también estuvo disponible para Linux

Basado en el proyecto Mad Hatter, que vio la luz a finales del 2003, el objetivo se centra en el desarrollo de un Linux amigable acompañado de su Star Office y Java, además de Gnome, Mozilla, Evolution ó Gaim y está basado en estándares abiertos.

En un principio Java Desktop System se basaba en la distribución Suse, que fue comprada a posteriori por Novell, pero más tarde los ejecutivos de Sun decidieron que Java Desktop System se base en Solaris, su otro sistema operativo. Así los planes de Sun incluyen de esta manera unificar el interfaz de usuario de sus sistemas basados en Linux con los basados en Solaris. Para algunos críticos sólo es un intento por ganar algunos usuarios para Solaris y, a largo plazo, ofrecer una versión unificada en el escritorio de equipos personales y estaciones de trabajo. Quizás sea un adelanto de la tan discutida liberación de Solaris.

Gnome#

El proyecto GNOME (GNU Network Object Model Environment) surge en agosto de 1997 como proyecto liderado por los mexicanos Miguel de Icaza y Federico Mena para crear un entorno de escritorio completamente libre para sistemas operativos libres, en especial para GNU/Linux. Desde el principio, el objetivo principal de GNOME ha sido proporcionar un conjunto de aplicaciones amigables y un escritorio fácil de utilizar. GNOME también es una palabra del idioma inglés que significa gnomo.

En esos momentos existía otro proyecto anterior con los mismos objetivos, pero con diferentes medios: KDE. Los primeros desarrolladores de GNOME criticaban a dicho proyecto por basarse en la biblioteca de controles gráficos Qt, cuya licencia (QPL), aunque libre, no era compatible con la licencia GPL de la FSF.

Años más tarde los problemas de licencia de Qt se han resuelto y estas críticas han cesado. Sin embargo, los dos proyectos siguen rumbos tecnológicos distintos y se hacen una competencia amigable.

Como con la mayoría de los programas GNU, GNOME ha sido diseñado para ejecutarse en toda la gama de sistemas operativos de tipo Unix con X Window, y especialmente pensado para GNU/Linux. Desde sus inicios se ha utilizado la biblioteca de controles gráficos GTK, originalmente desarrollada para el programa The GIMP.

A medida que el proyecto ha ido progresando en los últimos años, los objetivos del mismo se han extendido para tratar una serie de problemas en la infraestructura Unix existente. Diseñado originalmente para Linux, GNOME ahora funciona en la mayoría de sistemas tipo Unix y particularmente ha sido adoptado por Sun Microsystems como parte del escritorio Java, sustituyendo el antiguo escritorio común de su plataforma Solaris. Es el entorno de escritorio por omisión para muchas distribuciones de escritorio modernas de GNU/Linux, incluyendo Fedora y Ubuntu. Una lista de las distribuciones de Linux que incluyen GNOME se mantiene en la Web de GNOME. Existe una versión oficial de GNOME para los llamados LiveCD, que permite que un computador arranque directamente desde el CD-ROM y así poder probar y disfrutar el escritorio. Muchos componentes de GNOME han cambiado hacia a Cygwin permitiendo que las aplicaciones de GNOME funcionen en Microsoft Windows.

KDE#

KDE (K Desktop Environment) es un entorno de escritorio gráfico e infraestructura de desarrollo para sistemas Unix y, en particular, Linux. La 'K', originariamente, representaba la palabra "Kool", pero su significado fue abandonado más tarde. Actualmente significa simplemente 'K', la letra inmediatamente anterior a la 'L' (inicial de Linux) en el alfabeto. KDE es distribuido junto a muchas distribuciones Linux.

KDE imitó a CDE (Common Desktop Environment) en sus inicios. CDE es un entorno de escritorio utilizado por varios Unix. KDE se basa en el principio de la personalización. Todos los componentes de KDE pueden ser configurados en mayor o menor medida por el usuario. Las opciones más comunes son accesibles en su mayoría desde menús y diálogos de configuración. Los usuarios avanzados pueden optar por editar los archivos de configuración manualmente, obteniendo en algunos casos un mayor control sobre el comportamiento del sistema.

La intención del proyecto KDE es la de crear un entorno gráfico que no se comporte de un modo predefinido, sino que permita al usuario adecuar el sistema a su gusto y comodidad. Esto no impide que KDE resulte fácil de usar para nuevos usuarios, detalle al que no se resta importancia.

0 archivos adjuntos
12259 Accesos
Promedio (0 Votos)
La valoración media es de 0.0 estrellas de 5.
Comentarios