Está en la página 1de 147

Tema 1: Gestión de Archivos y directorios en Linux

1. Introducción
Algunas distribuciones de Linux tienen aplicaciones basadas en GUI que
permiten gestionar los archivos, pero es importante saber cómo realizar estas
operaciones a través de la línea de comandos.

La línea de comandos dispone de una amplia colección de comandos que


permiten administrar los archivos. En este capítulo aprenderemos cómo listar los
archivos en un directorio, así como, cómo copiar, mover y eliminar los archivos.

2. Comprender los archivos y Directorios


Los archivos se utilizan para almacenar datos tales como texto, gráficos y
programas. Los directorios (También conocidos como «carpetas») se utilizan
para proporcionar una estructura de organización jerárquica.

En un sistema Windows, el nivel superior de la estructura de directorios se


llama Este Equipo. Cada dispositivo físico (disco duro, unidad de DVD, unidad
USB, unidad de red, etc.) aparece en Este Equipo, cada uno asignado a una letra
de unidad como C: o D: Una representación visual de esta estructura:
la estructura de directorios de Linux tiene un nivel superior, sin embargo, no se
llama Este Equipo, sino directorio raíz y su símbolo es el carácter /. También, en
Linux no hay unidades; cada dispositivo físico es accesible bajo un directorio, no
una letra de unidad. Una representación visual de una estructura de directorios
típica de Linux:

La mayoría de los usuarios de Linux denominan esta estructura de directorios


el sistema de archivos.

Para ver el sistema de archivos raíz, en la terminal de linux, se introduce "ls /"(sin
comillas):
3. Los Directorios

Directorio PATH:
Una ruta de acceso te permite especificar la ubicación exacta de un directorio.
Para el directorio acpi, la ruta de acceso sería /etc/acpi. El primer
carácter / representa el directorio root (o «raíz» en español), mientras que cada
siguiente carácter / se utiliza para separar los nombres de directorio.

Este tipo de ruta se llama la ruta absoluta (o «aboslute path» en inglés). Con una
ruta absoluta, siempre se proporcionan direcciones a un directorio (o un archivo)
a partir de la parte superior de la estructura de directorios, el directorio root.

La siguiente gráfica muestra tres rutas absolutas adicionales:


Directorio HOME:
En la mayoría de las distribuciones de Linux hay un directorio llamado home bajo
el directorio root: /home.

Bajo de este directorio /home hay un directorio para cada usuario del sistema. El
nombre del directorio será el mismo que el nombre del usuario, por lo que un
usuario llamado «bob» tendría un directorio home llamado /home/bob.

Nuestro directorio home es un directorio muy importante. Para empezar, cuando


se abre un shell automáticamente nos ubicamos en nuestro directorio home, en
donde se harán la mayor parte de nuestros trabajos.

Además, el directorio home es uno de los pocos directorios donde se tiene el


control total para crear y eliminar los archivos adicionales. La mayor parte de
otros directorios en un sistema de archivos de Linux están protegidos con file
permissions (o «permisos de archivos» en español).

Directorio Actual:
Nuestro directorio actual es el directorio donde se está trabajando actualmente
en una terminal. Cuando primero abrimos una terminal, el directorio actual debe
ser por defecto el directorio home, pero esto puede cambiar mientras vamos
explorando el sistema de archivos y cambiamos a otros directorios.

Mientras estamos en un entorno de línea de comandos, podemos determinar el


directorio actual mediante el comando pwd:
Cambio de Directorios:
Si queremos cambiar a un directorio diferente, utilizamos el
comando cd (cambiar directorio). Por ejemplo, el siguiente comando cambiará el
directorio actual a un directorio llamado /etc/acpi/events:

Si queremos volver a nuestro directorio home, podemos introducir el


comando cd sin argumentos o usar el comando cd con el carácter ~ como
argumento:

Nombres de ruta absoluta versus nombres de ruta


relativa:
Hay que recordar que una ruta de acceso es esencialmente una descripción de
la ubicación de un archivo o un directorio en el sistema de archivos. Una ruta de
acceso también se puede entender como las direcciones que indican al sistema
donde se encuentra un archivo o un directorio. Por ejemplo, el comando cd
/etc/perl/Net significa "cambiar al directorio Net, que encontraremos bajo el
directorio perl, que encontraremos bajo el directorio etc , que encontraremos
bajo el directorio /".

Cuando demos un nombre de ruta que comienza en el directorio raíz, se


llamará ruta absoluta. En muchos casos, proporcionar una ruta de acceso
absoluta tiene sentido. Por ejemplo, si estamos en nuestro directorio home y
queremos ir al directorio /etc/perl/Net, entonces proporcionar una ruta de acceso
absoluta al comando cd tiene sentido:

Sin embargo, ¿Qué pasa si estamos en el directorio /etc/perl y queremos ir al


directorio /etc/perl/Net? Sería tedioso introducir la ruta completa para llegar a un
directorio que es sólo un nivel más abajo de nuestra ubicación actual. En una
situación como ésta, vamos a utilizar una ruta relativa:

Una ruta de acceso relativa proporciona direcciones usando nuestra ubicación


actual como un punto de referencia. Recordemos que esto es diferente de las
rutas absolutas, que siempre requieren que utilicemos el directorio raíz como
punto de referencia.

Existe una técnica útil de ruta de acceso relativa que se puede utilizar para subir
un nivel en la estructura de directorios: el directorio .. . Sin importar en qué
directorio nos encontremos, el comando .. siempre representa un directorio
arriba que el directorio actual (con la excepción de cuando estamos en el
directorio /):
A veces usar las rutas de acceso relativas es una mejor opción que rutas de
acceso absolutas, sin embargo esto no siempre es el caso. ¿Qué pasa si nos
encontramos en el directorio /etc/perl/Net y se quiere ir al
directorio /usr/share/doc? Utilizando una ruta absoluta, se ejecutaría el
comando cd /usr/share/doc. Utilizando una ruta relativa, se ejecutaría el
comando cd ../../../usr/share/doc:

Mientras que el doble punto (..) se utiliza para referirse al directorio arriba del
directorio actual, el punto solo (.) se usa para referirse al directorio actual. No
tendría sentido para un administrador moverse al directorio actual
introduciendo cd . (aunque en realidad funciona). Es más útil referirse a un
elemento en el directorio actual usando la notación ./. Por ejemplo:
4. Listados de los Archivos en un Directorio
Ahora que nos podemos mover de un directorio a otro, posiblemente querramos
visualizar el contenido de estos directorios. El comando ls (ls es la abreviatura
para listar) puede utilizarse para mostrar el contenido de un directorio, así como
toda la información sobre los archivos que están dentro de un directorio.

Por sí mismo, el comando ls listará los archivos en el directorio actual:

Lista de Colores:
En muchas distribuciones de Linux, las cuentas de usuario regulares son
modificadas de tal manera que el comando ls muestre los nombres de archivo,
codificados por colores según el tipo de archivo. Por ejemplo, los directorios
pueden aparecer en azul, archivos ejecutables pueden verse en verde, y enlaces
simbólicos pueden ser visualizados en cian (azul claro).
Esto no es un comportamiento normal para el comando ls, sino algo que sucede
cuando se utiliza la opción --color para el comando ls. La razón por la que el
comando ls parece realizar automáticamente estos colores, es que hay un alias
para el comando ls para que se ejecute con la opción --color:

Como podemos ver en la salida anterior, cuando se ejecuta el comando ls, en


realidad se ejecuta el comando ls --color=auto almacenado como un alias.

En algunos casos, puede que no querramos ver todos los colores (a veces
pueden distraer un poco). Para evitar el uso de los alias, colocamos un carácter
de barra invertida \ antes de nuestro comando:
Lista de Los Archivos Ocultos:
Cuando utilizamos el comando ls para mostrar el contenido de un directorio, no
todos los archivos se muestran automáticamente. El comando ls no muestra
los archivos ocultos de manera predeterminada. Un archivo oculto es cualquier
archivo (o directorio) que comienza con un punto (.).

Para mostrar todos los archivos, incluyendo los archivos ocultos, utilizamos la
opción -a para el comando ls:

¿Por qué los archivos están ocultos en primer lugar? La mayoría de los archivos
ocultos son archivos de personalización, diseñados para personalizar la forma
en la que Linux, el shell o los programas funcionan.

Listado con Visualización Larga:


Existe información sobre cada archivo, llamada metadata (o «metadatos» en
español), y visualizarla a veces resulta útil. Esto puede incluir datos de quién es
el dueño de un archivo, el tamaño de un archivo y la última vez que se modificó
el contenido de un archivo. Podemos visualizar esta información mediante el uso
de la opción -l para el comando ls:

Tamaños de Archivos Legibles:


Cuando visualizamos los tamaños de los archivos con la opción -l del
comando ls obtienes los tamaños de los archivo en bytes. Para archivos de texto,
un byte es 1 carácter.

Para visualizar el tamaño del archivo de una forma mas legible, tal como
megabytes o gigabytes, se añade la opción -h al comando ls:
Lista de Directorios:
Cuando se utiliza el comando ls -d, se refiere al directorio actual y no al
contenido dentro de él.

Para utilizar el comando ls -d de una manera significativa se tiene que añadir la


opción -l. En este caso, debemos tener en cuenta que el primer comando
muestra los detalles de los contenidos en el directorio /home/sysadmin, mientras
que el segundo lista el directorio /home/sysadmin.

Listado Recursivo:
Habrá momentos cuando querramos visualizar todos los archivos en un
directorio, así como todos los archivos en todos los subdirectorios bajo un
directorio. Esto se llama listado recursivo.

Para realizar un listado recursivo, utilizamos la opción -R para el comando ls:


Se recomienda tener cuidado con esta opción; por ejemplo, ejecutando el
comando ls -R / se listarían todos los archivos del sistema de archivos,
incluyendo todos los archivos de cualquier dispositivo USB y DVD en el sistema.
Lo mejor es limitar el uso de la opción -R para estructuras de directorio más
pequeñas, como en el caso de la imagen presentada anteriormente.

Ordenar Un listado:
De forma predeterminada, el comando ls ordena los archivos alfabéticamente
por nombre de archivo. A veces, puede ser útil ordenar los archivos utilizando
diferentes criterios.

Para ordenar los archivos por tamaño, podemos utilizar la opción -S. Observar
la diferencia en la salida de los dos siguientes comandos:
Aparecen los mismos archivos y directorios, pero en un orden diferente. Mientras
que la opción -S trabaja por sí misma, realmente no se puede decir que la salida
está ordenada por tamaño, por lo que es más útil cuando se utiliza con la opción -
l. El siguiente comando listará los archivos del mayor al menor y mostrará el
tamaño real del archivo.
También puede ser útil usar la opción -h para mostrar los tamaños de los
archivos de una manera legible:
La opción -t listará los archivos modificados más recientemente en primer lugar.
Esta opción puede utilizarse sola, pero otra vez, es generalmente más útil
cuando se combina con la opción -l:
Si los archivos en un directorio se modificaron hace muchos días o meses, puede
ser más difícil de decir exactamente cuándo fueron modificados, ya que para los
archivos más antiguos sólamente se proporciona la fecha. Para una información
más detallada de la hora de modificación podemos utilizar la opción --full
time que visualiza la fecha y la hora completas (incluyendo horas, segundos,
minutos...):
La opción --full-time asumirá automáticamente la opción -l.

Es posible realizar una ordenación inversa con las opciones -S o -t mediante la


opción -r. El siguiente comando ordena los archivos por tamaño, de menor a
mayor:
El siguiente comando listará los archivos por fecha de modificación, de la más
antigua a la más reciente:
Listado con Globs:
En temas anteriores, vimos el uso de los globs para los archivos para buscar
coincidencias de los nombres de archivo utilizando los caracteres comodín. Por
ejemplo, es posible listar todos los archivos en el directorio /etc que comienzan
con la letra e utilizando el siguiente comando:

Ahora que sabemos que el comando ls se utiliza normalmente para listar los
archivos en un directorio, el uso del comando echo puede parecer una elección
extraña. Sin embargo, hay algo sobre el comando ls que pudo haber causado
confusión mientras se habló sobre los globs. Esta «función» también puede
causar problemas cuando intentamos listar los archivos utilizando los patrones
glob.

Se debe tomar en cuenta que es el shell, no los comandos echo o ls, el que
expande el patrón glob a los nombres de archivo correspondientes. En otras
palabras, cuando se introduce el comando echo /etc/e*, lo que el shell
hizo antes de ejecutar el comando echo fue reemplazar el e* por todos los
archivos y directorios dentro del directorio /etc que coinciden con el patrón.

Por lo tanto, si se ejecutara el comando ls /etc/e*, lo que el shell realmente


haría, sería lo siguiente:

Cuando el comando ls ve varios argumentos, realiza una operación de listado


en cada elemento por separado.

Nótese que /etc/e2scrub.conf, /etc/environment así como también


/etc/ethertypes, son archivos que pertenecen al directorio etc; en cambio
/etc/emacs y /etc/environment.d, son directorios contenidos dentro del directorio
etc, por lo que al encontrarlos la shell, los enlista y al mismo tiempo ofrece un
listado de los archivos contenidos dentro de estos directorios que cumplen con
los criterios del comando.

Ahora consideremos lo que sucede cuando se ejecuta el comando ls en un


archivo, tal como encript.cfg:
Como puedemos ver, ejecutando el comando ls en un solo archivo se imprime
el nombre del archivo. Generalmente esto es útil si se quieren ver los detalles
acerca de un archivo mediante la opción -l del comando ls:

Sin embargo, ¿Qué ocurre si el comando ls recibe un nombre de directorio como


un argumento? En este caso, la salida del comando es diferente a que si el
argumento es un nombre de archivo:

Si proporcionamos un nombre de directorio como argumento del comando ls, el


comando mostrará el contenido del directorio (los nombres de los archivos en el
directorio), y no sólo proporcionará el nombre del directorio. Los nombres de los
archivos, que se ven en el ejemplo anterior, son los nombres de los archivos en
el directorio /etc/event.d.

¿Por qué ésto es un problema al utilizar los globs? Consideremos el siguiente


resultado:
Como podemos ver, cuando el comando ls ve un nombre de archivo como
argumento, sólo muestra el nombre del archivo. Sin embargo, para cualquier
directorio, mostrará el contenido del directorio, y no sólo el nombre del directorio.

Esto se vuelve aún más confuso en una situación como la siguiente:

En el ejemplo anterior, parece que el comando ls es simplemente incorrecto.


Pero lo que realmente sucedió es que lo único que coincide con el glob etc/ev
* es el directorio /etc/event.d. Por lo tanto, el comando ls muestra sólo los
archivos en ese directorio.

Hay una solución simple a este problema: al utilizar los argumentos glob con el
comando ls, utilizamos siempre la opción -d. Cuando utilizamos la opción -d, el
comando ls no muestra el contenido de un directorio, sino más bien el nombre
del directorio:
5. Copiar los Archivos
El comando cp se utiliza para copiar los archivos. Requiere especificar un origen
y un destino. La estructura del comando es la siguiente:

cp [fuente] [destino]

La fuente («source» en inglés) es el archivo que queremos copiar.


El destino («destination» en inglés) es la ubicación en donde queremos poner la
copia. Cuando el comando es exitoso, el comando cp no tendrá ninguna salida.
El siguiente comando copiará el archivo /etc/hosts al directorio home:

Cabe destacar que el caracter ~ representa el directorio "Home".

El Modo Verbose:
La opción -v hará que el comando cp produzca la salida en caso de ser exitoso.
La opción -v se refiere al comando verbose:

Cuando el destino es un directorio, el nuevo archivo resultante tendrá el mismo


nombre que el archivo original. Si se quiere que el nuevo archivo tenga un
nombre diferente, debemos proporcionar el nuevo nombre como parte del
destino:
Evitar Sobreescribir los Datos:
El comando cp puede ser destructivo para los datos si el archivo de destino ya
existe. En el caso donde el archivo de destino existe, el
comando cp sobreescribe el contenido del archivo existente con el contenido del
archivo fuente. Para ilustrar este problema, primero se crea un nuevo archivo en
el directorio home sysadmin copiando un archivo existente:

Si visualizamos la salida del comando ls para ver el archivo y visualizamos el


contenido del archivo utilizando el comando more:

6. Mover los Archivos


Para mover un archivo, utilizamos el comando mv. La sintaxis del
comando mv es muy parecida al comando cp:

mv [fuente] [destino]

En el ejemplo siguiente, el archivo apm que se copió anteriormente al directorio


Home, se mueve desde el directorio actual al directorio descargas:
Cuando se mueve un archivo, el archivo se elimina de la ubicación original y se
coloca en una ubicación nueva.

Mover los archivos y cambiar el nombre del mismo


simultaneamente:
Si el destino del comando mv es un directorio, el archivo se moverá al directorio
especificado. El nombre del archivo cambiará sólo si también se especifica un
nombre de archivo destino.

Si no se especifica un directorio destino, el archivo será renombrado con el


nombre de archivo destino y permanece en el directorio origen.

Renombrar los Archivos:


El comando mv no sólo se utiliza para mover un archivo, sino también cambiar el
nombre de un archivo. Por ejemplo: cambiamos el nombre del directorio
nuevoapm por nuevisimoapm en el directorio Home:
Hay dos opciones que pueden utilizarse para asegurarnos contra sobreescrituras
accidentales de los archivos. Con la opción -i (interactivo), el
comando cp emitirá un prompt antes de sobrescribir un archivo. En el siguiente
ejemplo demostrará esta opción, primero restaurando el contenido del archivo
original:

Observamos que puesto que el valor de n (no) se dió al emitir un prompt de


sobrescritura del archivo, no se hicieron cambios en el archivo. Si se da un valor
de y (sí), entonces resultará en un proceso de copiado.

La opción -i requiere respuesta y o n para cada copia que podría sobrescribir el


contenido de un archivo existente.

Si queremos contestar automáticamente n para cada prompt, utilizamos la


opción -n. En esencia, significa «sin sobreescribir».

Copiar los Directorios:


Para copiar un directorio completo así como también los archivos que contenga,
se debe utilizar la opción -r y de esta manera se copiará la estructura completa
del directorio. Esto podría resultar en copiar muchos archivos y directorios.
Nótese que el directorio apm anteriormente no se encontraba en el directorio
Home y ahora sí pues lo hemos copiado junto a todos sus directorios y archivos
contenidos.

7. Crear Archivos
Hay varias maneras de crear un nuevo archivo, incluyendo el uso de un
programa diseñado para editar un archivo (un editor de texto).

También existe una manera de simplemente crear un archivo que puede


rellenarse con datos en un momento posterior. Esto es útil puesto que por
algunas características del sistema operativo, la existencia de un archivo podría
alterar la forma de funcionamiento de un comando o de un servicio. También es
útil crear un archivo como un «indicador» («placeholder» en inglés) para
recordarte que debes crear el contenido del archivo en un momento posterior.

Para crear un archivo vacío, utiliza el comando touch (o «tocar» en español)


como se muestra a continuación:

8. Eliminar Archivos
Para borrar un archivo, utiliza el comando de rm:
Ten en cuenta que el archivo fue borrado sin hacer preguntas. Esto podría causar
problemas al borrar varios archivos usando los caracteres glob, por ejemplo: rm
*.txt. Ya que estos archivos son borrados sin proporcionar una pregunta, un
usuario podría llegar a borrar archivos que no quería eliminar.

Además, los archivos se eliminan permanentemente. No hay ningún comando


para recuperar un archivo y no hay «papelera de reciclaje» («trash can» en
inglés) desde la que se puedan recuperar los archivos eliminados. Como
precaución, los usuarios deben utilizar la opción -i al eliminar varios archivos,
para recibir una salida que pregunte si realmente se quiere eliminar cada uno de
los archivos.

Eliminar Directorios:
Si se quiere eliminar un directorio, se debe utilizar la opción -r con el
comando rm:

. Crear Directorios
Para crear un directorio, utilizamos el comando mkdir:
1. En qué consiste la virtualización de Hyper-v en Windows 10

Hyper-v Windows 10 es una aplicación que está disponible de forma nativa en


distintas versiones de Windows 10 y Windows Server. con este programa
podremos crear y ejecutar máquinas virtuales encima de un sistema operativo
host como si se tratasen de equipos físicos.

La función de un Hypervisor como Hyper-v es la de administrar el acceso y


funcionamiento de los sistemas virtuales, así como los recursos del hardware
físico del equipo host. Hyper-v, al igual que otras aplicaciones como VMware o
VirtualBox nos permitirá poder trabajar simultáneamente con un sistema
operativo instalado sobre otro físico y poder realizar pruebas en este sin que en
ningún momento nuestro equipo físico quede modificado de ninguna forma.

Hyper-v proporciona soporte para la virtualización por hardware lo que quiere


decir que cada máquina virtual que ejecutemos, correrá sobre un hardware
virtual compuesto por los dispositivos típicos que necesita un ordenador: disco
duro, tarjeta de red, CPU, memoria RAM y otros.
2. Sistemas operativos que soporta Hyper-v Windows 10

En cuanto a los sistemas operativos cliente que soportar Hyper-v contaremos


con los siguientes:

Windows:

• 10 en 32 y 64 bits
• 8 /8.1 32 y 64 bits
• 7 / 7 service pack 1 en versiones de 32 y 64 bits
• Vista SP2
• Server 2016 / 2012R2 / 2012 / 2008 SP1 y 2 de 32 y 64 bits las versiones
disponibles

Linux y Free BSD

• Ubuntu
• CentOS y Red Hat

3. Limitaciones y condiciones que debemos tener en cuenta

Para ejecutar las máquinas virtuales sobre Hyper-v tendremos que tener en
cuenta ciertas limitaciones que también coinciden con el resto de hypervisores
del mercado, en mayor o menor medida.

• Maquinas con hardware específico: para ciertas utilidades como juegos u


otros programas que sea necesario utilizar tarjetas gráficas dedicadas u
otros dispositivos hardware encontraremos problemas con su correcto
rendimiento. Estas aplicaciones no cuentan en definitiva con un hardware
con todas las funciones de uno real.
• Problemas reproducibles en el sistema host: además de experimentar
problemas en la máquina física estos pueden reproducirse en la propia
máquina física. El motivo de esto es debido a que Hyper-v una vez
activado también influye en cómo el sistema principal accede a los
recursos hardware de la máquina.
• Incompatibilidad con otros programas de virtualización: si tenemos
activado Hyper-v Windows 10 es bastante probable que experimentemos
problemas de compatibilidad con otras aplicaciones de virtualización. Por
ejemplo, hemos tenido una limitación en la instalación de máquinas
virtuales de 64 bits en VirtualBox y en VMware Workstation Player 15
• Problemas con el hardware físico del equipo: además de los anteriores,
los problemas de compatibilidad con las aplicaciones podrían provocar el
funcionamiento incorrecto de dispositivos como el teclado y mouse.
Nosotros mismo hemos experimentado estos problemas, siendo
necesaria la reinstalación del sistema operativo.

4. Versión de Hyper-v en Windows Server

Hay usuarios que, por ser un sistema operativo menos orientado al usuario
común deciden utilizar Windows Server para practicar la virtualización de sus
máquinas. Por este motivo, vamos a ver algunas de las diferencias
fundamentales que existen para Hyper-v en Windows Server:

• Migración en vivo de máquinas


