Preparación Examen LPIC1 Examen101 (2) K2opt
Preparación Examen LPIC1 Examen101 (2) K2opt
Examen 101
ÍNDICE
Tema 101
Arquitectura del sistema (intro)
Conociendo el sistema
El directorio /proc
Udev y el directorio /dev
Comandos útileS
Ver módulos del kernel
CPUs y dispositivos PCI, SCSI
Dispositivos USB
La Secuencia de Arranque
SysVinit
Upstart
Systemd
Targets en systemd
Logs de inicio
El proceso de inicio de sesión
3
3
6
7
7
o SATA... 9
12
13
13
16
18
19
22
24
25
27
Instalación de Linux y
Administración de Paquetes
(intro)
29
Disposición de unidades de
Almacenamiento
30
Diseño de particiones
30 Sistemas de archivos
31 Creación de
De archivos
particiones y sistemas
32
Librerías compartidas
Administración de paquetes:
Vocabulario clave
LVM 36
37
38
39
41
42
44
45
Administración de paquetes
(Debian y derivados)
Reconfigurar paquetes
CentOS y similares
Familia SUSE
en Linux 49
51
53
57
Tema 103
Herramienta de la línea
58 De comandos (intro)
Entrada,
salida, y error estándares
59
Localizar comando
Manipulación de texto
trabajo 60
64
66
67
68
Combinar
i
C ombinar archivos
Combinar
Combinar archivos con
archivos con cat
cat
Con more o less
con cat y paginar
Mostrar el comienzo o el
fin de un Archivo con head
o tail
Mostrar campos
Delimitador
separados por un Contar
palabras, bytes, y líneas
con Dividir archivos
Validar integridad de
archivos
74
74
wc 75
77
78
Creación y manipulación
Y directorios
de archivos
El comando ls
79
79 El comando
83 El comando mv (move)
84 El comando rm (remove)
85 Buscar con find
85 Mostrar salida de
un comando por
87 Pantalla y guardar el
Mismo tiempo
resultado al
Archivado y compresión
Herramientas de la línea de
Introducción a grep
Expresiones regulares
89
comandos 91
91
93
Usar grep
para averiguar si nuestro
93
CPU soporta extensiones
Virtualización
de
Eliminar líneas
de comentarios o vacías
94
una 94
96
96
Mostrar el archivo
Rango específico
entero excepto un
no consecutivos
97 Mostrar
Reemplazar
palabras o caracteres
97
Edición empleando
Regulares
expresiones Repetir
ejecución de comandos
Definición y tipos de
procesos El comando
pstree
El comando ps
y segundo plano El
comando nohup
Múltiples terminales en la
Pantalla
misma
Dividir la pantalla
Verticalmente
horizontal y
Crear nuevas
ventanas
El editor de texto vi
(Introducción ) Modos de
operación de vi
El modo comando
Comandos básicos de vi
Insertar texto
Cambiar texto
98
99
99
100
101
103
a 105
106
109
111
113
115
115
117
118
119
119
120
122
123
Copiar y mover texto: Yank,
Delete ,
125 Y Put
Búsqueda y reemplazo de
cadenas Texto
de 127
129
130
132
133
134
Uso y configuración
de la memoria swap
134 Sistemas de archivos
136
Montaje de dispositivos de
Almacenamiento
136
Integridad
de sistemas de archivos
138
144
Crear usuarios y grupos
144
Administración de grupos
146 Permisos en Linux
147 Máscaras
de archivos y directorios
150
152
Arquitectura
del Sistema
(Tema101)
En este capítulo
hablaremos sobre los
componentes de una
computadora personal
poniendo énfasis en el
hardware y el software base
o sistema operativo. Como
parte de este análisis
aprenderemos cómo
manipular los dispositivos
conectados a nuestro equipo.
Finalizaremos repasando el
proceso de arranque de un
sistema Linux desde el
momento en que se presiona
el botón de encendido hasta
que disponemos de un
sistema totalmente funcional.
2
Conociendo el sistema
En Linux "todo es un archivo"
reza el dicho. En otras
palabras, cada componente del
sistema puede ser manipulado
como si fuera un archivo
común y corriente en el
sentido de que se puede leer
y escribir en él. Como
ejemplo podemos citar a los
comúnmente llamados pseudo
sistemas de archivos. Lejos
de tratarse de dispositivos
reales donde podemos
almacenar información variada,
en realidad consisten en una
especie de ventana que nos
permite acceder (leer) a
información del sistema de
una manera relativamente
amigable.
El directorio /proc
Según el Filesystem Hierarchy
Standard, el directorio /proc
es el método adecuado para
obtener información sobre el
sistema ya que en el mismo se
encuentra montado el pseudo
sistema de archivos proc.
Además, en este directorio
también encontraremos
datos sobre los procesos que
están corriendo actualmente.
Al ingresar a /proc lo primero
que nos llama la atención es
que hay varios directorios cuyo
nombre es un número (1, 10,
12, 13, 606, etc.). Dicho
número es el identificador de
un cierto proceso y cada
subdirectorio dentro del
mismo contiene información
asociada a dicho proceso.
Cuando un proceso finaliza
su ejecución, o es terminado,
su directorio asociado dentro de
/proc desaparece.
Supongamos que deseamos
inspeccionar más en detalle el
proceso cuyo identificador es
541. Para ello nos
posicionamos en el directorio
/proc/541 donde
encontraremos los siguientes
archivos de interés (entre
otros):
cmdline: contiene los
argumentos de la línea de
comandos que se
utilizaron para iniciar el
proceso.
cwd: es
proceso.
exe:
es un enlace al ejecutable del
proceso.
proceso
.3
Además, dentro de /proc
encontramos dos archivos
sumamente útiles que nos
brindan información sobre el
uso de RAM y CPU llamados
meminfo y cpuinfo,
respectivamente. En el
primero las cantidades en
realidad se expresan en
kibibytes (1KiB = 1024 B). Por
razones de compatibilidad, se
utiliza la nomenclatura kB
debido a
que otros programas (como
free , top , y ps ) la requieren.
De hecho, ese es uno de los
motivos por el que este archivo
es tan importante, ya que es la
fuente de datos para otros
programas.
¿Qué más podemos encontrar
dentro de /proc? La siguiente
lista nombra otros archivos
comunes junto con una breve
descripción de estos (la cual
puede ampliarse en el man
page de proc ( man proc ):
dma nos muestra
los canales de acceso directo a
memoria (Direct
Memory Access) que se
están utilizando.
interrupts históricamente ha
contenido el número de
interrupciones
por CPU y por dispositivo de
E/S, aunque a partir del kernel
2.6.24
también se incluyen
interrupciones internas (no
asociadas con un
dispositivo propiamente
dicho).
ioports es una lista de rangos
de direcciones de E/S en uso.
En uptime podremos ver
dos números. El primero de
ellos es el
tiempo (en segundos) que ha
transcurrido desde el último
inicio del
sistema, mientras que el
segundo es la cantidad de
tiempo que
cada CPU ha estado inactivo.
4
En resumen, proc (o procfs,
como es también llamado) es
un sistema de archivos virtual
que no contiene archivos
reales sino información sobre la
operación del sistema. Puede
considerarse como el centro de
control del kernel.
En /sys (el punto de
montaje de este sistema de
archivos) encontramos
información variada sobre
dispositivos. Entre esos datos
podemos ver el estado de
estos (en funcionamiento o
no), el fabricante y modelo, el
tamaño (si corresponde) y el
bus al que están
conectados. Veamos en la imagen
este sistema de archivos:
tree -d -L 1 /sys
ls /sys/bus/usb/devices
En particular, dentro de
/sys/bus/usb/devices/usb1
encontramos un subdirectorio
llamado power, y un archivo
connected_duration.
5
En el mismo se nos indica,
en milisegundos, el tiempo en
que ha
estado conectado el
bus. Este dato debe
coincidir
(aproximadamente) con el
uptime del equipo.
7
plataforma, y el sistema
operativo.
La lista de los módulos del
kernel en uso puede verse
utilizando el comando lsmod.
Como la lista puede llegar a
ser muy larga, es conveniente
utilizar less para paginar el
resultado o grep para buscar
uno en particular. Si hay alguno
de la lista que capte nuestra
atención, podemos obtener más
información sobre el mismo
usando modinfo seguido del
nombre del módulo. A
continuación, podemos
apreciar el resultado de los
comandos
lsmod | grep 8139
modinfo 8139cp
En la imagen anterior
aprendemos que el módulo
8139cp es el controlador de la
placa de red correspondientes
a la serie RealTek RTL-8139C.
/lib/modules/4.9.0-4-
686-pae/kernel/drivers/net/ethernet/realtek/
con el nombre [Link].
Si en algún momento
necesitamos utilizar un
módulo que no está cargado
en el kernel, podemos recurrir
a dos herramientas llamadas
insmod y modprobe para
poner dicho módulo en
funcionamiento. ¿Cuál es la
diferencia entre ambas
herramientas? Mientras
modprobe es lo suficientemente
inteligente para resolver
dependencias, insmod no lo es.
Esto significa que modprobe
puede cargar automáticamente
otros módulos que sean
necesarios antes de hacer lo
propio con el
que le indicamos explícitamente.
8
Por ejemplo, para cargar el
módulo ac97_bus:
modprobe --verbose
ac97_bus
Para removerlo:
modprobe -r ac97_bus
En el man page de
modules-load.d información al
respecto.
9
Los dispositivos PCI, SCSI, o
SATA pueden ser
inspeccionados mediante los
comandos lspci y lsscsi. Este
último nos muestra SCSI y SATA
por igual. Ambas utilidades
aceptan el uso de la opción -v
para aumentar la verbosidad de
la salida, traduciéndose en
mayor cantidad de detalles
sobre los dispositivos. Veamos
un ejemplo de cada comando:
lsscsi
lsscsi -v
10
lspci
lspcsi -v
Además de estas
herramientas, también
11
Dispositivos USB
En el archivo
/var/lib/usbutils/[Link]
podemos encontrar una lista de
dispositivos USB por
fabricante. El comando
lsusb utiliza la información
disponible en dicho archivo
para identificar la lista de
dispositivos USB y sus buses
de conexión presentes en
nuestro equipo. Estos datos
pueden ser actualizados
descargando la última versión
d esd e
[Link]
/var/lib/usbutils/usb.
ids. Hewlett-Packard
v165w Stick es el
nombre del fabricante y del
dispositivo.
12
La Secuencia de Arranque
Al encender el equipo, el BIOS
(Basic Input-Output System) o
UEFI (Unified Extensible
Firmware Interface) llevan a
cabo una revisión del hardware
conocida comúnmente como
POST (Power-On Self Test). A
continuación, se busca un
gestor de arranque (por lo
general, GRUB) en el MBR
(Master Boot Record) o en la
partición EFI de un dispositivo
de almacenamiento.
A partir de ese momento, el
control del proceso se pasa a
manos de GRUB, que se
encargará de cargar el kernel,
el cual reconocerá y configurará
los dispositivos de hardware
presentes en el equipo y los
preparará para su uso. Como
próximo paso, el núcleo
también será responsable por
ejecutar el primer proceso,
en segundo plano
tiempo.
SysVinit
Hasta no hace mucho tiempo,
la mayoría de las
distribuciones más utilizadas
utilizaban como base de su
funcionamiento el sistema de
arranque y de administración
de servicios conocido como
SystemV o SysVinit. Este
sistema, heredado de Unix,
contempla 5 niveles útiles de
funcionamiento (de ahí el
nombre SystemV,
correspondiente al número 5 en
el sistema romano) numerados
del 1 al 5. A estos se les suma
el nivel 0 (apagado del
equipo) y el 6 (reinicio del
sistema). Cada uno de ellos es
lo que se conoce como
niveles de corrida o runlevels
enLinux
13
Cada runlevel se encuentra
asociado a un cierto número de
servicios que por defecto
deben iniciarse
automáticamente cuando
encendemos el equipo, y
que deben detenerse al
reiniciarlo o apagarlo. Por
ejemplo, en el directorio /etc
en un sistema Debian Wheezy
podemos encontrar 7 directorios
con nombre rcN.d, donde N es
un número del 0 al 6. Es
precisamente dentro de estos
directorios que se encuentran
una serie de enlaces simbólicos
a los ejecutables que inician y
detienen los servicios del
sistema en cada runlevel
respectivo, como vemos a
continuación:
Por elmomento, podemos
asociar elconcepto de enlaces
simbólicos (también llamados
soft links) con elde acceso
directo, conelque quizás
estemos más familiarizados. En
síntesis, setrata de una
representación de unrecurso
del
sistema que apunta a
dicho recurso pero que es
independiente delmismo
La Sutilizada como prefijo en
los nombres delos enlaces
simbólicos indica que,eneste
nivel decorrida enparticular se
debe iniciar elservicio
asociado. Por otro lado,laletra
K indica locontrario (elservicio
debe apagarse opermanecer
detenido alingresar al
runlevel encuestión)
14
Es importante tener en claro
que lo primero que hace init
es leer el archivo /etc/inittab
para identificar los próximos
pasos a seguir. Por brevedad,
nos referiremos solamente a la
detección del runlevel por
defecto, lo que se indica en la
siguiente línea (2 en este
ejemplo):
corrida de manera
15
Con el correr del tiempo, las
siguientes limitaciones se
hicieron notorias en este
esquema:
El proceso de inicio de
servicios es estrictamente
síncrono (se
espera a que un servicio
esté corriendo antes de
iniciar el
próximo). Esto impacta en el
tiempo total de inicio del
sistema.
Necesidad de chequear
dependencias antes de iniciar
unservicio
Por ejemplo, que el servicio
de red esté disponible antes de
iniciar
un servidor web.
Cualquier evento
posterior al inicio del
equipo necesita
intervención manual del
usuario (identificación y
montaje de
dispositivos extraíbles, por
nombrar dos ejemplos).
Fueron precisamente estas
desventajas que condujeron al
desarrollo de otros sistemas de
arranque y administración de
servicios como Upstart primero
y systemd después.
Upstart
Entre SysVinit y la adopción
final de systemd por la
mayoría de las distribuciones
principales GNU/Linux, surgió
una alternativa conocida como
Upstart. Fue desarrollada por
Canonical (la empresa detrás
de Ubuntu) e integrada por
primera vez con Ubuntu 6.10
Edgy a fines de 2006.
Posteriormente, Fedora la
adoptó y utilizó hasta la
versión 14 inclusive. Hoy en día
podemos encontrarla en RHEL
6.7 y similares, los cuales gozan
de soporte hasta fines de 2018.
Upstart se pensó como un
reemplazo basado en
eventos para SysVinit. Como
tal, supervisa tareas
mientras el sistema está
funcionando y responde a
eventos tales como la
conexión o desconexión de
dispositivos extraíbles.
Además, también gestiona los
servicios durante el inicio y el
apagado. Es importante notar
que es 100% compatible con
los scripts clásicos de
SysVinit. De esta manera,
aquellos servicios que provean
un script para init pueden
funcionar sin problemas bajo
Upstart.
Por otro lado, Upstart también
trabaja con archivos .conf
dentro del directorio /etc/init. En
los mismos se define el
funcionamiento de servicios, y
tienen la siguiente estructura:
16
Niveles de corrida en los
cuales el proceso debe
ejecutarse o
eventos que deben iniciarlo.
Niveles de corrida en los
cuales el proceso no debe
correr o
eventos que deben
detenerlo.
Opciones
Comando que se debe
utilizar para lanzar el proceso
Consideremos el archivo de
ejemplo [Link] que
mostramos a continuación. Los
comentarios presentes en el
mismo (en líneas que
comienzan con #) nos
sirven como guía para
entender el funcionamiento del
servicio que utiliza este archivo
de configuración):
# Servicio de prueba
para Upstart
# Stanzas
# Stanzas define when
and how a process is
started and stopped
# See a list of stanzas
here:
[Link]
com/wiki/Stanzas#respawn
17
Systemd
Es importante aclarar que
systemd no surgió como un
reemplazo de SysVinit porque
este último fuera defectuoso
o porque hubiera usuarios y
administradores que
estuvieran descontentos con
el mismo. Más bien, comenzó
como un proyecto para
desarrollar un sistema que fuera
más eficiente al 1) iniciar
menos servicios durante el
arranque (solamente aquellos
que fueran estrictamente
necesarios de acuerdo al uso
esperado y al hardware
disponible), y 2) hacerlo en
paralelo, en vez de manera
secuencial. En otras palabras,
se buscó un sistema de inicio
y de administración de
servicios que pudiera
reaccionar dinámicamente ante
cambios en el software y en el
hardware.
Dentro de /lib/systemd/system
podemos encontrar las
definiciones de las distintas
unidades. Para empezar, cabe
aclarar que los archivos de
configuración de los targets
llevan el sufijo .target. Por
ejemplo, podemos encontrar
[Link] y [Link].
Este último es el objetivo donde
se encuentran agrupados la
mayoría de los daemons. Para
funcionar correctamente, se
necesita que [Link]
esté activado. Dicho de otra
forma, antes de entrar en
[Link], todos los
servicios agrupados en
[Link] deben haberse
iniciado. A su vez, [Link]
requiere [Link].
Elobjetivo [Link] en
esencia cubre todo lo
relacionado con elinicio del
sistema. Luego
podemos decir losiguiente
engeneral:
[Link] seindica
Requires=[Link]
hablamos que elobjetivo
Besuna
dependencia delA
19
¿De dónde proviene este
dato? Se trata de un enlace
simbólico llamado [Link]
dentro de /lib/systemd/system
que apunta a la definición del
target indicado. Por ejemplo,
en la imagen siguiente
podemos ver que /l
ib/systemd/system/d efa [Link] rget
es un soft link hacia /li
b/systemd/system/g ra ph i ca
[Link]:
Por supuesto, es posible
systemctl set-default
[Link]
20
A continuación, presentamos
las opciones más utilizadas
de systemctl.
En todas ellas hacemos
referencia a un servicio
ficticio llamado miservicio:
Iniciar el servicio:
systemctl start
[Link]
Configurarlo para que inicie
al arrancar el equipo:
systemctl
enable
[Link]
Detenerlo: systemctl stop
[Link]
Impedir que inicie al arrancar
el equipo: systemctl
disable
[Link]
Reiniciar el servicio:
systemctl restart
[Link]
Averiguar si está
configurado para arrancar al
inicio: systemctl
is-enabled
[Link]
Averiguar si está corriendo
actualmente: systemctl
is-active
[Link]
o systemctl -l
status
[Link]
(esta última variante
provee más
información sobre el estado y
la operación del servicio).
Cuando es necesario
realizar tareas de
mantenimiento o de
emergencia será necesario
que nos cambiemos al
modo monousuario. Para llevar a
cabo esta acción haremos uso
de
systemctl rescue
osystemctl
emergency
21
Logs de inicio
A fin de investigar
inconvenientes cuando se
produzcan, a menudo
recurriremos a los registros de
operación (también llamados
logs) del sistema. Mediante el
comando dmesg (diagnostic
msg) podemos acceder a los
mensajes emitidos por el
kernel a lo largo de la
secuencia de arranque hasta el
momento actual.
Por motivo de que cuando
ejecutamos dmesg sin
opciones se muestran todos
los mensajes, por lo general
resulta útil aplicar un paginador
como less, un filtro como
head o tail (para ver los
primeros o los últimos
registros), o utilizar grep para
identificar los resultados que
cumplen con un patrón . Con
respecto a esta última
alternativa, en el ejemplo
que aparece a continuación
veríamos solamente los
mensajes relativos a los
dispositivos USB:
dmesg |less
dmesg |grep -i usb
22
warn:
condiciones de advertencia
notice: condición
normal pero significativa
info: de carácter informativo
debug:
mensajes de nivel de debug
dmesg –level=err,warn
Además de dmesg,
systemd provee una
utilidad llamada journalctl
para acceder al registro de
eventos de arranque (y de otras
clases también). Con
journalctl --boot
journalctl --list-boots
journalctl --boot -0 |
head -n 5
journalctl --boot -0 |
tail -n 5
23
Además, journalctl admite
opciones que nos permiten ver
datos de unidades específicas.
Por ejemplo, con la opción
--unit=UNIT podemos
visualizar datos de la unidad
representada por UNIT. Es
decir, el comando
journalctl --unit=cron
--boot
–priority=4
responda aeventos
ACPI(Advanced Configuration
and Power Interface)
como elpresionar el
botónde suspender
en/etc/acpi/events.
A continuación, el sistema
operativo nos devuelve el prompt
o la línea de comandos preparada
para recibir nuestras órdenes. En
el caso de Debian el prompt inicial
está compuesto por dos partes:
El nombre del usuario actual,
seguido del símbolo **@**.
El nombre del equipo.
El directorio inicial de
trabajo, más conocido como el
home o el
directorio personal del usuario
en cuestión. El símbolo ~ se
utiliza para
representar este directorio.
Si estamos logueados como
root, veremos el símbolo # a
continuación.
De otra manera (usuario
común), se mostrará el signo $.
Además de su directorio personal,
cada usuario tiene asignado un
shell o intérprete de comandos . Se
trata de un programa que recibe
los comandos que escribimos y
que los envía al sistema operativo
para ser ejecutados.
El intérprete utilizado en la
mayoría de las distribuciones
actuales (de las cuales Debian no
es la excepción) se llama Bash
(Bourne-Again SHell). Bash tiene
la posibilidad de ejecutar
comandos en tiempo real pero
además tiene un poderoso
lenguaje de programación de
scripts. Permite generar
programas con funciones, control
de flujo, creación de archivos,
seguimiento de procesos, entre
otros.
25
Ante tales casos, es preciso
conocer las opciones de las que
disponemos a fin de proceder
correctamente y con cautela.
Dentro de lo posible, debemos
init 0
poweroff
halt
shutdown -h [CUANDO]
[MENSAJE OPCIONAL]
shutdown -r [CUANDO]
[MENSAJE OPCIONAL]
26
Si existe un apagado pendiente y
deseamos cancelarlo, podemos
utilizar la opción -c para tal fin:
shutdown -c 'El
apagado ha sido
cancelado. Puede continuar
trabajando normalmente.'
de usuario. Si es cancelado, se
levantará esa restricción.
27
A continuación, ilustramos el
uso de wall y mesg
28
Instalación
de Linux y
Administración
de Paquetes
(Tema102)
En este capítulo hablaremos
sobre los pasos a seguir y
Sistemas de archivos
Los sistemas de archivos más
utilizados hoy en día son ext4 y
xfs. Veamos algunas
características de ambos:
ext4 (tomado de la
documentación oficial):
Tamaño máximo de sistema
de archivos (generalmente se
extiende a toda la partición):
1EiB = 1024 PB (1 PiB = 1024
TiB, 1
TiB = 1024 GiB)
Tamaño máximo de archivos:
16 TiB
Cantidad máxima de
subdirectorios: 64.000
Journaling: permite la
recuperación de archivos que
estaban
siendo escritos en el
momento de un fallo del
sistema. Si bien esta
característica no elimina
totalmente las posibilidades de
encontrar
archivos corruptos, sí
contribuye a la confiabilidad del
sistema de
archivos y a la rapidez del
chequeo de los mismos.
Permite aumentar o disminuir el
tamaño del sistema de archivos.
xfs:
Tamaño máximo de sistema
de archivos (generalmente se
extiende a toda la partición):
8 EiB en sistemas operativos de
64
bits y de 16 TiB en 32 bits.
pero no
disminuirlo
31
Creación de particiones y
sistemas de archivos
En Linux, la herramienta
tradicional para administrar
particiones basadas en MBR
(presente por defecto en
computadoras fabricadas hasta
2009 aproximadamente) es
fdisk, mientras que desde
2010 en adelante (particiones
basadas en GPT) se comenzó a
utilizar también otra utilidad
llamada gdisk.
Es importante aclarar que todas
las
operaciones relacionadas
conlacreación de
particiones
sistemas de archivos
ymontaje de dispositivos
deben
ser realizadas por root
oconunusuario con
permisos
desuperusuario
fdisk /dev/sdb
32
En la pantalla siguiente
podemos presionar la tecla m
para ver el
menú de ayuda como se
muestra en la imagen (por
limitaciones de
espacio no se alcanzan a
apreciar todas las opciones
disponibles):
Las operaciones más usuales
que podemos llevar a cabo a
partir de
este momento son las
siguientes:
p: mostrar la tabla
de particiones del dispositivo
n: agregar una
nueva partición
d:
33
Algunos puntos importantes
para destacar:
La primera partición de
/dev/sdb recibirá el identificador
/dev/sdb1, la segunda
/dev/sdb2, y así
sucesivamente. Por defecto, al
crear una nueva partición, se le
asignará el tipo Linux (83). Si
deseamos cambiarlo, podemos
listar los tipos disponibles con
L, elegir el adecuado, y luego
asignarlo con la opción t.
Si en el dispositivo
seleccionado existe más de
una partición y
deseamos borrar una de
ellas, tendremos que
especificar el
número de esta (a partir del
orden en el que aparecen al
mostrar la
tabla de particiones).
Antes de confirmar
cualquier cambio realizado,
es importante revisar la tabla de
particiones, ya que una vez que
se guarden los cambios y se
salga del menú de fdisk es
probable que los mismos sean
irreversibles (lo cual es
particularmente crítico si
hemos modificado una partición
que contenía datos).
34
Por ejemplo:
En la imagen anterior vemos
cómo crear una partición de 2,5
GB que
recibió la identificación
/dev/sdb1. Luego de guardar
el cambio
volvimos a la línea de
comandos y con fdisk -l
/dev/sdb
podemos ver la tabla de
particiones actual.
No serecomienda
editar elarchivo de
configuración
(/boot/grub/[Link])
delgestor de arranque
directamente. Más bien
sedebe trabajar con los
scripts presentes en
/etc/grub.d. La ubicación de los
archivos de
configuración puede llegar a
variar
según ladistribución
ylaversión.
37
Interactuar con GRUB
Durante el proceso de
arranque, GRUB presenta un
menú de modo texto que
permite elegir entre distintos
kernels o sistemas operativos
instalados en el equipo. Con
las flechas del teclado se
puede elegir la opción deseada
y presionar Enter para
confirmarla. Además,
presionando las teclas c o e
se puede acceder a una
línea de comandos básica o a
las opciones de arranque,
respectivamente. Mediante estas
herramientas podemos adaptar
el inicio del sistema a nuestras
necesidades, tal como se
aprecia en la siguiente imagen:
En la imagen de arriba
podemos observar algunos
puntos interesantes en la
configuración de la opción
Debian GNU/Linux. Las mismas
pueden editarse de ser
necesario. Luego, los cambios
se guardan y se retoma el
proceso de inicio al presionar
Ctrl + x o F10. Además:
insmod se utiliza para
cargar los
módulos gzio, part_msdos, y
ext2.
Mediante la directiva set
root (recuadro rojo con flecha
apuntando
hacia la derecha) se le
indica a GRUB dónde buscar
el archivo
[Link]. En este caso se
trata del primer disco (hd0).
Más
específicamente, en la
primera partición bajo el
esquema de
particionado tradicional
(msdos1).
Si el sistema no inicia
correctamente, podemos usar
la shell de GRUB para
realizar un diagnóstico
preliminar. Accedemos a la
misma presionando la tecla
c desde el menú principal
que mencionamos antes. Esta
herramienta admite el uso
de varios comandos aceptados
por Bash u otras shells.
38
Configuración de GRUB
En el archivo
/etc/default/grub se indican
las directivas de
configuración de GRUB, tales
como el sistema operativo o
kernel que
se debe utilizar por
defecto en el arranque
del sistema
(GRUB_DEFAULT) o el
tiempo (en segundos) que se
debe esperar
antes de iniciar el inicio
(GRUB_TIMEOUT), por
nombrar dos
ejemplos:
Elresto de las opciones están
disponibles enla
documentación de
GRUB2
39
En vez de modificar estos
scripts ,podemos crear nue vos
si deseamos agregar
opciones personalizadas
Bastará crear un archivo
y agregarlo al final de
40_custom para que se tenga
en cuenta al momento de
inicio .
Sin embargo ,
esta
habilidad no es necesaria para
el examen LPIC 1por lo que no
latrataremos eneste capítulo
cp /boot/grub/[Link]
/boot/grub/grub
.[Link]
grub-mkconfig >
/boot/grub/[Link]
Por ejemplo:
grub-install
--boot-directory=/tmp/
root/boot /dev/sda
de comandos mínima,
ejecutaremos el comando ls.
El mismo nos devolverá la
lista de dispositivos
encontrados. A continuación,
podemos identificar los
siguientes:
ls
ls (hd0,msdos1)
ls (hd0,msdos1)/
ls (hd0,msdos1)/grub
hd0,msdos1
(/dev/sda1) y hd0,msdos5
/dev/sdc, y /dev/sdd,
respectivamente).
41
Como podemos ver en la
imagen de arriba, el archivo
[Link] efectivamente está
ubicado en la partición 1 del
primer disco. Esto concuerda
con el valor que observamos
para la opción set root, tal
como comentamos antes. Si
repitiéramos el comando ls
para ver el contenido de otros
dispositivos (hd0,msdos5 por
ejemplo), nos encontraríamos
con un mensaje de error. El
mismo nos alertaría sobre el
hecho de que se desconoce
el sistema de archivos en
cuestión. Lo que sucede en
realidad es que dicha partición
no es la que contiene los
archivos de arranque.
Para ver la lista completa de
comandos que acepta la shell
de grub podemos utilizar help
en cualquier momento. Por
otro lado, presionando la tecla
Esc se vuelve al menú
anterior. Además, presionando
la tecla Tab se muestran las
posibles opciones de
automcompletado.
Librerías compartidas
Una librería es un conjunto de
funciones incluidas en un
mismo archivo. Dichas funciones
por lo general son utilizadas por
una variedad de programas que,
en vez de incorporarlas en su
propio código (enlace estático),
las llaman cuando es necesario
(enlace dinámico). Esto, por
supuesto, requiere que dichas
librerías existan en el sistema
previo al lanzamiento del
programa. La ventaja reside en
que en este último caso
solamente es necesario una
copia de la librería, la cual es
compartida por todas las
aplicaciones que la necesitan. El
enlace estático, en cambio,
requiere que cada programa
disponga de su propia copia y la
incluya como parte del programa
en sí.
está disponible,
cualquier programa que la
necesite no
podrá funcionar.
42
En el directorio /lib (o su
equivalente para sistemas de
64 bits, /lib64) encontraremos
librerías compartidas que
son utilizadas por los
programas ubicados en /bin y
/sbin. En distribuciones
modernas que utilizan systemd,
/lib y /lib64 son en realidad
enlaces simbólicos a /usr/lib y
/usr/lib64, respectivamente. En
estos directorios también
encontramos las librerías de
programas de usuario. Si
bien son importantes, estas
últimas no son críticas para
la operación del sistema.
Tomemos como ejemplo a
/usr/bin/ssh y a /bin/cat.
Utilizaremos el comando file
para determinar el tipo de cada
archivo:
file /usr/bin/ssh
file /bin/cat
programas enlazados
dinámicamente. En la misma
imagen podemos ver,
utilizando el comando ldd,
cuáles son las librerías de
las que depende /bin/cat:
ldd /bin/cat
Para asegurar que los enlaces a
las librerías se mantienen
43
Al inspeccionar el
contenido de la variable
de entorno
LD_LIBRAR Y_PA TH podemos
ver la lista de directorios que se
tienen en cuenta para buscar
librerías compartidas.
44
las dos anteriores, todavía
continúa usándose para ofrecer
a los usuarios finales la
posibilidad de compilar un
programa dado con opciones
particulares. También se
utiliza este método de
distribución de software para
poner al alcance del público
una versión más actualizada que
tenga mayores prestaciones
que las presentes en los
repositorios.
Cada distribución tiene
distintas utilidades para la
administración de paquetes.
Algunos de ellos (como yum
o apt-get, para CentOS y
Debian, respectivamente, junto
a los miembros de cada familia)
tienen la habilidad de
instalar junto con un
programa dado sus
dependencias, es decir,
aquellos paquetes adicionales
que son necesarios para el
funcionamiento del primero.
Por esa razón se los conoce
más comúnmente con el
nombre de gestores de
paquetes.
funcionamiento es el mismo:
1. Se configuran los
repositorios en los que
desea buscar
software para nuestro
sistema.
2. Antes de utilizar los
nuevos repositorios
configurados se
requiere actualizar el
índice de paquetes local de tal
manera
que refleje los
contenidos de los repositorios.
3. Se utiliza el gestor de
paquetes de cada distribución
para
buscar información
sobre un paquete dado o
directamente
para instalarlo.
Para
evitar congestionar un
En Debian, la lista de
repositorios se mantiene en el
archivo /etc/apt/ [Link] y
en archivos ubicados dentro
de /etc/apt/[Link].d En uno
u otro caso, el formato del
archivo es el mismo según
mostramos a continuación,
tomando como ejemplo el
mirror de Debian provisto por
la UBA (Universidad de
Buenos Aires, Argentina):
deb [Link]
.[Link]/pub/
linux/debian/debian/
stable main contrib
non-free
deb-src
[Link]
ar/pub/
linux/debian/debian/
stable main contrib
non-free
47
Cuando agreguemos un nuevo
repositorio a CentOS se nos
pedirá que confirmemos que
queremos instalar en nuestro
equipo la clave
GPG que dicho repositorio
provee por cuestiones de
seguridad.
dpkg -i [Link]
Si posteriormente quisiéramos
instalar una nueva versión del
mismo programa mediante un
archivo .deb más reciente,
podemos utilizar el mismo
comando anterior. En cambio,
si necesitamos desinstalarlo
emplearemos la opción -r
(también puede ser --remove)
o -P (de --purge) simplemente
incluyendo el nombre del
paquete:
dpkg -r mipaquete
paquetes instalados en el
sistema. Como la salida será
extensa en este caso se
recomienda que la visualicemos
con less o la filtremos con
alguna herramienta como tail,
head, o grep.
dpkg -l |head
dpkg --contents
[Link]
49
De forma similar a
--contents, podemos
emplear --listfiles (en
este caso utilizamos
solamente el nombre del
paquete, sin la extensión .deb)
para ver los archivos que se
agregaron al sistema al instalar
un paquete (sea que lo
hayamos hecho mediante
dpkg o apt-get, como
veremos a continuación).
apt-get update
apt-cache search
mipaquete
sobre el mismo, o
apt-get install
mipaquete
50
llevado a cabo mediante
dpkg y que no se haya
completado exitosamente por
dependencias faltantes.
quisiéramos removerlo,
cualquiera de los comandos
siguientes nos permitirá
hacerlo:
usaremos
apt-get upgrade
mipaquete
Si en el comando anterior
omitiéramos el nombre del
Reconfigurar paquetes
Es importante notar que
durante el curso de una
instalación por lo general se
nos ofrece la posibilidad de
configurar el programa en
cuestión. Si no lo hacemos
en ese momento, también
podemos hacerlo posteriormente
utilizando la herramienta
dpkg-reconfigure.
En primer lugar, podemos
revisar la configuración actual
con el comando debconf
seguido del nombre de un
paquete dado. Usemos como
ejemplo el paquete
keyboard-configuration, según
se aprecia
51
en la siguiente imagen:
debconf-show
keyboard-configuration
Si vemos algo que queremos o
vemos la necesidad de cambiar,
ahora es el momento de recurrir
a dpkg-reconfigure.
Siguiendo con el mismo ejemplo
de arriba, ahora se deberá
utilizar el comando
dpkg-reconfigure
keyboard-configuration
52
CentOS y similares
RPM (Red Hat Package
Manager) es el gestor de
paquetes utilizado por defecto
en Red Hat Enterprise
Linux como en SuSE (y
distribuciones derivadas como
CentOS, Fedora, u
OpenSUSE). Fue desarrollado
por Red Hat y luego adoptado
por otras distribuciones.
Podemos decir que consta de
2 componentes fundamentales:
1) el comando rpm, y 2) una
base de datos local. Esta
última contiene la lista de
paquetes instalados e
información sobre estos y se
encuentra dentro del directorio
/var/lib/rpm.
bc-1 .06.95-13.el7.x86_64.rpm.
Podemos descargar el mismo
desde el listado de paquetes
disponibles para CentOS 7.
En el nombre del archivo
podemos encontrar a primera
vista los siguientes datos:
El nombre del paquete: bc
La versión: 1.06-95-13.el7
La arquitectura: x86_64
utilizaremos la misma
herramienta
paquete. No es necesario
53
Otras opciones útiles del
comando rpm que no pueden
faltar en nuestro arsenal son
(siempre seguidas de -q, de
query): -a: muestra la
lista de todos
los paquetes instalados. -l:
lista de los archivos
instalados por un paquete dado.
-ip:
ver información detallada
sobre un
siguiente manera:
rpm2cpio tuxpaint-0.
9.22-1.x86_64.rpm |cpio
-idv
La configuración de yum se
encuentra en /etc/[Link].
Si bien podemos agregar
repositorios en este archivo,
por prolijidad y orden se
prefiere hacerlo mediante
archivos individuales (con
la extensión .repo) dentro
del directorio
/etc/[Link].d como
explicamos antes.
Cuando agreguemos un nuevo
repositorio a CentOS se nos
pedirá que confirmemos que
queremos instalar en nuestro
equipo la clave GPG que dicho
repositorio provee. Sin este
paso no será posible descargar
ningún paquete de ese origen.
55
Si en algún momento nos
interesa repasar la actividad
de yum, podemos consultar
el archivo de registros
(o logs) en /var/log/[Link].
Ya sea cuando agregamos un
repositorio de terceros (como
en el caso de MariaDB antes)
o incluso en
/etc/[Link].d/CentOS-
[Link], podemos valernos
de la directiva enabled para
indicar si se debe habilitar
inmediatamente o no. Por
ejemplo, en la imagen podemos
ver la configuración del
repositorio centosplus y notar
enabled=1. Esto indica que
centosplus está habilitado en
nuestro sistema:
Debido a que centosplus
contiene paquetes que son
mejoras para los presentes en
los repositorios base y
updates, es posible que
queramos deshabilitarlo en
ocasiones para que no
interfieran con estos últimos.
Podemos hacerlo al editar el
valor de la directiva a
enabled=0 antes de hacer yum
update o bien indicar yum
update --disablerepo=centosplus.
Lo mismo aplica si estuviera
deshabilitado y quisiéramos
habilitarlo con yum
update enablerepo=ce
--
ntosplus.
El habilitar o deshabilitar un
repositorio mediante la línea de
comandos tiene efecto
solamente durante la
transacción actual .Para
hacerlo de manera
permanente debemos cambiar
elvalor correspondiente en la
directiva enabled como
mostramos antes
56
En Fedora se ha comenzado a
utilizar un gestor de paquetes
llamado dnf desde hace un par
de años (fue presentado con la
versión 18 y pasó a ser la
herramienta por defecto a
partir de la 22). Guarda
semejanza con las opciones
disponibles de yum que
hemos visto, aunque es más
rápido y consume menos
memoria que su antecesor. El
proyecto Fedora provee
documentación detallada sobre
dnf en su sitio oficial.
Familia SUSE
Estas distribuciones, entre las
que se destaca openSUSE,
también utilizan la herramienta
rpm para administrar paquetes
individuales. Además, también
disponen de un gestor de
paquetes muy completo llamado
zypper. A continuación,
veremos las operaciones
más comunes que podemos
realizar con zypper:
Refrescar (actualizar)
repositorios: zypper refresh
Búsqueda por palabra
clave (apache en este caso):
zypper
search apache
Información sobre un
paquete en particular: zypper
info
apache2
Instalación de un paquete:
zypper install apache2
Desintalación: zypper
remove apache2
se (search), if (info), in
(install), up (update), y rm
(remove).
57
Herramientas
de la línea de
comandos
(Tema103)
A pesar de que hoy
existen distribuciones
GNU/Linux con excelentes
interfaces gráficas, la línea
de comandos nos ofrece
herramientas de
administración sumamente
útiles. Puede parecer
intimidante al principio, pero
con el tiempo puede
convertirse en nuestra mejor
aliada. Además, este es el
entorno más frecuente que
encontraremos en los
servidores que administremos.
58
Entrada, salida, y error
estándares
Cada vez que ejecutamos un
comando, por lo general
esperamos ver el resultado por
pantalla o guardar el mismo
en un archivo. Hay ocasiones
en que además del resultado
también se nos muestra
cualquier error que se haya
producido. Para ilustrar,
veamos en la imagen el
resultado del comando
ls /boot /otrodirectorio
Como /otrodirectorio no existe,
recibimos el mensaje de error
que resaltamos.
o también
redirigiremos el
mensaje de error (utilizando
el descriptor de archivo 2) a
[Link].
El resto del resultado se
mostrará por pantalla como en
el caso
anterior:
ls /boot
/otrodirectorio 2>
[Link] Utilizando el
ejemplo anterior también
podemos guardar en [Link] el
resultado al mismo tiempo
que enviamos el error a
[Link] como
vemos en la imagen:
ls /boot /otrodirectorio
60
Finalmente, también
podemos enviar tanto stdout
como stderr al mismo destino.
Por lo general, si esperamos
que un comando produzca una
cantidad considerable de
salida (y/o error) que no
deseamos ver en la
terminal, redirigimos ambos
flujos al sumidero /dev/null:
ls /boot /otrodirectorio
2>&1 > /dev/null
o al principio:
PATH=~/bin:$PATH
La decisión de agregar un
directorio al comienzo oal final
de PATH depende si
queremos que sea examinado
antes o después que el
resto de los directorios .Es
importante tener en cuenta
este punto si hay más de un
ejecutable con el mismo
nombre en la lista de
directorios contenidos en
PATH .Por ejemplo ,si tanto
~/bin como /usr/bin contienen
un binario llamado id ,será
ejecutado el que aparece en
~/bin si este directorio se
encuentra antes que /usr/bin en
lalista
inicio de
62
sesión del usuario actual:
>> ~/.bash_profile Si
source ~/.bash_profile
de entorno personalizada
(por lo
general se le da un nombre
con el comando unset:
LENGUAJE='Python'
echo $LENGUAJE
unset LENGUAJE
echo $LENGUAJE
en MAYÚSCULAS) podemos destruirla
63
Identificar comandos
Los muchos comandos que
podemos llegar a utilizar se
pueden clasificar en categorías
de acuerdo con su origen.
Algunos de ellos están
incorporados en la shell,
mientras que otros provienen
de un determinado paquete
que hayamos instalado.
También existe la posibilidad
de que un comando sea en
realidad un alias de otro
comando con sus opciones.
Un alias es un comando
construido a partir de otros y/o
diferentes opciones ,y es una
manera de ejecutar una serie
de comandos más fácilmente
De esta manera ,no es
necesario recordar toda la
secuencia ni las opciones
utilizadas
lscpu
type cd
64
En la imagen anterior
podemos ver que ls es un
alias de ls color=auto,
-- y
que lscpu corresponde a un
ejecutable cuya ubicación es
/usr/bin/lscpu. Esto significa
que cuando escribamos ls
/mi/directorio en
realidad estaremos
ejecutando ls --
color=auto
/mi/directorio.
cuando necesitemos
desplazarnos de la misma
manera que lo
hacíamos antes con cd
../../.
unalias ..
la herramienta unalias
permanente deberemos
guardar su declaración al final
de ~/.bash_profile o ~/.profile.
65
El historial de comandos
Cuando iniciamos sesión en
una terminal, el entorno de la
shell se pone en
funcionamiento de acuerdo a
nuestras configuraciones
personales. Para cada usuario,
las mismas se encuentran
dentro de archivos ocultos en
su correspondiente directorio
personal. Uno de estos
archivos es ~/.bash_history,
donde se guarda el historial
de comandos en Linux.
Por suerte, al disponer del
historial podemos ejecutar un
comando fácilmente sin volver
a tener que escribirlo
nuevamente. En primer lugar,
recordemos que con el
comando history podemos
listar los comandos
disponibles. A continuación,
colocando un signo de
exclamación y el número del
comando en el historial
podremos ejecutarlo otra vez. En
otras palabras,
history 10
repetirá type
fc 2006
fc 2000 20005
nos permitiría editar los
comandos que ocupan desde
la posición 2000 a la 2005 en el
historial.
Localizar comando
El comando which nos
muestra la ubicación del
archivo ejecutable
correspondiente a un comando
dado. Para hacerlo, busca en
orden dentro de los directorios
que aparecen en PATH.
Como podemos apreciar abajo,
podemos indicarle más de un
comando a la vez:
which ls
which ps top
siguientes:
Manipulación de texto
Gran parte de las tareas de
un sysadmin se llevan a
cabo al manipular archivos o
flujos de texto. Para
ayudarnos en esta
responsabilidad podremos
utilizar los comandos que
listamos a continuación.
cat [Link]
[Link] -n -s
68
Otra alternativa para ver los
números de línea junto a
cada una es utilizar la
herramienta nl seguida del
nombre del archivo a
examinar , produciendo
esencialmente el mismo efecto
decat -n
69
El comando cat puede ser
interesante para ver el
contenido de archivos
pequeños, pero en general
more o less resultan de mayor
utilidad en la mayoría de los
casos, en especial si
tratamos con archivos extensos.
Estas dos herramientas
paginan (dividen en páginas)
uno o varios archivos y los
muestran en la terminal. De no
indicárseles un archivo dado,
paginan la entrada estándar.
Se diferencian en las
facilidades que brindan como
indicamos a continuación:
less /etc/password
more /etc/passwd
búsqueda empleando un
correspondiente.
70
El comando man (que
utilizamos para acceder a los
man pages o manuales de los
comandos), utiliza por defecto
el paginador less
para dar formato a su salida.
Existen además los comandos
zless y zmore que permiten
paginar a los archivos
comprimidos sin necesidad de
descompactarlos previamente
en nuestro disco.
para enero
y DEC para diciembre).
-f o --ignore-case
-t o
--field-separator nos
permite especificar un
separador de campos distinto
al espacio.
sort -M -f -t,
[Link]
71
Por lo general, sort se utiliza
junto con uniq, que permite
eliminar líneas repetidas en una
secuencia. Por ejemplo, el
comando cat [Link] |
sort |uniq
o su equivalente
sort -u [Link]
72
En [Link]:
Argentina
Uruguay
Paraguay
Chile
Bolivia
Brasil
En [Link]:
Buenos Aires
Montevideo
Asuncion
Santiago
La Paz
Brasilia
Por ejemplo,
head -n 7 /etc/passwd
nos mostrará las primeras 7
líneas de /etc/passwd, mientras
que tail /etc/passwd
mismo archivo.
las modificaciones a un
archivo a medida que se
hacen. En otras palabras
tail -f /var/
log/httpd/access_log
74
mientras que -d especifica el
separarlos:
/etc/passwd
Por ejemplo,
75
Utilicemos el archivo
La cantidad de palabras: wc -w
[Link] El número
de caracteres, que debería
coincidir con el tamaño del
archivo: wc -c
[Link]
ps -u www-data |grep -v
PID |wc -l
Compresión de archivos y
lectura de archivos
comprimidos
Para comprimir archivos
podemos utilizar cualquiera
de las tres herramientas
siguientes: gzip, bzip2, o
gzip [Link]
bzip2 [Link]
xz [Link]
76
xz -dc [Link]
xzcat [Link]
gzip -d [Link]
bzip2 -d [Link].bz2
xz -d [Link]
Dividir archivos
Linux provee una herramienta
muy útil llamada split para
dividir archivos de gran tamaño.
Comencemos primero creando
un archivo llamado
[Link] de 2 GB
(bs=1M * count=2000) en el
directorio actual:
dd if=/dev/zero
of=archivoprueba . iso
bs=1M count=2000
de 2 GB en partes de 600 MB
como máximo. Debido a que 2
GB no es un múltiplo de esta
split --bytes
600M
--numeric-suffixes
[Link]
[Link].
Con la opción --bytes
indicamos el tamaño máximo
que deberá tener
cada archivo individual. Por
otra parte, --numeric-suffixes
nos permite
agregar un número al final
del nombre de cada uno.
Finalmente,
[Link] es el
nombre del archivo a dividir,
mientras que
[Link]. (notar el
punto al final) es el prefijo de
salida.
77
Una vez que hayamos
compartido los archivos,
podemos regenerar el original
muy fácilmente. Nombraremos
el archivo destino como
[Link] para
distinguirlo del original
propiamente dicho:
cat [Link].*
>
[Link] A
continuación, podemos
comparar [Link]
con [Link]
utilizando el comando cmp:
cmp [Link]
[Link]
utilizan sha256sum,
sha512sum, y md5sum para
devolver el hash que
representa el contenido de
[Link]:
sha256sum [Link]
sha512sum [Link]
md5sum [Link]
78
En la imagen anterior
podemos apreciar el
resultado. Podemos
contar con que es
imposible (prácticamente
hablando) que dos
archivos diferentes tengan
hashes iguales.
Creación y manipulación de
archivos y directorios
Para organizar nuestros
archivos, poder montar
dispositivos de
almacenamiento, y borrar
contenido que no sea necesario
es preciso que desde un
comienzo sepamos cómo
emplear las herramientas que
nombraremos en este apartado.
El comando ls
fondo de la
En este caso, [Link] y
[Link] son ejemplos de
archivos. Por otro lado,
archivo3 (contrario a lo que
podría sugerir su nombre) se
trata de un directorio,
link_archivo2 es un enlace
simbólico activo, link_archivo1
uno roto, y archivo2 es un
archivo binario ejecutable.
80
Para ilustrar, veamos la
diferencia que existe entre
hacer ls y ls -a en el directorio
personal de un usuario.
Si ahora agregamos el
modificador -l obtenemos
mayor información de los
archivos y directorios. La
salida del comando en este
caso está dispuesta en
columnas para que nos
resulte más sencillo
reconocerla. Veamos cómo
queda cada columna:
1. Se trata de un archivo
propiamente dicho, ya que el
primer
caracter de la secuencia
-rw-r--r-- es -.
2. El archivo tiene un
(1) enlace que apunta
hacia el mismo. 3. El dueño del
archivo es el usuario alumno.
4. El grupo dueño es finanzas.
5. La última modificación fue
realizada el día 2 de abril del
corriente
año a las 19:03.
Si dentro de un directorio
existen subdirectorios y nos
interesa ver el contenido de
todos simultáneamente, se
puede utilizar la opción -R para
mostrar de forma recursiva tal
información. Dicho de otra
forma, ls -lR pruebas nos
devolverá un listado detallado
de tal directorio y de todos los
subdirectorios que se
encuentren dentro del mismo.
directory)
Con este comando creamos
nuevos directorios vacíos. En
este ejemplo veremos cómo
hacerlo al crear un nuevo
directorio llamado nuevodir:
mkdir nuevodir
mkdir -p dir1/dir2/dir3
82
Si miramos dentro de dir1
encontraremos a dir2, y
dentro de este último a dir3:
El comando rmdir (remove
directory)
El comando cp (copy)
La herramienta cp se usa para
copiar archivos. A continuación
del comando propiamente dicho,
se debe escribir el archivo que
se desee copiar y el destino
donde se habrá de guardar la
copia.
83
Por ejemplo:
cp pruebas/[Link]
copiará el archivo
[Link], ubicado
dentro del directorio pruebas,
en el directorio actual
(representado por .) con el
mismo nombre.
cp pruebas/[Link]
[Link]
hará una copia del archivo
[Link] que se halla
dentro de pruebas, en el
directorio actual, pero con el
nombre [Link].
Veamos el resultado de los dos
comandos anteriores:
Es importante tener en cuenta
que si el archivo de destino
existe, se sobreescribirá
mediante el proceso de copia.
El comando mv (move)
Esta herramienta se utiliza
tanto para mover archivos de
un lugar a otro como también
para renombrarlos . Es
importante tener en cuenta que
si el archivo de destino existe,
se sobreescribirá mediante
este proceso.
Para ilustrar, cambiemos el
nombre de [Link]
a [Link]. Luego
de ejecutar el comando
mv [Link]
[Link]
A continuación, movamos
[Link] desde el
El comando rm (remove)
Este comando se utiliza para
borrar archivos. Debemos
tener en cuenta que desde la
línea de comandos no
tenemos papelera de reciclaje,
y tampoco hay un undelete
así que cuando borramos
nunca más podemos recuperar
el archivo original. Para
remover un
directorio junto con todo su
contenido empleamos la opción
-r, con sumo cuidado por la
misma razón señalada antes.
rm -ri midirectorio
es una opción más adecuada
que
rm -r midirectorio
para evitar el borrado accidental
de los contenidos de
midirectorio.
querramos:
85
1. trabajar con un archivo que
no sabemos o no recordamos
dónde
se encuentra.
2. identificar archivos
por propietario o grupo
dueño.
por fecha de modificación
por permisos asignados
por tipo de archivo (archivo
regular, directorio, etc)
combinando los criterios
anteriores
(o -iname si deseamos
ignorar mayúsculas y
minúsculas), y finalmente el
criterio de búsqueda,
deberemos encerrar el mismo
86
-mtime x: archivos
modificados exactamente hace
x por 24 horas
(lo cual se traduce en x
cantidad de días).
-mtime -x: modificados
Encontrar archivos
ejecutables por todos en el
directorio actual:
find .-type f -perm
-o=x
f -empty
-delete
87
Si deseamos agregar más
contenido posteriormente
usamos el operador de
redirección doble >>. En el
caso de que queramos enviar
la salida de un comando como
entrada a otro empleamos el
operador tubería |. ¿Pero qué
sucede cuando deseamos ver
la salida de un comando por
pantalla y guardar el resultado
en un archivo? Para lograrlo
podemos utilizar una
herramienta llamada tee.
Consideremos el siguiente
ejemplo. Como sabemos, el
comando
ls -l
ls -l |tee [Link]
Veamos el resultado:
-name "*.txt"
-name "*.txt" |xargs ls
En síntesis, podremos utilizar
xargs cada vez que
Archivado y compresión
En Linux, el archivado y
xz (compresión). La posibilidad
comprimido (a menudo
89
Como observamos en los
ejemplos, los comandos en
cada caso son prácticamente
idénticos. La única diferencia
reside en el uso de las
opciones -z, -j, y -J que
representan la compresión
con gzip, bzip2, y xz
respectivamente.
Antes de descomprimir,
crearemos tres directorios
auxiliares dentro de resultados:
mkdir resultados/1
mkdir resultados/2
mkdir resultados/3
Y luego descomprimiremos
los contenidos en
ta [Link],
[Link].bz2, y
[Link] en resultados/1 ,
resultados/2, y resultados/3. La
opción -C (mayúscula) nos
permite indicar un directorio
destino para los archivos
descomprimidos antes de
realizar la operación
propiamente dicha:
tar -xzvf
resultados/tarcongzip
.[Link] -C resultados/1
tar -xjvf
resultados/tarconbzip2
.tar.bz2 -C resultados/2
tar -xJvf
resultados/tarconxz
.[Link] -C resultados/ 3
algunos puntos
importantes a tener en cuenta
en todos los casos:
La opción -c indica que
estamos creando un tarball,
mientras que
-x nos dice que lo estamos
descomprimiendo.
-v muestra la lista de
archivos que fueron
procesados. -f es la última
es una
90
especie de promedio entre las
otras dos.
Cabe destacar que todas
las opciones de tar (que
podemos consultar en el man
page correspondiente) se
pueden utilizar con cualquiera
de las herramientas de
compresión mencionadas a
nteriormente.
Herramientas de la línea de
comandos
Todo administrador de sistemas
Linux tiene que trabajar con
archivos de texto plano a
diario. Mediante dos
herramientas de la línea de
comandos llamadas grep y sed
se puede filtrar contenido
presente en uno o varios
archivos, así como visualizar
rangos determinados de líneas,
reemplazar palabras, y filtrar
contenido por palabras clave,
por nombrar algunos
ejemplos. Utilizando este
último comando inclusive es
posible modificar archivos sin
necesidad de abrirlos con un
editor de texto.
gacanepa /etc/passwd
Buscar la palabra
DocumentRoot dentro de todos
los archivos del
directorio /etc/httpd/conf:
grep -ir
documentroot
/etc/httpd/conf/*
ignorando mayúsculas y
minúsculas (i). De esta
forma podemos especificar un
patrón inclusive si no sabemos
si aparece en minúsculas o
mayúsculas dentro de los
archivos.
log
expresión regular de la
siguiente manera:
esuna
secuencia de caracteres que
forma unpatrónde búsqueda
Combinándolas:
^[a-z]:
líneas que comienzan con
una letra minúscula ^#:
líneas cuyo primer caracter sea
el signo # ^$: líneas vacías
[0-9][0-9]:
líneas donde se encuentren al
menos dos dígitos
numéricos consecutivos
A continuación, algunos
ejemplos para ilustrar.
Usar grep para averiguar si
nuestro CPU soporta
extensiones de virtualización
Generalmente se recurre a
grep para averiguar si
nuestro CPU soporta
virtualización. Para hacerlo,
inspeccionaremos el archivo
virtual /proc/cpuinfo,
concentrándonos en la
presencia de los indicadores
vmx o svm en la lista de flags.
La presencia del primero o del
segundo indica que nuestro
CPU (Intel o AMD,
respectivamente) soporta
virtualización.
El siguiente comando utiliza la
opción -E para indicar que el
patrón
93
de búsqueda consiste en
una expresión regular y
El comando anterior
mostrará solamente aquellas
líneas de
/etc/httpd/conf/[Link] que
NO comiencen con # o que
NO estén vacías.
Esta no es fama
digna de una dama,
y mi auto nuevo
no es de alta gama.
Andar a pie es un drama,
pero el precio de la
nafta la atención ya me
llama.
encuentre
94
la cadena de texto ama
grep '.ama' [Link]
[Link]
95
Donde:
. se utiliza para
representar cualquier caracter
* representa
cero o más ocurrencias del
Buscar secuencias de
caracteres alfanuméricos
Como mencionamos antes,
podemos representar cualquier
caracter numérico mediante
[0-9], las letras minúsculas
con [a-z], y las mayúsculas
con [A-Z]. Veamos ahora
cómo ver los mensajes del
kernel relacionados con las
particiones de nuestro
sistema. Recordemos que, por
lo general las mismas tienen el
formato sdXY donde X es una
letra minúscula mientras que Y
es un número que indica la
partición propiamente dicha.
es el siguiente:
dmesg | grep sd[a-z]
[0-9]
Uso de sed
Si bien disponemos de
herramientas tales como head
y tail para poder visualizar el
comienzo o el fin de un
archivo, ¿Qué pasa si
queremos observar una
sección determinada en medio
de este? Si recurrimos a sed,
podemos lograr este objetivo
fácilmente. El siguiente
comando nos permitirá ver las
líneas 5 a 10 de /etc/passwd:
sed -n '5,10p'
/etc/passwd
podemos usar:
96
Mostrar líneas y rangos no
consecutivos
Otra variante puede consistir
en mostrar una serie de
líneas y/o rangos que no sean
consecutivos. En el siguiente
ejemplo vamos a mostrar las
líneas 5 a 7 y 10 a 13 de
/etc/passwd:
sed -n -e '5,7p' -e
'10,13p' /etc/passwd
Reemplazar palabras o
caracteres
sed '
s/cantar/interpretar/g'
[Link]
Si deseamos que no se
distinga entre mayúsculas y
97
sed
's/cielo/firmamento/gi'
[Link] podemos
cambiar la palabra cielo o Cielo
por firmamento.
s/cielo/firmamento/gi '
[Link]
contenido de [Link]. Si
quisiéramos guardar una copia
(con el nombre
[Link], por
ejemplo) antes de hacer la
modificación deberíamos usar
sed -i'.orig'
's/cielo/firmamento/gi'
[Link]
sed '/^$/d'
[Link]
98
reemplazará los espacios
dobles por uno simple, el cual
servirá como separador de
campos para cut, que
finalmente devolverá el noveno
campo. ¿Pueden adivinar de
qué se trata? Sí, la dirección
IP de nuestro equipo según la
tabla de ruteo.
watch -d -n 1 'cat
/proc/loadavg'
veremos la actualización cada
segundo del comando que se
observa. Para interrumpir la
ejecución bastará presionar la
combinación de teclas Ctrl + C.
Enelman page de
watch sesugieren
otros usos posibles para
esta herramienta
En síntesis, watch no
solamente nos permite repetir
la ejecución de
un comando, sino también
identificar los cambios que
hubo entre un caso y el
siguiente.
El comando pstree
Esta herramienta nos permite
observar la relación entre
procesos padre y sus hijos al
visualizar los procesos de
nuestro sistema y la relación
que existe entre ellos. Si la
utilizamos con la opción -p,
podremos ver el Process
IDentifier (o identificador de
proceso, comúnmente llamado
PID) de cada proceso. En
este contexto, decimos que si
el proceso A es el padre de B,
El comando ps
103
Por ejemplo, antes de matar el
proceso con PID 3392 es una
buena idea identificarlo primero
mediante ps y la opción --pid.
La razón de esto es asegurarnos
de que apuntamos
correctamente el PID a fin de no
interrumpir el proceso
equivocado:
ps --pid 3092
Kill 3092
Si quisiéramos interrumpir
todos aquellos que tienen un
PPID en común (o todos los
que pertenezcan a un
usuario o grupo en particular)
ir uno por uno sería tedioso. Por
tal motivo, disponemos de los
comandos pgrep y pkill
pgrep -l -P 1576
pkill -P 1576
Si en vez de realizar la
identificación por PPID
quisiéramos hacerlo a partir del
propietario o del grupo dueño
del proceso, simplemente
deberemos reemplazar la
opción -P con -u o -G,
respectivamente, seguido del
nombre o del identificador del
usuario o grupo.
104
sintaxis es idéntica a kill.
Esto puede suceder en el
caso del servidor Apache y
sus procesos relacionados,
por ejemplo, donde todos
comparten el nombre apache2
(Debian y derivados) o httpd
(CentOS y similares).
kill -l
Las señales más utilizadas
son 1 (SIGHUP), 9
(SIGKILL), y 15 (SIGTERM):
SIGKILL le indica a un
proceso que debe finalizar de
inmediato, sin darle tiempo a
liberar adecuadamente los
recursos que esté utilizando.
Esta señal no puede ser
ignorada por el proceso al que
es enviada. Por ejemplo,
cualquiera de los siguientes
comandos enviará un SIGKILL al
proceso cuyo PID es 964:
kill -9 964 kill -s
SIGKILL 964
105
Finalmente, SIGTERM le
permite al proceso terminar su
ejecución normalmente dándole
la oportunidad de liberar los
recursos utilizados. Aunque
esto suene bien, cabe aclarar
que esta señal puede ser
ignorada por un proceso. Por
eso puede ser necesario (como
último recurso) utilizar SIGKILL
en algunas ocasiones.
El comando top
Una de las limitaciones de ps
es que devuelve una foto del
estado de los procesos en el
momento que el comando se
ejecuta. En cambio, top actualiza
la información cada cierto
tiempo (por defecto, cada tres
segundos) y además provee
otros datos útiles sobre el
estado del sistema.
En la siguiente imagen vemos a
top en funcionamiento. En la
pantalla podemos distinguir dos
áreas principales, marcadas
con 1y 2.
En las dos primeras filas del
área marcada con el 1vemos
información sumamente
Fila 1:
top es el
nombre del programa.
[Link] es la hora actual.
up 57 min indica que el
equipo ha
estado encendido por 57
minutos.
106
load average: 0.00, 0.00,
0.00 muestra la cantidad de
procesos (en
promedio) que están
utilizando (o han estado
esperando para
utilizar) el CPU durante los
últimos 60 segundos, 5
minutos, y 15
minutos, respectivamente.
Fila 2:
sleeping representa el
número de procesos que no
están corriendo actualmente
pero que se encuentran
esperando que ocurra un
evento para despertarse (por
ejemplo, una consulta al
servidor web). Se indican con la
letra S en la misma columna
mencionada anteriormente.
detenidos. Se
identifican con la letra T.
proceso.
PR: Prioridad de ejecución
del proceso.
NI: Es un valor que refleja la
SHR: La cantidad de
memoria compartida
(potencialmente con
otros procesos) disponible
para este proceso en particular,
expresada en KiB.
proceso
desde el último refresco de
pantalla.
correspondiente al uso de
memoria
física de un proceso en
particular.
que
inició, expresado en
minutos:[Link]ésimas
desegundo COMMAND:
108
Veamos otro ejemplo:
%MEM
109
cuando los necesiten. Esto se
logra estableciendo la
prioridad de ejecución de
procesos, algo que
mencionamos en la sección
anterior.
Las columnas PR y NI en la
salida de top indican la
prioridad que se le ha asignado
a un proceso en particular -tal
como lo ve el kernel en un
momento dado- y el valor de
niceness del mismo. Este
último valor puede considerarse
como una especie de pista que
se le da al kernel para indicar
la prioridad que debe darse
inicialmente al proceso. PR y NI
están relacionados entre sí:
mientras mayor sea la prioridad
de un proceso, es menos nice
(del inglés bueno) ya que
consumirá más recursos del
sistema. El valor de niceness
puede ubicarse en algún lugar
del intervalo comprendido
entre -20 y 19. Estos dos
límites representan la mayor y
la menor prioridad posibles, resp
ectivamente.
Para modificar la prioridad de
un proceso en ejecución,
utilizaremos el comando
Cambiar la prioridad de
todos los procesos del usuario
(opción -u)
alumno a -10: renice -n
-10 -u alumno
nice -n 10 top
110
El resultado de la ejecución de
nice y renice pueden
comprobarse al observar las
columnas PRI y NI en la salida
de top.
111
Para que un proceso se inicie
en segundo plano,
colocaremos el símbolo & al fin
de este. Por ejemplo, si
queremos correr updatedb en
segundo plano, podemos hacer:
updatedb &
Al iniciar un proceso en
segundo plano, la terminal
queda libre para seguir
trabajando en la misma y se
nos provee la identificación de
dicho proceso y su PID.
Si deseamos traer un
proceso a primer plano, nos
valdremos el comando fg
caso):
Si el proceso se hubiera
iniciado en primer plano,
podemos pausar
su ejecución con Ctrl + z y
luego utilizar el comando bg
para enviarlo
a segundo plano:
112
De ahí en más podemos
proceder como explicamos
anteriormente para traerlo
nuevamente a primer plano si
así lo deseamos.
El comando nohup
la ejecución de un proceso
se verá interrumpida si
cerramos la terminal desde la
que lo iniciamos, o si
cerramos la sesión actual. Para
evitar que esto suceda,
podamos usar nohup, una
herramienta que permite iniciar
un proceso que sea inmune a
la situación que describimos
anteriormente.
estamos
conectados a un equipo de
manera remota y deseamos
ejecutar
un script que continúe su
ejecución luego de que
cerremos la
terminal asociada. De esta
manera, no tenemos que estar
logueados durante todo el
tiempo que corra el script.
herramienta es la siguiente:
nohup [programa a
iniciar] &
[Link]
ppid,pid,cmd
Paso 3 – Cerramos la
primera terminal y volvemos a
ejecutar el
comando anterior. Vemos
que el proceso padre (la
shell bash)
ya no aparece en la lista,
y que ahora el padre del ping
es el
proceso con PID 1.
113
En la imagen de arriba
podemos ver que cuando el
proceso padre desapareció de
la tabla de procesos, el hijo
huérfano fue adoptado por
systemd.
Múltiples terminales en la
misma pantalla
Por comodidad y para
disponer de terminales
adicionales en una misma
pantalla, es conveniente
instalar un programa como
tmux o screen. Ambas
herramientas que nos
permiten crear, acceder, y
controlar varias terminales
desde una única consola. A
continuación, nos
concentraremos en tmux
exclusivamente, ya que el
funcionamiento de screen es
similar.
114
consolas abiertas mediante
115
Para desplazarnos de la
consola de arriba hacia la de
abajo (y viceversa), usaremos
Ctrl + b + flecha arriba y Ctrl + b
+ flecha abajo. La consola activa
se puede distinguir por la
presencia del cursor en la
misma.
espacio disponible en la
117
Luego de abrir una sesión,
crearemos una nueva ventana
(también llamadas pestaña) con
Ctrl + b + c y luego con Ctrl +
b + , (coma) haremos aparecer
en el extremo inferior un
diálogo para ingresar el nombre.
Luego de ingresar la
identificación deseada
(otra_ventana en este ejemplo)
y presionar Enter, podremos
verla en el mismo lugar, como
se observa en la imagen:
Para desplazarnos de una
ventana a otra, utilizaremos
El editor de texto vi
Introducción
Si lo deseamos, también
podemos utilizar una versión
gráfica de vi que se llama
gvim. Para hacerlo, lo más
probable es que necesitemos
instalarlo primero.
118
Modos de operación de vi
Al invocar a vi seguido del
nombre de un archivo, lo crea si
no existe. En la pantalla
aparecerá la posición actual
del cursor resaltada, las líneas
en blanco indicadas con el
símbolo ~, y en la parte inferior
la línea de estado. En este
sector se mostrará el nombre
del archivo y el número de
caracteres que contiene.
operación en el vi:
Modo entrada: Se usa para
añadir texto al archivo. Modo
comando: Es el modo de
operación por defecto. Se usa
para
introducir comandos que
realizan funciones específicas
del editor.
este editor.
dos
119
letras y un número opcional
relacionado con distintas
funciones.
Cuando editamos un archivo
con vi, los cambios no se
hacen directamente sobre el
archivo. En realidad, se
aplican a una copia temporal
del archivo que vi crea en un
espacio de memoria temporal
llamado buffer . La copia en
disco del archivo se modifica
solo cuando se graban los
contenidos del buffer
Esto tiene sus ventajas y sus
inconvenientes. Por un lado,
la edición de un archivo y
no grabado
del buffer de trabajo si el
sistema cae.
La mejor política en todos los
casos es grabar cambios
frecuentemente, especialmente
cuando hayamos hecho
cambios importantes.
pulsar la secuencia:
Esc :w [ENTER]
Para salir cuando no se han
hecho modificaciones:
Esc :q [ENTER]
modificaciones:
Comandos básicos de vi
Cuando arrancamos vi, el
cursor está en la esquina
superior izquierda de la pantalla.
En modo comando, existen
ordenes que nos permiten
moverlo por toda la pantalla:
ciertas teclas de letras, las
flechas, el ENTER, BackSpace
(tecla de borrar), y Space Bar
(barra espaciadora). Los
comandos de vi son
case-sensitive, es decir, la
120
la misma orden tecleada en
mayúsculas o minúsculas
puede tener efectos totalmente
distintos.
palabra emplearemos
Si deseamos movernos a lo
largo de una línea:
con:
mencionadas anteriormente si
que avancemos o
retrocedamos una
pantalla, y que el cursor se
Insertar texto
A la hora de pasar desde el
modo comando a modo
entrada texto disponemos de
varias posibilidades. Todas
ellas pueden ser útiles de
acuerdo a la posición donde
deseemos comenzar a
agregar texto relativa a la
ubicación actual del cursor.
:linea r archivo
122
barra \. Por ejemplo, para
insertar [Link] en la
:9 r pruebas\.txt
:linea r! Comando
Por ejemplo,
:5 r! which python3
Cambiar texto
Cambiar texto implica sustituir
una sección de texto por otra.
El editor vi tiene varios modos
de hacer esto, dependiendo de
la necesidad. Veamos algunos
ejemplos:
123
Para trasposicionar
caracteres , colocar el cursor
sobre la primera
letra a mover y pulsando
xp, se intercambian las
posiciones de
ambos caracteres. Esto es
útil para fallos tales como
escribir qeu
en lugar de que.
Pulsando u a continuación
del último comando, se
deshacen los
cambios producidos por la
ejecución delmismo.
Pulsando U se deshacen
todos los cambios que se han
hecho
sobre una línea. Este
comando funciona solo si no
nos movimos
de la línea.
cursor a la
derecha de la parte a
modificar y teclear dw.
Pulsando dd se borra
ocupaba.
basta con
pulsar D.
124
Para borrar todo lo que esté
a la izquierda del mismo basta
con
pulsar d0.
Muchos comandos de vi
pueden estar precedidos de
125
caracteres. También se pueden
usar contadores para los
comandos de moverse por la
pantalla que mencionamos
anteriormente.
Un dato interesante es que
pulsando un . (punto) se repite
la última operación de cambio
realizada. Por ejemplo si se
borra una línea, y la siguiente
operación a realizar es borrar
una línea, basta con pulsar .
para llevarla a cabo
nuevamente.
Usar buffers con nombre
Para insertar repetidamente
un grupo de líneas en varios
lugares dentro de un
documento, se puede copiar
las líneas a un buffer con
nombre. Se especifican los
buffers con nombre escribiendo
antes del comando comillas
dobles y su nombre.
Por ejemplo:
expresión:
:linea1,linea2 co linea3
[ENTER]
126
donde linea1 y linea2
especifican el rango de
líneas a copiar (incluyendo
ambos extremos), mientras que
linea3 representa la línea
anterior al punto de
inserción. La palabra clave
co indica que estamos por
realizar una operación de copia.
:linea1,linea2 d [ENTER]
Búsqueda y reemplazo de
cadenas de texto
Tecleando n se salta a la
siguiente ocurrencia del string,
anterior.
y pulsando N a la
Para buscar hacia atrás en
127
Normalmente las búsquedas
son case-sensitive . Si se
quiere ignorar mayúsculas y
minúsculas (o ignore case)
durante la búsqueda, teclear:
:set ic[ENTER]
:set noic[ENTER]
especificarse de un modo
especial en la búsqueda,
precediéndolos por la barra
hacia atrás \. Este procedimiento
se conoce comúnmente como
escape de caracteres. Por
ejemplo, para buscar algo?
hay que teclear /algo\?
[ENTER].
que preceder al
string a buscar por ^. Por
ejemplo, para buscar la
siguiente línea
que empieza por Sin
embargo, habría que teclear
:/^Sin
embargo[ENTER].
string a
buscar por un símbolo $.
Para ilustrar, el comando
:/nada\.$
Para buscar
cualquier caracter , deberemos
utilizar el . (punto) en
el string de la posición a
emparejar. Por ejemplo, para
encontrar la
siguiente ocurrencia de
disinformation o
misinformation
deberemos hacer /.
isinformation[ENTER].
128
Debido aque eneste caso
estamos realizando la
búsqueda de unstring, ynode
una palabra, este último
patrónpuede también
encontrar palabras como
misinformationalist y
disinformationism
*isinformation[ENTER].
comando es : %s/texto_a_bus
car/ text o_de_re emp l
azo/ g
[ENTER]. Por ejemplo, para
reemplazar todas las
ocurrencias de la palabra carro
por automovil,
se debería
tecl ea r
:% s / c a rro / a ut omo v il/g
[ENTER]. Si luego de la g
agregamos una c
(de tal forma
que quede
:% s/ c a rro/ a ut omo v il/ gc
[ENTER]), nos pedirá
confirmación antes de
reemplazar cada una de las
ocurrencias de carro. Las
respuestas posibles son y (de
yes) y n (de no).
129
Por ejemplo, para editar
[Link], [Link], y
[Link] podemos invocar a vi
de la siguiente manera:
vi [Link]
[Link] [Link]
[ENTER].
Opciones de configuración
Afortunadamente, vi también
nos permite configurar el
ambiente de uso para que nos
resulte lo más placentero
posible. Las siguientes opciones
de configuración pueden
establecerse cada vez que
abramos un archivo o bien
colocarlas (una por línea)
en el archivo .vimrc dentro del
directorio personal de usuario
que desee emplearlas.
Importante: si vamos a
establecer estas opciones
mientras estamos editando un
archivo, las mismas estarán
disponibles hasta que
cerremos el mismo. Para
guardarlas de manera
permanente deberemos
incluirlas en el archivo .vimrc.
En este último caso no es
necesario colocar los dos
puntos (:) antes del comando
propiamente dicho.
130
Para visualizar el número de
cada línea, teclear:
:set nu[ENTER]
set softtabstop=4
set expandtab
131
Dispositivos,
sistemas de
archivos y
FHS
(Tema104)
En el tema 102 (Instalación
de Linux y administración de
paquetes) aprendimos a crear
particiones con fdisk y
sistemas de archivos con
mkfs. En esa ocasión
mencionamos que la
primera tarea también puede
llevarse a cabo con gdisk.
Además, existe otra
herramienta similar llamada
parted que goza de gran
popularidad. En esta
oportunidad explicaremos el
criterio a utilizar para decidir
cuál emplear y mostraremos
cómo mantener la integridad
de los sistemas de archivos o
repararlos cuando sea
132
necesario.
Particiones MBR versus GPT
El estándar de particionado
MBR (Master Boot Record)
soporta discos de hasta 2 TB y
con un máximo de 4
particiones primarias. Por otro
lado, GPT (GUID Partition
Table) soporta discos de hasta
2 ZB y puede manejar hasta 128
particiones en cada uno.
parted -l /dev/sda
133
Para determinar si un disco
está utilizando MBR o GPT
podemos observar la
información proporcionada por
el comando anterior. En este
caso, Partition Table : msdos
nos indica que /dev/sda
utiliza MBR. Si el resultado
hubiera sido gpt podríamos
asegurar que el disco fue
particionado empleando dicho
estándar.
Memoria swap
Debido a que una computadora
puede tener solamente una
cantidad finita de memoria física,
quizás haya momentos en que
la cantidad de esta no sea
suficiente para todos los
servicios y aplicaciones que
requieran su uso. Cuando eso
sucede, el sistema operativo
puede llegar a utilizar una
porción definida de uno (o
varios) dispositivos de
almacenamiento (llamada
memoria swap) para mantener
datos no prioritarios. En esta
sección abordaremos
precisamente el uso de la
memoria swap y cómo
configurar una partición para tal
propósito.
Si tenemos más de 2 GB de
RAM, le debemos sumar 2 GB
extras
de swap, pero sin superar los
8 GB. Por ejemplo, si tenemos
3 GB,
tendríamos que disponer de
5 GB de swap
135
Sistemas de archivos
Podemos clasificar a los
sistemas de archivos en dos
categorías principales: aquellos
que proveen journaling y
aquellos que no. Entre estos
últimos solamente se continúa
utilizando ext2 (por lo general
para la partición dedicada a
/boot).
una
cuenta delos cambios que nose
hanescrito alsistema dearchivos
1) De manera permanente
implica agregar al dispositivo
(junto con las opciones de
montaje correspondientes) en
el archivo /etc/fstab. Esto
causará que el dispositivo
esté disponible cuando se
inicia el sistema y durante su
uso, salvo que se lo desmonte
explícitamente.
El archivo /etc/fstab contiene
información sobre los
sistemas de archivos que
deben montarse al inicio del
sistema. Cada línea en el
archivo posee los siguientes 6
campos:
El primer campo
representa el dispositivo de
almacenamiento (local o remoto)
que debe montarse. Puede
especificarse mediante el
identificador de dispositivo (por
ejemplo, /dev/sdb1) o mediante
la etiqueta asignada al
momento de crear el sistema
de archivos (LABEL=ALUMNO,
por ejemplo), o mediante el
UUID (identificador único) del
sistema de archivos (lo cual
puede averiguarse
136
mediante el comando blkid).
Más adelante mostraremos
cómo
obtener estos datos.
El segundo campo muestra
el punto de montaje en el
que se
anexará el sistema de
archivos.
El tercer campo especifica el
tipo de sistema de archivos
(ext4, xfs,
etc.)
El cuarto campo indica las
opciones de montaje
(separadas por
comas)
El quinto campo es hoy una
opción en desuso.
El sexto campo indica si el
sistema de archivos debe
chequearse
al iniciar el sistema y en qué
orden: para /root siempre
debería ser
1, mientras que para el resto
siempre 2. Si este campo no
existe o
es 0, significa que no se
debe chequear el sistema de
archivos
durante el arranque.
/dev/sdb1 /mnt/pruebas
ext4 defaults 0 2
LABEL=ALUMNO
/mnt/pruebas ext4
defaults 0 2 o mediante el
UUID. Averigüémoslo primero
con blkid:
blkid /dev/sdb1
Si el comando anterior
indica UUID=“4fe8b01
0-f52 1-4f85-bab2- d9e86da35f1 3”,
en /etc/fstab deberemos
usarlo sin comillas de la
siguiente manera:
UUID=4fe8b010-f521-4f85
-bab2-d9e86da35f13
/mnt/pruebas ext4
defaults 0 2
137
2) Bajo demanda significa
montar el dispositivo cuando
se lo necesite, luego de lo cual
se prescinde de su uso y se lo
desmonta.
mount -t ext4
LABEL=ALUMNO
/mnt/pruebas
umount /mnt/pruebas
Es importante aclarar que el
proceso anterior fallará si
estamos situados dentro del
punto de montaje. Para salir
del mismo primero, podemos
utilizar cd y presionar Enter
(a fin de volver a nuestro
directorio personal) y luego
ejecutar el comando anterior.
Integridad de sistemas de
archivos
A la hora de monitorear el
estado de un sistema de
archivos, lo primero a tener en
cuenta es el espacio
disponible en los mismos.
Desde la línea de comandos
mediante el uso de
138
df -h -t ext4
nos mostrará el uso de los
sistemas de archivos ext4
que estén montados en nuestro
sistema, como podemos
apreciar en la imagen:
Como podemos observar
arriba, también podemos
obtener la misma información
sobre un sistema de archivos
específico omitiendo la opción
-t y reemplazándola con el
punto de montaje asociado.
du: mostrar el espacio
utilizado.
Sin embargo, es
probable que en
ocasiones nos interese
únicamente el total en
vez del aporte individual
de cada subdirectorio.
Esto es posible al
agregar la opción -s
como vemos a
continuación:
du -h
du -sh
139
Para ver la misma información
para otro directorio distinto al
actual deberemos acompañar
los comandos anteriores con la
ruta a dicho directorio.
aquellos
subdirectorios se encuentren
/etc/systemd
imagen:
Para apreciar la utilidad de
--max-depth, en la imagen
anterior se
incluye la estructura de
/etc/systemd en forma de
árbol. Al utilizar
--max-depth=1, solamente
se muestra el resumen de
140
/etc/systemd,
/etc/systemd/network,
/etc/systemd/system, y
/etc/systemd/user. Por
otro lado, los
subdirectorios de
/etc/systemd/system se omiten
del reporte.
ls -i
df -i
du --inodes /etc
--summarize
141
Enelúltimo comando
Es importante tener en
cuenta que si se agotan
los ínodos disponibles se
producirán errores al tratar de
utilizar un sistema de archivos,
inclusive cuando se
disponga de espacio de
almacenamiento. La causa
más probable detrás de este
problema suele ser la
acumulación indiscriminada de
archivos de pequeño tamaño.
chequear el sistema de
archivos en /dev/vg00/vol01.
Luego de desmontarlo
umount /dev/vg00/vol01
142
Si el comando anterior nos
advirtiera sobre la presencia
de errores, podemos ejecutarlo
nuevamente con la opción -y
para repararlos
automáticamente:
fsck -y /dev/vg00/vol01
Para simular la
envez de -y.
Sin embargo, lo más sabio es
tune2fs -c 30
/dev/vg00/vol01
En cambio, en el caso de que
estemos tratando con un
sistema de archivos que
montamos y desmontamos
de manera frecuente,
querremos efectuar el chequeo
luego de una cantidad dada de
veces que haya sido montado.
En el siguiente ejemplo también
143
Por ejemplo,
tune2fs -i 2w
/dev/vg00/vol01
Permisos y propiedad de
archivos
La mantención de cuentas de
usuarios y grupos en Linux es
una tarea fundamental de
cualquier administrador de
sistemas. En esta sección
mostraremos cómo crear,
modificar, y eliminar cuentas
de usuario y grupos de nuestro
sistema Linux.
useradd fulano -c
"Fulano De Tal"
Si queremos cambiar el
shell del usuario fulano a
/bin/sh, el contenido del campo
comentario a Fulano De Tal
actualizado y el directorio
home a /mnt/homes/fulano
(el cual debe ser creado
primero) usaremos usermod
mkdir -p
/mnt/homes/fulano
usermod -s /bin/sh -c
"Fulano De Tal
actualizado" d -
/mnt/homes/fulano fulano
Para asignar una contraseña
inicial al usuario fulano
emplearemos el comando
passwd. Luego de iniciar sesión
por primera vez, él podrá
144
cambiarla utilizando el mismo
comando.
passwd fulano
mostrada en la imagen:
Ahora veremos cómo editar la
cuenta de fulano de tal manera
que la cuenta expire (-E) el 31
de diciembre de 2018, y
mientras tanto se le permita
cambiarla solamente (-m) una
vez por semana (7 días). Cada
contraseña será válida como
máximo (-M) durante 60 días, y
3 días antes se le debe enviar
un recordatorio para que la
modifique (- W). Finalmente, 5
días después de la fecha
de vencimiento de la
contraseña se procederá a
bloquear (-I) la cuenta:
chage -E 2018-12-31 -m 7
-M 60 -W 3 -I 5 fulano
145
Por seguridad, podemos forzar
chage -d 0 fulano
Administración de grupos
En Linux, los grupos
constituyen el primer método
de control de acceso a los
recursos del sistema. Cuando
se crea una cuenta de usuario,
también se crea un grupo con
el mismo nombre (conocido
como grupo primario para dicha
cuenta) y ambos son
vinculados.
groupadd migrupo
usermod -a -G migrupo
fulano
groups fulano
146
Para eliminar una cuenta de
usuario de un grupo
suplementario tenemos dos
alternativas:
userdel -r fulano
Para borrar un grupo dado
(migrupo en utilizaremos
groupdel migrupo
Permisos en Linux
Veamos cómo crear un
directorio llamado mostrar el
usuario y el grupo dueños de
este: mkdir
/tmp/midirectorio
ls -ld /tmp/midirectorio
147
el siguiente ejemplo),
midirectorio en /tmp y
Si queremos cambiar el usuario
dueño o el grupo propietario de
/tmp/ midirectorio, podemos
utilizar el comando chown de
la siguiente manera:
chown fulano:
/tmp/midirectorio #
Cambiar usuario dueño
chown :fulano
/tmp/midirectorio #
Cambiar grupo
propietario (similar a
chgrp)
chown fulano:fulano
/tmp/midirectorio #
Cambiar ambos
Otra opción para cambiar el
grupo propietario es chgrp:
chgrp fulano
/tmp/midirectorio
En la imagen siguiente
podemos apreciar el
resultado de haber cambiado el
grupo propietario del directorio
a fulano:
En la primera columna de
la salida de ls -ld podemos
ver los
permisos asignados para el
usuario dueño y el grupo
propietario de
/tmp/midirectorio, y para el
resto de los usuarios del
sistema:
A continuación, la primera
que el
148
usuario dueño posee
permisos de lectura (r),
escritura (w), y ejecución (x)
sobre el directorio. La segunda
terna (r-x) indica que los
miembros del grupo propietario
poseen permisos de lectura y
ejecución (pero no de
escritura). Finalmente, la
última terna muestra que todos
los demás usuarios del
sistema poseen los mismos
permisos que en el caso
anterior.
Veamos la forma en que los
permisos rwx nos permiten
restringir el acceso a los
recursos del sistema:
chmod g+w
/tmp/midirectorio
chmod o-rx
/tmp/midirectorio
149
Por último, para asignar o
quitar permisos al usuario
dueño, utilizamos la opción u
(del inglés user), mientras que
si queremos otorgar o remover
un permiso en particular para
todos usaremos la opción a (de
all). De esta manera, el
siguiente comando activa los
permisos de ejecución
sobre /tmp/midirectorio para
todos los usuarios:
chmod a+x
/tmp/midirectorio
Adicionalmente, podemos
indicar un determinado
Máscaras de archivos y
directorios
Por lo general, cada vez que
utilizamos una cuenta de
usuario limitado para crear un
archivo o un directorio, se
establecen por defecto los
permisos rw-rw-r– (octal 664)
y rwxrwxr-x (octal 775),
respectivamente. Si lo
hacemos como root, los
permisos se setean como rw-r–r–
(octal 644) y rwxr-xr-x (octal
755). Esto es resultado de
aplicar lo que se conoce como
máscaras de archivos y
directorios, cuyos valores
podemos visualizar y cambiar
Enesencia, elpermiso
resultante surge derestar las
máscaras del
usuario alos valores 666
para archivos y777 para
directorios
150
1a [Link]
touch file1
mkdir dir1
ls -ld file1 dir1
rm file1
rmdir dir1
umask 000
touch file1
mkdir dir1
ls -ld file1 dir1
En la imagen siguiente
podemos ver el resultado de
los comandos anteriores:
Los cambios que hicimos en la
máscara permanecerán hasta
que reiniciemos el equipo o que
efectuemos otra modificación.
Si deseamos aplicarlos de
manera permanente deberemos
colocar el comando umask junto
con el valor deseado en el
archivo de inicialización de
nuestra shell.
151
es que los primeros poseen su
propio número de ínodo,
mientras que los últimos
comparten este número con el
archivo propiamente dicho.
Los desarrolladores de
aplicaciones no necesitan
modificarlas
para funcionar en distintas
distribuciones.
Los usuarios que llegan a
aprender la estructura de
directorios en
una distribución no
necesitan de mayores
esfuerzos para utilizar
otra. Salvo algunos casos
puntuales en los que
diferentes
distribuciones agregan sus
propios subdirectorios, no hay
gran
diferencia estructural de una
distribución a otra.
En /boot podemos
encontrar los archivos
necesarios para el
arranque del sistema
(incluyendo el propio kernel).
152
Dentro de /dev aparecen los
identificadores de dispositivos,
tanto
de almacenamiento
(/dev/sda1, por ejemplo) como
de entrada /
salida
/root es el directorio
personal del usuario root.
No debe
confundirse con el directorio
raíz (/), del cual /root es hijo.
/var contiene
subdirectorios y archivos
variables, sujetos a
cambios permanentes (por
ejemplo, el registro de logs del
sistema
o del funcionamiento de
procesos).
Los directorios
mencionados anteriormente
contienen otros subdirectorios,
cuyo propósito también se
explica en el FHS. La
introducción que hemos
compartido en este capítulo
es un buen comienzo para
poder entender el estándar de
jerarquía del sistema de
archivos.
153