Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
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.
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.
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.
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:
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.
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.
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.
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.
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.
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]
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:
mv [fuente] [destino]
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).
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.
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
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
• Ubuntu
• CentOS y Red Hat
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.
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:
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
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
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.
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.
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.
Pulsamos sobre la máquina virtual con botón derecho para elegir “Desconectar” para apagar la
máquina.
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.
Ahora pulsamos sobre “Nuevo conmutador de red virtual” y elegimos la opción “Externo”
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
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
Í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
¿Qué es la virtualización?
blog.carreralinux.com.ar
3
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
Historia
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.
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.
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.
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
· 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
APLICACIONES APLICACIONES
HARDWARE HARDWARE
HIPERVISOR
HARDWARE REAL
APLICACIONES APLICACIONES
HARDWARE HARDWARE
SOFTWARE DE VIRTUALIZACIÓN
HARDWARE REAL
blog.carreralinux.com.ar
7
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
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
HARDWARE
8
blog.carreralinux.com.ar
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
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.
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.
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
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.
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.
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.
blog.carreralinux.com.ar
11
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
OS Virtualization
APPS APPS
CONTAINER CONTAINER
CONTAINER MANAGER
HARDWARE
blog.carreralinux.com.ar 12
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
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.
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.
blog.carreralinux.com.ar
13
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
¿Qué hay de lo que es cloud computing?
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
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.
blog.carreralinux.com.ar
16
VIRTUALIZACIÓN DE REDES LINUX · Capítulo 01
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:
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í:
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.
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.
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.
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:
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.
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:
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).
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:
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.
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:
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):
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:
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
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.
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
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):
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:
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
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$
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:
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
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
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$
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
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:
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:
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
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
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.
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.
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.
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 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.
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.
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.
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
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:
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:
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:
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
Hay una extensa lista de comandos que se pueden ejecutar dentro del top:
Teclas Significado
ho? Ayuda
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:
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.
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:~$
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.
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.
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.
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.
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.
#!/bin/sh
^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:
#!/bin/sh
^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á:
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
#!/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
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"
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
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 1 –ne 1 Más fácil, ejecutar test (probar) si hay desigualdad numérica
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.
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
#!/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
#!/bin/bash
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 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"
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.
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):
7.2.3 Paso 3
Para crear un archivo tar comprimido, utiliza la opción -z:
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
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$
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:
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
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
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$
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
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:
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:
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
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
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
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:
-1: $ ls -1 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
$ date && ls
$ 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:
Por ejemplo, para completar la variable HOME dando sólo $HOM, ingrese simplemente un
carácter 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
Eventos de historial
$ 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.
mv misdatos informes
$ !mv mi
$ !-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
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
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
% dte
% ^dt^dat
date
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
% !-4
vi misdatos
% !!
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.
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
documento
docudrama
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.
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.
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.
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.
3. Compresión de archiveros
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.
$ ls
$ miarch.tar.gz
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.
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 misdatos
$ ls
misdatos.zip
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
~$ ./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:
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.
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)
#!/bin/bash
for numero in {1..20..2};
do
echo Este es el número: $numero
done
3. Condicionales (if)