• Replicación de Hyper-v
• Soporte para canal de fibra virtual
• Configuración de redes SR-IOV
• VHDX en modo compartido
• Gestión de memoria avanzada para las máquinas virtuales

En cuando a las funciones que solamente tendremos disponibles en Hyper-v


Windows 10 serán:

• Modo de creación rápido de máquinas virtuales y carpeta de galería de


VM
• Modo de red compartida con host de tipo NAT

5. Requisitos mínimos para ejecutar Hyper-v Windows 10

Otro apartado muy importante que debemos de conocer para saber si nuestras
máquinas virtuales se ejecutarán correctamente serán los requisitos mínimos:
• Tener instalada una de las versiones de Windows 10 64 bits: Pro,
Education Enterprise.
• Tener instalada una versión de Windows Server 2008 R2 (necesitaremos
descargar el paquete para su instalación)
• Disponer de una versión de Windows Server 2012 o 2016
• 4 GB de memoria RAM
• CPU de 64 bits con al menos dos o más núcleos
• Disco duro de al menos 100 GB
• Compatibilidad con Intel VT-x

Los requisitos serán variables en función de la máquina virtual que queramos


crear y de cuantas de ellas queramos tener ejecutándose en el sistema host.
Mientras mayor número más recursos será necesarios.
Cómo crear máquina virtual en Hyper-V y
configurarla

Hoy daremos un paso más y aprenderemos paso a paso cómo crear máquina virtual en Hyper-V. Veremos
cómo configurar ésta para obtener el mejor rendimiento posible. No solamente debemos de centrarnos en
los principales Hypervisores como son VMware o VirtualBox. Windows también dispone de una buena
herramienta para estos menesteres como es Hyper-V.

Índice de contenidos 
1. Crear máquina virtual en Hyper-V
1.1. Arrancar máquina virtual
1.2. Solución error no operating system was loaded Hyper-V
2. Configuración de Hyper-V
2.1. Como crear un adaptador de red en modo puente en Hyper-V
2.2. Elegir adaptador en la máquina virtual
2.3. Otras opciones

Sin duda la virtualización es algo que cada vez más personas y profesionales la utilizan, comenzó siendo un
servicio disponible solo para las mejores compañías, pero cada vez más son los usuarios que entran en
este mundillo y se sirven de las ventajas que esta proporciona. Microsoft no ha querido ser menos y ha
implementado en su sistema de escritorio principal la opción de virtualizar por medio de hardware
nuestras máquinas y sistemas.

Solamente debemos de tener presente que necesitaremos tener una versión de Windows server, 10 Pro,
Enterprise o Education para disponer de Hyper-V. Los que sean usuarios de Windows Home, no tendrán
la posibilidad de virtualizar con esta herramienta, ya que no está disponible para estas versiones del
sistema.

Ya hicimos un tutorial de qué era Hyper-V y de cómo activarlo en Windows 10. Aquí entraremos manos a
la obra en crear y configurar una máquina virtual bajo este Hypervisor

Crear máquina virtual en Hyper-V


Pues bien, sin más dilación procederemos a ver cómo crear máquina virtual en Hyper-V. Como es normal,
tendremos que tener ya activado nuestro Hypervisor en el sistema.

Abrimos Hyper-V mediante el menú inicio. Lo encontraremos en la sección de Herramientas


administrativas. Aunque también podremos escribir directamente “Administrador de Hyper-V”
Una vez hayamos abierto Hyper-V, pulsaremos sobre el botón de la barra de herramientas “Acción”,
“Nuevo” y “Máquina virtual”. De esta forma comenzaremos con el asistente de creación de la máquina
virtual en Hyper-V
En la primera ventana del asistente, tendremos que colocar el nombre de la máquina virtual y la ubicación
en donde esta se va a almacenar. Nosotros para este ejemplo, vamos a crear una máquina virtual de
Ubuntu.
A continuación, tendremos que seleccionar la generación de máquina virtual que queremos hacer. Para
que lo entendamos rápido, si tenemos un equipo físico con UEFI y posibilidad de activar tecnologías de
virtualización en esta, seleccionaremos “Generación 2”
En la siguiente ventana, tendremos que asignarle una cantidad de memoria RAM a la máquina virtual.
Para el caso de Ubuntu en su versión de 64 bit de escritorio, podríamos poner por ejemplo 2 GB. Pero
además podremos activar la opción de “Usar la memoria dinámica para esta máquina virtual”. Esto
permitirá asignar más recursos si fuera necesario.
En cuanto a la configuración de red, solamente podremos elegir “No conectado” o “Default Switch” para
establecer una red en la máquina virtual. Luego veremos cómo crear una conexión en modo puente.
Continuamos.
El siguiente paso, será la creación o asignación de un disco duro virtual para la máquina virtual. Si no
tenemos aún ninguno hecho, pulsaremos sobre “Crear un disco duro virtual” y la asignaremos una
determinada cantidad de espacio (en GB).
La última ventana corresponde a la selección del modo de instalación del sistema operativo en la máquina
virtual. Nosotros contamos con una imagen ISO del sistema en cuestión, por lo que utilizaremos la
segunda opción, y seleccionaremos el archivo de nuestro disco duro.

También podríamos seleccionar instalar más adelante, o, si tenemos un NAS o algún sistema similar de
archivos compartidos con un sistema operativo, elegiríamos la tercera opción
El asistente nos mostrará un resumen y finalmente nuestra máquina virtual estará lista para ser instalada.

Arrancar máquina virtual


Ahora lo que tendremos que hacer es arrancar la máquina virtual para comenzar la instalación del sistema
operativo.

Para ello debemos de situarnos por ejemplo sobre la máquina virtual y pulsar con botón derecho.
Elegiremos la opción de “Conectar”. También dispondremos de esta opción en la barra de herramientas
situada en la zona derecha del Hypervisor.
El proceso de instalación será el mismo que para cualquier otro sistema.

Solución error no operating system was loaded Hyper-V


En este punto, si durante los pasos anteriores seleccionamos la opción de “Generación 2”, es posible que
obtengamos un bonito error al conectar la máquina virtual pro, primera vez.

Este error se debe a que, por defecto, se encuentra activada una opción de “Arranque seguro” en la
máquina virtual cuya función es analizar las firmas del sistema operativo a instalar para validar que sólo los
componentes aprobados puedan ejecutarse.

Como no ha sido nuestro caso, hemos obtenido este error.


Lo que tendremos que hacer para solucionar este error, es desactivar el arranque seguro de la máquina
virtual. Para ello haremos los siguiente:

Pulsamos sobre la máquina virtual con botón derecho para elegir “Desconectar” para apagar la
máquina.

Ahora nos iremos a la opción de “Configuración” situada en la barra de herramientas de la zona


derecha.

Una vez dentro, nos vamos a la opción de “Seguridad”. Aquí desmarcaremos la opción “Arranque
seguro”
Una vez hecho esto, pulsamos en “Aplicar” y probamos nuevamente a iniciar nuestra máquina virtual.
Ahora todo debería de ir correctamente.

Configuración de Hyper-V
Una vez creada la máquina virtual, es importante ver algunas opciones de configuración que nos ayudarán
a mejorar las posibilidades de nuestras máquinas virtuales.

Como crear un adaptador de red en modo puente en Hyper-


V
Pues bien, como antes vimos durante el proceso de creación de la máquina virtual, solamente podíamos
configurar como adaptador de red el que viene por defecto en Hyper-V. Para configurar una máquina
virtual con el modo puente y que obtenga directamente la dirección IP del router, tendremos que crear un
nuevo adaptador de red. Veamos qué debemos hacer:

Situados en la ventana principal de Hyper-V, debemos de pulsar sobre la opción “Administrador de


conmutadores”. Opción situada en la barra de herramienta derecha del programa.

Ahora pulsamos sobre “Nuevo conmutador de red virtual” y elegimos la opción “Externo”

Pulsamos sobre “Crear conmutador virtual”


En la siguiente pantalla, debemos elegir la tarjeta de red que se encargará de proporcionar el puente
hasta el router. Por defecto se mostrará como activa la opción que actualmente estemos usando para
conectarnos a la red. En nuestro caso actual es la Wi-Fi.
Elegir adaptador en la máquina virtual
Para elegir el nuevo adaptador creado, tendremos que dirigirnos a la configuración de la máquina virtual y
situarnos en el apartado de “Adaptador de red” desplegamos la lista de “Conmutador virtual” y elegimos
el que hemos creado en el apartado anterior
Ahora cuando iniciemos la máquina virtual, verificaremos que estamos obteniendo la dirección IP
directamente desde el router.
Otras opciones
El resto de opciones de la máquina virtual son bastante similares a otros Hypervisores.

 Agregar Hardware: desde aquí podremos agregar nuevos controladores de hardware como discos
duros virtuales o adaptadores de red.

 Firmware: con esta opción podremos modificar la secuencia de arranque de la máquina virtual o
eliminar las imágenes ISO activas en el lector virtual de CD-ROM

 Memoria: podremos en todo momento configuración la cantidad de memoria RAM de la máquina


virtual. Recomendamos activar la memoria RAM dinámica si tenemos un equipo con buen hardware
para que Hyper-V gestione este recurso de forma automática.

 Procesador: desde esta opción podremos asignar más de un núcleo a la máquina virtual
 Apartado de administración: desde el segundo apartado, podremos modificar el nombre de la
máquina virtual, localización de archivos de paginación, o configurar los puntos de control para
almacenar determinados estados de la máquina virtual.
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Virtualización: Capítulo 1

CONCEPTOS GENERALES

blog.carreralinux.com.ar 1
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Capítulo 01 - CONCEPTOS GENERALES


DE VIRTUALIZACIÓN

ÍNDICE

¿Qué es la virtualización? 3
Historia 4
Conceptos de virtualización 5
Tipos de hipervisores 6
Extensión de microprocesadores para virtualización 8
Full Virtualization 8
Paravirtualization 10
OS Virtualization 12
¿Qué hay de lo que es cloud computing? 14
Modelos de servicio 15
SOFTWARE COMO SERVICIO 15
PLATAFORMA COMO SERVICIO 16
INFRAESTRUCTURA COMO SERVICIO 17

blog.carreralinux.com.ar 2
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Capítulo 01 - CONCEPTOS GENERALES


DE VIRTUALIZACIÓN

¿Qué es la virtualización?

Es una técnica que posibilita la ejecución


de una o más máquinas (denominadas máquinas
virtuales) sobre una única máquina física.

Cada máquina tiene asignada de forma independiente un conjun-


to de recursos de hardware y ejecuta su propia copia del OS.
Software de virtualización. Este software se conoce de manera
genérica como Hypervisor.

Este Hyperisor se encarga de la planificación de:


· Ejecución de las máquinas virtuales.
· Gestiona acceso compartido a los recursos de hardware.

El Hypervisor generará que los recursos reales de nuestro equipo físico se


abstraigan y se utilicen en conveniencia.

blog.carreralinux.com.ar
3
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Historia

Contrario de lo que la mayoría piensa, el tema de la virtualización no es nuevo ni rela-


tivamente nuevo tampoco. Durante la década de los 60 los equipos de informática de
muchas empresas y entidades tenían un problema similar: contaban con súper-com-
putadoras o “mainframes” de alto rendimiento que deseaban “particionar lógicamen-
te”, o utilizar para múltiples tareas simultaneas (lo que hoy conocemos como “multi-
tasking”, trabajar más de una aplicación o proceso simultáneamente).

Es por esto que IBM desarrolló un método para crear múltiples


“particiones lógicas” (similar a lo que conocemos hoy como
“máquinas virtuales”), las cuales trabajaban independiente-
mente una de las otras, y cada una utilizando los recursos
provistos por el “mainframe”.

Cabe aclarar que podemos definir esto como los inicios de la virtualización; pero no
es comparable con el crecimiento o como fue adoptado durante la década del 2000.

Ya para la década de los 80 y con la llegada de las relativamente económicas máqui-


nas x86, comenzó una nueva era de micro computadoras, aplicaciones cliente-ser-
vidor, y “computación distribuida”; en donde los enormes y potentes “mainframes”
con mil y una tareas y utilidades en una sola caja gigantesca, costosa y que ocupaba
mucho espacio en la sala de servidores, se comenzaron a cambiar por relativamente
pequeños servidores y computadoras personales de arquitectura x86 con “una caja
diferente para cada uso”. Esto se convirtió rápidamente en el estándar de la industria.
Entonces, en lugar de tener un solo mainframe que dividiera recursos para 3 tareas
(por ejemplo) era mucho menos costoso tener 3 equipos que realizaran cada uno
una tarea separada. Debido a esto, una vez más, el tema de la virtualización vuelve
a quedar prácticamente en el olvido y no es hasta finales de la década de los 90 que
gracias al alto desarrollo del hardware volvemos a caer en un predicamento similar
al que estábamos en los años 60: el hardware existente es altamente eficiente, y uti-
lizar cada “caja” para una sola aplicación sería un desperdicio de recursos, espacio,
energía y dinero; y tampoco es conveniente asignarle múltiples usos o instalar varias

4
blog.carreralinux.com.ar
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

aplicaciones en un solo servidor convencional por más de una razón; pero podemos
indicar una de las más importantes es que se vuelve cada vez más complejos de
administrar.

Es por esto que vuelve a resurgir la idea de dividir el hard-


ware, de manera tal que funcione como múltiples servidores
independientes pero compartiendo los recursos de un mismo
servidor físico. Y es de aquí que nace lo que hoy todos cono-
cemos como “virtualización”.

Conceptos de virtualización

Para entender un poco más lo que es virtualización vamos a decir que, del Sistema
Operativo al usuario se puede segmentar en 3 partes:

Host OS

VIRTUALIZACIÓN Hypervisor

Guest OS

· Host OS
Es el Host donde reside el hardware junto con su sistema operativo y proveerá los
recursos a las máquinas virtuales y compartir los mismos.

· Guest OS
Es el “sistema operativo” que está instalado dentro de la máquina virtual. Esta
puede ser distinta o no del sistema operativo del Host OS, o puede estar obligada a
ser la misma que el sistema operativo de Host OS. Noten que utilicé comillas al mo-
mento de decir “sistema operativo”; ya que como veremos más adelante, no necesa-
riamente para que la máquina virtual funcione es necesario un OS completo.

blog.carreralinux.com.ar
5
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

· Hypervisor
También se lo conoce como Virtual Machine Manager y es la aplicación que permi-
te utilizar distintas técnicas de virtualización para ejecutar al mismo tiempo di-
ferentes sistemas operativos. Nuevamente, estamos utilizando la palabra “sistema
operativo” por ahora para facilitar la comprensión; pero como indiqué anteriormente
no necesariamente vamos a encontrar todo un sistema Operativo instalado para co-
rrer una máquina virtual.
El concepto viene de principio de los 70’s donde en el mainframe se consolidaban
varias computadoras en una sola.

Dada la extensión de los sistemas basados en Unix, muchos fabricantes de hardwa-


re han estado vendiendo hardware ya virtualizado; pero es costoso. Por ejemplo los
Blades Center de IBM.

El primer hypervisor para PC fue la máquina virtualWare a fines de los 90’s y ahora
tanto intel como AMD están incorporando extensiones para virtualizar de mejor ma-
nera lo referente a arquitectura x86 para proporcionar un apoyo adicional a lo que es
el hypervisor.

Tipos de hipervisores

Los hipervisores pueden clasificarse en dos tipos:

· Tipo 1: nativo, unhosted, bare metal. En este caso, el Hypervissor se ejecuta di-
rectamente sobre el hardware para controlarlo y a su vez también controla el
Guest OS. Lo primero que se nota es la falta de OS. Como dijimos, el hypervisor
se sienta directamente sobre el hardware y el sistema operativo del Host OS sobre
este Hypervisor. De esta manera se reduce el overhead que genera que una máquina
virtual deba transitar el sistema operativo para llegar al hardware. Podríamos decir
que para el Hyervisor en este caso, el sistema operativo del Host OS lo toma como si
fuera una máquina virtual más. Claro que desde aquí podremos controlar al resto de
las máquinas virtuales a través del Hypervisor.

6
blog.carreralinux.com.ar
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

ESX, XEN, HYPERV.

APLICACIONES APLICACIONES

SISTEMA OPERATIVO SISTEMA OPERATIVO

HARDWARE HARDWARE

HIPERVISOR

HARDWARE REAL

· Tipo 2: también denominado hosted. El Hypervisor se ejecuta dentro del sistema


operativo, por lo que el OS del Host OS se encargará de coordinar las llamadas para
el uso de CPU, memoria, disco, red y otros recursos. Este tipo de virtualización hace
que los usuarios finales corran una máquina virtual dentro de un dispositivo personal.
Pero no confundan, no es que solo se utiliza dentro de los usuarios finales, sino que
los usuarios finales, si tienen que virtualizar, usarán este tipo de virtualización.

Típico ejemplo de esto es Virtualbox.

APLICACIONES APLICACIONES

SISTEMA OPERATIVO SISTEMA OPERATIVO


(huesped) (huesped)

HARDWARE HARDWARE

SOFTWARE DE VIRTUALIZACIÓN

SISTEMA OPERATIVO (anfitrión)

HARDWARE REAL

blog.carreralinux.com.ar
7
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Extensión de microprocesadores para virtualización

Las extensiones de microprocesadores permi-


ten ejecutar una máquina virtual en el Guest
OS sin incurrir en penalizaciones de emula-
ción; o sea, que al estar virtualizando un
sistema operativo se reduzca el rendimiento.

No todos los procesadores cuentan con este tipo de extensiones. Para los procesa-
dores Intel, la extensión se la conoce como IVT (Intel Virtualization Technologies) y
se la referencia con el nombre de Vanderpool. Básicamente divide todo su poder en
procesadores lógicos y se los asigna a las diferentes máquinas virtuales.

Por otro lado, para lo que es el mundo AMD, las extensiones se las conocen bajo el
nombre de Pacifica y se publicó con el nombre de Secure Virtual Machine de ahí
que más adelante buscaremos el svm dentro del /proc/cpuinfo para saber si es que
contamos con la extensión para virtualización.

Full Virtualization

APPS APPS

VM VM

HYPERVISOR

HOST OPERATING SYSTEM

HARDWARE

CPU MEMORY NIC DISK

8
blog.carreralinux.com.ar
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Existen diferentes técnicas, o lo que es lo mismo, diferentes maneras de lograr la vir-


tualización: Full virtualization, Para virtualization, OS Virtualization.

Tomemos el caso de Full Virtualization. En esta técnica, las máquinas virtuales emulan
hardware real o ficticio que requiere de recursos reales desde el host. Este enfoque es
utilizado por la mayoría de los sistemas de virtualización.

Permite ejecutar un sistema operativo invitado sin que éste


sepa que no se ejecuta en hardware real.

Por lo que en este tipo de técnica de virtualización, requeriremos que cada feature
de hardware sea reflejado en las máquinas virtuales. Como estamos emulando o re-
flejando el Hardware dentro del entorno de la máquina virtual, cualquier software (re-
cuerden que el sistema operativo también es una aplicación) es capaz de ejecutarse.

Ejemplos de software de full Virtualization:


· VirtualBox
· Hyper-V
· QEMU
· ESXi
· Vmware Workstation

Entonces, tenemos que en Full Virtualization. El Host OS


emula suficiente hardware para permitir a los Guest OS correr
separados unos de otros.

También debemos agregar que los sistemas operativos Guest no sufren ninguna mo-
dificación, esto significa que el proceso de instalación es el mismo que si instala-
remos sobre un hardware real. Es por eso que decimos también que el Guest OS
no tiene conocimiento de que está siendo virtualizado, ya que si nos conectáramos a
una Vm con Full Virtualization, no tenemos a nivel funcional forma de darnos cuenta
que estamos corriendo en un entorno virtualizado.

blog.carreralinux.com.ar
9
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Como puede observer en el gráfico, el Hypervisor (por ejemplo VirtualBox) corre den-
tro del sistema operativo, y es quien administra cada una de las máquinas virtuales.
Cuando una máquina virtual necesita acceder a Hardware se comunica con el hyper-
visor, y el hypervisor con el sistema operativo como si fuera una aplicación más.

Pero, ¿qué pasa con las instrucciones privilegiadas? Las instrucciones privilegiadas
dentro de una máquina virtual son traducidas en instrucciones para el hypervi-
sor. Esta es otra de las razones principales por la que cualquier sistema operativo
con arquitectura x86 puede ser virtualizado sin problemas.

Paravirtualization

Requiere un hypervisor también; pero la mayor parte de su trabajo se realiza en el


código del sistema operativo Guest, que es modificado para apoyarse sobre este
hypervisor y evitar el uso innecesario de las instrucciones privilegiadas.

Entonces, una de las primeras diferencias que encontramos es


que el sistema operativo guest es modificado para poder apo-
yarse sobre este tipo de Hypervisor.

También permite ejecutar diferentes sistemas operativos en un único server; pero los
sistemas virtualizados tienen conocimiento que se están ejecutando dentro de un hi-
pervisor, ya que estos son modificados. El kernel del guestOS es modificado para
correr en el hypervisor.

Esto limita el soporte a sistemas operativos open source,


que puede ser alterado o sistemas privativos donde los due-
ños concordaron en realizar estas modificaciones. Esto genera
que el Guest OS se comunique directamente con el hypervisor,
resultando una gran performance.

blog.carreralinux.com.ar
10
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Como pueden notar en el gráfico tanto las máquinas virtuales como el Host OS
se apoyan en el Hypervisor, y es este quien se comunica directamente con el
hardware. Por lo que el hypervisor no utiliza el sistema operativo del Host para
comunicarse con el hardware.

Entonces, la paravirtualización requiere que el sistema ope-


rativo Guest sea portado específicamente para utilizar la API
del Hypervisor, por lo que no es el kernel original del Host
OS en el que trabajaremos, sino que es uno modificado.

Este modelo modificado intenta reducir la porción del tiempo de ejecución utilizado
para realizar operaciones en un entorno virtualizado que en uno no virtualizado; pero
tiene como limitante que el Guest OS debe estar preparado para correr por encima
del Hypervisor, y no por encima de un kernel como los que conocemos.

La reducción de tiempo de ejecución se logra porque elimina la necesidad de la má-


quina virtual de atrapar las instrucciones privilegiadas y traducirlas, ya que estas son
reemplazadas por las hypercalls. Estas hypercalls se comunican de manera di-
recta con el hypervisor, por lo que no hay necesidad de traducir nada.

Recuerden que el Guest OS fue modificado, por


lo que puede realizar hypercalls y no system
calls o llamadas al sistema.

Un ejemplo de ParaVirtualization es Xen.

blog.carreralinux.com.ar
11
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

OS Virtualization

APPS APPS

CONTAINER CONTAINER

CONTAINER MANAGER

HOST OPERATING SYSTEM

HARDWARE

CPU MEMORY NIC DISK

Proporciona la seguridad para ejecutar múl-


tiples aplicaciones o copias del mismo OS
(diferentes distros) en el mismo servidor.

En lugar de virtualizar un sistema en donde hay un OS completamente instalado, lo


que hace es armar un container (o VE) de un solo OS.

En casos donde un solo sistema operativo es necesitado, los


beneficios de estos VE es que no duplican funcionalidades y
aumenta la performance.

Por lo que en este tipo de Virtualizaciones el sistema operativo será particionado


creando múltiples máquinas virtuales separadas unas de otras. Pensemos esto
como si fueran entornos que se ejecutan de manera separada.

blog.carreralinux.com.ar 12
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Cuando nos referimos a que no duplican funcionalidades o que el sistema operativo


es particionado implica que todos los containers comparten un solo kernel.

Para particionar una única máquina física en varios containers, el primer paso es crear
un filesystem separado para cada una de ellas. La llamada al sistema chroot() setea
el directorio raíz del proceso que lo está llamando, junto con el de sus hijos. Al modi-
ficar el directorio raíz, establecemos nuestro propio filesystem del cual no podremos
mirar más afuera de él.

Esto también nos lleva a entender que habrá actividades que no


pueden ser contenidas en el jail, como ser modificaciones de
kernel accediendo de manera directa (/proc) o cargar módulos.

Como podemos observar, solo instancia por cada máquina virtual el filesystem y las
librerías necesarias para ejecutarse; o por explicarlo simple, si hay algo que se pueda
utilizar común a todos los containers, lo utilizamos.

Esto nos da mucha flexibilidad; pero más importante, impone casi nada de overhead
ya que las aplicaciones en cada uno de estos jails utilizan las llamadas al sistema
normales, y no necesitan conversiones ni emulaciones de ningún tipo. Tampoco
requiere soporte de hardware.

Ejemplos de esto son:


· OpenVZ
· FreeBSD Jails
· Docker

blog.carreralinux.com.ar
13
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
¿Qué hay de lo que es cloud computing?

La computación en la nube o cloud computing es un paradigma que permite ofrecer


servicios de computación a través de una red, que usualmente es Internet.

Noten que hablamos de servicios de computación y no solamente


de máquinas virtuales.

El concepto principal es que todo lo que puede ofrecer un sistema informático


se ofrece como servicio, de modo que los usuarios puedan acceder a los servicios
disponibles “en la nube de Internet” sin conocimientos (o, al menos sin ser expertos)
en la gestión de los recursos que usan.

Cloud computing es un nuevo modelo de pres-


tación de servicios de negocio y tecnología,
que permite incluso al usuario acceder a un
catálogo de servicios estandarizados ya que
encontraremos que entre los diferentes pro-
veedores de cloud computing, aunque con dife-
rentes nombres, ofrecen los mismos servicios.

Esta segmentación en los servicios permite responder con lo necesario a las nece-
sidades de su negocio de forma adaptativa, en caso de demandas no previsibles o
de picos de trabajo, pagando únicamente por el consumo efectuado. O sea, no es lo
mismo una pequeña empresa que una multinacional.

blog.carreralinux.com.ar
14
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
Modelos de servicio

Cada uno de los servicios que ofrecen las empresas de cloudcomputing caerá en
alguno de estos:

SaaS
END USERS

PaaS
APPLICATION
DEVELOPERS

IaaS
NETWORK
ARCHITECTS

SOFTWARE COMO SERVICIO

El software como servicio (en inglés sof-


tware as a service, SaaS) se encuentra en la
capa más alta y caracteriza una aplicación
completa ofrecida como un servicio, por-de-
manda, vía multitenencia, que significa que
una sola instancia del software que corre en
la infraestructura del proveedor y sirve a
múltiples organizaciones.

blog.carreralinux.com.ar
15
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

Las aplicaciones que suministran este modelo de servicio son accesibles a través de
un navegador web, cliente o a veces hasta una API y el usuario no tiene control sobre
ellas, aunque en algunos casos se le permite realizar algunas configuraciones. Esto le
elimina la necesidad al cliente de instalar la aplicación en sus propios computadores,
evitando asumir los costos de soporte y el mantenimiento de hardware y software.
Software como servicio satisface la necesidad de usuarios finales que precisen de
una aplicación sin mayores necesidades de configuración.

Ejemplos de esto son:


· Google Apps (sheet, docs)
· Office 365
· Cisco WebEX

PLATAFORMA COMO SERVICIO

La capa del medio, que es la plataforma como


servicio (en inglés platform as a service,
PaaS), es la encapsulación de una abstrac-
ción de un ambiente de desarrollo y el em-
paquetamiento de una serie de módulos o com-
plementos que proporcionan, normalmente, una
funcionalidad horizontal como ser la persis-
tencia de datos, autenticación, mails.

En este modelo de servicio al usuario se le ofrece la plataforma de desarrollo y las


herramientas de programación por lo que puede desarrollar aplicaciones propias y
controlar la aplicación, pero no controla la infraestructura. Generalmente son elemen-
to de los que hacen uso las aplicaciones; pero no es donde corren las aplicaciones.

blog.carreralinux.com.ar
16
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01

INFRAESTRUCTURA COMO SERVICIO

La infraestructura como servicio (infras-


tructure as a service, IaaS) -también lla-
mada en algunos casos hardware as a service,
HaaS) se encuentra en la capa inferior y es
un medio de entregar almacenamiento básico y
capacidades de cómputo como servicios estan-
darizados en la red.

Servidores, sistemas de almacenamiento, conexiones, enrutadores, y otros sistemas


se concentran (por ejemplo a través de la tecnología de virtualización) para manejar
tipos específicos de cargas de trabajo, desde procesamiento en lotes (“batch”) hasta
aumento de servidor/almacenamiento durante las cargas pico. El ejemplo comercial
mejor conocido es Amazon Web Services, cuyos servicios EC2 y S3 ofrecen cómputo
y servicios de almacenamiento esenciales (respectivamente). Otro ejemplo es Joyent,
cuyo producto principal es una línea de servidores virtualizados, que proveen una
infraestructura en demanda altamente escalable para manejar sitios web, incluidas
aplicaciones web complejas escritas en Python, Ruby, PHP y Java.

blog.carreralinux.com.ar
17
7.1 Introducción
En este capítulo vamos a hablar de cómo gestionar los archivos en la línea de comandos.
El Empaquetamiento de Archivos se utiliza cuando uno o más archivos se tienen que
transmitir o almacenar lo más eficientemente posible. Hay dos aspectos:

• El Empaquetamiento - Combina varios archivos en uno solo, lo que elimina la


sobrecarga en archivos individuales y los hace más fácil de transmitir
• Compresión – hace los archivos más pequeños mediante la eliminación de
información redundante

Puedes realizar empaquetamiento de varios archivos en un solo archivo y luego comprimirlo, o


puedes comprimir un archivo individual. La primera opción se conoce todavía como
empaquetamiento de archivos, mientras la última se llama solo compresión. Cuando tomas un
archivo empaquetado, lo descomprimes y extraes uno o más archivos, lo
estás desempaquetando.
A pesar de que el espacio en disco es relativamente barato, el empaquetamiento y la
compresión aún tienen su valor:
• Si quieres que un gran número de archivos sea disponible, tales como el código
fuente a una aplicación o un conjunto de documentos, es más fácil para las
personas descargar un archivo empaquetado que descargar los archivos
individuales.
• Los archivos de registro tienen la costumbre de llenar los discos por lo que es
útil dividirlos por fecha y comprimir las las versiones más antiguas.
• Cuando haces copias de seguridad de los directorios, es más fácil mantenerlos
todos en un archivo empaquetado que crear una versión de cada archivo.
• Algunos dispositivos de transmisión, como cintas, se desempeñan mejor
enviando una transmisión en secuencia de datos en lugar de los archivos
individuales.
• A menudo puede ser más rápido comprimir un archivo antes de enviarlo a una
unidad de cinta o a una red más lenta y descomprimir en el otro extremo en vez
de enviarlo descomprimido.
Como administrador de Linux, debes familiarizarte con las herramientas para el
empaquetamiento y compresión de archivos.

7.2 Comprimir los Archivos


Comprimiendo los archivos los hace más pequeños eliminando la duplicación en un archivo y
guardándolo de tal manera que el archivo se pueda restaurar. Un archivo de texto legible podría
reemplazar palabras usadas con frecuencia por algo más pequeño, o una imagen con un fondo
sólido podría representar manchas de ese color por un código. Generalmente no usas la versión
comprimida del archivo, más bien lo descomprimes antes de usar. El algoritmo de
compresión es un procedimiento con el que la computadora codifica el archivo original y como
resultado lo hace más pequeño. Los científicos informáticos investigan estos algoritmos y
elaboran mejores, que pueden trabajar más rápido o hacer más pequeño el archivo de entrada.
Cuando se habla de compresión, existen dos tipos:

• Lossless (o «sin pérdida» en español): No se elimina ninguna información del


archivo. Comprimir un archivo y descomprimirlo deja algo idéntico al original.
• Lossy (o «con pérdida» en español): Información podría ser retirada del archivo
cuando se comprime para que al descomprimir el archivo de lugar a un archivo
que es un poco diferente que el original. Por ejemplo, una imagen con dos tonos
de verde sutilmente diferentes podría hacerse más pequeña por tratar esos dos
tonos como uno. De todos modos, el ojo no puede reconocer la diferencia.

Generalmente los ojos y oídos humanos no notan imperfecciones leves en las imágenes y el
audio, especialmente cuando se muestran en un monitor o suenan a través de los altavoces. La
compresión con pérdida a menudo beneficia a los medios digitales ya que los tamaños de los
archivos son más pequeños y las personas no pueden indicar la diferencia entre el original y la
versión con los datos cambiados. Cosas que deben permanecer intactas, como los documentos,
los registros y el software necesitan una compresión sin pérdida.
La mayoría de los formatos de imágenes, como GIF, PNG y JPEG, implementan algún tipo de
compresión con pérdida. Generalmente puedes decidir cuánta calidad quieres conservar. Una
calidad inferior resultará en un archivo más pequeño, pero después de la descompresión puedes
notar resultados no deseados tales como los bordes ásperos o decoloraciones. Una calidad alta
se parecerá mucho a la imagen original, pero el tamaño del archivo será más cercano al original.
Comprimir un archivo ya comprimido no lo hará más pequeño. Esto a menudo se olvida cuando
se trata de imágenes, puesto que ya se almacenan en un formato comprimido. Con la
compresión sin pérdida esta compresión múltiple no es un problema, pero si se comprime y
descomprime un archivo varias veces mediante un algoritmo con pérdida obtendrás algo que es
irreconocible.
Linux proporciona varias herramientas para comprimir los archivos, la más común es gzip. A
continuación te mostraremos un archivo de registro antes y después de la compresión.

bob:tmp $ ls -l access_log*
-rw-r--r-- 1 sean sean 372063 Oct 11 21:24 access_log
bob:tmp $ gzip access_log
bob:tmp $ ls -l access_log*
-rw-r--r-- 1 sean sean 26080 Oct 11 21:24 access_log.gz

En el ejemplo anterior hay un archivo llamado access_log que tiene 372,063 bytes. El archivo
se comprime invocando el comando gzip con el nombre del archivo como el único argumento.
Al finalizar el comando su tarea, el archivo original desaparece y una versión comprimida con
una extensión de archivo .gz se queda en su lugar. El tamaño del archivo es ahora 26,080
bytes, dando una relación de compresión de 14:1, que es común en el caso de los archivos de
registro.
El comando gzip te dará esta información si se lo pides utilizando el parámetro –l tal como se
muestra aquí:

bob:tmp $ gzip -l access_log.gz


compressed uncompressed ratio uncompressed_name
26080 372063 93.0% access_log

Aquí puedes ver que se da el porcentaje de compresión de 93%, lo inverso de la relación 14:1,
es decir, 13/14. Además, cuando el archivo se descomprime, se llamará access_log.

bob:tmp $ gunzip access_log.gz


bob:tmp $ ls -l access_log*
-rw-r--r-- 1 sean sean 372063 Oct 11 21:24 access_log

Lo contrario del comando gzip es el comando gunzip. Por otra parte, gzip –d hace la misma
cosa (gunzip es sólo un script que invoca el comando gzip con los parámetros correctos).
Cuando el comando gunzip termine su tarea, podrás ver que el archivo access_log vuelve a
su tamaño original.
Gzip puede también actuar como un filtro que no lee ni escribe nada en el disco sino recibe
datos a través de un canal de entrada y los escribe a un canal de salida. Aprenderás más sobre
cómo funciona en el siguiente capítulo, por lo que el ejemplo siguiente sólo te da una idea de lo
que puedes hacer al comprimir una secuencia.

bob:tmp $ mysqldump -A | gzip > database_backup.gz


bob:tmp $ gzip -l database_backup.gz
compressed uncompressed ratio uncompressed_name
76866 1028003 92.5% database_backup

El comando mysqldump – A da salidas a los contenidos de las bases de datos de MySQL


locales a la consola. El carácter | (barra vertical) dice "redirigir la salida del comando anterior en
la entrada del siguiente". El programa para recibir la salida es gzip, que reconoce que no se
dieron nombres de archivo por lo que debe funcionar en modo de barra vertical. Por último, >
database_backup.gz significa "redirigir la salida del comando anterior en un archivo
llamado database_backup.gz. La inspección de este archivo con gzip –l muestra que la
versión comprimida es un 7.5% del tamaño original, con la ventaja agregada de que el archivo
más grande jamás tuvo que ser escrito a disco.
Hay otro par de comandos que operan prácticamente idénticamente al gzip y gunzip. Éstos son
el bzip2 y bunzip2. Las utilidades del bzip utilizan un algoritmo de compresión diferente
(llamado bloque de clasificación de Burrows-Wheeler frente a la codificación Lempel-Ziv que
utiliza gzip) que puede comprimir los archivos más pequeños que un gzip a costa de más
tiempo de CPU. Puedes reconocer estos archivos porque tienen una extensión .bz o .bz2 en
vez de .gz.

7.3 Empaquetando Archivos


Si quieres enviar varios archivos a alguien, podrías comprimir cada uno individualmente.
Tendrías una cantidad más pequeña de datos en total que si enviaras los archivos sin
comprimir, pero todavía tendrás que lidiar con muchos archivos al mismo tiempo.
El empacamiento de archivos es la solución a este problema. La utilidad tradicional de UNIX
para archivar los ficheros es la llamada tar, que es una abreviación de TApe aRchive (o
«archivo de cinta» en español). Tar era utilizado para transmitir muchos archivos a una cinta
para copias de seguridad o transferencias de archivos. Tar toma varios archivos y crea un único
archivo de salida que se puede dividir otra vez en los archivos originales en el otro extremo de la
transmisión.
Tar tiene 3 modos que deberás conocer:

• Crear: hacer un archivo nuevo de una serie de archivos


• Extraer: sacar uno o más archivos de un archivo
• Listar: mostrar el contenido del archivo sin extraer

Recordar los modos es clave para averiguar las opciones de la línea de comandos necesarias
para hacer lo que quieres. Además del modo, querrás asegurarte de que recuerdas dónde
especificar el nombre del archivo, ya que podrías estar introduciendo varios nombres de archivo
en una línea de comandos.
Aquí, mostramos un archivo tar, también llamado un tarball, siendo creado a partir de múltiples
registros de acceso.

bob:tmp $ tar -cf access_logs.tar access_log*


bob:tmp $ ls -l access_logs.tar
-rw-rw-r-- 1 sean sean 542720 Oct 12 21:42 access_logs.tar

La creación de un archivo requiere dos opciones de nombre. La primera, c, especifica el modo.


La segunda, f, le dice a tar que espere un nombre de archivo como el siguiente argumento. El
primer argumento en el ejemplo anterior crea un archivo llamado access_logs.tar. El resto
de los argumentos se toman para ser nombres de los archivo de entrada, ya sea un comodín,
una lista de archivos o ambos. En este ejemplo, utilizamos la opción comodín para incluir todos
los archivos que comienzan con access_log.
El ejemplo anterior hace un listado largo de directorio del archivo creado. El tamaño final es
542,720 bytes que es ligeramente más grande que los archivos de entrada. Los tarballs pueden
ser comprimidos para transporte más fácil, ya sea comprimiendo un archivo con gzip o
diciéndole a tar que lo haga con la a opción z tal como se muestra a continuación:

bob:tmp $ tar -czf access_logs.tar.gz access_log*


bob:tmp $ ls -l access_logs.tar.gz
-rw-rw-r-- 1 sean sean 46229 Oct 12 21:50 access_logs.tar.gz
bob:tmp $ gzip -l access_logs.tar.gz
compressed uncompressed ratio uncompressed_name
46229 542720 91.5% access_logs.tar

El ejemplo anterior muestra el mismo comando como en el ejemplo anterior, pero con la adición
del parámetro z. La salida es mucho menor que el tarball en sí mismo, y el archivo resultante es
compatible con gzip. Se puede ver en el último comando que el archivo descomprimido es del
mismo tamaño, como si hubieras utilizado el tar en un paso separado.
Mientras que UNIX no trata las extensiones de archivo especialmente, la convención es
usar .tar para los archivos tar y .tar.gz o .tgz para los archivos tar comprimidos. Puedes
utilizar bzip2 en vez de gzip sustituyendo la letra z con j y usando .tar.bz2,.tbz,
o .tbz2 para una extensión de archivo (por ejemplo tar –cjf file.tbz access_log*).
En el archivo tar, comprimido o no, puedes ver lo que hay dentro utilizando el comando t:

bob:tmp $ tar -tjf access_logs.tbz


logs/
logs/access_log.3
logs/access_log.1
logs/access_log.4
logs/access_log
logs/access_log.2
Este ejemplo utiliza 3 opciones:

• t: listar documentos en el archivo en el archivo empaquetado


• j: descomprimir con bzip2 antes de la lectura
• f: operar en el nombre de archivo access_logs.tbz

El contenido del archivo comprimido entonces es desplegado. Puedes ver que un directorio fue
prefijado a los archivos. Tar se efectuará de manera recursiva hacia los subdirectorios
automáticamente cuando comprime y almacenará la información de la ruta de acceso dentro del
archivo.
Sólo para mostrar que este archivo aún no es nada especial, vamos a listar el contenido del
archivo en dos pasos mediante una barra vertical.

bob:tmp $ bunzip2 -c access_logs.tbz | tar -t


logs/
logs/access_log.3
logs/access_log.1
logs/access_log.4
logs/access_log
logs/access_log.2

A la izquierda de la barra vertical está bunzip –c access_logs.tbz, que descomprime el


archivo, pero el c envía la salida a la pantalla. La salida es redirigida a tar -t. Si no especificas
que un archivo con –f, entonces el tar leerá la entrada estándar, que en este caso es el archivo
sin comprimir.
Finalmente, puedes extraer el archivo con la marca –x:

bob:tmp $ tar -xjf access_logs.tbz


bob:tmp $ ls -l
total 36
-rw-rw-r-- 1 sean sean 30043 Oct 14 13:27 access_logs.tbz
drwxrwxr-x 2 sean sean 4096 Oct 14 13:26 logs
bob:tmp $ ls -l logs
total 536
-rw-r--r-- 1 sean sean 372063 Oct 11 21:24 access_log
-rw-r--r-- 1 sean sean 362 Oct 12 21:41 access_log.1
-rw-r--r-- 1 sean sean 153813 Oct 12 21:41 access_log.2
-rw-r--r-- 1 sean sean 1136 Oct 12 21:41 access_log.3
-rw-r--r-- 1 sean sean 784 Oct 12 21:41 access_log.4

El ejemplo anterior utiliza un patrón similar como antes, especificando la operación (eXtract),
compresión ( (la opción j, que significa bzip2) y un nombre de archivo -f access_logs.tbz).
El archivo original está intacto y se crea el nuevo directorio logs. Los archivos están dentro del
directorio.
Añade la opción –v y obtendrás una salida detallada de los archivos procesados. Esto es útil
para que puedas ver lo que está sucediendo:

bob:tmp $ tar -xjvf access_logs.tbz


logs/
logs/access_log.3
logs/access_log.1
logs/access_log.4
logs/access_log
logs/access_log.2

Es importante mantener la opción –f al final, ya que el tar asume que lo que sigue es un
nombre de archivo. En el siguiente ejemplo, las opciones f y v fueron transpuestas, llevando
al tar a interpretar el comando como una operación en un archivo llamado "v" (el mensaje
relevante viene en itálica).

bob:tmp $ tar -xjfv access_logs.tbz


tar (child): v: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

Si sólo quieres algunos documentos del archivo empaquetado puedes agregar sus nombres al
final del comando, pero por defecto deben coincidir exactamente con el nombre del archivo o
puedes utilizar un patrón:

bob:tmp $ tar -xjvf access_logs.tbz logs/access_log


logs/access_log

El ejemplo anterior muestra el mismo archivo que antes, pero extrayendo solamente el
archivo logs/access_log. La salida del comando (ya se solicitó el modo detallado con la
bandera v) muestra que sólo un archivo se ha extraído.
El tar tiene muchas más funciones, como la capacidad de utilizar los patrones al extraer los
archivos, excluir ciertos archivos o mostrar los archivos extraídos en la pantalla en lugar de un
disco. La documentación para el tar contiene información a profundidad.

7.4 Archivos ZIP


De hecho, la utilidad del empaquetamiento de archivos en el mundo de Microsoft es el archivo
ZIP. No es tan frecuente en Linux pero también es compatible con los comandos zip y unzip.
Con el tar y gzip/gunzip se pueden utilizar los mismos comandos y las mismas opciones para
hacer la creación y extracción, pero éste no es el caso del zip. La misma opción tiene diferentes
significados para los estos dos diferentes comandos.
El modo predeterminado del zip es añadir documentos a un archivo y comprimir.

bob:tmp $ zip logs.zip logs/*


adding: logs/access_log (deflated 93%)
adding: logs/access_log.1 (deflated 62%)
adding: logs/access_log.2 (deflated 88%)
adding: logs/access_log.3 (deflated 73%)
adding: logs/access_log.4 (deflated 72%)

El primer argumento en el ejemplo anterior es el nombre del archivo sobre el cual se trabajará,
en este caso es el logs.zip. Después de eso, hay que añadir una lista de archivos a ser
agregados. La salida muestra los archivos y la relación de compresión. Debes notar que
el tar requiere la opción –f para indicar que se está pasando un nombre de archivo, mientras
que el zip y unzip requiere un nombre de archivo, por lo tanto no tienes que decir
explícitamente que se está pasando un nombre de archivo.
Zip no se efectuará de manera recursiva hacia los subdirectorios por defecto, lo que es un
comportamiento diferente del tar. Es decir, simplemente añadiendo logs en vez de logs/* sólo
añadirá un directorio vacío y no los archivos dentro de él. Si quieres que zip se comporte de
manera parecida, debes utilizar el comando –r para indicar que se debe usar la recursividad:

bob:tmp $ zip -r logs.zip logs


adding: logs/ (stored 0%)
adding: logs/access_log.3 (deflated 73%)
adding: logs/access_log.1 (deflated 62%)
adding: logs/access_log.4 (deflated 72%)
adding: logs/access_log (deflated 93%)
adding: logs/access_log.2 (deflated 88%)

En el ejemplo anterior, se añaden todos los archivos bajo el directorio logs ya que utiliza la
opción –r. La primera línea de la salida indica que un directorio se agregó al archivo, pero de lo
contrario la salida es similar al ejemplo anterior.
El listado de los archivos en el zip se realiza por el comando unzip y la opción –l (listar):

bob:tmp $ unzip -l logs.zip


Archive: logs.zip
Length Date Time Name
--------- ---------- ----- ----
0 10-14-2013 14:07 logs/
1136 10-14-2013 14:07 logs/access_log.3
362 10-14-2013 14:07 logs/access_log.1
784 10-14-2013 14:07 logs/access_log.4
90703 10-14-2013 14:07 logs/access_log
153813 10-14-2013 14:07 logs/access_log.2
--------- -------
246798 6 files

Extraer los archivos es como crear el archivo, ya que la operación predeterminada es extraer:
bob:tmp $ unzip logs.zip
Archive: logs.zip
creating: logs/
inflating: logs/access_log.3
inflating: logs/access_log.1
inflating: logs/access_log.4
inflating: logs/access_log
inflating: logs/access_log.2

Aquí, extraemos todos los documentos del archivo empaquetado al directorio actual. Al igual que
el tar, puedes pasar los nombres de archivos a la línea de comandos:

bob:tmp $ unzip logs.zip access_log


Archive: logs.zip
caution: filename not matched: access_log
bob:tmp $ unzip logs.zip logs/access_log
Archive: logs.zip
inflating: logs/access_log
bob:tmp $ unzip logs.zip logs/access_log.*
Archive: logs.zip
inflating: logs/access_log.3
inflating: logs/access_log.1
inflating: logs/access_log.4
inflating: logs/access_log.2

El ejemplo anterior muestra tres diferentes intentos para extraer un archivo. En primer lugar, se
pasa sólo el nombre del archivo sin el componente del directorio. Al igual que con el tar, el
archivo no coincide.
El segundo intento pasa el componente del directorio junto con el nombre del archivo, que
extrae solo ese archivo.
La tercera versión utiliza un comodín, que extrae los 4 archivos que coinciden con el patrón, al
igual que el tar.
Las páginas man del zip y unzip describen las otras cosas que puedes hacer con estas
herramientas, tales como reemplazar los archivos dentro del archivo empaquetado, utilizar los
diferentes niveles de compresión o incluso el cifrado.

7.1 Introducción
Este es Lab 7: Empaquetamiento y desempaquetamiento de los archivos. Mediante la
realización de esta práctica de laboratorio, los estudiantes aprenderán cómo trabajar con los
archivos empaquetados.
En este laboratorio llevarás a cabo las siguientes tareas:
1. Crear los archivos empaquetados usando tar con y sin compresión
2. Comprimir y descomprimir los archivos en un archivo empaquetado comprimido
con gzip
3. Comprimir y descomprimir los archivos en un archivo empaquetado en bzip2
4. Utilizar zip y unzip para comprimir y descomprimir los archivos empaquetados

7.2 Comandos de empaquetamiento


En esta tarea, utilizaremos gzip, bzip2, tar y zip/unzip para empaquetar y restaurar los
archivos. Estos comandos están diseñados para combinar varios archivos en un único archivo o
comprimir un archivo grande en uno más pequeño. En algunos casos, los comandos tendrán
ambas funciones.
La tarea de empaquetamiento de los datos es importante por varias razones, incluyendo pero no
limitado a lo siguiente:

a. Los archivos grandes pueden ser difíciles de transferir. Haciendo estos archivos
más pequeños ayuda a hacer la transferencia más rápida.
b. La transferencia de múltiples archivos de un sistema a otro puede llegar a ser
tedioso cuando hay muchos archivos. Su fusión en un único archivo para la
transferencia hace que este proceso sea más fácil.
c. Los archivos pueden ocupar rápidamente una gran cantidad de espacio,
especialmente en un medio extraíble como memorias USB más pequeñas. El
empaquetamiento reduce este problema.

Un área potencial de confusión que un usuario principiante de Linux puede experimentar se


deriva de la siguiente pregunta: ¿Por qué hay tantos comandos diferentes de
empaquetamiento? La respuesta es que estos comandos tienen diferentes características (por
ejemplo, algunos de ellos permiten proteger el archivo empaquetado con una contraseña) y
técnicas de compresión utilizadas.
Lo más importante que debe saber por ahora es cómo funcionan estos diferentes comandos.
Con el tiempo, aprenderás a seleccionar la herramienta de empaquetamiento correcta para
cualquier situación.

7.2.1 Paso 1
Utiliza el siguiente comando tar para crear un archivo empaquetado del directorio /etc/udev.
Guardar la copia de seguridad en el directorio ~/mybackups :

cd
mkdir mybackups
tar –cvf mybackups/udev.tar /etc/udev
ls mybackups

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~$ cd
sysadmin@localhost:~$ mkdir mybackups
sysadmin@localhost:~$ tar -cvf mybackups/udev.tar /etc/udev
tar: Removing leading `/' from member names
/etc/udev/
/etc/udev/rules.d/
/etc/udev/rules.d/70-persistent-cd.rules
/etc/udev/rules.d/README
/etc/udev/udev.conf
sysadmin@localhost:~$ ls mybackups/
udev.tar
sysadmin@localhost:~$

El comando tar se utiliza para combinar varios archivos en un solo archivo. Por defecto no
comprime los datos.
La opción -c le indica al comando tar que cree un archivo tar. La opción -v significa "verbose",
que le indica al comando tar para muestre lo que está haciendo. La opción -f se utiliza para
especificar el nombre del archivo tar.
Para tu información: tar significa Tape ARchive (archivo de cinta). Este comando se utilizó
originalmente para crear copias de seguridad de cintas, pero hoy en día es más comúnmente
utilizado para crear los archivo empaquetados.
Importante: No tienes que utilizar la extensión .tar con nombre de archivo empaquetado, sin
embargo, es muy útil para determinar el tipo de archivo. Se considera de «buen estilo» cuando
envias un archivo a otra persona.

7.2.2 Paso 2
Muestra el contenido del archivo tar (t = lista el contenido, v = verbose, f =nombre del archivo):

tar –tvf mybackups/udev.tar

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~$ tar -tvf mybackups/udev.tar


drwxr-xr-x root/root 0 2015-01-28 16:32 etc/udev/
drwxr-xr-x root/root 0 2015-01-28 16:32 etc/udev/rules.d/
-rw-r--r-- root/root 306 2015-01-28 16:32 etc/udev/rules.d/70-persist
ent-cd.rules
-rw-r--r-- root/root 1157 2012-04-05 19:18 etc/udev/rules.d/README
-rw-r--r-- root/root 218 2012-04-05 19:18 etc/udev/udev.conf
sysadmin@localhost:~$

Ten en cuenta que los archivos fueron copiados de forma recursiva utilizando los nombres de
ruta relativa . Esto es importante porque al extraer los archivos, que serán colocados en el
directorio actual, no se reemplazan los archivos actuales.

7.2.3 Paso 3
Para crear un archivo tar comprimido, utiliza la opción -z:

tar –zcvf mybackups/udev.tar.gz /etc/udev


ls –lh mybackups

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~$ tar -zcvf mybackups/udev.tar.gz /etc/udev


tar: Removing leading `/' from member names
/etc/udev/
/etc/udev/rules.d/
/etc/udev/rules.d/70-persistent-cd.rules
/etc/udev/rules.d/README
/etc/udev/udev.conf
sysadmin@localhost:~$ ls -lh mybackups/
total 16K
-rw-rw-r-- 1 sysadmin sysadmin 10K Jan 25 04:00 udev.tarf
-rw-rw-r-- 1 sysadmin sysadmin 1.2K Jan 25 04:34 udev.tar.gz
sysadmin@localhost:~$

Observa la diferencia de tamaño; la primera copia de seguridad (10 Kbytes) es mayor que la
segunda copia de seguridad (1.2 Kbytes).
La opción -z hace uso de la utilidad gzip para realizar la compresión.

7.2.4 Paso 4
Extraer el contenido de un archivo. Los datos se restauran en el directorio actual por defecto:

cd mybackups
tar –xvf udev.tar.gz
ls
ls etc
ls etc/udev
ls etc/udev/rules.d

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~$ cd mybackups
sysadmin@localhost:~/mybackups$ ls
udev.tar udev.tar.gz
sysadmin@localhost:~/mybackups$ tar -xvf udev.tar.gz
etc/udev/
etc/udev/rules.d/
etc/udev/rules.d/70-persistent-cd.rules
etc/udev/rules.d/README
etc/udev/udev.conf
sysadmin@localhost:~/mybackups$ ls
etc udev.tar udev.tar.gz
sysadmin@localhost:~/mybackups$ ls etc
udev
sysadmin@localhost:~/mybackups$ ls etc/udev
rules.d udev.conf
sysadmin@localhost:~/mybackups$ ls etc/udev/rules.d
70-persistent-cd.rules README
sysadmin@localhost:~/mybackups$

Si quieres «regresar» los archivos a su ubicación original, primero puede cd al directorio / , y


luego ejecutar el comando tar. Sin embargo, en este ejemplo, esto requeriría que inicies la
sesión como administrador porque la creación de los archivos en el directorio /etc sólo puede
realizarse por el administrador.

7.2.5 Paso 5
Para añadir un archivo a un archivo empaquetado existente, utiliza la opción -r con el
comando tar. Ejecuta los siguientes comandos para realizar esta acción y comprobar la
existencia del archivo nuevo en el archivo empaquetado tar:

tar -rvf udev.tar /etc/hosts


tar –tvf udev.tar

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ tar -rvf udev.tar /etc/hosts


tar: Removing leading `/' from member names
/etc/hosts
sysadmin@localhost:~/mybackups$ tar -tvf udev.tar
drwxr-xr-x root/root 0 2015-01-28 16:32 etc/udev/
drwxr-xr-x root/root 0 2015-01-28 16:32 etc/udev/rules.d/
-rw-r--r-- root/root 306 2015-01-28 16:32 etc/udev/rules.d/70-persist
ent-c
d.rules
-rw-r--r-- root/root 1157 2012-04-05 19:18 etc/udev/rules.d/README
-rw-r--r-- root/root 218 2012-04-05 19:18 etc/udev/udev.conf
sysadmin@localhost:~/mybackups$

7.2.6 Paso 6
En los siguientes ejemplos, vas a utilizar los comandos gzip y gunzip para comprimir y
descomprimir un archivo. Ejecuta los siguientes comandos para comprimir una copia del
archivo words:

cp /usr/share/dict/words .
ls -l words
gzip words
ls -l words.gz

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ cp /usr/share/dict/words .
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
sysadmin@localhost:~/mybackups$ gzip words
sysadmin@localhost:~/mybackups$ ls -l words.gz
-rw-r--r-- 1 sysadmin sysadmin 255996 Jan 25 07:39 words.gz
sysadmin@localhost:~/mybackups$

Observa que el tamaño del archivo comprimido (255996 bytes en el ejemplo anterior) es mucho
menor que el tamaño del archivo original (938848 bytes en el ejemplo anterior).
Muy importante: Cuando utilizas el comando gzip, el archivo original se sustituye por el archivo
comprimido. En el ejemplo anterior, el archivo words fue sustituido por words.gz.
Al descomprimir el archivo, el archivo comprimido será reemplazado por el archivo original.

7.2.7 Paso 7
Ejecuta los siguientes comandos para descomprimir el archivo words.gz :

ls -l words.gz
gunzip words.gz
ls -l words

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ ls -l words.gz
-rw-r--r-- 1 sysadmin sysadmin 255996 Jan 25 07:39 words.gz
sysadmin@localhost:~/mybackups$ gunzip words.gz
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
sysadmin@localhost:~/mybackups$

Linux proporciona un gran número de utilidades de compresión además de gzip/gunzip. Cada


uno de ellos tiene pros y contras (compresión más rápida, mejores tasas de compresión, más
flexible, más portátil, descompresión más rápida, etc.).
Los comandos gzip/gunzip son muy populares en Linux, pero se debe tener en cuenta que los
comandos bzip2/bunzip2 también son muy populares en algunas distribuciones de Linux. Por
suerte, la mayor parte de la funcionalidad (la forma de ejecutar los comandos) y las opciones
son las mismas que en el caso de gzip/gunzip.

7.2.8 Paso 8
El uso de los comandos bzip2 y bunzip2 para comprimir y descomprimir un archivo es muy
similar al de los comandos gzip y gunzip. El archivo comprimido se crea con
una extensión .bz2. La extensión se retira una vez descomprimido. Ejecuta los siguientes
comandos para comprimir una copia del archivo words :

ls -l words
bzip2 words
ls -l words.bz2

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
sysadmin@localhost:~/mybackups$ bzip2 words
sysadmin@localhost:~/mybackups$ ls -l words.bz2
-rw-r--r-- 1 sysadmin sysadmin 335405 Jan 25 07:39 words.bz2
sysadmin@localhost:~/mybackups$

Si se compara el resultado tamaño del archivo .bz2 resultante (335405) con el tamaño del
archivo .gz (255996) en el paso no. 7, se puede observar que gzip hizo un mejor trabajo al
comprimir ese archivo en particular.

7.2.9 Paso 9
Ejecuta los siguientes comandos para descomprimir el archivo words.bz2 :

ls -l words.bz2
bunzip2 words.bz2
ls -l words
sysadmin@localhost:~/mybackups$ ls -l words.bz2
-rw-r--r-- 1 sysadmin sysadmin 335405 Jan 25 07:39 words.bz2
sysadmin@localhost:~/mybackups$ bunzip2 words.bz2
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words

Mientras que los archivos empaquetados gzip y bzip se utilizan comúnmente en Linux, el tipo
de empaquetamiento zip es más comúnmente utilizado por otros sistemas operativos, como
Windows. De hecho, la aplicación Explorador de Windows tiene un soporte integrado para
extraer los archivos empaquetados zip.
Por lo tanto, si quieres compartir un archivo con los usuarios de Windows, por lo general se
prefiere el uso de empaquetamiento zip. A diferencia de gzip y bzip2, cuando un archivo se
comprime con el comando zip, una copia del archivo original es comprimido y el original
permanece sin comprimir.

7.2.10 Paso 10
Utiliza el comando zip para comprimir el archivo words:

zip words.zip words


ls -l words.zip

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ zip words.zip words


adding: words (deflated 73%)
sysadmin@localhost:~/mybackups$ ls -l words.zip
-rw-rw-r-- 1 sysadmin sysadmin 256132 Jan 25 21:25 words.zip
sysadmin@localhost:~/mybackups$

El primer argumento (words.zip en el ejemplo anterior) del comando zip es el nombre del
archivo que quieres crear. El resto de los argumentos (words en el ejemplo anterior) son los
archivos que quieres colocar en el archivo comprimido.
Importante: No tienes que utilizar la extensión .zip con nombre de archivo comprimido, sin
embargo, es muy útil para determinar el tipo de archivo. También, se considera de «buen estilo»
cuando envías un archivo a otra persona.

7.2.11 Paso 11
Comprime el directorio /etc/udev y su contenido con el comando de compresión zip:

zip -r udev.zip /etc/udev


ls -l udev.zip

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ zip -r udev.zip /etc/udev


adding: etc/udev/ (stored 0%)
adding: etc/udev/rules.d/ (stored 0%)
adding: etc/udev/rules.d/70-persistent-cd.rules (deflated 29%)
adding: etc/udev/rules.d/README (deflated 50%)
adding: etc/udev/udev.conf (deflated 24%)
sysadmin@localhost:~/mybackups$ ls -l udev.zip
-rw-rw-r-- 1 sysadmin sysadmin 1840 Jan 25 21:33 udev.zip
sysadmin@localhost:~/mybackups$
El comando tar que viste anteriormente en este laboratorio desciende automáticamente a
través de los subdirectorios de un directorio especificado para ser empaquetado. Con los
comandos bzip2, gzip, y zip es necesario especificar la opción -r para realizar la recursividad
en los subdirectorios.

7.2.12 Paso 12
Para ver el contenido de un archivo zip, utiliza la opción -l con el comando unzip:

unzip -l udev.zip

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ unzip -l udev.zip


Archive: udev.zip
Length Date Time Name
--------- ---------- ----- ----
0 2015-01-28 16:32 etc/udev/
0 2015-01-28 16:32 etc/udev/rules.d/
306 2015-01-28 16:32 etc/udev/rules.d/70-persistent-cd.rules
1157 2012-04-05 19:18 etc/udev/rules.d/README
218 2012-04-05 19:18 etc/udev/udev.conf
--------- -------
1681 5 files
sysadmin@localhost:~/mybackups$

7.2.13 Paso 13
Para extraer el archivo zip, utiliza el comando unzip sin ninguna opción. En este ejemplo,
primero tenemos que eliminar los archivos que se crearon en el ejemplo tar más arriba:

rm -r etc
unzip udev.zip

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ rm -r etc
sysadmin@localhost:~/mybackups$ unzip udev.zip
Archive: udev.zip
creating: etc/udev/
creating: etc/udev/rules.d/
inflating: etc/udev/rules.d/70-persistent-cd.rules
inflating: etc/udev/rules.d/README
inflating: etc/udev/udev.conf
sysadmin@localhost:~/mybackups$
11.1 Introducción
Un sistema típico de Linux tiene miles de archivos. El Filesystem Hierarchy Standard (o
«estándar jerárquico del sistema de archivos» en español) (explicado en detalle en un capítulo
posterior) proporciona una guía para las distribuciones en cómo organizar estos archivos. En
este capítulo verás cómo los sistemas de administración de paquetes de software pueden
proporcionar información sobre la ubicación de los archivos pertenecientes a un paquete.
El kernel de Linux es el núcleo del sistema operativo GNU/Linux. Este capítulo explica el papel
del kernel de Linux y cómo proporciona información acerca del sistema bajo los pseudo-
sistemas de archivo /proc y /sys.
Verás cómo cada comando que se ejecuta causa que se ejecute un proceso y podrás ver los
procesos ejecutándose con el comando ps. También verás discusión sobre cómo el sistema
graba o registra mensajes desde los procesos en segundo plano llamados demonios (o
«daemons» en inglés).
Finalmente, verás cómo visualizar el ring buffer del kernel con el comando dmesg para ver los
mensajes que contiene.

Conociendo como Linux promueve carreras profesionales. 86% de los profesionistas de


Linux reportan que saber Linux les ha dado más oportunidades de carrera profesional. Y 64%
dicen que seleccionaron trabajar con Linux por su omnipresencia en la infraestructura de
tecnología del mundo moderno.

11.2 Administración de Paquetes


Administración de Paquetes es un sistema que instala, actualiza, consulta o elimina software
dentro de un sistema de archivos. En Linux hay muchos sistemas de administración de paquetes
de software diferentes, pero los dos más populares son Debian y Red Hat.

11.2.1 Administración de Paquetes Debian


La distribución Debian y sus derivados como Ubuntu y Mint utilizan el sistema de gestión de
paquetes Debian. En el centro de administración de paquetes de distribuciones derivadas de
Debian están los paquetes de software que se distribuyen como archivos con terminación
«.deb».
La herramienta de nivel más bajo para administrar estos archivos es el comando dpkg. Este
comando puede ser complicado para los usuarios de Linux principiantes, por lo que una
herramienta de paquetes avanzada, apt-get, un programa front-end para la herramienta dpkg,
facilita más la administración de los paquetes. Existen otras herramientas de la línea de
comandos que sirven como front-end de dpkg, tales como aptitude, así como front-ends de
GUI como synaptic y software-center (tal como se muestra abajo).
11.2.1.1 Debian - Agregando paquetes
Los repositorios de Debian contienen más de 65,000 diferentes paquetes de software. Para
obtener una lista actualizada de estos repositorios de Internet, puedes ejecutar el comando
de sudo apt-get update.
Para buscar palabras clave dentro de estos paquetes, puedes utilizar el comando sudo apt-
cache search keyword.

Cuando hayas encontrado el paquete que quieres instalar, puedes instalarlo con el
comando sudo apt-get install package.
Importante: Para ejecutar estos comandos tu sistema necesitará acceso a Internet. El
comando apt-cache busca repositorios de estos programas de software en Internet.

11.2.1.2 Debian - Actualización de Paquetes


Si quieres actualizar un paquete individual vas a utilizar un comando que instala tal
paquete: sudo apt-get install package.
Si ya tienes instalada una versión anterior del paquete, entonces se actualizará. De lo contrario
se ejecuta una nueva instalación.
Si quieres actualizar todos los paquetes posibles, tienes que ejecutar el comando sudo apt-get
upgrade.

Los usuarios que inicien sesión con una interfaz gráfica pueden ver en el área de las
notificaciones un mensaje del update-manager («administrador de actualizaciones» en español)
que indica que las actualizaciones están disponibles tal como se muestra a continuación:
11.2.1.3 Debian - Eliminación de Paquetes
Ten cuidado cuando elimines una paquete de software puede resultar en la eliminación de otros
paquetes. Debido a las dependencias entre paquetes, si eliminas un paquete, entonces todos
los paquetes que necesitan o dependen de ese paquete se eliminarán también.
Si quieres eliminar todos los archivos de un paquete de software, excepto los archivos de
configuración, puedes ejecutar el comando sudo apt-get remove package.
Si quieres eliminar todos los archivos de un paquete de software, incluyendo los archivos de
configuración, puedes ejecutar el comando sudo apt-get --purge remove package.
Puede que quieras guardar los archivos de configuración en caso de que vuelvas a instalar el
paquete de software en un momento posterior.

11.2.1.4 Debian - Consultar Paquetes


Hay varios tipos de consultas que los administradores necesitan utilizar. Para obtener una lista
de todos los paquetes que están instalados actualmente en el sistema ejecuta el comando dpkg
-l.

Para listar los archivos que componen un paquete especial, puedes ejecutar el comando
de dpkg -L package.
Para consultar un paquete y obtener información o su estado usa el comando de dpkg -
s package.

Para determinar si un determinado archivo fue puesto en el sistema de archivos como el


resultado de la instalación de un paquete utiliza el comando dpkg -S /path/to/file. Si el
archivo era parte de un paquete, podría proporcionarse el nombre del paquete. Por ejemplo:

sysadmin@localhost:~$ dpkg -S /usr/bin/who


coreutils: /usr/bin/who

En el ejemplo anterior se muestra que el archivo /usr/bin/who es parte del


paquete coreutils.

11.2.2 Administración de Paquetes RPM


Linux Standards Base (o «La Base de Estándares de Linux» en español) es un proyecto de
Linux Foundation y está diseñada para especificar (a través de un consenso) un conjunto de
normas que aumentan la compatibilidad entre los sistemas conformes de Linux. Según Linux
Standards Base el administrador de paquetes estándar es RPM.
RPM utiliza un archivo .rpm para cada paquete de software. Este sistema es el que usan las
distribuciones derivadas de Red Hat (como Red Hat, Centos y Fedora) para administrar
software. Además, varias otras distribuciones que no son derivadas de Red Hat (como SUSE,
OpenSUSE y Mandriva) también utilizan RPM.
Nota: Los comandos de RPM no están disponible dentro del entorno de la máquina virtual de
este curso.
Al igual que el sistema Debian, los sistemas de administración de paquetes RPM rastrean
dependencias entre paquetes. Las dependencias rastreadas aseguran que cuando se instala un
paquete, el sistema también instalará los paquetes que el paquete necesita para funcionar
correctamente. Las dependencias también garantizan que las actualizaciones de software y las
eliminaciones se realicen correctamente.
La herramienta de back-end más comúnmente utilizada para la administración de paquetes
RPM es el comando rpm. Mientras que el comando rpm puede instalar, actualizar, consultar y
eliminar paquetes, las herramientas front-end de línea de comandos
como yum y up2date automatizan el proceso de resolución de los problemas con las
dependencias.
Además, existen herramientas de front-end basadas en GUI tales como yumex y gpk-
application (ver abajo) que también facilitan la administración de paquetes RPM.
Debes tener en cuenta que muchos de los comandos siguientes requieren privilegios de root. La
regla es que si un comando afecta el estado de un paquete, necesitarás tener acceso
administrativo. En otras palabras, un usuario normal puede realizar una consulta o una
búsqueda, pero agregar, actualizar o eliminar un paquete requiere que el comando lo ejecute un
usuario root.

11.2.2.1 RPM - Agregando paquetes


Para buscar un paquete desde los repositorios configurados, ejecuta el comando yum
search keyword.

Para instalar un paquete, junto con sus dependencias, ejecuta el comando yum
install package.

Los comandos RPM no están disponibles dentro del entorno de la máquina virtual de este curso.

11.2.2.2 RPM - Actualización de Paquetes


Si quieres actualizar un paquete de software individual, puedes ejecutar el comando yum
update package.

Si quieres actualizar todos los paquetes, puedes ejecutar el comando yum update.
Si las actualizaciones están disponibles y el usuario está utilizando una GUI, entonces el gpk-
update-viewer puede mostrar un mensaje en el área de las notificaciones de la pantalla
indicando que las actualizaciones están disponibles.
Los comandos RPM no están disponibles dentro del entorno de la máquina virtual de este curso.

11.2.2.3 RPM - Eliminación de los Paquetes


Igual que en el caso de cualquier sistema de administración de paquetes que rastrea
dependencias, si quieres eliminar un paquete, puedes terminar quitando más de uno debido a
las dependencias. La forma más fácil de resolver automáticamente los problemas con las
dependencias es utilizar el comando yum:

yum remove package

Mientras que puedes quitar los paquetes de software con el comando rpm, éste no eliminará
automáticamente los paquetes de dependencia.
Los comandos RPM no están disponibles dentro del entorno de la máquina virtual de este curso.

11.2.2.4 RPM - Consultar Paquetes


La administración de paquetes de Red Hat es similar a la administración de paquetes de Debian
a la hora de realizar consultas. Es mejor utilizar la herramienta de back-end, rpm, en lugar de la
herramienta front-end, yum. Mientras que las herramientas de front-end pueden realizar algunas
de estas consultas, el rendimiento sufre porque normalmente estos comandos se conectan a
múltiples repositorios en toda la red al ejecutar cualquier comando. El comando rpm realiza sus
consultas mediante la conexión a una base de datos local de la máquina y no se conecta por la
red a los repositorios.
Los comandos RPM no están disponibles dentro del entorno de la máquina virtual de este curso.
Para obtener una lista de todos los paquetes que están instalados actualmente en el sistema
ejecuta el comando rpm -qa.
Para listar los archivos que componen un paquete especial, puedes ejecutar el comando de rpm
-ql package.

El carácter después de q en la opción -ql es la letra l y no el número 1.


Para consultar un paquete y obtener información o su estado ejecuta el comando rpm -
qi package.

Para determinar si un archivo en particular fue puesto en el sistema de archivos como el


resultado de la instalación de un paquete utiliza el comando rpm -qf /path/to/file.

11.3 Kernel de Linux


Cuando la mayoría de la gente se refiere a Linux, realmente se refiere al GNU/Linux, que define
el sistema operativo. La parte de Gnu's Not Unix (GNU)de esta combinación viene
proporcionada por un proyecto de la Free Software Foundation. GNU es lo que proporciona los
equivalentes de código abierto de muchos comandos comunes del UNIX, la mayor parte de los
comandos de línea de comandos esenciales. La parte de Linux de esta combinación es
el Kernel de Linux que es el núcleo del sistema operativo. El kernel se carga al arrancar y se
queda cargado para gestionar todos los aspectos del sistema en ejecución.
La implementación del kernel de Linux incluye muchos subsistemas que forman parte del kernel
y otros que se pueden cargar de manera modular cuando sea necesario. Algunas de las
funciones principales del kernel de Linux incluyen una interfaz de invocación del sistema,
administración de procesos, administración de memoria, sistema de archivos virtual, redes y
controladores de dispositivos.
En resumen, el kernel acepta comandos del usuario y gestiona los procesos que llevan a cabo
los comandos, dándoles acceso a los dispositivos como memoria, discos, interfaces de red,
teclados, ratones, monitores y mucho más.
El kernel proporciona acceso a la información sobre la ejecución de los procesos a través de
un pseudo-sistema de archivos que es visible bajo el directorio /proc. Los dispositivos de
hardware están a disposición a través de unos archivos especiales bajo el directorio /dev,
mientras que la información sobre tales dispositivos se encuentra en otro pseudo-sistema de
archivos bajo el directorio /sys.
El directorio /proc no sólo contiene la información sobre la ejecución de los procesos, como su
nombre sugiere (proceso), sino también contiene la información sobre el hardware del sistema y
la configuración actual del kernel. A continuación puedes ver un ejemplo de salida:
Ten en cuenta que la información mostrada en los ejemplos siguientes será diferente de lo que
puedes ver dentro del entorno de la máquina virtual de este curso.
La salida de la ejecución de ls /proc muestra más de cien directorios numerados. Hay un
directorio numerado por cada proceso en ejecución en el sistema, donde el nombre del
directorio coincide con el PID (ID del proceso) del proceso en ejecución.
Como el proceso de /sbin/init siempre es el primer proceso, tiene un PID de 1 y la
información del proceso /sbin/init se puede encontrar en el directorio /proc/1 .Como
verás después en este capítulo, hay varios comandos que te permiten ver información sobre
procesos en ejecución, por lo que raramente es necesario para los usuarios tener que ver los
archivos para cada proceso en ejecución directamente.
Quizá también veas que hay un número de archivos regulares en el directorio /proc,
como /proc/cmdline, /proc/meminfo y /proc/modules. Estos archivos proporcionan
información sobre el kernel en ejecución:

• El archivo /proc/cmdline puede ser importante porque contiene toda la información


que le fue pasada al kernel cuando fué iniciado.
• El archivo /proc/meminfo contiene información sobre el uso de memoria por el kernel.
• El archivo /proc/modules contiene una lista de módulos que están cargados
actualmente en el kernel para agregar funcionalidad extra.

De nuevo, raramente es necesario ver estos archivos directamente, ya que otros comandos
ofrecen una salida más amigable para el usuario y una manera alternativa de ver esta
información.
Mientras que la mayoría de los “archivos” bajo el directorio /proc no se pueden modificar,
incluso por el usuario root, los “archivos” bajo el directorio /proc/sys pueden modificarse por
el usuario root. Modificar estos archivos cambiarán el comportamiento del kernel de Linux.
Una modificación directa a estos archivos solo causa cambios temporales al kernel. Para hacer
cambios permanentes, se le pueden agregar entradas al archivo /etc/sysctl.conf.
Por ejemplo, el directorio /proc/sys/net/ipv4 contiene un archivo
llamado icmp_echo_ignore_all. Si ese archivo contiene un cero 0 , como lo hace
normalmente, entonces el sistema responderá a solicitudes icmp. Si ese archivo contiene un
uno 1 , entonces el sistema no responderá a solicitudes icmp: ”

[user@localhost ~]$ su -
Password:
[root@localhost ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[root@localhost ~]# ping -c1 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.0
26 ms

--- localhost.localdomain ping statistics ---


1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.026/0.026/0.026/0.000 ms
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
[root@localhost ~]# ping -c1 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.

--- localhost.localdomain ping statistics ---


1 packets transmitted, 0 received, 100% packet loss, time 10000ms

11.4 Jerarquía de Procesos


Cuando el kernel termina de cargarse durante el proceso de arranque, se inicia el
proceso /sbin/init y le asigna un Id de proceso (PID) 1. Este proceso entonces arranca otros
procesos del sistema y a cada proceso se le asigna un PID en orden secuencial.
Como el proceso /sbin/init inicia otros procesos, a su vez éstos pueden iniciar procesos,
que pueden poner en marcha otros procesos, y así sucesivamente. Cuando un proceso inicia
otro proceso, el proceso que lleva a cabo la puesta en marcha se llama proceso padre y el
proceso que se inicia se denomina el proceso hijo. Al visualizar los procesos, el padre será
marcado como PPID.
Cuando el sistema ha estado funcionando durante mucho tiempo, eventualmente alcanzará
el máximo valor de PID, que puedes ver y configurar a través del
archivo /proc/sys/kernel/pid_max. Una vez que se ha utilizado el PID más grande, el
sistema se «volteará» y reanudará asignando valores de PID que están disponibles en la parte
inferior de la gama.
Los gráficos siguientes proporcionan un ejemplo y la explicación del comando pstree. La salida
variará de los resultados que verás si introduces el comando en el entorno de la máquina virtual
de este curso.
Puedes acomodar los procesos en un árbol familiar de las parejas de padre e hijo. Si quieres ver
este árbol, el comando pstree lo mostrará:

Si quieres examinar la relación de procesos padre e hijo, usando la salida del comando anterior,
podrías considerar que es como:
11.5 El Comando ps (proceso)
Otra forma de visualizar los procesos es con el comando ps. De forma predeterminada, el
comando ps sólo mostrará los procesos actuales en el shell actual. Irónicamente, verás
el ps ejecutándose cuando quieras ver qué otra cosa se está ejecutando en el shell:

sysadmin@localhost:~$ ps
PID TTY TIME CMD
6054 ? 00:00:00 bash
6070 ? 00:00:01 xeyes
6090 ? 00:00:01 firefox
6146 ? 00:00:00 ps
sysadmin@localhost:~$
De manera similar al comando pstree, si ejecutas ps con la opción --forest, verás las líneas
indicando la relación de padre e hijo:

sysadmin@localhost:~$ ps --forest
PID TTY TIME CMD
6054 ? 00:00:00 bash
6090 ? 00:00:02 \_ firefox
6180 ? 00:00:00 \_ dash
6181 ? 00:00:00 \_ xeyes
6188 ? 00:00:00 \_ ps
sysadmin@localhost:~$

Para poder ver todos los procesos del sistema, puedes ejecutar el comando ps aux o ps -ef:

sysadmin@localhost:~$ ps aux | head


USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 17872 2892 ? Ss 08:06 0:00 /sbin?? /i
ni
syslog 17 0.0 0.0 175744 2768 ? Sl 08:06 0:00 /usr/sbin/
rsyslogd -c5
root 21 0.0 0.0 19124 2092 ? Ss 08:06 0:00 /usr/sbin/
cron
root 23 0.0 0.0 50048 3460 ? Ss 08:06 0:00 /usr/sbin/
sshd
bind 39 0.0 0.0 385988 19888 ? Ssl 08:06 0:00 /usr/sbin/
named -u bind
root 48 0.0 0.0 54464 2680 ? S 08:06 0:00 /bin/login
-f
sysadmin 60 0.0 0.0 18088 3260 ? S 08:06 0:00 -bash
sysadmin 122 0.0 0.0 15288 2164 ? R+ 16:26 0:00 ps aux
sysadmin 123 0.0 0.0 18088 496 ? D+ 16:26 0:00 -bash
sysadmin@localhost:~$ ps -ef | head
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:06 ? 00:00:00 /sbin?? /init
syslog 17 1 0 08:06 ? 00:00:00 /usr/sbin/rsyslogd -c5
root 21 1 0 08:06 ? 00:00:00 /usr/sbin/cron
root 23 1 0 08:06 ? 00:00:00 /usr/sbin/sshd
bind 39 1 0 08:06 ? 00:00:00 /usr/sbin/named -u bind
root 48 1 0 08:06 ? 00:00:00 /bin/login -f
sysadmin 60 48 0 08:06 ? 00:00:00 -bash
sysadmin 124 60 0 16:46 ? 00:00:00 ps -ef
sysadmin 125 60 0 16:46 ? 00:00:00 head
sysadmin@localhost:~$

La salida de todos los procesos ejecutándose en un sistema sin duda puede ser abrumador. En
el ejemplo la salida del comando ps se filtró por el comando head, por lo que se ven sólo los
diez primeros procesos. Si no filtras la salida del comando ps, es probable que tengas que
recorrer cientos de procesos para encontrar lo que te interesa.
Una forma común de ejecutar el comando ps es utilizando el comando grep para filtrar la salida
que muestre las líneas que coincidan con una palabra clave, como el nombre del proceso. Por
ejemplo, si quieres ver la información sobre el proceso de firefox, puede ejecutar un comando
como:

sysadmin@localhost:~$ ps -e | grep firefox


6090 pts/0 00:00:07 firefox

Como usuario root te pueden interesar más los procesos de otro usuario que tus propios
procesos. Debido a los varios estilos de opciones que soporta el comando ps, hay diferentes
formas de ver los procesos de un usuario individual. Utilizando la opción tradicional de UNIX,
para ver los procesos del sysadmin (o «administrador del sistema» en español), ejecuta el
siguiente comando:

[root@localhost ~]# ps -u username

O utilice las opciones de estilo BSD y ejecute:

[root@localhost ~]# ps u U username

11.6 El Command top


El comando ps ofrece una «foto» de los procesos que se ejecutan en el momento de introducir
el comando, el comando top actualizará periódicamente la salida de los procesos en ejecución.
El comando top se ejecuta de la siguiente manera:

sysadmin@localhost:~$ top

De forma predeterminada, la salida del comando top se ordena por el % del tiempo de CPU que
cada proceso está utilizando actualmente, con los valores más altos en primer lugar. Esto
significa los procesos que son los «CPU hogs» aparecen primero:

top - 16:58:13 up 26 days, 19:15, 1 user, load average: 0.60, 0.74, 0.60
Tasks: 8 total, 1 running, 7 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.0%us, 2.5%sy, 0.0%ni, 90.2%id, 0.0%wa, 1.1%hi, 0.2%si, 0.0
%st
Mem: 32953528k total, 28126272k used, 4827256k free, 4136k buffers
Swap: 0k total, 0k used, 0k free, 22941192k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


1 root 20 0 17872 2892 2640 S 0 0.0 0:00.02 init
17 syslog 20 0 171m 2768 2392 S 0 0.0 0:00.20 rsyslogd
21 root 20 0 19124 2092 1884 S 0 0.0 0:00.02 cron
23 root 20 0 50048 3460 2852 S 0 0.0 0:00.00 sshd
39 bind 20 0 376m 19m 6100 S 0 0.1 0:00.12 named
48 root 20 0 54464 2680 2268 S 0 0.0 0:00.00 login
60 sysadmin 20 0 18088 3260 2764 S 0 0.0 0:00.01 bash
127 sysadmin 20 0 17216 2308 2072 R 0 0.0 0:00.01 top

Hay una extensa lista de comandos que se pueden ejecutar dentro del top:

Teclas Significado

ho? Ayuda

l Alternar entre las estadísticas de carga

t Alternar entre las estadísticas de tiempo

m Alternar entre las estadísticas del uso de la memoria

< Mover la columna ordenada hacia la izquierda

> Mover la columna ordenada hacia la derecha

F Elegir un campo ordenado

R Alternar entre la dirección de la clasificación

P Ordenar por % CPU

M Ordenar por % de la memoria usada

k Terminar un proceso (o enviarle una señal)


Teclas Significado

r Cambiar la prioridad de un proceso con el comando renice

Una de las ventajas del comando top es que se puede dejar correr para permanecer al
«pendiente» de los procesos para propósitos de monitoreo. Si un proceso comienza a dominar o
«huye» con el sistema, entonces por defecto aparecerá en la parte superior de la lista
presentada por el comando top. Un administrador que está ejecutando el comando top puede
entonces tomar una de dos acciones:
• Terminar el proceso «corrido»: Apretando la tecla k mientras se ejecuta el
comando top pedirá al usuario que proporcione el PID y un número señal. Enviar la
señal predeterminada le pedirá al proceso que termine, pero enviando el número 9 de la
señal, la señal KILL, forzará el cierre del proceso.
• Ajustar la prioridad del proceso: Apretando la tecla r mientras se ejecuta el
comando top pedirá al usuario que ejecute el renice del proceso seguido por el valor
del discernimiento (o «niceness» en inglés). Los valores de niceness pueden ser del -20
al 19 y afectan la prioridad. Sólo el usuario root puede utilizar un «niceness» menor que
el valor actual de niceness o un valor de niceness negativo, que hace que el proceso se
ejecute con una prioridad mayor. Cualquier usuario puede proporcionar un valor de
niceness que es mayor que el valor actual de niceness y hará que el proceso se ejecute
con una prioridad baja.
Otra ventaja del comando top es que puede darte una representación general de lo ocupado
que está el sistema actualmente y la tendencia en el tiempo. Los promedios de carga se
muestran en la primera línea de la salida del comando top e indican que tan ocupado ha estado
el sistema durante los últimos uno, cinco y quince minutos. Esta información también puede
verse ejecutando el comando uptime o directamente mostrando el contenido del
archivo /proc/loadavg:

sysadmin@localhost:~$ cat /proc/loadavg


0.12 0.46 0.25 1/254 3052

Los tres primeros números de este archivo indican la carga media sobre los intervalos pasados
uno, cinco y quince minutos. El cuarto valor es una fracción que muestra el número de los
procesos ejecutando código actualmente en la CPU 1 y el número total de los procesos 254. El
quinto valor es el último valor de PID que ejecutó código en la CPU.
El número reportado como un promedio de carga es proporcional al número de los núcleos de
CPU capaces de ejecutar procesos. En una CPU de un solo núcleo un valor de uno significaría
que el sistema está totalmente cargado. En una CPU de cuatro núcleos un valor de uno
significaría que 1/4 o el 25% del sistema está cargado.
Otra razón por la que los administradores mantienen ejecutado el comando top es la capacidad
para monitorear el uso de la memoria en tiempo real. Ambos comandos el top y
el free muestran las estadísticas del uso general de la memoria.
El comando top también puede mostrar el porcentaje de memoria utilizado por cada proceso,
así pues, se puede identificar rápidamente un proceso que está consumiendo una cantidad
excesiva de memoria.

11.7 El Comando free


Ejecutando el comando free sin opciones proporciona una foto de la memoria utilizada en ese
momento.
Si quieres supervisar el uso de la memoria en el tiempo con el comando free, puedes ejecutarlo
con la opción -s y especificar el número de segundos. Por ejemplo, ejecutando free -s
10 actualizaría la salida cada 10 segundos.

Para hacer más fácil la interpretación de la salida del comando free, las opciones -m o -
g pueden ser útiles para mostrar la salida en megabytes o gigabytes, respectivamente. Sin estas
opciones, se muestra la salida en bytes:

sysadmin@localhost:~$ free
total used free shared buffers cached
Mem: 32953528 26171772 6781756 0 4136 22660364
-/+ buffers/cache: 3507272 29446256
Swap: 0 0 0
sysadmin@localhost:~$

Cuando lees la salida del comando free:

• La primera línea es un encabezado descriptivo.


• La segunda línea con la etiqueta Mem: son las estadísticas de la memoria física del
sistema.
• La tercera línea representa la cantidad de memoria física después de ajustar esos
valores sin tener en cuenta cualquier memoria utilizada por el kernel para los buffers y
caché. Técnicamente, esta memoria «utilizada» podría ser «reclamada» si es necesario.
• La cuarta línea de la salida se refiere a la memoria Swap, también conocida como la
memoria virtual. Éste es el espacio en el disco duro que se utiliza como memoria física
cuando se baja la cantidad de memoria física. De hecho, puede parecer que el sistema
tiene más memoria de lo que realmente tiene, pero el uso del espacio swap puede
también ralentizar el sistema.

Si la cantidad de memoria y swap que está disponible es muy baja, el sistema comenzará
automáticamente a cerrar los procesos. Esta es una razón por la que es importante supervisar el
uso de la memoria del sistema. Un administrador que se da cuenta que el sistema se va
quedando sin memoria libre, puede utilizar el comando top o kill para cerrar los procesos que
quiere, en lugar de dejar que el sistema elija por él.

11.8 Los Archivos de Registro


A medida que el kernel y varios procesos se ejecutan en el sistema, producen una salida que
describe cómo se están ejecutando. Parte de esta salida se muestra en la ventana de la terminal
donde se ejecuta el proceso, algunos de estos datos no se envían a la pantalla, pero en cambio
se escribe en varios archivos. Esto se llama «datos de registro» o «mensajes de registro».
Estos archivos de registro son muy importantes por un número de razones; pueden ser útiles en
la solución de los problemas y pueden ser utilizados para la determinación de si o no ha habido
intentos de acceso no autorizado.
Algunos procesos son capaces de «registrar» sus propios datos en estos archivos, otros
procesos dependen de otro proceso (un demonio) para manejar estos archivos de registro de
datos.
Estos demonios de registro pueden variar de una distribución a otra. Por ejemplo, en algunas
distribuciones, los demonios que se ejecutan en segundo plano para realizar el registro se
llaman syslogd y klogd. En otras distribuciones, un demonio como el rsyslogd en Red Hat y
Centos o systemd journald en Fedora puede servir para esta función de registro.
Independientemente del nombre del proceso de demonio, los archivos de registro se colocan
casi siempre en la estructura del directorio /var/log. Aunque algunos de los nombres de
archivo pueden variar, aquí están algunos de los archivos más comunes en este directorio:

Archivo Contenido

boot.log Mensajes generados cuando servicios se inician durante el arranque del sistema.

cron Mensajes generados por el demonio crond para las tareas que se deben
ejecutar en forma recurrente.

dmesg Mensajes generados por el kernel durante el arranque del sistema.

maillog Mensajes producidos por el demonio de correo para mensajes de correo


electrónico enviados o recibidos

messages Mensajes del kernel y otros procesos que no pertenecen a ninguna otra parte. A
veces se denomina dsyslog en lugar de messages cuando el demonio haya
grabado este archivo.

secure Mensajes de los procesos que requieren autorización o autenticación (por


ejemplo, el proceso de inicio de sesión).

Xorg.0.log Mensajes del servidor de ventanas X (GUI).

Los archivos de registro se rotan, lo que significa que los archivos de registro antiguos
cambiaron de nombre y fueron reemplazados por nuevos archivos de registro. Los nombres de
archivo que aparecen en la tabla anterior pueden tener un sufijo numérico o fecha añadida al
nombre, por ejemplo: secure.0 o secure-20131103
La rotación de un archivo de registro por lo general se ocurre en forma programada, por
ejemplo, una vez por semana. Cuando se rota un archivo de registro, el sistema deja de escribir
en el archivo de registro y agrega un sufijo. Entonces se crea un nuevo archivo con el nombre
original y el proceso de registro sigue usando este nuevo archivo.
Con los demonios modernos normalmente se utiliza un sufijo de fecha. De esta manera, al final
de la semana que termina el 03 de noviembre de 2013, el demonio de registro podría dejar de
escribir en el archivo /var/log/messages, lo podría renombrar a /var/log/messages-
20131103 y comenzar a escribir en un nuevo archivo /var/log/messages.
Aunque la mayoría de los archivos de registro contienen texto como su contenido, que puede
verse de forma segura con muchas herramientas, otros archivos
como /var/log/btmp y /var/log/wtmp contienen un binario. Mediante el comando file (o
«archivo» en español), puedes comprobar si el tipo de contenido del archivo es seguro para ver.
Para los archivos que contienen datos binarios, normalmente hay comandos disponibles que
leen los archivos, interpretan su contenido y luego muestran texto. Por ejemplo, los
comandos lastb y last se pueden usar para ver los
archivos /var/log/btmp y /var/log/wtmp respectivamente.
Por razones de seguridad, la mayoría de los archivos encontrados no son legibles por los
usuarios normales, así que asegúrate de ejecutar los comandos que interactúan con estos
archivos teniendo los privilegios de root.

11.9 El Comando dmesg


El archivo /var/log/dmesg contiene los mensajes del kernel que se produjeron durante el
arranque del sistema. El archivo /var/log/messages contiene mensajes del kernel que se
producen mientras el sistema está corriendo, pero los mensajes se mezclarán con otros
mensajes de demonios o procesos.
Aunque el kernel normalmente no tiene su propio archivo de registro, se puede configurar uno
para ellos por lo general mediante la modificación de los
archivos /etc/syslog.conf o /etc/rsyslog.conf. Además, el comando dmesg puede
utilizarse para ver el kernel ring buffer, que contendrá un gran número de mensajes generados
por el kernel.
En un sistema activo, o en uno que tiene muchos errores de kernel, es posible que se haya
sobrepasado la capacidad de este búfer y podrían perderse algunos mensajes. El tamaño de
este búfer se establece en el momento que el kernel es compilado, por lo que no es sencillo
cambiarlo.
Ejecutar el comando dmesg puede producir hasta 512 kilobytes de texto, así que se recomienda
filtrar el comando con una barra vertical a otro comando como less o grep. Por ejemplo, si
estuvieras resolviendo problemas con tu dispositivo USB, entonces buscando el texto «USB»
con el comando grep siendo sensible a mayúsculas y minúsculas, puede ser de ayuda:

sysadmin@localhost:~$ dmesg | grep -i usb


usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
ohci_hcd 0000:00:06.0: new USB bus registered, assigned bus number 1
usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
9.2 Scripts Shell en Pocas Palabras
Un script shell es un archivo de comandos ejecutables que ha sido almacenado en un archivo de
texto. Cuando el archivo se ejecuta, se ejecuta cada comando. Los scripts shell tienen acceso a
todos los comandos del shell, incluyendo la lógica. Un script (o «secuencia de comandos» en
español), por lo tanto, puede detectar la presencia de un archivo o buscar una salida particular y
cambiar su comportamiento en consecuencia. Se pueden crear scripts para automatizar partes
repetitivas de tu trabajo, que ahorran tu tiempo y aseguran consistencia cada vez que utilices el
script. Por ejemplo, si ejecutas los mismos cinco comandos todos los días, puedes convertirlos
en un script shell que reduce tu trabajo a un comando.
Un script puede ser tan simple como un único comando:

echo “Hello, World!”

El script, test.sh, consta de una sola línea que imprime la cadena Hello, World! (o «¡Hola,
Mundo!» en español) en la consola.
Ejectutar un script puede hacerse, ya sea pasándolo como un argumento a tu shell o
ejecuándolo directamente:

sysadmin@localhost:~$ sh test.sh
Hello, World!
sysadmin@localhost:~$ ./test.sh
-bash: ./test.sh: Permission denied
sysadmin@localhost:~$ chmod +x ./test.sh
sysadmin@localhost:~$ ./test.sh
Hello, World!

En el ejemplo anterior, en primer lugar, el script se ejecuta como un argumento del shell. A
continuación, se ejecuta el script directamente desde el shell. Es raro tener el directorio actual
en la ruta de búsqueda binaria $PATH, por lo que el nombre viene con el prefijo ./ para indicar
que se debe ejecutar en el directorio actual.
El error Permission denied (o «Permiso denegado» en español) significa que el script no ha
sido marcado como ejecutable. Un comando chmod rápido después y el script funciona. El
comando chmod se utiliza para cambiar los permisos de un archivo, que se explica en detalle en
un capítulo posterior.
Hay varios shells con su propia sintaxis de lenguaje. Por lo tanto, los scripts más complicados
indicarán un shell determinado, especificando la ruta absoluta al intérprete como la primera
línea, con el prefijo #!, tal como lo muestra el siguiente ejemplo:

#!/bin/sh
echo “Hello, World!”

#!/bin/bash
echo “Hello, World!”
Los dos caracteres #! se llaman tradicionalmente el hash y el bang respectivamente, que
conduce a la forma abreviada «shebang» cuando se utilizan al principio de un script.
Por cierto, el shebang (o crunchbang) se utiliza para los scripts shell tradicionales y otros
lenguajes basados en texto como Perl, Ruby y Python. Cualquier archivo de texto marcado
como ejecutable se ejecutará bajo el intérprete especificado en la primera línea mientras se
ejecuta el script directamente. Si el script se invoca directamente como argumento a un
intérprete, como sh script o bash script, se utilizará el shell proporcionado,
independientemente de lo que está en la línea del shebang.
Ayuda sentirse cómodo utilizando un editor de texto antes de escribir los scripts shell, ya que se
necesitarás crear los archivos de texto simple. Las herramientas de oficina tradicionales como
LibreOffice, que dan salida a archivos que contienen la información de formato y otra
información, no son adecuadas para esta tarea.

9.3 Editar los Scripts Shell


UNIX tiene muchos editores de texto y las ventajas del uno sobre el otro se debaten muy a
menudo. Dos de ellos vienen mencionados específicamente en el programa del curso de los
aspectos esenciales de LPI: El editor de GNU nano es un editor muy sencillo y bien adaptado
para editar pequeños archivos de texto. El Visual Editor , vi, o su versión más reciente, VI
mejorado (vim), es un editor muy potente pero tiene un arduo proceso de aprendizaje. Nosotros
nos centraremos en el nano.
Introduce nano test.sh y verás una pantalla similar a esta:

GNU nano 2.2.6 File: test.sh modified

#!/bin/sh

echo "Hello, World!"


echo -n "the time is "
date

^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur Po
^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text^T To Spel
l

El editor nano tiene algunas características que debes conocer. Simplemente escribes con tu
teclado, utiliza las flechas para moverte y el botón suprimir/retroceso para borrar texto. A lo
largo de la parte inferior de la pantalla puedes ver algunos comandos disponibles, que son
sensible al contexto y cambian dependiendo de lo que estás haciendo. Si te encuentras
directamente en la máquina Linux, o sea no te conectas a través de la red, puedes utilizar el
ratón para mover el cursor y resaltar el texto.
Para familiarizarte con el editor, comienza a escribir un script shell sencillo dentro del
editor nano:

GNU nano 2.2.6 File: test.sh modified

#!/bin/sh

echo "Hello, World!"


echo -n "the time is "
date

^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur Po
^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text^T To Spel
l

Ten en cuenta que la opción de la parte inferior izquierda es ^X Exit que significa
«presiona control y X para salir». Presione Ctrl con X y la parte inferior cambiará:

Save modified buffer (ANSWERING "No" WILL DESTROY CHANGES) ?


Y Yes
N No ^C Cancel

En este punto, puedes salir del programa sin guardar los cambios pulsando la tecla N o guardar
primero pulsando Y para guardar. El valor predeterminado es guardar el archivo con el nombre
de archivo actual. Puedes presionar la tecla Entrar para guardar y salir.
Después de guardar regresarás al shell prompt. Regresa al editor. Esta vez pulsa Ctrl y O para
guardar tu trabajo sin salir del editor. Los prompts son iguales en gran parte, salvo que estás de
nuevo en el editor.
Esta vez utiliza las teclas de la flecha para mover el cursor a la línea que contiene el texto «The
time is» (o «La hora es» en español). Presiona Control y K dos veces para cortar las dos
últimas líneas al búfer de copia. Mueve el cursor a la línea restante y presiona Control y U una
vez para pegar el búfer de copia a la posición actual. Esto hace que el script muestre la hora
actual antes de saludarte y te ahorra tener que volver a escribir las líneas.
Otros comandos útiles que puedas necesitar son:
Comando Descripción

Ctrl + W buscar en el documento

Ctrl + W, buscar y reemplazar


luego Control + R

Ctrl + G mostrar todos los comandos posibles

Ctrl + Y/V página hacia arriba / abajo

Ctrl + C mostrar la posición actual en el archivo y el tamaño del


archivo

9.4 El Scripting Básico


Anteriormente en este capítulo tuviste tu primera experiencia de scripting y recibiste una
introducción a un script muy básico que ejecuta un comando simple. El script comenzó con la
línea shebang, que le dice al Linux que tiene que utilizar el /bin/bash (lo que es Bash) para
ejecutar un script.
Aparte de ejecutar comandos, hay 3 temas que debes conocer:

• Las variables, que contienen información temporal en el script


• Las condicionales, que te dejan hacer varias cosas basadas en las pruebas que
vas introduciendo
• Los Loops, que te permiten hacer lo mismo una y otra vez

9.4.1 Las Variables


Las variables son una parte esencial de cualquier lenguaje de programación. A continuación se
muestra un uso muy simple de las variables:

#!/bin/bash

ANIMAL="penguin"
echo "My favorite animal is a $ANIMAL"

Después de la línea shebang está una directiva para asignar un texto a una variable. El nombre
de la variable es ANIMAL y el signo de igual asigna la cadena penguin (o «pingüino» en
español). Piensa en una variable como una caja en la que puedes almacenar cosas. Después
de ejecutar esta línea, la caja llamada ANIMAL contiene la palabra penguin.
Es importante que no haya ningún espacio entre el nombre de la variable, el signo de igual y el
elemento que se asignará a la variable. Si le pones espacio, obtendrás un error como «command
not found». No es necesario poner la variable en mayúsculas pero es una convención útil
para separar las variables de los comandos que se ejecutarán.
A continuación, el script despliega una cadena en la consola. La cadena contiene el nombre de
la variable precedido por un signo de dólar. Cuando el intérprete ve el signo de dólar reconoce
que va a sustituir el contenido de la variable, lo que se llama interpolación. La salida del script
es My favorite animal is a penguin (o «My animal favorito es un pingüino» en
español.)
Así que recuerda esto: Para asignar una variable, usa el nombre de la variable. Para acceder al
contenido de la variable, pon el prefijo del signo de dólar. ¡A continuación, vamos a mostrar una
variable a la que se asigna el contenido de otra variable!

#!/bin/bash

ANIMAL=penguin
SOMETHING=$ANIMAL
echo "My favorite animal is a $SOMETHING"

ANIMAL contiene la cadena penguin (como no hay espacios, se muestra la sintaxis alternativa
sin usar las comillas). A SOMETHING se le asigna el contenido de ANIMAL (porque a la
variable ANIMAL le procede el signo de dólar).
Si quieres, puedes asignar una cadena interpolada a una variable. Esto es bastante común en
las grandes secuencias de comandos, ya que puedes construir un comando más grande y
ejecutarlo!
Otra forma de asignar una variable es utilizar la salida de otro comando como el contenido de la
variable incluyendo el comando entre los comillas invertidas:

#!/bin/bash
CURRENT_DIRECTORY=`pwd`
echo "You are in $CURRENT_DIRECTORY"

Este patrón a menudo se utiliza para procesar texto. Puedes tomar el texto de una variable o un
archivo de entrada y pasarlo por otro comando como sed o awk para extraer ciertas partes y
guardar el resultado en una variable.
Es posible obtener entradas del usuario de su script y asignarlo a una variable mediante el
comando read (o «leer» en español):

#!/bin/bash

echo -n "What is your name? "


read NAME
echo "Hello $NAME!"

El comando read puede aceptar una cadena directo desde el teclado o como parte de la
redirección de comandos tal como aprendiste en el capítulo anterior.
Hay algunas variables especiales además de las establecidas. Puedes pasar argumentos a tu
script:
#!/bin/bash
echo "Hello $1"

El signo de dólar seguido de un número N corresponde al argumento Nth pasado al script. Si


invocas al ejemplo anterior con ./test.sh el resultado será Hola Linux. La
variable $0 contiene el nombre del script.
Después de que un programa se ejecuta, ya sea un binario o un script, devuelve el exit code (o
«código de salida» en español) que es un número entero entre 0 y 255. Puedes probarlo con la
variable $? para ver si el comando anterior se ha completado con éxito.

sysadmin@localhost:~$ grep -q root /etc/passwd


sysadmin@localhost:~$ echo $?
0
sysadmin@localhost:~$ grep -q slartibartfast /etc/passwd
sysadmin@localhost:~$ echo $?
1

Se utilizó el comando grep para buscar una cadena dentro de un archivo con el indicador -q,
que significa «silencioso» (o «quiet» en inglés). El grep, mientras se ejecuta en modo silencioso,
devuelve 0, si la cadena se encontró y 1 en el caso contrario. Esta información puede utilizarse
en un condicional para realizar una acción basada en la salida de otro comando.
Además puedes establecer el código de salida de tu propio script con el comando exit:

#!/bin/bash
# Something bad happened!
exit 1

El ejemplo anterior muestra un comentario #. Todo lo que viene después de la etiqueta hash se
ignora, se puede utilizar para ayudar al programador a dejar notas. El comando exit
1 devuelve el código de salida 1 al invocador. Esto funciona incluso en el shell. Si ejecutas este
script desde la línea de comandos y luego introduces echo $?, verás que devolverá 1.
Por convención, un código de salida de 0 significa «todo está bien». Cualquier código de salida
mayor que 0 significa que ocurrió algún tipo de error, que es específico para el programa. Viste
que grep utiliza 1 lo que significa que la cadena no se encontró.

9.4.2 Condicionales
Ahora que puedes ver y definir las variables, es hora de hacer que tus propios scripts tengan
diferentes funciones basadas en pruebas, llamado branching (o «ramificación» español). La
instrucción if (o «si» en español) es el operador básico para implementar un branching.
La instrucción if se ve así:

if somecommand; then
# do this if somecommand has an exit code of 0
fi
El siguiente ejemplo ejecutará «somecommand» (en realidad, todo hasta el punto y coma) y si el
código de salida es 0, entonces se ejecutará el contenido hasta el cierre fi. Usando lo que
sabes acerca del grep, ahora puedes escribir un script que hace cosas diferentes, basadas en la
presencia de una cadena en el archivo de contraseñas:

#!/bin/bash

if grep -q root /etc/passwd; then


echo root is in the password file
else
echo root is missing from the password file
fi

De los ejemplos anteriores podrías recordar que el código de salida del grep es 0 si se
encuentra la cadena. El ejemplo anterior utiliza esto en una línea para imprimir un mensaje
si root está en el archivo passwd, u otro mensaje si no es así. La diferencia aquí es que en
lugar de un fi para cerrar, el bloque if, hay un else. Esto te permite realizar una acción si la
condición es verdadera, y otra si la condición es falsa. El bloque else siempre debe cerrarse
con la palabra clave fi.
Otras tareas comunes son buscar la presencia de un archivo o directorio y comparar cadenas y
números. Podrías iniciar un archivo de registro si no existe, o comparar el número de líneas en
un archivo con la última vez que se ejecutó. El comando if es claramente de ayuda aquí, pero
¿qué comando debes usar para hacer la comparación?
El comando test te da un acceso fácil los operadores de prueba de comparación y archivos.
Por ejemplo:

Comando Descripción

test –f /dev/ttyS0 0 si el archivo existe

test ! –f /dev/ttyS0 0 si el archivo no existe

test –d /tmp 0 si el directorio existe

test –x `which ls` sustituir la ubicación de ls y luego (probar) test, si el usuario


puede ejecutar

test 1 –eq 1 0 si tiene éxito la comparación numérica

test ! 1 –eq 1 NO – 0 si la comparación falla


Comando Descripción

test 1 –ne 1 Más fácil, ejecutar test (probar) si hay desigualdad numérica

test “a” = “a” 0 si tiene éxito la comparación de cadenas

test “a” != “a” 0 si las cadenas son diferentes

test 1 –eq 1 –o 2 – -o es OR: cualquiera de las opciones pueden ser igual


eq 2

test 1 –eq 1 –a 2 – -a es AND: ambas comparaciones deben ser iguales


eq 2

Es importante tener en cuenta que el test ve las comparaciones de números enteros y cadenas
de manera distinta. 01 y 1 son iguales por comparación numérica, pero no para comparación de
cadenas o strings. Siempre debes tener cuidado y recordar qué tipo de entrada esperas.
Hay muchas más pruebas, como –gt para mayor que, formas de comprobar si un archivo es
más reciente que los otros y muchos más. Para más información consulta la página test man.
La salida de test es bastante largo para un comando que se usa con tanta frecuencia, por lo
que tiene un alias llamado [ (corchete cuadrado izquierdo). Si incluyes tus condiciones en
corchetes, es lo mismo que si ejecutaras el test. Por lo tanto, estas instrucciones son idénticas.

if test –f /tmp/foo; then


if [ -f /tmp/foo]; then

Mientras que la última forma es de uso más frecuente, es importante entender que el corchete
es un comando en sí que funciona de manera semejante al test excepto que requiere el
corchete cuadrado de cierre.
La instrucción if tiene una forma final que te permite hacer varias comparaciones al mismo
tiempo usando elif (abreviatura de elseif).

#!/bin/bash

if [ "$1" = "hello" ]; then


echo "hello yourself"
elif [ "$1" = "goodbye" ]; then
echo "nice to have met you"
echo "I hope to see you again"
else
echo "I didn't understand that"
fi

El código anterior compara el primer argumento pasado al script. Si es hello, se ejecuta el


primer bloque. Si no es así, el script de comandos comprueba si es goodbye e invoca con el
comando echo con un diferente mensaje entonces. De lo contrario, se envía un tercer mensaje.
Ten en cuenta que la variable $1 viene entre comillas y se utiliza el operador de comparación de
cadenas en lugar de la versión numérica (-eq).
Las pruebas if/elif/else pueden ser bastante detalladas y complicadas. La
instrucción case proporciona una forma distinta de hacer las pruebas múltiples más fáciles.

#!/bin/bash

case "$1" in
hello|hi)
echo "hello yourself"
;;
goodbye)
echo "nice to have met you"
echo "I hope to see you again"
;;
*)
echo "I didn't understand that"
esac

La instrucción case comienza con la descripción de la expresión que se analiza: case


EXPRESSION in. La expresión aquí es $1 entre comillas.
A continuación, cada conjunto de pruebas se ejecutan como una coincidencia de patrón
terminada por un paréntesis de cierre. El ejemplo anterior primero busca hello o hi; múltiples
opciones son separadas por la barra vertical | que es un operador OR en muchos lenguajes de
programación. Después de esto, se ejecutan los comandos si el patrón devuelve verdadero y se
terminan con dos signos de punto y coma. El patrón se repite.
El patrón * es igual a else, ya que coincide con cualquier cosa. El comportamiento de la
instrucción case es similar a la instrucción if/elif/else en que el proceso se detiene tras la
primera coincidencia. Si ninguna de las otras opciones coincide, el patrón * asegurá que
coincida con la última.
Con una sólida comprensión de las condicionales puedes hacer que tus scripts tomen acción
sólo si es necesario.

9.4.3 Los Loops


Los loops (o «ciclos o bucles» en español) permiten que un código se ejecute repetidas veces.
Pueden ser útiles en numerosas situaciones, como cuando quieres ejecutar los mismos
comandos sobre cada archivo en un directorio, o repetir alguna acción 100 veces. Hay dos loops
principales en los scripts del shell: el loop for y el loop while.
Los loops for se utilizan cuando tienes una colección finita que quieres repetir, como una lista
de archivos o una lista de nombres de servidor:

#!/bin/bash

SERVERS="servera serverb serverc"


for S in $SERVERS; do
echo "Doing something to $S"
done

Primero, el script establece una variable que contiene una lista de nombres de servidor
separada por espacios. La instrucción for entonces cicla (realiza «loops») sobre la lista de los
servidores, cada vez que establece la variable S con el nombre del servidor actual. La elección
de la S es arbitraria, pero ten en cuenta que la S no tiene un signo de dólar, pero en
el $SERVERS sí lo tiene, lo que muestra que se $SERVERS se extenderá a la lista de servidores.
La lista no tiene que ser una variable. Este ejemplo muestra dos formas más para pasar una
lista.

#!/bin/bash

for NAME in Sean Jon Isaac David; do


echo "Hello $NAME"
done

for S in *; do
echo "Doing something to $S"
done

El primer loop es funcionalmente el mismo que en el ejemplo anterior, excepto que la lista se
pasa directamente al loop for en lugar de usar una variable. Usar una variable ayuda a que el
script sea más claro, ya que una persona fácilmente puede realizar cambios en la variable en
lugar de ver el loop.
El segundo loop utiliza comodín * que es un file glob. El shell expande eso a todos los archivos
en el directorio actual.
El otro tipo de loop, un loop while, opera en una lista de tamaño desconocido. Su trabajo es
seguir ejecutándose y en cada iteración realizar un test para ver si se tiene que ejecutar otra
vez. Lo puedes ver como «mientras que una condición es verdadera, haz cosas».

#!/bin/bash

i=0
while [ $i -lt 10 ]; do
echo $i
i=$(( $i + 1))
done
echo "Done counting"

El ejemplo anterior muestra un loop while que cuenta de 0 a 9. Un contador de variables, i,


arranca en 0. Luego, un loop while se ejecuta con un test siendo «is $i less than 10?» (o
«¿es $i menor que 10?») ¡Ten en cuenta que el loop while utiliza la misma notación que la
instrucción if.
Dentro del loop while el valor actual de i es mostrado en pantalla, y luego se le añade 1 a
través del comando $((aritmética)) y se asigna de regreso al i. Una vez que i llega a 10,
la instrucción while regresa falso y el proceso continuará después del loop.
7.1 Introducción
Práctica: Empaquetamiento y desempaquetamiento de los archivos. Mediante la realización de
esta práctica de laboratorio, los estudiantes aprenderán cómo trabajar con los archivos
empaquetados.
En este laboratorio llevarás a cabo las siguientes tareas:

1. Crear los archivos empaquetados usando tar con y sin compresión


2. Comprimir y descomprimir los archivos en un archivo empaquetado comprimido
con gzip
3. Comprimir y descomprimir los archivos en un archivo empaquetado en bzip2
4. Utilizar zip y unzip para comprimir y descomprimir los archivos empaquetados

7.2 Comandos de empaquetamiento


En esta tarea, utilizaremos gzip, bzip2, tar y zip/unzip para empaquetar y restaurar los
archivos. Estos comandos están diseñados para combinar varios archivos en un único archivo o
comprimir un archivo grande en uno más pequeño. En algunos casos, los comandos tendrán
ambas funciones.
La tarea de empaquetamiento de los datos es importante por varias razones, incluyendo pero no
limitado a lo siguiente:

a. Los archivos grandes pueden ser difíciles de transferir. Haciendo estos archivos
más pequeños ayuda a hacer la transferencia más rápida.
b. La transferencia de múltiples archivos de un sistema a otro puede llegar a ser
tedioso cuando hay muchos archivos. Su fusión en un único archivo para la
transferencia hace que este proceso sea más fácil.
c. Los archivos pueden ocupar rápidamente una gran cantidad de espacio,
especialmente en un medio extraíble como memorias USB más pequeñas. El
empaquetamiento reduce este problema.

Un área potencial de confusión que un usuario principiante de Linux puede experimentar se


deriva de la siguiente pregunta: ¿Por qué hay tantos comandos diferentes de
empaquetamiento? La respuesta es que estos comandos tienen diferentes características (por
ejemplo, algunos de ellos permiten proteger el archivo empaquetado con una contraseña) y
técnicas de compresión utilizadas.
Lo más importante que debe saber por ahora es cómo funcionan estos diferentes comandos.
Con el tiempo, aprenderás a seleccionar la herramienta de empaquetamiento correcta para
cualquier situación.

7.2.1 Paso 1
Utiliza el siguiente comando tar para crear un archivo empaquetado del directorio /etc/udev.
Guardar la copia de seguridad en el directorio ~/mybackups :

cd
mkdir mybackups
tar –cvf mybackups/udev.tar /etc/udev
ls mybackups
Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~$ cd
sysadmin@localhost:~$ mkdir mybackups
sysadmin@localhost:~$ tar -cvf mybackups/udev.tar /etc/udev
tar: Removing leading `/' from member names
/etc/udev/
/etc/udev/rules.d/
/etc/udev/rules.d/70-persistent-cd.rules
/etc/udev/rules.d/README
/etc/udev/udev.conf
sysadmin@localhost:~$ ls mybackups/
udev.tar
sysadmin@localhost:~$

El comando tar se utiliza para combinar varios archivos en un solo archivo. Por defecto no
comprime los datos.
La opción -c le indica al comando tar que cree un archivo tar. La opción -v significa "verbose",
que le indica al comando tar para muestre lo que está haciendo. La opción -f se utiliza para
especificar el nombre del archivo tar.
Para tu información: tar significa Tape ARchive (archivo de cinta). Este comando se utilizó
originalmente para crear copias de seguridad de cintas, pero hoy en día es más comúnmente
utilizado para crear los archivo empaquetados.
Importante: No tienes que utilizar la extensión .tar con nombre de archivo empaquetado, sin
embargo, es muy útil para determinar el tipo de archivo. Se considera de «buen estilo» cuando
envias un archivo a otra persona.

7.2.2 Paso 2
Muestra el contenido del archivo tar (t = lista el contenido, v = verbose, f =nombre del archivo):

tar –tvf mybackups/udev.tar

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~$ tar -tvf mybackups/udev.tar


drwxr-xr-x root/root 0 2015-01-28 16:32 etc/udev/
drwxr-xr-x root/root 0 2015-01-28 16:32 etc/udev/rules.d/
-rw-r--r-- root/root 306 2015-01-28 16:32 etc/udev/rules.d/70-persist
ent-cd.rules
-rw-r--r-- root/root 1157 2012-04-05 19:18 etc/udev/rules.d/README
-rw-r--r-- root/root 218 2012-04-05 19:18 etc/udev/udev.conf
sysadmin@localhost:~$
Ten en cuenta que los archivos fueron copiados de forma recursiva utilizando los nombres de
ruta relativa . Esto es importante porque al extraer los archivos, que serán colocados en el
directorio actual, no se reemplazan los archivos actuales.

7.2.3 Paso 3
Para crear un archivo tar comprimido, utiliza la opción -z:

tar –zcvf mybackups/udev.tar.gz /etc/udev


ls –lh mybackups

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~$ tar -zcvf mybackups/udev.tar.gz /etc/udev


tar: Removing leading `/' from member names
/etc/udev/
/etc/udev/rules.d/
/etc/udev/rules.d/70-persistent-cd.rules
/etc/udev/rules.d/README
/etc/udev/udev.conf
sysadmin@localhost:~$ ls -lh mybackups/
total 16K
-rw-rw-r-- 1 sysadmin sysadmin 10K Jan 25 04:00 udev.tarf
-rw-rw-r-- 1 sysadmin sysadmin 1.2K Jan 25 04:34 udev.tar.gz
sysadmin@localhost:~$

Observa la diferencia de tamaño; la primera copia de seguridad (10 Kbytes) es mayor que la
segunda copia de seguridad (1.2 Kbytes).
La opción -z hace uso de la utilidad gzip para realizar la compresión.

7.2.4 Paso 4
Extraer el contenido de un archivo. Los datos se restauran en el directorio actual por defecto:

cd mybackups
tar –xvf udev.tar.gz
ls
ls etc
ls etc/udev
ls etc/udev/rules.d

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~$ cd mybackups
sysadmin@localhost:~/mybackups$ ls
udev.tar udev.tar.gz
sysadmin@localhost:~/mybackups$ tar -xvf udev.tar.gz
etc/udev/
etc/udev/rules.d/
etc/udev/rules.d/70-persistent-cd.rules
etc/udev/rules.d/README
etc/udev/udev.conf
sysadmin@localhost:~/mybackups$ ls
etc udev.tar udev.tar.gz
sysadmin@localhost:~/mybackups$ ls etc
udev
sysadmin@localhost:~/mybackups$ ls etc/udev
rules.d udev.conf
sysadmin@localhost:~/mybackups$ ls etc/udev/rules.d
70-persistent-cd.rules README
sysadmin@localhost:~/mybackups$

Si quieres «regresar» los archivos a su ubicación original, primero puede cd al directorio / , y


luego ejecutar el comando tar. Sin embargo, en este ejemplo, esto requeriría que inicies la
sesión como administrador porque la creación de los archivos en el directorio /etc sólo puede
realizarse por el administrador.

7.2.5 Paso 5
Para añadir un archivo a un archivo empaquetado existente, utiliza la opción -r con el
comando tar. Ejecuta los siguientes comandos para realizar esta acción y comprobar la
existencia del archivo nuevo en el archivo empaquetado tar:

tar -rvf udev.tar /etc/hosts


tar –tvf udev.tar

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ tar -rvf udev.tar /etc/hosts


tar: Removing leading `/' from member names
/etc/hosts
sysadmin@localhost:~/mybackups$ tar -tvf udev.tar
drwxr-xr-x root/root 0 2015-01-28 16:32 etc/udev/
drwxr-xr-x root/root 0 2015-01-28 16:32 etc/udev/rules.d/
-rw-r--r-- root/root 306 2015-01-28 16:32 etc/udev/rules.d/70-persist
ent-c
d.rules
-rw-r--r-- root/root 1157 2012-04-05 19:18 etc/udev/rules.d/README
-rw-r--r-- root/root 218 2012-04-05 19:18 etc/udev/udev.conf
sysadmin@localhost:~/mybackups$

7.2.6 Paso 6
En los siguientes ejemplos, vas a utilizar los comandos gzip y gunzip para comprimir y
descomprimir un archivo. Ejecuta los siguientes comandos para comprimir una copia del
archivo words:

cp /usr/share/dict/words .
ls -l words
gzip words
ls -l words.gz

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ cp /usr/share/dict/words .
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
sysadmin@localhost:~/mybackups$ gzip words
sysadmin@localhost:~/mybackups$ ls -l words.gz
-rw-r--r-- 1 sysadmin sysadmin 255996 Jan 25 07:39 words.gz
sysadmin@localhost:~/mybackups$

Observa que el tamaño del archivo comprimido (255996 bytes en el ejemplo anterior) es mucho
menor que el tamaño del archivo original (938848 bytes en el ejemplo anterior).
Muy importante: Cuando utilizas el comando gzip, el archivo original se sustituye por el archivo
comprimido. En el ejemplo anterior, el archivo words fue sustituido por words.gz.
Al descomprimir el archivo, el archivo comprimido será reemplazado por el archivo original.

7.2.7 Paso 7
Ejecuta los siguientes comandos para descomprimir el archivo words.gz :

ls -l words.gz
gunzip words.gz
ls -l words

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ ls -l words.gz
-rw-r--r-- 1 sysadmin sysadmin 255996 Jan 25 07:39 words.gz
sysadmin@localhost:~/mybackups$ gunzip words.gz
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
sysadmin@localhost:~/mybackups$

Linux proporciona un gran número de utilidades de compresión además de gzip/gunzip. Cada


uno de ellos tiene pros y contras (compresión más rápida, mejores tasas de compresión, más
flexible, más portátil, descompresión más rápida, etc.).
Los comandos gzip/gunzip son muy populares en Linux, pero se debe tener en cuenta que los
comandos bzip2/bunzip2 también son muy populares en algunas distribuciones de Linux. Por
suerte, la mayor parte de la funcionalidad (la forma de ejecutar los comandos) y las opciones
son las mismas que en el caso de gzip/gunzip.

7.2.8 Paso 8
El uso de los comandos bzip2 y bunzip2 para comprimir y descomprimir un archivo es muy
similar al de los comandos gzip y gunzip. El archivo comprimido se crea con
una extensión .bz2. La extensión se retira una vez descomprimido. Ejecuta los siguientes
comandos para comprimir una copia del archivo words :

ls -l words
bzip2 words
ls -l words.bz2

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
sysadmin@localhost:~/mybackups$ bzip2 words
sysadmin@localhost:~/mybackups$ ls -l words.bz2
-rw-r--r-- 1 sysadmin sysadmin 335405 Jan 25 07:39 words.bz2
sysadmin@localhost:~/mybackups$

Si se compara el resultado tamaño del archivo .bz2 resultante (335405) con el tamaño del
archivo .gz (255996) en el paso no. 7, se puede observar que gzip hizo un mejor trabajo al
comprimir ese archivo en particular.

7.2.9 Paso 9
Ejecuta los siguientes comandos para descomprimir el archivo words.bz2 :

ls -l words.bz2
bunzip2 words.bz2
ls -l words
sysadmin@localhost:~/mybackups$ ls -l words.bz2
-rw-r--r-- 1 sysadmin sysadmin 335405 Jan 25 07:39 words.bz2
sysadmin@localhost:~/mybackups$ bunzip2 words.bz2
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words

Mientras que los archivos empaquetados gzip y bzip se utilizan comúnmente en Linux, el tipo
de empaquetamiento zip es más comúnmente utilizado por otros sistemas operativos, como
Windows. De hecho, la aplicación Explorador de Windows tiene un soporte integrado para
extraer los archivos empaquetados zip.
Por lo tanto, si quieres compartir un archivo con los usuarios de Windows, por lo general se
prefiere el uso de empaquetamiento zip. A diferencia de gzip y bzip2, cuando un archivo se
comprime con el comando zip, una copia del archivo original es comprimido y el original
permanece sin comprimir.

7.2.10 Paso 10
Utiliza el comando zip para comprimir el archivo words:

zip words.zip words


ls -l words.zip

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ zip words.zip words


adding: words (deflated 73%)
sysadmin@localhost:~/mybackups$ ls -l words.zip
-rw-rw-r-- 1 sysadmin sysadmin 256132 Jan 25 21:25 words.zip
sysadmin@localhost:~/mybackups$

El primer argumento (words.zip en el ejemplo anterior) del comando zip es el nombre del
archivo que quieres crear. El resto de los argumentos (words en el ejemplo anterior) son los
archivos que quieres colocar en el archivo comprimido.
Importante: No tienes que utilizar la extensión .zip con nombre de archivo comprimido, sin
embargo, es muy útil para determinar el tipo de archivo. También, se considera de «buen estilo»
cuando envías un archivo a otra persona.

7.2.11 Paso 11
Comprime el directorio /etc/udev y su contenido con el comando de compresión zip:

zip -r udev.zip /etc/udev


ls -l udev.zip

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ zip -r udev.zip /etc/udev


adding: etc/udev/ (stored 0%)
adding: etc/udev/rules.d/ (stored 0%)
adding: etc/udev/rules.d/70-persistent-cd.rules (deflated 29%)
adding: etc/udev/rules.d/README (deflated 50%)
adding: etc/udev/udev.conf (deflated 24%)
sysadmin@localhost:~/mybackups$ ls -l udev.zip
-rw-rw-r-- 1 sysadmin sysadmin 1840 Jan 25 21:33 udev.zip
sysadmin@localhost:~/mybackups$

El comando tar que viste anteriormente en este laboratorio desciende automáticamente a


través de los subdirectorios de un directorio especificado para ser empaquetado. Con los
comandos bzip2, gzip, y zip es necesario especificar la opción -r para realizar la recursividad
en los subdirectorios.

7.2.12 Paso 12
Para ver el contenido de un archivo zip, utiliza la opción -l con el comando unzip:

unzip -l udev.zip

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ unzip -l udev.zip


Archive: udev.zip
Length Date Time Name
--------- ---------- ----- ----
0 2015-01-28 16:32 etc/udev/
0 2015-01-28 16:32 etc/udev/rules.d/
306 2015-01-28 16:32 etc/udev/rules.d/70-persistent-cd.rules
1157 2012-04-05 19:18 etc/udev/rules.d/README
218 2012-04-05 19:18 etc/udev/udev.conf
--------- -------
1681 5 files
sysadmin@localhost:~/mybackups$

7.2.13 Paso 13
Para extraer el archivo zip, utiliza el comando unzip sin ninguna opción. En este ejemplo,
primero tenemos que eliminar los archivos que se crearon en el ejemplo tar más arriba:

rm -r etc
unzip udev.zip

Tu resultado debe ser similar al siguiente:

sysadmin@localhost:~/mybackups$ rm -r etc
sysadmin@localhost:~/mybackups$ unzip udev.zip
Archive: udev.zip
creating: etc/udev/
creating: etc/udev/rules.d/
inflating: etc/udev/rules.d/70-persistent-cd.rules
inflating: etc/udev/rules.d/README
inflating: etc/udev/udev.conf
sysadmin@localhost:~/mybackups$
Tema 3

La Shell

La shell es un intérprete de comandos cuya interfaz se orienta al trabajo en línea,


interactiva y no interactiva, entre usuario y sistema operativo. Usted inserta comandos en
la línea de comandos; las shell los interpreta y envía instrucciones al sistema operativo (se
puede acceder a la interfaz de línea de comandos GNOME y KDE a través de las ventanas
Terminal, del menú Aplicaciones/Accesorios). También puede colocar comandos en un
archivo de secuencia de comandos para ejecutarse consecutivamente, de forma similar a
un programa. Esta capacidad de interpretación de la shell incorpora muchas
características sofisticadas. Por ejemplo, la shell tiene un conjunto de archivos de
coincidencia de caracteres que generan nombres de archivo. La shell puede redirigir la
entrada y salida, además de ejecutar operaciones en segundo plano, evitándole realizar
otras tareas.

Varios tipos diferentes de shells se han desarrollado para Linux: Bourne Again Shell
(BASH), Korn, TCSH y Z. TCSH es una versión mejorada de shell C, usada en varios sistemas
Unix, especialmente las versiones BSD. Sólo necesita un tipo de shell para su trabajo. Linux
incluye casi todas las shells; sin embargo, se instala y usa la shell BASH, como opción
predeterminada. Si utiliza la shell de línea de comandos, entrará a BASH, a menos que
especifique otra. En este capítulo se analiza principalmente la shell BASH, que comparte
muchas características con otras shell. Un breve recuento de las shell C, TCSH y Z sigue al
final del capítulo, donde se indican las diferencias. Conocerá más acerca de las shell en sus
sitios Web respectivos, como figura en la lista de la tabla 3-1. Además, está disponible un
manual en línea detallado para cada shell instalada. Introduzca el comando man y la
palabra clave de la shell para acceder a ésta, bash para BASH, ksh para Korn, zsh para Z y
tsch para TSCH. En el caso de la shell C, puede usar csh, vinculada con tcsh. Por ejemplo, el
comando man bash accederá al manual en línea de la shell BASH.

2. La línea de comandos

La interfaz de línea de comandos de Linux consta de una sola línea en que se ingresan
comandos con cualquiera de sus opciones y argumentos. Desde GNOME o KDE, accederá a
la interfaz de línea de comandos abriendo la ventana Terminal. En caso de que quiera
iniciar Linux con la interfaz de línea de comandos, se presentará la correspondiente a
BASH cuando inicie sesión.
Como opción predeterminada, la shell BASH tiene un indicador de comandos de signo
pesos ($), pero Linux tiene varios otros tipos de shells, cada uno con su propio indicador
de comandos (% para la shell C, por ejemplo). El usuario root tendrá un indicador de
comandos diferente, el signo # (almohadilla). Un indicador de comandos de shell, como el
mostrado aquí, marca el comienzo de la línea de comandos:

Puede insertar un comando junto con opciones y argumentos en el indicador. Por


ejemplo, con la opción -1, el comando ls desplegará una línea de información acerca de
cada archivo, mostrando una lista de datos, como tamaño, hora y fecha en que fue
modificado. Un guión antes de la opción -1 es necesario. Linux emplea para distinguir una
opción de un argumento.

$ ls -1 Si quiere que la información se despliegue sólo para un archivo en particular, puede


agregar el nombre del archivo como argumento, seguido de la opción

-1: $ ls -1 misdatos

-rw-r--r-- 1 chris weather 207 Feb 20 11:55 misdatos

Puede ingresar un comando en varias líneas al escribir una diagonal invertida justo antes
oprimir enter. La diagonal invertida actúa como “escape” al comando enter (es decir,
omite el final del comando), prosiguiendo la misma orden para la siguiente línea. En el
siguiente ejemplo, el comando cp se ingresa en tres líneas:

$ cp -1 \

misdatos \

/home/george/miproyecto/nuevosdatos

También puede insertar varios comandos en la misma línea al separarlos con punto y
coma (;). En realidad el punto y coma actúa como una operación de ejecución. Los
comandos se ejecutarán en la secuencia que se hayan insertado. El siguiente comando
ejecuta ls seguido por date.

$ ls ; date

También puede ejecutar condicionalmente varios comandos en la misma línea con el


operador && (consulte el Capítulo 4). Un comando sólo se ejecuta si el anterior es
correcto. Esta característica es útil cuando procesa varias secuencias de comandos
dependientes en la misma línea. En el siguiente ejemplo, el comando ls sólo se ejecuta si
date es correcto.

$ date && ls

3. Edición en la línea de comandos

La shell BASH, que es la predeterminada, tiene capacidades en edición de línea de


comandos especiales, que resultarán útiles mientras aprende Linux (vea la tabla 3-2).
Puede modificar de manera sencilla los comandos que haya insertado antes de
ejecutarlos, moviéndose por cualquier lugar de la línea de comandos, insertando o
eliminando caracteres. Esto es útil, sobre todo en el caso de comandos complejos. Puede
usar ctrl-f o flecha a la derecha para moverse hacia delante un carácter o ctrl-b o flecha a
la izquierda para moverse hacia atrás un carácter. ctrl-d o supr elimina el carácter donde
se encuentra el cursor y ctrl-h o retroceso elimina el carácter anterior al cursor. Para
agregar texto, utilice las teclas de las flechas para mover el cursor a donde quiera insertar
texto y luego escriba los nuevos caracteres. Incluso puede cortar palabras con las teclas
ctrl-w o alt-d y después utilizar ctrl-y para pegarlas en otra posición, moviendo así las
palabras. Como regla general, la versión ctrl del comando opera en los caracteres, y la
versión alt funciona con palabras, como ctrl-t para trasponer caracteres y alt-t para
trasponer palabras. En cualquier momento, puede oprimir enter para ejecutar el
comando. Las asociaciones actuales de teclas y sus tareas, junto con la configuración
global, se especifican en el archivo /etc/inputrc.
Ayuda para completar comandos y nombres de archivo La línea de comandos BASH tiene
una característica integrada, completa la línea de comandos y nombres de archivo. Éstos
se concluyen automáticamente al usar la tecla tab. Si inserta un patrón inconcluso, como
un argumento de comando o nombre de archivo, puede presionar la tecla tab para activar
la característica que remata el comando o nombre de archivo. Los directorios tendrán un /
adjunto al nombre. Si más de un comando o archivo tienen el mismo prefijo, la shell sólo
hace beep, en espera de que presione nuevamente la tecla tab. Después despliega una
lista de posibles comandos y espera que agregue caracteres suficientes para seleccionar
un comando o nombre específico de archivo. En situaciones donde sabe que existen varias
posibilidades, puede oprimir la tecla esc en vez de dos tab. En el siguiente ejemplo, el
usuario envía el comando cat con un nombre de archivo incompleto. Cuando el usuario
oprime la tecla tab, el sistema busca una coincidencia y, al encontrarla, concluye el
nombre de archivo. El usuario puede oprimir enter para ejecutar el comando.

$ cat pre tab

$ cat prefacio
La acción automática para completar también funciona con nombres de variables,
usuarios y hosts. En este caso, el texto parcial debe antecederse con un carácter especial
indicando el tipo de nombre. Las variables inician con un signo $, así que cualquier texto
cuyo inicio es con el signo $ se trata como variable que habrá de completarse. Las
variables se seleccionan a partir de variables predefinidas, como las de la shell del sistema
(consulte el capítulo 4). Los nombres de usuario inician con una tilde (~). Los nombres de
host inician con el signo @, con posibles nombres tomados del archivo /etc/hosts. A
continuación se muestra una lista de opciones automáticas para completar:

• Los nombres de archivo inician con cualquier texto o /.

• El texto para variables de la shell comienza con el signo $.

• El texto de nombre de usuario comienza con el signo ~.

• El texto de nombre host comienza con el signo @.

• Los comandos, alias y texto en archivos comienzan con texto normal.

Por ejemplo, para completar la variable HOME dando sólo $HOM, ingrese simplemente un
carácter tab.

$ echo $HOM <tab>

$ echo $HOME

Si inserta sólo una H, entonces puede ingresar dos tabuladores para ver todas las variables
posibles que empiezan con H. La línea de comandos se desplegará de nuevo,
permitiéndole completar el nombre.

$ echo $H <tab> <tab>

$HISTCMD $HISTFILE $HOME $HOSTTYPE HISTFILE $HISTSIZE $HISTNAME

$ echo $H

También puede seleccionar específicamente qué tipo de texto se completará, usando


comandos de tecla correspondientes. En este caso, no importa con que tipo de signo
comience el nombre. Por ejemplo, alt-~ tratará el texto actual como nombre de usuario.
alt-@ lo tratará como nombre de host y alt-$ como variable. alt-! lo tratará como
comando. Para desplegar una lista de opciones para completar, use las teclas ctrl-x con la
tecla apropiada, como en ctrl-x-$, para presentar una lista de opciones para completar
variables.
4. Historial

BASH mantiene una lista de comandos ingresados previamente, denominada lista de


historial. Puede desplegar cada comando, uno tras otro, en su línea de comandos
oprimiendo la tecla flecha hacia arriba. La tecla flecha hacia abajo lo desplaza hacia abajo
en la lista. Puede modificar y ejecutar cualquiera de estos comandos previos al
desplegarlos en su línea de comandos.

Eventos de historial

En BASH, la utilería de historial mantiene un registro de comandos ejecutados más


recientes. Los comandos se numeran comenzando desde el 1 y existe un número límite de
comandos recordados (la opción predeterminada es 500). La utilería de historial es un tipo
de memoria a corto plazo, que da seguimiento a los comandos más recientes ejecutados.
Para ver el conjunto de comandos más recientes, escriba history en la línea de comandos y
oprima enter. Se despliega una lista de comandos recientes, precedidos por un número.

$ history

1 cp misdatos hoy

2 vi misdatos

3 mv misdatos informes

4 cd informes

5 ls
A cada uno de estos comandos se le conoce de manera técnica como eventos. Un evento
describe acciones tomadas (un comando ejecutado). Los eventos se enumeran de acuerdo
con su secuencia de ejecución. El evento más reciente tiene el número mayor. Cada uno
de estos eventos puede identificarse por su número o el carácter inicial del comando.

La utilería historial permite hacer referencia a un evento anterior, colocándolo en su línea


de comandos y permitiéndole ejecutarlo. La manera más sencilla para hacer esto es
mediante las teclas flecha hacia arriba y flecha hacia abajo, para presentar eventos del
historial en su línea de comandos, de uno en uno. No necesita desplegar primero la lista
con history. Oprimiendo la tecla flecha hacia arriba una vez, coloca el último comando del
historial. Al oprimir la tecla flecha hacia abajo, coloca el siguiente evento en la línea de
comandos. Puede usar ciertos controles y meta teclas (combinaciones de teclado) para
realizar otras operaciones, como buscar en la lista del historial. Una meta tecla es alt (o
esc, en teclados que carecen de ella). Aquí se usará La tecla alt . alt-< lo llevará al principio
de la lista del historial; altn hará una búsqueda. ctrl-s y ctrl-r realizarán búsquedas
incrementales, desplegando comandos coincidentes mientras escribe una búsqueda.

También puede referir eventos del historial y ejecutarlos mediante el comando ! de


historial. El signo ! es seguido por una referencia que identifica el comando. La referencia
puede ser el número de evento o conjunto inicial de caracteres en el evento. En el
siguiente ejemplo, se hace referencia al tercer comando en la lista del historial, primero
por número y después por caracteres iniciales.
$ !3

mv misdatos informes

$ !mv mi

mv misdatos informes También puede hacer referencia a un evento usando un


desplazamiento desde el final de la lista. Un número negativo desplazará desde el final de
la lista a ese evento, por lo que hará referencia a éste. En el siguiente ejemplo, se hace
referencia al cuarto comando, cd misdatos, usando un desplazamiento negativo y después
se ejecuta. Recuerde que el desplazamiento se efectúa desde el final de la lista (en este
caso, el evento 5) hacia arriba, al principio de la lista, el evento 1. Un desplazamiento de 4,
empezando desde el evento 5, lo coloca en el evento 2.

$ !-4

vi misdatos

Para hacer referencia al último evento, use un ! posterior, como en !!. En el siguiente
ejemplo, el comando !! ejecuta el último comando aplicado por el usuario (en este caso,
ls):

$ !!

ls

misdatos hoy informes

5. La shell C: edición e historial de la línea de comandos

La shell C se desarrolló originalmente para usarse en BSD Unix. Con Linux, está disponible
como shell alternativa, junto con Korn y Bourne. shell C incorpora todos los comandos raíz
usados en Bourne, pero difiere significativamente en características más complejas, como
la programación de shell. La shell C fue desarrollada tras Bourne y la primera en introducir
nuevas características como edición en la línea de comandos y la utilidad historial. La shell
Korn después incorporó muchas de las mismas características. Asimismo, la shell bash, a
cambio, incorporó muchas características de todas estas shell. Sin embargo, las
respectivas implementaciones difieren significativamente. La shell C tiene ediciones de
línea de comandos limitadas que permiten realizar algunas operaciones de edición
básicas. La edición de línea de comandos de shell C no es tan poderosa como Korn. La
utilidad de historial permite ejecutar y editar comandos previos. La utilidad historial
trabaja de manera muy similar a Korn, BASH, Z y C. Sin embargo, sus nombres de
comandos difieren radicalmente, la shell C tiene un conjunto de operaciones de edición de
historial muy diferente.

En casi todas las distribuciones de Linux, se utiliza una versión mejorada de la shell C,
denominada TCSH. Casi todos los comandos son similares. Puede acceder a la shell C con
el comando csh, un vínculo a la shell TCSH. El indicador de comandos tradicional para la
shell C es el símbolo %. En algunas distribuciones de Linux el indicador de comandos
puede permanecer con

$, sin cambio.

$ csh

El comando para entrar a la shell TCSH es tcsh.

Edición en la línea de comandos shell C Al igual que BASH, la shell C sólo tiene límites en
capacidades de edición de la línea de comandos. Sin embargo, son más poderosas que las
de Bourne. En vez de eliminar sólo un carácter, puede eliminar toda la palabra. También
puede realizar operaciones de edición, limitadas al uso de substitución de patrones. La
tecla ctrl-w elimina una palabra insertada recientemente. El término “palabra” es más un
concepto técnico denotando la manera en que la shell analiza un comando. Una palabra
se analiza hasta un espacio o tabulación. Cualquier carácter o conjunto de caracteres
rodeados de espacios o tabulaciones se considera una palabra. Con ctrl-w puede eliminar
texto insertado, de palabra en palabra.

% date quién

% date

Otras veces, tal vez necesite cambiar parte de una palabra o varias palabras en una línea
de comando. La shell C tiene un comando de sustitución de patrones para reemplazar
patrones en la línea de comandos. Este comando de sustitución se representa con un
patrón encerrado entre los símbolos ^. El patrón a reemplazar se encierra entre dos ^. El
texto reemplazado sigue inmediatamente.

% ^patrón^nuevotexto

La operación de sustitución de patrón no es sólo un comando de edición. También es de


ejecución. En vez de remplazar el patrón, el comando correcto se desplegará y después
ejecutará. En el siguiente ejemplo, el comando date se ha escrito mal. La shell despliega
un mensaje de error diciendo que no pudo encontrarse el comando. Puede editarlo
usando los símbolos ^ para remplazar el texto incorrecto. Entonces el comando se ejecuta.

% dte

dte: not found

% ^dt^dat

date

Sun July 5 10:30:21 PST 1992

Se hace como parte de su configuración shell. En este ejemplo, la utilería historial se define y
configura para recordar los últimos cinco comandos.

% set history=5

Como en la shell BASH, se hace referencia a comandos recordados como eventos. Para ver el
conjunto de sus eventos más recientes, inserte la palabra history en la línea de comandos y oprima
enter. Se desplegará una lista de comandos recientes, con un número antes de cada evento.

% history

1 ls
2 vi misdatos

3 mv misdatos informes

4 cd informes

5 ls -F

Se puede hacer referencia a cada uno de estos eventos por su número, el comienzo de los
caracteres de un evento o un patrón de caracteres en el evento. Una referencia al patrón se
encierra entre signos de interrogación, ? Puede volver a ejecutarlos utilizando el comando de
historial !.

Los signos de exclamación son seguidos por una referencia al evento, como un número de evento,
el comienzo de los caracteres o un patrón. En el siguiente ejemplo, primero se hace referencia al
segundo comando en la lista del historial por su número de evento, después por el comienzo de
los caracteres de un evento y luego por un patrón en el evento.

% !2

vi misdatos

% !vi

vi misdatos

% !?misd?

vi misdatos

También puede hacer referencia a un comando mediante un desplazamiento desde el final de la


lista. Al poner un signo menos antes del número de desplazamiento, desde el final de la lista a ese
comando. En el siguiente ejemplo, se hace referencia al segundo comando, vi misdatos, usando un
desplazamiento.

% !-4

vi misdatos

Un signo de admiración también se utiliza para identificar el último comando ejecutado. Es


equivalente a un desplazamiento de -1. En los siguientes ejemplos, ambos, el desplazamiento de 1
y el signo de admiración, hacen referencia al último comando, Is –F.

% !!

ls –F

misdatos /informes
% !-1

ls –F

misdatos /informes

6. La shell TCSH

La shell TCSH es, en esencia, una versión de la shell C, con características añadidas. Es totalmente
compatible con la shell C estándar e incorpora todas las capacidades, incluido el lenguaje shell y la
utilería historial. TCSH tiene características de edición de línea de comandos e historial más
avanzadas que las encontradas en la shell C original. Puede usar combinaciones de teclas Vi o
Emacs para editar comandos o eventos de historial. La shell TCSH también soporta el remate de
líneas de comandos, llenando un comando al utilizar sólo los primeros caracteres que escriba. La
shell TCSH tiene soporte para lenguaje nativo, administración de terminal extensa, nuevos
comandos incluidos y variables de sistema. Consulte la página man de TCSH para conocer
información más detallada.

Terminación de palabras en línea de comandos de TCSH La línea de comandos tiene una


característica integrada que completa comandos y nombres de archivos. Si inserta un patrón
incompleto, como un argumento de nombre de archivo, puede oprimir la tecla tab para activar
esta característica, que completará el patrón para generar un nombre de archivo. Para utilizar esta
característica, escriba el nombre parcial de un archivo en la línea de comandos y oprima tab. La
shell buscará automáticamente el archivo con el prefijo parcial y completará los caracteres
faltantes en la línea de comandos por usted. En el siguiente ejemplo, el usuario envía el comando
cat con un nombre de archivo incompleto. Cuando el usuario oprime tab, el sistema buscará
coincidencias; después de encontrar una, rellena el nombre de archivo.

> cat pre TAB

> cat prefacio

Si más de un archivo tiene el mismo prefijo, la shell encontrará el nombre hasta donde los
nombres de archivo acepten y después hará beep. Puede entonces agregar más caracteres o
seleccionar uno u otro. Por ejemplo:

> ls

documento docudrama

> cat doc TAB

> cat docu beep


Si, en vez de eso quiere una lista de todos los nombres con los que su archivo incompleto
concuerde, puede oprimir ctrl-d en la línea de comandos. En el siguiente ejemplo, al oprimir ctrl-d
después del nombre de archivo, se genera una lista de posibles nombres de archivo.

> cat doc Ctrl-d

documento

docudrama

> cat docu

La shell vuelve a dibujar la línea de comandos, y puede escribir entonces el resto del nombre de
archivo, caracteres diferentes u oprimir tab para que el nombre de archivo se complete.

> cat docudrama

7. La shell Z

La shell Z incluye todas las características de la shell Korn, agregando características de línea de
comando y eventos de historial. La shell Z realiza expansiones automáticas en la línea de
comandos, después de efectuar el análisis sintáctico. Las expansiones se realizan en nombres de
archivos, procesos, parámetros, comandos, expresiones aritméticas, corchetes y generación de
nombres de archivo.

La shell Z soporta el uso de combinaciones de teclas Vi y Emacs para referir eventos del historial,
muy parecido a como hace BASH. flecha hacia arriba y ctrl-p lo llevan al evento anterior, mientras
flecha hacia abajo y ctrl-n lo llevan abajo, al siguiente. esc < lo dirige al primer evento y esc > lo
lleva al último evento. flecha a la derecha y flecha a la izquierda lo conducen a lo largo de la línea
de eventos. ctrl-r ctrl-x efectúa una búsqueda de eventos del historial. También puede hacerse
referencia a eventos del historial usando el símbolo !, de manera muy similar a como se hace en el
historial de la shell C. Cuando inserta el comando del historial, una lista de comandos previos
(llamados eventos) se desplegará, cada uno con un número. Para hacer referencia a un evento,
ingrese el símbolo ! y su número. En el siguiente ejemplo se hace referencia al tercer evento.

Hay más de una forma para hacer referencia a un evento. Puede usar un desplazamiento del
comando actual, emplear un patrón para identificar un evento o especificar el comienzo de los
caracteres de un evento. Puede manejar designadores de palabra para incluir sólo segmentos de
un evento de historial en su comando. Un designador de palabra indica qué palabra o palabras de
un comando dado en la línea de comandos, se incluirá en la referencia del historial. Dos puntos
separan el número de evento desde el designador de palabra. Puede omitirse si éste empieza con
^, $, *, - o %. Las palabras se numeran desde el 0; esto hace referencia a la primera palabra de un
evento y 1 a la segunda palabra. $ refiere la última palabra. ^ indica el primer argumento, la
primera palabra después de la palabra de comando (igual a 1). Puede hacer referencia a un rango
de palabras o, con *, las palabras sobrantes de un evento. Para referir todas las palabras desde la
tercera hasta el final, use 3*. El *, por sí solo, indica todos los argumentos (desde 1). En el
siguiente ejemplo se hace referencia a la segunda, tercera y cuarta palabra del sexto evento.

Tema 4: Empacamiento y compresión en Linux

1. Empacamiento y compresión de Archivos

Los archiveros se utilizan para respaldar archivos o combinarlos en un paquete, que


después puede transferirse como archivo en Internet o puede publicarse en un sitio FTP
para una descarga sencilla. La utilería de archivero estándar usada en sistemas Linux y
Unix es tar, para el que existen varias GUI. Se tienen varios programas de compresión para
escoger, incluidos GNU zip (gzip), Zip, bzip y compress.

Archivado y compresión de archivos con File Roller:

GNOME proporciona la herramienta File Roller (se accede a ella desde el menú Accesorios,
etiquetado Gestor de archivadores), operable como GUI para archivar y comprimir
archivos, permitiéndole realizar operaciones Zip, gzip, tar y bzips2 mediante una GUI.
Puede examinar el contenido de los archiveros, extraer archivos deseados y crear nuevos
archiveros comprimidos.
Cuando crea un archivo, usted determina su método de compresión especificando
extensión de nombre de archivo, como .gz para gzip o .bz2 para bzip2. Puede seleccionar
diferentes extensiones desde el menú Tipo de archivo o insertar la extensión usted
mismo. Para archivar y comprimir archivos, puede seleccionar una extensión combinada
como .tar.bz2, que archiva con tar y comprime con bzip2. Haga clic en Agregar para añadir
archivos a su archivero. Para extraer archivos y archivar, abra el archivo para desplegar la
lista de nombres de archivo. Luego puede hacer clic en Extraer, para sacar archivos
determinados o el archivero completo.

File Roller también puede usarse para examinar el contenido de un archivero de manera
sencilla. Desde el administrador de archivos, haga clic con el botón derecho en el
archivador y seleccione Abrir con el administrador de archivos. Se desplegará la lista de
archivos y directorios en ese archivero. En el caso de subdirectorios, haga doble clic en sus
entradas. Este método también funciona para archivos de software RPM, permitiéndole
explorar todos los archivos creados por el paquete de software.

2. Archivos y dispositivos de archivero: tar

Específicos, actualizarlos en el archivero y agregar nuevos archivos al mismo. Incluso


directorios completos con todos los archivos y subdirectorios, todo lo cual puede
restaurarse desde el archivero. La utilería tar fue diseñada originalmente para crear
archiveros en cintas. (El término “tar” viene de tape archive *archivo de cinta+. Sin
embargo, puede crear archiveros en cualquier dispositivo, como un disco flexible o crear
un archivo de archivero para almacenar este último.) La utilería tar es ideal para crear
copias de seguridad de sus archivos o combinar varios archivos en uno, solo para
transmisión a través de la red (File Roller es una GUI para tar).

Despliegue del contenido de los archiveros

Ambos administradores de archivo en los escritorios GNOME y K Desktop tienen la


capacidad para desplegar el contenido de un archivo de archivero tar automáticamente. El
contenido se despliega como si fueran archivos en un directorio. Puede mostrar una lista
de archivos como íconos o con detalles, ordenarlos por nombre, tipo u otros campos.
Incluso puede desplegar el contenido de los archivos. Al hacer clic en un archivo de texto,
se abre con un editor de texto y despliega una imagen con un visor de imagen. Si el
administrador de archivos no puede determinar qué programa utilizar para desplegar el
archivo, le pide seleccione una aplicación. Ambos administradores de archivos pueden
realizar el mismo tipo de operaciones en archivos residentes en archiveros remotos, como
archivos tar o sitios FTP. Puede obtener una lista del contenido e incluso leer sus archivos
readme.
El administrador de archivos Nautilus (GNOME) también puede extraer un archivo. Haga
clic con el botón derecho en el icono Archivo y seleccione Extraer.

Creación de archiveros

En Linux, a menudo se usa tar para generar archiveros en dispositivos o archivos. Puede
instruir a tar para almacenar los archivos en un dispositivo por determinado archivo
usando la opción f con el nombre del dispositivo o archivo. En el siguiente ejemplo se
muestra la sintaxis del comando tar, empleando la opción f. A menudo, se toma el nombre
del dispositivo o archivo como nombre del archivero. Cuando crea un archivo para un
archivero tar, suele añadirse a su nombre la extensión .tar. Esto sólo es una convención y
no es obligatorio. Puede mostrar una lista de todos los nombres de archivo que quiera. Si
se especifica un nombre de directorio, todos los subdirectorios se incluyen en el archivero.

Para crear un archivero, use la opción c. Combinada con f, c crea un archivero en un


archivo o dispositivo. Puede ingresar esta opción antes y justo después de la opción f.
Observe que no hay diagonales antes de la opción tar.

3. Compresión de archiveros

La operación tar no realiza compresión de archivos archivados. Si quiere comprimirlos,


puede instruir a tar para invocar la utilería gzip. Con la opción z minúscula, tar primero
utiliza gzip para comprimir archivos antes de archivarlos. La misma opción z invoca gzip
para descomprimirlos cuando se extraen los archivos.

$ tar czf miarch.tar.gz midir

Si desea recurrir a bzip en vez de gzip para comprimir los archivos antes de archivarlos,
use la opción j. La misma opción j invoca bzip para descomprimirlos cuando se extraigan
los archivos.

$ tar cjf miarch.tar.bz2 midir

Recuerde que existe diferencia entre comprimir archivos individuales en un archivero y


comprimir el archivero como un todo. A menudo, un archivero se crea para transferir
varios archivos a la vez como archivo tar. Para acortar el tiempo de transmisión, el archivo
debe lo más pequeño posible. Puede utilizar la utilería de compresión gzip en el archivo
tar para comprimirlo, reduciendo su tamaño y después enviar la versión comprimida. La
persona que lo recibe puede descomprimirlo, restaurando el archivo tar. El uso de gzip en
un archivo tar a menudo produce un archivo con la extensión .tar.gz. La extensión .gz se
agrega a un archivo zip comprimido. En el siguiente ejemplo se crea una versión
comprimida de miarch.tar empleando el mismo nombre con la extensión .gz:
$ gzip miarch.tar

$ ls

$ miarch.tar.gz

Compresión de archivos: gzip, bzip2 y zip

Existen varias razones para reducir tamaño de un archivo. Las dos más comunes son
liberar espacio o, si quiere transferir el archivo en una red, para ahorrar tiempo de
transmisión. Reducirá de manera efectiva el tamaño de un archivo creando una copia
comprimida de éste. En cualquier momento que necesite de nuevo el archivo, lo puede
descomprimir. La compresión se usa junto con el archivado para permitirle comprimir
directorios completos y sus archivos de una sola vez. La descompresión genera una copia
del archivo del archivero, que después puede ser ejecutado, generando una copia de
archivos y directorios. File Roller proporciona una GUI para estas tareas.

Compresión con gzip

Varias utilerías de compresión están disponibles en sistemas Linux y Unix. Casi todo el
software de sistemas Linux recurre a las utilerías GNU gzip y gunzip. La utilería gzip
comprime archivos y gunzip los descomprime. Para comprimir un archivo, inserte el
comando gzip y el nombre del archivo. Esto reemplaza el archivo con una versión
comprimida, con la extensión .gz.

$ gzip misdatos

$ ls

misdatos.gz
4. Archivos zip

Zip es una utilería de compresión y archivado modelada en PKZIP, usada originalmente en


sistemas DOS. Zip es una utilería de varias plataformas, utilizada en sistemas Windows,
Mac, MSDOS, OS/2, Unix y Linux. Los comandos Zip funcionan con archivos creados con
PKZIP y pueden utilizar archivos Zip. Usted comprime un archivo con el comando zip. Esto
genera un archivo Zip con extensión .zip. Si no hay archivos en la lista, zip dirige la salida
de los datos comprimidos a la salida estándar. También puede utilizar el argumento - para
que zip lea desde la entrada estándar. Para comprimir un directorio, necesita incluir la
opción -r. En el primer ejemplo se archiva y comprime un archivo:

$ zip misdatos

$ ls

misdatos.zip

Tema 5: Scipting Básico de Linux


1. Scripting básico en Linux

Un script no es más que un archivo que contiene un conjunto de órdenes para realizar una
acción.

Vamos a crear nuestro primer script. Para ello en un editor de texto escribiremos lo
siguente y lo guardaremos con el nombre *hola.sh *

#!/bin/bash

# Este es nuestro primer progrma

echo Hola Mundo

A continuación iremos a la terminal y lo ejecutaremos:

~$ ./hola.sh.

La primera línea de nuestro script le indica al sistema que tiene que usar la shell BASH. La
segunda línea es un comentario para consumo humano, todas las líneas que comiencen
por # son ignoradas por la máquina y nos sirven para incluir comentarios destinados a
programadores o usuarios. En la tercera línea tenemos el comando echo que sirve para
imprimir texto en la pantalla.

2. Variables

Como cualquier otro lenguaje de programación, necesitamos variables que nos servirán
para guardar datos en la memoria del ordenador hasta el momento que los necesitemos.
Podemos pensar en una variable como una caja en la que podemos guardar un elemento
(e.g, un número, una cadena de texto, la dirección de un archivo…) y, siguiendo con el
símil, la memoria del ordenador no sería más que el conjunto de esas cajas.

Para asignar el valor a una variable simplemente simplemente debemos usar el signo =:

nombre_variable=valor_variable
Es importante no dejar espacios ni antes ni después del =.

Para recuperar el valor de dicha variable sólo hay que anteponer el símbolo de
dolar $ antes del nombre de la variable:

$nombre_variable
A lo largo de un script podemos asignarle diferentes valores a una misma variable:

#!/bin/bash
to_print='Hola mundo'
echo $to_print
to_print=5.5
echo $to_print
Nombre de las variables

Las variables pueden tomar prácticamente cualquier nombre, sin embargo, existen
algunas restricciones:

 Sólo puede contener caracteres alfanuméricos y guiones bajos


 El primer carácter debe ser una letra del alfabeto o “_” (este último caso se suele
reservar para casos especiales).
 No pueden contener espacios.
 Las mayúsculas y las minúsculas importan, “a” es distinto de “A”.
 Algunos nombres som usado como variables de entorno y no los debemos utilizar
para evitar sobrescribirlas (e.g.,PATH).

De manera general, y para evitar problemas con las variables de entorno que siempre
están escritas en mayúscula, deberemos escribir el nombre de las variables en minúscula.

Además, aunque esto no es una regla que deba obedecerse obligatoriamente, es


conveniente que demos a las variables nombres que más tarde podamos recordar. Si
abrimos un script tres meses después de haberlo escrito y nos encontramos con la
expresión “m=3.5” nos será difícil entender que hace el programa. Habría sido mucho más
claro nombrar la variable como “media=3.5”.

Control de flujo

Como hemos visto los scripts se ejecutan línea a línea hasta llegar al final, sin embargo,
muchas veces nos interesará modificar ese comportamiento de manera que el programa
pueda responder de un modo u otro dependiendo de las circunstancias o pueda repetir
trozos de código.

En este curso nos vamos a centrar en los controles de flujo más importantes:

 bucles (for loops)


 condicionales (if)

Bucles (for)

La sintaxis general de los bucles es la siguiente:

for VARIABLE in LISTA_VALORES;


do
COMANDO 1
COMANDO 2
...
COMANDO N
done
Donde la lista de valores puede ser un rango numérico:

for VARIABLE in 1 2 3 4 5 6 7 8 9 10;


for VARIABLE in {1..10};
una serie de valores:

for VARIABLE in file1 file2 file3;


o el resultado de la ejecución de un comando:

for VARIABLE in $(ls /bin | grep -E 'c.[aeiou]');


Hay que tener en cuenta que si pasamos un listado de valores pero lo ponemos
entrecomillado, el ordenador lo entera como un única línea:
for VARIABLE in "file1 file2 file3";
Un ejemplo simple de for sería:

#!/bin/bash
for numero in {1..20..2};
do
echo Este es el número: $numero
done
3. Condicionales (if)

La sintaxis básica de un condicional es la siguiente

También podría gustarte