Académique Documents
Professionnel Documents
Culture Documents
También es probable que ya esté utilizando Linux, pero que aún no haya estudiado de
forma seria tópicos más complejos que mantener su sistema personal funcionando
apropiadamente y de forma segura.
Este curso no está diseñado principalmente para:
Usuarios nuevos sin mucha experiencia previa con cualquier sistema operativo.
A los usuarios de Linux relativamente nuevos se les recomienda tomar este
curso solamente después de haber tomado un curso introductorio como
el LFS101x.2 de Linux Foundation.
Desarrolladores (a nivel del kernel o de aplicaciones).
Estamos asumiendo que usted ha tomado el curso gratuito Introducción a Linux (2da
Ed.) de Linux Foundation enedX. Este MOOC (Massive Open Online Course) puede ser
encontrado haciendo click aquí, o buscando “Linux” enedx.org. O por otro lado, que usted
tiene conocimiento equivalente o incluso mejor que lo que podría haber obtenido al tomar
ese curso.
En lugar de repetirnos, instamos a que usted se refiera el curso introductorio para temas
básicos no cubiertos aquí.
Existen otros temas que los administradores de sistemas deben saber, que no cubriremos
en este curso. En particular:
Editores de texto (vi, emacs, nano, gedit, etc.)
Encontrar documentación de Linux
Manipulación de texto (sed, grep, awk, cut, paste, tail, head, etc.)
Utilidades de archivo (find, locate, file, etc.)
Impresión (configurar impresoras, manejo de trabajos de impresión)
Interfaces gráficas y su administración
Programas en el shell bash
Instalación de sistemas
Antes de tomar este curso, le recomendamos que por lo menos eche un vistazo
a LFS101x.2. Si no se siente cómodo o totalmente familiar con algunas herramientas
básicas y los procedimientos que usaremos en este curso, usted probablemente los
encontrará ahí, ya que este curso pretende tenerlo como complemento.
Para ver los gráficos incluidos en este curso en un formato más grande, simplemente
haga clic en el gráfico y automáticamente se mostrará en una ventana emergente.
1.5 La Documentación
Mientras que a menudo le diremos explícitamente “lea la página Man para obtener más
detalles”, usted debe asumir que lo estamos diciendo implícitamente todo el tiempo.
Usted debe desarrollar el hábito de la lectura de la documentación de fácil acceso en su
distribución de Linux sin preguntar, para la mayoría de las utilidades.
Además de las páginas man, la mayoría de los programas tienen dentro de sí una ayuda
como también información acerca de su uso. Generalmente esto se accede mediante el
uso de la opción—help, como en df—help.
Si tratamos de incluir toda esa información en el material del curso, sería una duplicación
inútil y de hecho el contenido se diluiría de una mala manera.
Este curso está diseñado para trabajar en plataformas basadas en x86, ya sea en
hardware nativo o como una máquina virtual (VM) bajo un hypervisor,
como KVM, VMWare u Oracle Virtual Box.
Muchas de las tareas administrativas pueden ser realizadas desde la línea de comandos
o desde una aplicación gráfica. Casi siempre hay más flexibilidad y capacidades
adicionales en el enfoque de la línea de comandos, ya que la capa de abstracción se ha
eliminado. El inconveniente de la línea de comandos, sin embargo, es que el
administrador puede tener que recordar más o buscar información cuando tiene que
completar una tarea.
Hay una gran variedad de entornos de escritorio gráficos utilizados en Linux, los dos más
comunes son GNOME y KDE. Cada uno de ellos viene en múltiples versiones, o
generaciones. There are a variety of graphical desktop environments used in Linux, the
two most common being GNOME and KDE.
En este curso no queremos involucrarnos en interfaces gráficas, debido a que varían
mucho entre las versiones y familias de distribuciones de Linux. Además, muchos
servidores no tienen una interfaz gráfica instalada.
Fedora está en la familia Red Hat y en realidad puede ser visto como la versión
hacia donde RHEL se dirige. Las versiones actuales son bastante similares
a RHEL 7. Sin embargo, es raro que Fedora se utilice en implementaciones
Empresariales debido a que es de vanguardia y cambia características
importantes (la versión del kernel, por ejemplo) muy a menudo y por comodidad,
donde más bien la estabilidad es clave.
Debido a que no estamos usando un entorno gráfico, usted debe ser capaz de hacer el
trabajo del curso en una máquina en la que inicie sesión de forma remota.
Puede utilizar una máquina física, o una máquina virtual en ejecución bajo
un hipervisor como VMware, Oracle Virtual Box o KVM. En parte porque no nos
estamos concentrando en optimización de rendimiento, una máquina virtual debe
funcionar tan bien como una máquina física; por una parte el rendimiento menor no será
un problema, y por otra, usted puede hacer mucho menos daño.
La Linux Foundation preparó un documento sobre los temas involucrados al realizar una
instalación para LFS101x, el cual es completamente relevante para este curso. Puede
descargarlo haciendo click aquí (si es que se ha registrado para el MOOC) o haciendo clic
en el botón Documento a continuación. Entre otras cosas le dará información sobre las
distintas opciones para hipervisores.
Este curso es completamente autodidacta; no hay ningún horario fijo para ir a través del
material. Puede revisar el curso a su propio ritmo y siempre será devuelto a exactamente
donde lo dejó cuando vuelva a iniciar una nueva sesión. Sin embargo, de todas formas
sugerimos evitar pausas largas entre períodos de trabajo, para que el aprendizaje sea
más rápido y la retención del contenido sea mejor.
Usted tiene acceso ilimitado a este curso por 12 meses desde la fecha en la cual se
registró, incluso después de haber completado el curso.
Los capítulos en el curso han sido diseñados para construirse uno sobre el otro.
Probablemente lo mejor para trabajar a través de ellos es de forma secuencial; si se salta
o pasa por algunos capítulos rápidamente, puede encontrar que hay temas en discusión a
los que no ha estado expuesto todavía. Pero todo esto es a su propio ritmo y siempre se
puede volver atrás, por lo que puede hacer su propio camino a través del material.
Para mayor comodidad, también puede descargar en un archivo todos los ejercicios de
laboratorio y soluciones. Para ello haga click en el botón Documento que se muestra a
continuación.
1 Las cosas cambian en Linux. No importa lo duro que hemos trabajado para estar al
día, Linux está en constante evolución, tanto a nivel técnico (incluyendo
características del kernel) y al nivel de distribución y la interfaz. Por favor, tenga en
mente que hemos tratado de estar lo más actualizados posible al momento en que
este curso fue publicado, pero habrá cambios y novedades que no hemos discutido,
es inevitable.
2 Hemos repetido unas pocas cosas en el material del curso. Es casi imposible en un
curso de esta amplitud no revisar temas que han sido cubiertos previamente. Los
comentarios cortos son útiles, así que no tendrá que ir recorriendo a través de las
secciones anteriores para refrescar su memoria. Sabemos que hemos hecho esto, y
por lo menos en la mayoría de los casos es por diseño, no por accidente.
3 Hemos intentado evitar guerras santas. Hay muchas áreas donde hay fuertes
desacuerdos de preferencias en la comunidad Linux (y de forma más amplia en el
código abierto). Los ejemplos incluyen el mejor editor: emacs vs vi; el mejor escritorio
gráfico: GNOME vs KDE, etc. Generalmente hemos elegido (cuando sea necesario)
una alternativa particular tan sólo para mantener las cosas claras; por ejemplo
podemos hablar más acerca de GNOME que KDE simplemente porque tiene una
base de usuarios más grande, no porque estamos tomando una posición en cuanto a
que es superior.
1.15 Certificaciones
Es muy peligroso ejecutar una terminal de root a menos de que sea absolutamente necesario: un
solo error de /peo o de otro /po puede causar daños graves (incluso no recuperables).
Por lo tanto, el procedimiento recomendado es con.gurar el sistema de tal forma que comandos
únicos puedan ser ejecutados con privilegios de superusuario, a través del mecanismo de sudo.
Con sudo el usuario necesita conocer su propia clave solamente y nunca la del usuario root.
Si usted está usando una distribución como Ubuntu, es posible que no necesite realizar este
laboratorio para tener sudo con.gurado de forma apropiada para el curso. Sin embargo, todavía
necesita asegurarse de comprender el procedimiento.
Para comprobar si su sistema ya está con.gurado para permi/r que la cuenta de usuario que está
usando ejecute sudo, ejecute un comando simple como el siguiente:
$ sudo ls
Inicie una terminal de root a través del comando su y luego provea la clave de root, no su clave de
usuario.
Si el usuario es estudiante.
Una prác/ca an/gua (la que aún funciona) es agregar la línea al .nal del archivo /etc/sudoers. Lo
más recomendable es hacerlo con el programa visudo, ya que se ocupa de que usted esté usando
la sintaxis adecuada mientras edita.
Es posible que necesite con.gurar los permisos adecuados en el archivo, de la siguiente forma:
Tenga en cuenta que algunas distribuciones Linux pueden requerir permisos 400 en vez de 440.
Luego de haber realizado esos pasos, salga de la consola root con exit e intente de nuevo sudo ls.
Sin embargo, hay un ajuste adicional que recomendamos altamente que realice, aún si su sistema
ya /ene con.gurado sudo. La mayoría de las distribuciones establecen directorios diferentes para
los directorios en donde se encuentran los ejecutables de los usuarios normales y los de root.
En par/cular los directorios /sbin y /usr/sbin no son encontrados en las búsquedas, ya que sudo
hereda el PATH del usuario, no del superusuario. Por lo tanto, en este curso estaremos
constantemente recordándole la ruta completa de varias herramientas de administración;
cualquier otra mejora en cuanto a la seguridad de esta implementación probablemente no valdría
la pena (como intentar esconder los binarios del superusuario, por ejemplo).
PATH=$PATH:/usr/sbin:/sbin
No es necesario que reinicie, en vez de eso, puede salir de la sesión y entrar nuevamente, lo cual
sería completamente efec/vo.
Objetivos de aprendizaje
La secuencia de arranque
Los equipos más nuevos están cambiando a UEFI, un reemplazo para la BIOS, que
realiza muchas de las mismas funciones.
En la arquitectura x86, la BIOS contiene todo el código requerido para obtener acceso
inicial al teclado, pantalla, unidades de disco, de comunicaciones en serie y un número de
funciones variadas. Una vez que el sistema completo está en marcha, la mayoría de estos
dispositivos habrán mejorado sus capacidades cuando los controladores de dispositivos
especializados y completos se cargan y asumen el control.
La BIOS se coloca típicamente en un chip ROM que viene con el equipo (el que a
menudo se llama BIOS ROM). Esto asegura que la BIOS estará siempre disponible y no
será dañada por fallas en el disco. Esto también hace que sea posible que un equipo
arranque.
Durante el proceso de arranque, la BIOS carga el gestor de arranque desde el MBR.
Más adelante vamos a discutir acerca de donde las distribuciones de Linux cooperan para
colocar ciertos tipos de archivos en lugares estándar en el sistema. En particular, los
archivos de configuración de todo el sistema se colocan generalmente en /etc y sus
subdirectorios, mientras que los específicos del usuario se colocan a menudo en sus
directorios personales.
Las distribuciones desarrollaron sus propias reglas sobre exactamente dónde colocar
información en /etc. Por ejemplo, todos los sistemas derivados de Red Hat hacen uso
extensivo de /etc/sysconfig, mientras que los sistemas basados en Debian han
utilizado /etc/default. Curiosamente, RHEL 7 y SUSE usan ambos.
2.5 /etc/sysconfig
En un sistema RHEL 6:
$ ls -F /etc/sysconfig
atd grub modules samba
auditd htcacheclean netconsole sandbox
authconfig httpd network saslauthd
autofs i18n networking selinux
cbq init network-scripts sendmail
cgconfig ip6tables-config nfs smartmontools
cgred.conf ip6tables-config.rpmnew ntpd snmpd
clock iptables-config ntpdate snmptrapd
collectl iptables-config.rpmnew pluto sshd
console irqbalance prelink sysstat
cpuspeed kdump quota_nld sysstat.ioconf
crond kernel radvd system-config-
firewall
dhcpd keyboard raid-check system-config-
users
dhcpd6 ksm readahead udev
dhcrelay libvirtd readonly-root vncservers
dhcrelay6 libvirt-guests rhn wpa_supplicant
ebtables-config lm_sensors rngd xinetd
firstboot mcelogd rsyslog
$ cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=quad64
GATEWAY=192.168.1.1
Los archivos en este directorio son usados a menudo por el script que controla el servicio
asociado en /etc/init.d; por ejemplo, el script /etc/init.d/network incluye la línea
con el siguiente archivo:
. /etc/sysconfig/network
2.6 /etc/default
$ ls -F /etc/default
acpid console-setup grub.ucf-dist locale rsyslog
acpi-support crda halt nfs-common saned
alsa cron im-config nss speech-dispatcher
anacron cups irqbalance ntfs-3g sysstat
apport dbus kdump-tools ntpdate ufw
avahi-daemon devpts kerneloops pulseaudio useradd
bridge-utils grub kexec qemu-kvm whoopsie
brltty grub~ keyboard rcS
bsdmainutils grub.d/ libvirt-bin rsync
Los archivos son utilizados para proveer opciones adicionales al iniciar un servicio.
shutdown se utiliza para apagar el sistema de forma segura, notificando a todos los
usuarios que el sistema va a apagarse y luego lo detiene de manera elegante y no
destructiva. Después de que está apagado, el sistema es detenido o reiniciado.
Ejemplos de shutdown
$ shutdown—help
shutdown [OPTIONS...] [TIME] [WALL...]
Shut down the system.
help Show this help
H—halt Halt the machine
P—poweroff Power-off the machine
r—reboot Reboot the machine
h Equivalent to—poweroff, overridden by—halt
k Don’t halt/power-off/reboot, just send warnings
no-wall Don’t send wall message before halt/power-off/reboot
c Cancel a pending shutdown
Sin opciones (por ejemplo, shutdown now) el comportamiento por defecto es apagar por
completo el sistema. Algunas distribuciones, como Ubuntu, violan esto y van a modo
monosuario en vez de apagarse.
Un error común es no especificar un argumento de tiempo (tal como now o algún tiempo
real). Esto es requerido.
También existen los comandos heredados reboot, halt y poweroff, los que muchos
usuarios veteranos utilizan con frecuencia.
Nota: este ejercicio requiere ser ejecutado desde la consola, es decir, no a través de la red usando
SSH.
1. Lleve el sistema a modo monousuario usando el comando shutdown.
2. Desde el modo monousuario, reinicie el sistema con el comando shutdown.
3. Una vez que el sistema haya reiniciado, apáguelo completamente usando el comando
shutdown.
4. Vuelva a iniciar el sistema.
Solución
1. $ sudo shutdown now
Objetivos de aprendizaje
Prácticamente todos sistemas basados en x86 de Linux (dejando de lado la esfera de los
sistemas embebidos) usan GRUB actualmente (GRand Unified Bootloader) para
manejar las primeras fases de arranque del sistema. Otras plataformas pueden tener
otros equivalentes, como ELILO, utilizado en sistemas EFI como IA64 (Itanium) y Das U-
BOOT utilizado en muchas configuraciones de sistemas embebidos.
Los kernels alternativos o ramdisk inicial pueden ser elegidos durante el arranque
para un determinado sistema operativo.
Las distribuciones de Linux más antiguas (por ejemplo, RHEL 6) usan versiones antiguas
de GRUB, 1.0 o menor, mientras que las más recientes se basan en GRUB 2. Mientras
que los detalles son diferentes entre las versiones, la filosofía básica es la misma.
/boot/grub/grub.cfg o /boot/grub2/grub.cfg
/boot/grub/grub.conf o /boot/grub/menu.lst.
Al arranque del sistema, después de las etapas iniciales del POST y BIOS, GRUB se
ejecutará y mostrará un menú.
Este puede o no tener gráficos en él (al menos para el fondo de pantalla de splash). El
menú contiene una lista de imágenes de arranque de uno o más sistemas operativos o
distribuciones de Linux. En GRUB 2 (o, si usas ‘chainloading’ para conectar múltiples
instalaciones de GRUB en el mismo disco, un tema complicado que no trataremos aquí)
también pueden haber submenús con aún más opciones.
Usando las flechas arriba y abajo y la tecla Enter, usted puede seleccionar la opción de
arranque correcta, o puede esperar durante un periodo de tiempo configurable antes de
entrar en la opción predeterminada.
Sin embargo, es posible hacer mucho más. Después de seleccionar una entrada, puede
escribir e para editar y luego entrar en una shell interactiva. En esta shell, puede modificar
la sección en el archivo de configuración que describe esa opción de arranque particular.
Por lo general, esto se hace para modificar la línea de comandos del kernel; por
ejemplo, agregando la palabra single al final de la línea de comando hará que el sistema
arranque en el modo monousuario con el fin de tomar acciones correctivas. Una vez que
el cambio deseado se ha realizado, usted puede presionar la tecla adecuada para iniciar
el sistema.
En la parte inferior de la pantalla verá que aparece información sobre las combinaciones
de teclas exactas, así que no es necesario memorizarlas.
También es posible introducir una shell pura, en lugar de editar una sección en particular.
Puede ejecutar una serie de comandos diferentes e incluso tratar de reinstalar o
reparar GRUB. Si hay problemas serios, como no encontrar un archivo de
configuración, GRUB vuelve al modo de línea de comandos y usted podría rescatar el
sistema sin tener que recurrir a los medios físicos (DVDs).
2. Instalar los archivos que GRUB necesita para operar en el momento de arranque,
ya sea en /boot/grub o/boot/grub2. Esto es independiente de los archivos que
el kernel Linux necesita (vmlinuz-*, initramfs-*), los cuales deberán estar en
el directorio /boot también.
Por favor lea la página del manual con cuidado antes de ejecutar un comando como ese;
hay muchas opciones y hacer algo mal en GRUB puede hacer que el sistema no
arranque. En particular tendrá que indicarle al sistema donde encontrar el
directorio /boot y en qué partición reside.
$ sudo grub
> root (hd0,0)
> setup (hd0)
> exit
$
lo cual debería instalar grub en el primer disco y los archivos de arranque en la primera
partición.
En ambas versiones de GRUB, el primer y segundo disco duro es denominado como hd0,
el segundo como hd1, etc. Sin embargo, en la versión 1 las particiones comienzan
contando desde 0 y en la versión 2 desde 1:
No hay necesidad de enfatizar que confundirse acerca de esto puede ser muy destructivo.
Ambas versiones de GRUB a veces usan la notación de sda# y a veces usan (hd0,#), así
que puede ser aún más confuso.
Dentro del archivo de configuración, cada sección tiene que especificar cuál es la
partición raíz; esto no es lo mismo que lo que queremos decir cuando hablamos del
directorio raíz del sistema. En este contexto significa la partición que contiene el kernel
(en el directorio /boot). Por ejemplo, es muy común tener /boot en su partición propia,
digamos/dev/sda1. Luego, en GRUB 1 podrá encontrar una sección simple como la
siguiente:
title 3.17.3
root (hd0,0)
kernel vmlinuz-3.17.3 ro root=/dev/sda2 quiet
initrd initramfs-3.17.3.img
title 3.17.3
root (hd0,0)
kernel /boot/vmlinuz-3.17.3 ro root=/dev/sda1 quiet
initrd /boot/initramfs-3.17.3.img
Nos vamos a concentrar en GRUB 2 porque las versiones anteriores se están volviendo
obsoletas rápidamente. Además es esencialmente el mismo en las diversas distribuciones
de Linux.
$ cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=”$(sed ‘s, release .*$,,g’ /etc/system-release)”
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT=”console”
GRUB_CMDLINE_LINUX=”vconsole.keymap=us crashkernel=auto
vconsole.font=latarcyrheb-sun16 rhgb quiet”
GRUB_DISABLE_RECOVERY=”true”
Red Hat ha abreviado bastante este archivo en comparación con otras distribuciones. Por
ejemplo, en un sistema Ubuntu 14.4 se ve de la siguiente forma:
$ cat /etc/default/grub
# If you change this file, run ‘update-grub’ afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n ‘Simple configuration’
GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=’lsb_release -i -s 2> /dev/null || echo Debian’
GRUB_CMDLINE_LINUX_DEFAULT=”quiet”
GRUB_CMDLINE_LINUX=”find_preseed=/preseed.cfg auto noprompt
priority=critical locale=en_US”
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel
that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD
...)
#GRUB_BADRAM=”0x01234567,0xfefefefe,0x89abcdef,0xefefefef”
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports
via VBE
# you can see them in real GRUB with the command ‘vbeinfo’
#GRUB_GFXMODE=640x480
$ ls -l /etc/grub.d
total 76
• rwxr-xr-x 1 root root 9424 Sep 8 17:35 00_header
• rwxr-xr-x 1 root root 6058 Sep 8 17:35 05_debian_theme
• rwxr-xr-x 1 root root 11608 Sep 8 17:35 10_linux
• rwxr-xr-x 1 root root 10412 Sep 8 17:35 20_linux_xen
• rwxr-xr-x 1 root root 1992 Sep 8 17:35 20_linux_xen
• rwxr-xr-x 1 root root 11692 Sep 8 17:35 30_os-prober
• rwxr-xr-x 1 root root 1416 Sep 8 17:35 30_uefi-firmware
• rwxr-xr-x 1 root root 214 Sep 8 17:35 40_custom
• rwxr-xr-x 1 root root 216 Sep 8 17:35 41_custom
• rw-r—r-- 1 root root 483 Sep 8 17:35 README
donde una vez más estamos mostrando Ubuntu 14.04. Cada uno de estos archivos se
ejecutan en orden ascendente cuando se actualiza el archivo de configuración. No los
discutiremos aquí debido a que están bien autodocumentados y recomendamos que les
eche un vistazo.
Para GRUB 1 cada distribución puede tener algunas peculiaridades, pero básicamente se
edita grub.conf directamente o a través de un script como grubby.
Falso
Verdadero
Falso
Verdadero
Falso
Nota: Este ejercicio requiere ser ejecutado desde la consola, es decir, no a través de SSH.
1. Reinicie su máquina y vaya a la consola interac/va de GRUB presionando e, o cualquier otra
tecla que sea requerida para tal efecto, según se indique en la pantalla.
2. Haga que su sistema inicie en modo no grá.co. La forma de hacerlo dependerá de su sistema
especí.co. En sistemas tradicionales que respetan los runlevels (los cuales trataremos en la
próxima sección) es posible agregar un 3 a la línea de comandos del kernel, en la entrada
especí.ca que seleccionó desde las opciones en el menú de GRUB.
$ sudo telinit 5
$ sudo service gdm restart
$ sudo service lightdm restart
Objetivos de Aprendizaje
init coordina las etapas posteriores del proceso de arranque, configura todos los aspectos
del ambiente e inicia los procesos necesarios para entrar/autenticarse en el
sistema. init también trabaja estrechamente con el kernel para limpiar lo necesario a
medida en que los procesos terminan.
El inicio fue visto como un proceso serial, dividido en una serie de etapas secuenciales.
Cada etapa requería ser finalizada antes de que la próxima pudiera iniciar. Por lo tanto, el
arranque no aprovechó el procesamiento en paralelo que podría hacerse en múltiples
procesadores.
Para lidiar con estas limitaciones intrínsecas en SysVinit, se han desarrollado nuevos
métodos para controlar el arranque del sistema. Si bien es cierto que existen otros, dos
esquemas principales fueron adoptados por distribuidores Empresariales:
1. Upstart fue desarrollado por Ubuntu y fue incluido por primera vez en el
lanzamiento de la versión 6.10 en el 2006 y pasó a ser utilizado por defecto en el
lanzamiento de la versión 9.10, el 2009. También fue adoptado en Fedora 9(en el
2008) y en RHEL 6 y sus clones, tales como CentOS, Scientific Linux y Oracle
Linux. En openSUSE fue ofrecido como una opción desde la versión 11.3.
También se ha utilizado en varios dispositivos embebidos y móviles.
El runlevel 0 está reservado para el apagado del sistema, runlevel 1 para el modo
monousuario y runlevel 6 para reiniciar el sistema. Los otros runlevels se usan para
definir qué servicios están ejecutándose en un sistema normal; según el caso, las
distribuciones definen algo de forma diferente. Por ejemplo, en sistemas basados en Red
Hat, runlevel 2 se define como un sistema en funcionamiento sin red o X, runlevel 3
incluye soporte de red, y runlevel 5 incluye red y X.
$runlevel
N 5
$ sudo /sbin/telinit 5
Sin embargo, en sistemas más recientes como RHEL 6 que enmascaran upstart detrás
de una capa de compatibilidad, la única línea descomentada y lo único que se encuentra
en este archivo es el runlevel predeterminado con la línea:
id:5:initdefault
Este es el runlevel al cual llegará el sistema una vez que haya terminado de iniciar. Sin
embargo, si se especifica otro valor en la línea de comandos del núcleo, init ignora el
valor por defecto (esto se hace añadiendo el dígito entero a la línea de comandos del
núcleo). El runlevel por defecto es generalmente 5 para un sistema completo, lo cual
considera soporte multiusuario, sistema gráfico en red o 3 para un servidor sin una
interfaz gráfica.
El script rc.local puede ser usado para iniciar aplicaciones específicas del sistema.
Note lo siguiente:
Todos los scripts reales están en /etc/init.d: cada directorio de nivel de ejecución
solo enlaza a ellos.
Los nombres de los scripts de inicio comienzan con s.
Los nombres de los scripts de detención comienzan con k.
chkconfig se utiliza para consultar y configurar en qué runlevels van a correr los
diferentes servicios del sistema.
Ejemplos de chkconfig
Verifica un servicio en particular para comprobar si está configurado para correr en el
runlevel actual:
$ chkconfig some_service
No es difícil añadir sus propios servicios y escribir scripts de inicio. Solamente hay que
poner el script en /etc/init.d, el cual debe tener ciertas características (¡sólo algunas
líneas en el comienzo del archivo!) y luego usar chkconfig –add para habilitarlo
o chkconfig—del para desactivar el uso de las instrucciones on y off.
¿Cómo lo hace chkconfig para determinar qué número debería aparecer luego de
la S o K en un enlace simbólico? ¿Cómo sabe qué runlevels configurar en on u off y qué
estado configurar en los enlaces simbólicos? La información está en los propios scripts,
los cuales contienen una línea en la parte de arriba, como la siguiente:
# chkconfig: 2345 10 90
El primer argumento luego de chkconfig: aquí se definen los runlevels en los cuales el
servicio va a ejecutarse por defecto. En el ejemplo de arriba con los runlevels 2, 3, 4 y 5.
El segundo y tercer número son los prefijos numéricos en los scripts de inicio y detención;
en el caso de arriba inician con S10 y K90.
Cada sistema operativo tiene servicios que generalmente arrancan en la inicialización del
sistema y a menudo permanecen funcionando hasta el apagado. Tales servicios pueden
ser iniciados, detenidos o reiniciados en cualquier momento, lo que generalmente requiere
privilegios de root. En un sistema Linux usando o emulando SysVinit, los servicios están
en el directorio /etc/init.d.
service tiene diversas opciones, las que varían según el servicio en particular; por
ejemplo:
$ sudo service—status-all
acpid (pid 4170) is running...
anacron (pid 4540) is running...
atd (pid 4553) is running.......
smartd (pid 4614) is running...
smbd is stopped......
El iniciar y detener servicios con service es efectivo sólo durante la operación actual del
sistema; todos los cambios se pierden al reiniciar. Para configurar que un servicio en
particular se active o no durante la inicialización del sistema - en sistemas basados
en Red Hat - se utiliza chkconfig como se describió anteriormente.
Usted deberá consultar las páginas man para acceder a la documentación completa.
/etc/init/rcS.conf
/etc/rc-sysinit.conf
/etc/inittab
/etc/init/rc.conf
/etc/rc[0-6].d
Cuando el kernel inicia el proceso init, éste ejecuta el script rcS.conf. Esto a su vez,
hace que rc-sysinit.conf se ejecute.
rc-sysinit.conf realizará una serie de tareas, incluyendo iniciar LVM, montar sistemas
de archivos y luego ejecuta todos los scripts para el runlevel por defecto especificado
en /etc/inittab.
Esto se logra mediante la ejecución de rc.conf y pasando al runlevel. Los scripts del
runlevel levantan los servicios en el sistema.
Finalmente, scripts adicionales como prefdm.conf son ejecutados (para el runlevel 5
solamente).
4.11 systemd
El sistema de administración central systemd y manejador de sesión para Linux está
tomando lugar rápidamente en todas las distribuciones importantes.
4.13 systemctl
$ systemctl
Nota: algunos comandos systemctl de los mostrados arriba pueden ser ejecutados como
usuario normal, sin embargo otros tienen que ser ejecutados como root o con sudo.
Para ver un excelente resumen de cómo pasar desde SysVinit a systemd, consulte la
documentación SysVinit to Systemd Sheatsheet en:
https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet.
Respuesta Correcta: SysVinit fue diseñado para mainframes, los que tienen
requerimientos diferentes a computadores de escritorio, sistemas embebidos y
plataformas para dispositivos móviles.
Respuesta Correcta:
0
6
1
3
5
En este y el siguiente ejercicio crearemos un servicio simple de inicio. Primero lo haremos para un
sistema SysVinit. Tenga en cuenta que si está usando un sistema basado en systemd, todo debería
funcionar debido a la capa de compa/bilidad hacia atrás que todas las distribuciones /enen. Sin
embargo, lo haremos de forma na/va systemd en el próximo ejercicio.
Si está en un sistema basado en Debian como Ubuntu, asegúrese de tener instalados los paquetes
sysvinit-u/ls y chkcong. Sin embargo, las versiones recientes de Ubuntu ya no proveen el paquete
chkcon.g; en cambio, tendría que usar la herramienta update-rc.d.
Primero es necesario crear el script especí.co del servicio; usted lo puede crear por sí solo en caso
que lo desee, o u/lizar el procedimiento que se describe a con/nuación (como root). En este
úl/mo caso cree un archivo llamado /etc/init.d/fake_service con el siguiente contenido:
#!/bin/bash
# fake_service
# Starts up, writes to a dummy .le, and exits
#
# chkcon.g: 35 69 31
# descrip/on: This service doesn’t do anything.
# Source func/on library
. /etc/syscon.g/fake_service
case “$1” in
start) echo “Running fake_service in start mode...”
touch /var/lock/subsys/fake_service
echo “$0 start at $(date)” >> /var/log/fake_service.log
if [ ${VAR1} = “true” ]
then
.
echo
;;
stop)
echo “Running the fake_service script in stop mode...”
echo “$0 stop at $(date)” >> /var/log/fake_service.log
if [ ${VAR2} = “true” ]
then
.
rm -f /var/lock/subsys/fake_service
echo
esac
exit
Si está tomando la versión autodidacta en línea del curso, el script está disponible para descargarlo
desde la pantalla Lab.
Asígnele permisos de ejecución (y todos los otros permisos necesarios) al archivo anterior:
$ sudo chmod 755 /etc/init.d/fake_service
Se daría cuenta que el script incluye el archivo /etc/syscong/fake service. En sistemas diferentes
a RHEL debería cambiar esto a /etc/default/fake_service. Créelo e inserte el siguiente contenido:
VAR1=”true”
VAR2=”true”
Para probarlo completamente tendría que reiniciar el sistema con el .n de con.rmar si el servicio
inicia automá/camente. También puede modi.car los runlevels en los cuales el servicio debería
ejecutarse.
Como se mencionó en el ejercicio anterior, todavía es posible u/lizar el script de inicio SysVinit con
systemd, pero esto está en desuso.
El procedimiento análogo consiste en crear un archivo (como root) directamente bajo
/etc/systemd/system o en otro lugar en ese árbol de directorios; las distribuciones varían un poco
en esto. Este es un ejemplo de un archivo con contenido mínimo, llamado
/etc/systemd/system/fake2.service:
[Unit]
Descrip/on=fake2
ANer=network.target
[Service]
ExecStart=/bin/echo Estoy iniciando el servicio fake2
ExecStop=/bin/echo Estoy deteniendo el servicio fake2
[Install]
WantedBy=mul/-user.target
Si usted hizo cambios a la sección unit, debe hacer lo siguiente para recargar el servicio con la
información nueva:
$ sudo systemctl daemon-reload y el sistema le mostraría una advertencia.
Una vez más, es necesario reiniciar el sistema para asegurarse que los cambios realizados están
siendo efec/vos.
Objetivos de aprendizaje
Linux, como todos los sistemas operativos basados en UNIX, consiste en un árbol grande
de sistemas de archivos. Generalmente es diagramado como un árbol invertido con
el directorio raíz / en la parte superior del árbol.
Dentro de este tremendo sistema de archivos lógico pueden haber varios, incluso muchos
sistemas de archivos distintos, montados en puntos que corresponden a los
subdirectorios. Estos distintos sistemas de archivos suelen estar en particiones diferentes,
en diversas cantidades y tipos de dispositivos, incluyendo aquellos que se encuentran en
red.
De forma independiente de cómo exactamente las cosas están unidas entre sí, todo se ve
como un gran sistema de archivos; las aplicaciones no se preocupan en absoluto de los
dispositivos físicos en los cuales residen los archivos.
En el pasado los diferentes sistemas operativos tipo UNIX organizaron este gran árbol de
diversas maneras; incluso entre las distribuciones de Linux había muchas diferencias.
Esto hizo que tanto el desarrollo de aplicaciones como llevar a cabo tareas de
administración en más de un tipo de sistema fuera difícil y a menudo frustrante.
Mientras que todo el sistema de archivos puede ser visto como un gran árbol, como
hemos señalado, pueden haber varias particiones y sistemas de archivos trabajando de
forma unida.
La partición raíz debe contener todos los archivos esenciales necesarios para iniciar el
sistema y luego montar el resto de los sistemas de archivos. Por lo tanto necesita
utilidades, archivos de configuración, información del cargador de arranque y otros datos
esenciales del inicio. Debe estar habilitado para:
Iniciar el sistema.
Restaurar el sistema desde copias de seguridad de medios externos, tales como
cintas y otros medios extraíbles, o NAS, etc.
Recuperar y/o reparar el sistema; un administrador experimentado debe tener las
herramientas para diagnosticar y reconstruir un sistema dañado.
5.6 /bin
cat, chgrp, chmod, chown, cp, date, dd, df, dmesg, echo,false, hostname, kill, ln, logi
n, ls, mkdir, mknod, more,mount, mv, ps, pwd, rm, rmdir, sed, sh, stty, su, sync, true
,umount, y uname.
5.7 /boot
Los archivos esenciales para iniciar el sistema deben estar en el directorio /boot y sus
subdirectorios. Los dos archivos absolutamente esenciales son:
vmlinuz: El kernel Linux comprimido.
initramfs: El sistema de archivos de RAM inicial, el cual se monta antes de que
el sistema real de archivos raíz esté disponible.
Estos archivos tienen nombres largos que dependen de la versión del núcleo, en donde el
nombre exacto está en función de la distribución de Linux. Además, en lugar
de initramfs, el archivo puede ser llamado initrd, siglas de disco RAM inicial, el cual si
bien es cierto corresponde al método antiguo, el nombre se usa en algunas distribuciones
todavía.
El contenido exacto de /boot variará según la distribución y el tiempo; en un
sistema RHEL 7 tenemos:
$ ls -lF /boot
total 135336
-rw-r—r-- 1 root root 122094 Nov 4 09:20 config-3.10.0-
123.13.1.el7.x86_64
-rw-r—r-- 1 root root 81386 Dec 7 12:03 config-3.17.5
-rw-r—r-- 1 root root 81896 Dec 15 07:28 config-3.18.0
-rw-r—r-- 1 root root 81896 Dec 16 15:56 config-3.18.1
drwxr-xr-x. 6 root root 4096 Dec 16 15:57 grub2
-rw-r—r--. 1 root root 40732911 Sep 3 04:07 initramfs-0-rescue-
3ª0cc7a6d7bb4525815f4d2b4298e611.img
-rw-r—r-- 1 root root 16406996 Dec 10 07:25 initramfs-3.10.0-
123.13.1.el7.x86_64.img
-rw-r—r-- 1 root root 13967066 Dec 7 12:03 initramfs-3.17.5.img
Hace mucho tiempo estos archivos esenciales se solían poner directamente en /, en vez
de usar un directorio /boot por separado, siguiendo las prácticas tradicionales de UNIX.
Hoy en día esto se considera obsoleto.
Usted puede haber notado que existen varias versiones del núcleo en /boot, y para cada
uno hay cuatro archivos disponibles (la posibilidad de elegir entre los núcleos se hace
mediante GRUB en el inicio).
Las distribuciones pueden poner otros archivos y directorios en /boot, tales como los
sectores de arranque maestros guardados y otros datos no editados a mano.
Listado de /dev
$ cd /dev ; ls -lF
lrwxrwxrwx 1 root root 3 Aug 28 10:12 cdrom1 -> sr0
....
lrwxrwxrwx 1 root root 15 Aug 28 10:12 fitbit -> bus/usb/003/002
....
crw-rw---- 1 root lp 6, 0 Aug 28 10:12 lp0
crw-rw---- 1 root lp 6, 1 Aug 28 10:12 lp1
....
brw-rw---- 1 root disk 8, 4 Aug 28 10:12 sda4
brw-rw---- 1 root disk 8, 5 Aug 28 10:12 sda5
brw-rw---- 1 root disk 8, 6 Aug 28 10:12 sda6
....
brw-rw----+ 1 root cdrom 11, 0 Aug 28 10:12 sr0
Note que los dispositivos de carácter comienzan con una c, los bloques con una b y los
enlaces simbólicos con una l (L minúscula).
Todas las distribuciones modernas de Linux (no embebidas) utilizan el sistema udev, el
cual crea nodos en /dev sólo a medida en que se necesita, lo que sucede cuando se
encuentran dispositivos, ya sea al inicio o al conectarlos al sistema (discutiremos udev en
una sección posterior).
5.11 /home
En los sistemas Linux los directorios de usuarios están en /home,
como /home/coop, /home/alumno, etc. Toda la configuración personal, datos y programas
ejecutables se ponen en esta jerarquía de directorios. /home también puede contener
subdirectorios para varios grupos o asociaciones de usuarios,
como /home/estudiantes, /home/staff,/home/aliens, etc.
En otros sistemas operativos tipo UNIX, existe el concepto del árbol de directorios /home,
pero puede ser sutilmente diferente. Por ejemplo, en Solaris los directorios de usuarios se
crean en /export/home y luego la utilidad automount los montará en /home. Esto se
debe a la situación habitual en que el directorio de los usuarios puede estar en cualquier
lugar en una red corporativa, probablemente en un servidor NFS, en donde el directorio
de cada usuario se montará automáticamente cuando esté en uso.
Linux también tiene la utilidad automount, pero muchos usuarios no están conscientes
de ellos, y en sistemas personales probablemente el concepto de puntos de
montaje NFS no aplicará.
Un usuario siempre puede sustituir la variable de ambiente $HOME para su directorio raíz, o
la abreviación ~; es decir, los siguientes usos son equivalentes:
$ ls -l $HOME/public_html
$ ls -l ~/public_html
Hay una excepción: el directorio home del usuario root en los sistemas Linux siempre se
encuentra en /root. Algunos sistemas UNIX antiguos pueden usar / en cambio, lo que
puede causar algún desorden.
Este directorio debe contener sólo las bibliotecas necesarias para ejecutar los binarios
en /bin y /sbin. Estas bibliotecas son particularmente importantes para iniciar el sistema
y ejecutar comandos en el sistema de archivos raíz.
Los sistemas que soportan tanto binarios de 32 bits y 64 bits deben mantener ambos tipos
de bibliotecas en el sistema. En los sistemas basados en Red Hat hay directorios
separados para las bibliotecas de 32 bits (/lib) y 64 bits (/lib64).
5.13 /media
Los sistemas Linux modernos montan estos medios de forma dinámica durante la
inserción, momento en el cual udev crea directorios bajo /media y luego monta los
sistemas de archivos extraíbles allí, con los nombres que se establecen a través de las
reglas de udev especificadas en los archivos de configuración. Al desmontar y extraer los
medios, los directorios que fueron usados como puntos de montaje
en /media desaparecerán.
Si el medio extraíble tiene más de una partición y sistema de archivos, aparecerá más de
una entrada en /media. En muchas distribuciones de Linux el administrador de archivos
(como Nautilus) se abrirá cuando el medio es montado.
Nota: En algunas distribuciones más recientes (incluyendo SUSE y RHEL 7) los medios
extraíbles se montarán en/run/media/[nombre de usuario]/... Vamos a tratar /run al
final de este capítulo.
Se dispone de este directorio para que el administrador del sistema pueda montar
temporalmente un sistema de archivos en caso de necesitarlo. Se usa comúnmente para
sistemas de archivos en red, incluyendo:
NFS
Samba
CIFS
AFS
Históricamente, /mnt también fue usado para los tipos de archivos que se montan
actualmente en /media (o/run/media) en los sistemas modernos.
En términos generales, este directorio no debe ser utilizado por programas de instalación.
Una mejor alternativa es otro directorio temporal que no esté siendo usado.
5.15 /opt
Este directorio está diseñado para paquetes de software que desean mantener la totalidad
o gran parte de sus archivos en un lugar aislado en vez de dispersarse por todo el sistema
en los directorios compartidos con otros programas.
Por ejemplo, si dolphy_app fuera el nombre de un paquete en /opt, todos sus archivos
deben residir en directorios bajo /opt/dolphy_app, incluyendo
/opt/dolphy_app/bin para binarios y /opt/dolphy_app /man para las páginas man.
Esto puede hacer que tanto la instalación y desinstalación de software sean relativamente
fácil, ya que todo está aislado de forma conveniente en una ubicación predecible y
estructurada. También hace que sea más fácil para los administradores de sistemas el
determinar la naturaleza de cada archivo asociado a un paquete.
Note, sin embargo, que si uno utiliza sistemas de empaquetamiento como RPM y APT,
como veremos más adelante, también es fácil de instalar y desinstalar conservando un
claro sentido de las ubicaciones de archivos, sin exhibir tal conducta antisocial con la
distribución.
En Linux, el directorio /opt es utilizado a menudo por proveedores de aplicaciones, ya
sea con software propietario o aquellos que desean evitar las complicaciones asociadas a
los cambios entre distribuciones. Por ejemplo, en RHEL 7 los únicos paquetes se
encuentran en esta categoría están en /opt/skype y /opt/google, en donde este último
tiene subdirectorios para chrome, earth y talkplugin.
Para propósitos de organización, los archivos que contienen información sobre un tema
similar se agrupan en directorios virtuales y subdirectorios. Por
ejemplo, /proc/scsi/ contiene información de todos los dispositivos SCSI físicos. De la
misma forma, los directorios de procesos contienen información acerca de
cada proceso corriendo en el sistema.
5.18 /sys
sysfs se utiliza tanto para recopilar información sobre el sistema, como también modificar
su comportamiento mientras se ejecuta. En ese sentido se parece a /proc, pero es más
nuevo y se ha adherido a normas estrictas acerca de qué tipo de entradas que puede
contener. Por ejemplo, casi todos los seudoarchivos en /sys contienen sólo una línea o
valor; no existe ninguna de las entradas largas que se pueden encontrar en /proc.
Al igual que con /proc, examinaremos entradas en /sys a lo largo de este curso, lo que
será relevante en los próximos capítulos acerca de la configuración del kernel y monitoreo
del sistema.
5.19 /sbin
Este directorio contiene los archivos binarios esenciales para arrancar, restaurar,
recuperar y/o reparar los binarios en el directorio /bin. También debe tener lo necesario
para montar otros sistemas de archivos en /usr, /home y otros lugares de ser necesario,
una vez que el sistema de archivos raíz esté en buenas condiciones en el arranque.
Los siguientes programas deberían estar incluidos en este directorio (siempre y cuando
sus subsistemas estén instalados):
fdisk, fsck, getty, halt, ifconfig, init, mkfs, mkswap, reboot, route, swapon, swapoff,
update.
Este directorio se utiliza para almacenar archivos temporales, y puede ser accedido por
cualquier usuario o aplicación. Sin embargo, no se puede esperar que los archivos
en /tmp estén ahí por largo tiempo:
Algunas distribuciones corren trabajos de cron automatizados, los que
generalmente eliminan los archivos de más 10 días, a menos que los scripts de
purga hayan sido modificado para excluirlos. Esta es la política de RHEL 6.
Algunas distribuciones eliminan el contenido de /tmp con cada reinicio del sistema.
Esta ha sido la política de Ubuntu.
Algunas distribuciones modernas utilizan un sistema de archivos virtual, usando el
directorio /tmp sólo como un punto de montaje para un disco ram utilizando el
sistema de archivos tmpfs. Esta es la política por defecto de los
sistemas Fedora recientes. Cuando el sistema se reinicia, toda la información se
pierde; ¡/tmp es de hecho temporal!
En este último caso, hay que evitar la creación de archivos de gran tamaño en /tmp,
debido a que en realidad va a ocupar espacio en memoria en vez de disco, y es fácil
dañar o bloquear el sistema a través del agotamiento de la memoria. Si bien es cierto que
la guía para las aplicaciones es evitar poner archivos de gran tamaño en /tmp, hay un
gran número de aplicaciones que violan esta política. Incluso si fuera posible ponerlos en
otro lugar (tal vez mediante la especificación de una variable de entorno), muchos
usuarios no saben cómo configurarlo, y por otro lado, todos los usuarios tienen acceso
a /tmp.
Esta política puede ser cancelada en los sistemas utilizando systemd, como en Fedora, a
través del siguiente comando:
5.21 /usr
El directorio /usr puede ser visto como una jerarquía secundaria. Se utiliza para los
archivos que no son necesarios para el inicio del sistema. De hecho, /usr no necesita
estar localizado en la misma partición que el directorio raíz y se puede compartir entre los
hosts que utilizan la misma arquitectura de sistema a través de la red.
Este directorio tiene usualmente datos de sólo lectura. Contiene binarios que no son
necesarios en modo monousuario. Contiene el directorio /usr/local, donde es posible
almacenar binarios locales. Las páginas man se encuentran en/usr/share/man.
Obviamente, /var no puede ser montado como un sistema de archivos de sólo lectura.
Por razones de seguridad, a menudo se considera una buena idea montar /var como un
sistema de archivos por separado. Además, si el directorio se llena, no debería producir
un bloqueo del sistema.
/var/log es donde se encuentran la mayoría de los archivos del registro del sistema. El
directorio /var/spool es donde se almacenan los archivos locales para procesos como
correo, impresión y trabajos de cron a la espera de ser liberados de la cola.
Un nuevo árbol de directorio montado en /run ha estado en uso desde hace varios años
por las principales distribuciones de Linux, y pese a que ha sido propuesto para el FHS,
no ha sido aceptado formalmente. Sin embargo es bueno saber acerca de su existencia,
ya que muy probablemente se encontrará con él.
Algunos directorios existentes, tal como /var/run y /var/lock, serán enlaces simbólicos
a los directorios bajo /run. Otros, dependiendo de cada distribución, pueden apuntar a
directorios bajo /run.
Use la herramienta du para calcular el tamaño total de cada uno de los directorios de primer nivel
de su sistema.
Ejecute el comando:
$ du—help
para tener una idea de cómo obtener y mostrar la información de forma e.ciente.
Solución lab 5.1
Para obtener una lista completa de los directorios principales bajo / y sus tamaños:
$ sudo du—max-depth=1 -hx /
4.3M /home
16K /lost+found
39M /etc
4.0K /srv
3.6M /root
178M /opt
138M /boot
6.1G /usr
1.1G /var
16K /mnt
4.0K /media
869M /tmp
8.4G /
Tenga en cuenta que muchos de los nombres de los directorios son números; cada uno
corresponde a un proceso en ejecución y sus nombres son el process ID. Un subdirectorio
importante que veremos más adelante es /proc/sys, bajo el cual es posible ver o modi.car muchos
parámetros del sistema.
Los nombres de cada uno dan una buena idea acerca de la información que con/enen.
Tenga en cuenta que esta información no se actualiza de forma constante, sino que es obtenida
sólo cuando uno quiere visualizarla.
3. Eche un vistazo a cualquier directorio de proceso. Si no es un proceso del cual usted es dueño, el
acceso a la información podría ser limitada, a menos que use sudo):
$ ls -F 5564
Eche un vistazo a algunos de los campos aquí, tales como cmdline, cwd, environ, mem, y status
Objetivos de Aprendizaje
Saber cómo usar sysctl para configurar parámetros del kernel ya sea una vez que
el sistema ha iniciado, o de forma persistente luego del reinicio del sistema.
En rigor, Linux es sólo el kernel del sistema operativo. Este último incluye muchos otros
componentes, como bibliotecas y aplicaciones que interactúan con el kernel.
Un sistema que ejecuta solamente el kernel tiene una funcionalidad bastante limitada.
Esto se encuentra sólo en dispositivos dedicados y enfocados a los sistemas
embebidos.
o
kernel /vmlinuz-2.6.32-279.14.1.el6.x86_64 ro
root=UUID=178d0092-4154-4688-af24-cda272265e08
rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD
SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc
Para la versión GRUB 2 (la nueva), una línea de comandos del kernel podría verse así:
linux16 /boot/vmlinuz-3.16.0 root=UUID=178d0092-4154-4688-af24-
cda272265e08 ro vconsole.keymap=us crashkernel=auto
vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=en_US.UTF-8
y se encontraría en /boot/grub2/grub.cfg.
En la versión 2 no se debe editar este archivo directamente, sino que modificar los
archivos relevantes bajo /etc.
En los ejemplos anteriores las filas largas fueron divididas para su visualización, pero
cada una de ellas corresponden a una línea larga. Recuerde que discutimos cómo
configurar las dos versiones de GRUB, y que la versión 2 no debe editarse directamente,
sino modificar los archivos correspondientes en /etc.
Basta hacer lo siguiente para ver con qué línea de comandos inició un sistema:
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.18.1 root=UUID=9d6b5801-9c7e-4c17-9068-
49923952338e ro rhgb quiet loop.max_loop=256 LANG=en_US.UTF-8
Hay una lista sorprendentemente larga de los parámetros disponibles del kernel.
Documentación detallada al respecto se puede encontrar aquí:
En línea, en http://kernel.org/doc/Documentation/kernel-parameters.txt.
Los parámetros pueden ser especificados simplemente como un valor dado como
argumento, o de la forma param=valor, donde el valor dado puede ser un string, entero,
arreglo de enteros, etc, tal como se explica en el archivo de documentación.
Por convención, no debería haber parámetros intencionalmente escondidos o secretos,
todos ellos deberían estar explicados en la documentación. Los parches a las fuentes del
kernel con parámetros nuevos deben incluir modificaciones en el archivo de
documentación.
Tenga en cuenta que los parámetros que comienzan con rd se usan solamente en los
sistemas basados en Red Hat. Alguna documentación al respecto puede encontrarse
en https://fedoraproject.org/wiki/Dracut/Options.
La interfaz sysctl puede ser utilizada para leer y ajustar los parámetros del kernel en
tiempo de ejecución. Los valores actuales se pueden visualizar con el siguiente comando:
$ sysctl -a
....
kernel.pid_max = 32768
...
kernel.threads-max = 63707
....
net.ipv4.ip_default_ttl = 64
....
net.ipv4.ip_forward = 0
....
vm.nr_hugepages = 16
vm.swappiness = 10
....
donde la segunda forma se usa para establecer un valor con la interfaz de línea de
comando sysctl. No se puede dejar espacios alrededor del signo = en este comando.
Note que en la primera forma, no es posible utilizar sudo con echo; el comando debe
hacerse en la forma en que se muestra, o ejecutándolo como root.
$ sudo sysctl -p
1. Veri.que si puede hacer ping a su sistema. Tenga en cuenta que en RHEL 7 es necesario ser
root para hacer ping en la mayoría de redes externas.
2. Veri.que el valor actual de net.ipv4.icmp_echo_ignore_all, el cual se usa para habilitar y
deshabilitar que su sistema responda a ping. El valor 0 permite a su sistema responder a
pings.
3. Con.gure el valor en 1 usando la herramienta de línea de comandos sysctl y luego veri.que
si el sistema dejó de responder a pings.
4. Con.gure el valor de vuelta a 0 y con.rme si se restauró el comportamiento original.
5. Ahora modi.que el valor a través de la edición de /etc/sysctl.conf y fuerce al sistema a
ac/var esa con.guración en el archivo sin reiniciar el sistema.
6. Veri.que que la modi.cación esté funcionando correctamente. Una vez que haya terminado,
puede reiniciar su sistema para asegurarse que todo está de vuelta en el punto original.
net.ipv4.icmp_echo_ignore_all=1
y luego haga:
$ sysctl -p
6. $ sysctl net.ipv4.icmp_echo_ignore_all
$ ping localhost
Ya que los cambios en el archivo /etc/sysctl.conf son persistentes, sería buena idea restaurar los
valores originales.
El comportamiento normal de un sistema Linux es que los IDs de proceso comiencen en PID=1
para el proceso init, el primer proceso en el sistema, y luego en forma secuencial a medida en que
procesos nuevos van siendo creados y terminados (de forma constante).
El kernel Linux hace un uso extensivo de módulos, los cuales contienen software
importante que puede ser cargado y descargado según se necesite después que el
sistema ha iniciado. Muchos módulos incorporan controladores de dispositivos para el
control de hardware, ya sea como parte del sistema o periféricos. Otros módulos pueden
controlar protocolos de red, proveer soporte a diferentes tipos de sistemas de archivos y
muchos otros propósitos. Los parámetros pueden ser especificados al cargar los módulos
con el fin de controlar su comportamiento. El resultado final es una gran flexibilidad y
agilidad en la respuesta a las condiciones y necesidades cambiantes.
Objetivos de Aprendizaje
Muchas piezas de soporte en el kernel Linux están diseñadas como parte integral del
kernel cuando éste se carga inicialmente, o para ser agregadas (o removidas) más tarde
en forma de módulos según sea necesario. De hecho, la mayoría de los componentes
del kernel se integran como módulos, con excepción de los elementos centrales.
Incluso con el uso generalizado de los módulos del kernel, Linux conserva una
arquitectura de kernel monolítico en vez de un microkernel. Esto es porque cuando se
carga un módulo se convierte en una parte completamente funcional del kernel, con pocas
restricciones. Estos se comunican con todos los subsistemas del kernel principalmente a
través de recursos compartidos, como memoria y archivos de bloqueo, más que a través
de pasar mensajes como puede ocurrir en un microkernel.
Linux no es el único sistema operativo que utiliza módulos; Solaris lo hace y también AIX,
quienes las llaman extensiones del kernel. Sin embargo, Linux las utiliza de manera
particularmente robusta.
Hay una serie de herramientas que se utilizan con los módulos del kernel:
lsmod: Lista los módulos cargados.
insmod: Carga módulos directamente.
rmmod: Remueve módulos directamente.
modprobe: Carga o descarga módulos, utilizando una base de datos
preconstruida de los módulos con información de sus dependencias.
depmod: Reconstruye la base de datos de dependencia de módulos; es requerida
por modprobe y modinfo.
modinfo: Proporciona información acerca de un módulo.
La carga y descarga del módulo se debe realizar como usuario root. Si se conoce la ruta
completa, el módulo se puede cargar directamente de la siguiente forma:
$ lsmod
Note que al remover un módulo no es necesario proveer ya sea la ruta completa del
archivo o la extensión .ko.
Hay algunas cosas importantes para mantener en mente al cargar y descargar módulos:
No es posible descargar un módulo que está siendo usado por uno u otros
módulos, lo cual se puede determinar a partir de la lista que provee lsmod.
modinfo puede ser usado para encontrar información acerca de los módulos del kernel
(tanto si están actualmente cargados o no), como se muestra a continuación:
$ /sbin/modinfo my_module
$ /sbin/modinfo <pathto>/my_module.ko
Por ejemplo:
$ modinfo e1000
filename: /lib/modules/3.1.0/kernel/drivers/net/e1000/e1000.ko
version: 7.3.21-k8-NAPI
license: GPL
description: Intel® PRO/1000 Network Driver
author: Intel Corporation, <linux.nics@intel.com>
srcversion: E005D763BC7910379BDD09A
alias: pci:v00008086d00002E6Esv*sd*bc*sc*i*
alias: pci:v00008086d000010B5sv*sd*bc*sc*i*
alias: pci:v00008086d00001099sv*sd*bc*sc*i*
....
alias: pci:v00008086d00001000sv*sd*bc*sc*i*
depends: vermagic: 3.1.0 SMP preempt mod_unload
parm: TxDescriptors:Number of transmit descriptors (array of int)
parm: RxDescriptors:Number of receive descriptors (array of int)
parm: Speed:Speed setting (array of int)
parm: Duplex:Duplex setting (array of int)
parm: AutoNeg:Advertised auto-negotiation setting (array of int)
parm: FlowControl:Flow Control setting (array of int)
parm: XsumRX:Disable or enable Receive Checksum offload (array of
int)
parm: TxIntDelay:Transmit Interrupt Delay (array of int)
parm: TxAbsIntDelay:Transmit Absolute Interrupt Delay (array of
int)
parm: RxIntDelay:Receive Interrupt Delay (array of int)
parm: RxAbsIntDelay:Receive Absolute Interrupt Delay (array of int)
parm: InterruptThrottleRate:Interrupt Throttling Rate (array of
int)
parm: SmartPowerDownEnable:Enable PHY smart power down (array of
int)
parm: copybreak:Maximum size of packet that is copied to a new
buffer on receive (uint)
parm: debug:Debug level (0=none,...,16=all) (int)
Mucha de la información acerca de los módulos puede ser visualizada también en el árbol
de directorios del seudosistema de archivos /sys; en el ejemplo anterior se podría mirar
bajo /sys/module/e1000, y algunos - si es que no todos los parámetros - se pueden leer
y/o escribir bajo /sys/module/e1000/parameters. Le mostraremos cómo configurarlos
en el ítem siguiente.
o de forma más fácil para un módulo que está presente en la ubicación adecuada del
sistema:
1. Liste todos los módulos del kernel que están cargados actualmente en su sistema.
2. Cargue un módulo que no esté en uso en su sistema. Si está ejecutando un kernel que
viene con la distribución es fácil encontrar los módulos; simplemente /ene que buscar en
el directorio /lib/modules/ /kernel/drivers/net y elegir uno (los kernels que vienen con las
distribuciones incluyen controladores para cada disposi/vo, sistema de archivos, protocolo
de red, etc., todo lo que un sistema puede necesitar). Sin embargo, si está corriendo un
kernel personalizado es posible que no tenga muchos módulos disponibles para cargar.
3. Liste los módulos del kernel nuevamente y vea si el módulo fue realmente cargado.
4. Remueva el módulo que cargó anteriormente.
5. Liste los módulos del kernel nuevamente y compruebe si el módulo fue descargado
correctamente.
Solución 7.1
1. $ lsmod
En la sección que viene a con/nuación, subs/tuya cualquier nombre de módulo que usó
en vez de 3c59x. Cualquiera de estos dos métodos va a funcionar, pero el segundo es más
fácil.
2. $ sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/3c59.x
$ sudo /sbin/modprobe 3c59x
3. $ lsmod | grep 3c59x
4. De nuevo, cualquiera de los siguientes métodos va a funcionar.
Objetivos de aprendizaje
$ ls -l /dev
total 0
crw------- 1 coop audio 14, 4 Jul 9 01:54 audio
crw------- 1 root root 10, 62 Jul 9 01:54 autofs
lrwxrwxrwx 1 root root 4 Jul 9 01:54 cdrom -> scd0
lrwxrwxrwx 1 root root 4 Jul 9 01:54 cdrw -> scd0
crw------- 1 coop root 5, 1 Jul 9 06:54 console
....
lrwxrwxrwx 1 root root 4 Jul 9 01:54 dvd -> scd0
lrwxrwxrwx 1 root root 4 Jul 9 01:54 dvdwriter -> scd0
crw------- 1 root root 10, 228 Jul 9 01:54 hpet
crw-r----- 1 root kmem 1, 2 Jul 9 01:54 kmem
crw------- 1 root root 1, 11 Jul 9 01:54 kmsg
crw-r----- 1 root kmem 1, 1 Jul 9 01:54 mem
crwxrwxrwx 1 root root 1, 3 Jul 9 01:54 null
crw-rw---- 1 root root 10, 144 Jul 9 01:54 nvram
brw------- 1 coop disk 11, 0 Jul 9 01:54 scd0
....
brw-r----- 1 root disk 8, 0 Jul 9 01:53 sda
brw-r----- 1 root disk 8, 1 Jul 9 01:53 sda1
brw-r----- 1 root disk 8, 2 Jul 9 06:54 sda2
....
brw-r----- 1 root disk 8, 16 Jul 9 01:53 sdb
brw-r----- 1 root disk 8, 17 Jul 9 01:53 sdb1
brw-r----- 1 root disk 8, 18 Jul 9 01:53 sdb2
....
crw------- 1 coop audio 14, 1 Jul 9 01:54 sequencer
crw------- 1 coop audio 14, 8 Jul 9 01:54 sequencer2
crw-rw-rw- 1 root tty 5, 0 Jul 9 01:54 tty
crw-rw---- 1 root root 4, 0 Jul 9 14:54 tty0
crw------- 1 root root 4, 1 Jul 9 06:54 tty1
cr—r—r-- 1 root root 1, 9 Jul 9 01:53 urandom
....
crw-rw-rw- 1 root root 1, 5 Jul 9 01:54 zero
$ ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 Dec 29 06:40 /dev/sda
brw-rw---- 1 root disk 8, 1 Dec 29 06:40 /dev/sda1
brw-rw---- 1 root disk 8, 2 Dec 29 06:40 /dev/sda2
.......
Los números mayor y menor se muestran en el mismo lugar que el tamaño de archivo al
visualizar archivos normales; en el ejemplo de arriba sería 8, 0, etc. Mientras que los
usuarios finales probablemente no necesitarán referirse explícitamente a los números
mayor y menor (ya que lo harán por nombre), los administradores de sistema podrían
requerir hacerlo de vez e cuando, en caso que el sistema se confunda acerca de los
dispositivos, o si se ha agregado hardware en tiempo de ejecución.
Los números de dispositivo tienen sentido en el espacio de usuario también. Las llamadas
al sistema mknod() y stat() entregan información acerca de los
números mayor y menor.
8.3 udev
Note que mientras los nodos de dispositivo no son archivos normales y no ocupan mucho
espacio en el sistema de archivos, el tener directorios muy grandes disminuye la
velocidad de acceso a los nodos de dispositivo, especialmente en el primer uso. Por otro
lado, el agotamiento de los números mayor y menor disponibles requiere un enfoque más
moderno y dinámico en cuanto a la creación y el mantenimiento de los nodos de
dispositivo.
Lo ideal sería registrar dispositivos por nombre. Sin embargo, no es posible librarse de los
números mayor y menor del todo, debido a que el estándar POSIX los exige (POSIX es
un acrónimo de Interfaz de sistema operativo portable, una familia de estándares
diseñados para asegurar la compatibilidad entre diferentes sistemas operativos).
El método udev crea nodos de dispositivo al vuelo, a medida en que son requeridos. No
hay necesidad de mantener un gran cantidad de nodos de dispositivo que no van a ser
usados nunca. La u en udev viene de usuario e indica que la mayoría del trabajo de
creación, eliminación y modificación de nodos de dispositivo se realiza en el espacio de
usuario.
udev se ejecuta como demonio (ya sea udevd o systemd-udevd) y monitorea un netlink
socket. Cuando dispositivos nuevos son inicializados o removidos, el utilitario uevent del
kernel envía un mensaje a través del socket, el que es recibido por udev, el cual realiza la
acción apropiada para crear o remover entradas de los nodos de dispositivo de acuerdo a
las reglas.
Cuando udev recibe un mensaje desde el kernel acerca de dispositivos que están siendo
añadidos o removidos, analiza los archivos de configuración en /etc/udev/rules.d/*.rules
para determinar si hay reglas que apliquen al dispositivo en cuestión.
Hay dos partes separadas que están definidas en una misma línea:
La primera parte consiste en uno o más pares indicados por == . Estos tratan de
coincidir con los atributos y/o características de un dispositivo a algún valor.
La segunda parte consiste en una o más asignaciones clave-valor, las que asignan
un valor a un nombre, tal como un nombre de archivo, pertenencia a un grupo,
incluso permisos de archivo, etc.
$ cat /etc/udev/conf.d/rules.d/99-fitbit.rules
SUBSYSTEM==”usb”, ATTR{idVendor}==”2687”, ATTR{idProduct}==”fb01”,
SYMLINK+=”fitbit”, MODE=”0666”
$ cat /etc/udev/conf.d/rules.d/98-kexec.rules
SUBSYSTEM==”cpu”, ACTION==”online”, PROGRAM=”/bin/systemctl try-
restart kdump.service”
SUBSYSTEM==”cpu”, ACTION==”offline”, PROGRAM=”/bin/systemctl try-
restart kdump.service”
SUBSYSTEM==”memory”, ACTION==”add”, PROGRAM=”/bin/systemctl try-
restart kdump.service”
SUBSYSTEM==”memory”, ACTION==”remove”, PROGRAM=”/bin/systemctl try-
restart kdump.service”
$ cat 80-kvm.rules
KERNEL==”kvm”, GROUP=”kvm”, MODE=”0666”
$ cat 99-fuse.rules
KERNEL==”fuse”, MODE=”0666”,OWNER=”root”,GROUP=”root”
Objetivos de aprendizaje
Existe una gran variedad de tipos de discos duros; cada uno está caracterizado por el tipo
de bus de datos a través del cual se conecta, como también otros factores como
velocidad, capacidad y cuán bien operan múltiples unidades de forma simultánea.
IDE y EIDE
(Entorno de desarrollo integrado e IDE mejorado)
Estos fueron el estándar en notebooks y PCs de escritorio por años. Sin embargo,
son pequeños y lentos en comparación a hardware más moderno, por lo cual
actualmente están obsoletos; de hecho, los controladores no están disponibles en
máquinas actualizadas.
Los discos SCSI van desde un rango pequeño (bus de 8 bits) a uno amplio (bus de
16 bits), con una tasa de transferencia desde 5MB por segundo (un valor bajo,
correspondiente a dispositivos SCSI estándar) a cerca de 160MB por segundos
(Ultra-Wide SCSI-3).
Los controladores de una sola terminación soportan hasta 7 dispositivos, con una
longitud de cable de cerca de 6 metros. Los controladores diferenciales soportan
hasta 15 dispositivos, con una longitud máxima del cable de unos 12 metros.
USB
Los dispositivos de Bus Universal en Serie incluyen memorias y discos duros
externos USB. El sistema operativo los ve como dispositivos SCSI.
En la misma categoría están las unidades SSD modernas (dispositivos de estado sólido),
las cuales han bajado de precio, no tienen partes movibles, usan menos energía que las
unidades de disco giratorio y tienen velocidades de transferencia más rápidas.
Los SSD internos son instalados de forma similar y en los mismos encapsulados que los
discos convencionales.
La geometría del disco es un concepto con una historia larga para dispositivos giratorios;
se habla de cabezales,cilindros, pistas y sectores.
Para examinar la geometría del disco con fdisk:
Tenga en cuenta que el uso de la opción -l sólo lista la tabla de particiones sin entrar en
modo interactivo.
Los discos giratorios se componen de uno o más platos, cada uno de los cuales es leído
por uno o más cabezales. Los cabezales leen una pista del plato a medida en que el
disco gira.
Actualmente los discos están siendo fabricados con sectores más grandes que 512 bytes;
están disponibles en 4 KB. Mientras que sectores de tamaño más grandes pueden
conducir a velocidades de transferencia mayores, el soporte del sistema operativo no está
listo todavía para lidiar con tamaños grandes.
9.3 Particionamiento
Hay diversas razones que justifican dividir los datos del sistema en múltiples particiones,
incluyendo:
Separación
Es deseable aislar los datos de usuario y aplicaciones de los archivos del sistema
operativo, la mayoría de los cuales son de lectura solamente, excepto durante la
instalación y actualizaciones del sistema. Por ejemplo,/home, que contiene
archivos específicos de los usuarios se suele poner en una partición por separado.
Datos compartidos
Múltiples sistemas operativos o máquinas pueden usar los mismos sistemas de
archivos. Por ejemplo, /home podría estar montado como un directorio compartido
en una red, a través de NFS. O alguien podría tener un sistema de inicio múltiple,
incluso varias versiones de Linux, entre las cuales usted podría desear
compartir/usr/local o /home, por dar un par de ejemplos.
Seguridad
Puede ser deseable imponer diferentes cuotas (espacio en disco), permisos y
ajustes para diferentes partes del sistema.
Tamaño
Algunos datos son más bien constantes y otros variables o volátiles, y a menudo
pueden incrementar su tamaño un poco. Por ejemplo, tales datos variables son
almacenados generalmente en una partición montada en /var. Si la partición se
queda sin espacio disponible, en el caso de estar en una partición por separado
de /, será menos probable que el sistema se bloquee.
Rendimiento
Los datos que tienen que ser leídos con mayor frecuencia, en grandes trozos de
información, serán accedidos más rápidamente si están en un disco rápido (como
los SSD), o en términos anticuados, cercanos al centro del disco, en donde los
tiempos de búsqueda son más cortos.
Intercambio (swap)
Cada entrada en la tabla de partición tiene 16 bytes de largo y describe una de las cuatro
posibles particiones primarias. La información que tiene cada una es la siguiente:
Bit activo
Dirección de inicio en formato cilindro/cabezal/sectores (CHS), lo cual es ignorado
por Linux de todas formas
Código del tipo de partición, indicando: xfs, LVM, ntfs, ext4, swap, etc
Dirección final en CHS (también ignorado por Linux)
Sector de inicio, contando linealmente desde 0
Número de sectores en la partición
Linux usa sólo los últimos dos campos para direccionamiento, utilizando el método de
direccionamiento de bloque lógico (LBA).
El kernel Linux interactúa a bajo nivel con los discos a través de nodos de dispositivos
que normalmente se encuentran en el directorio /dev. Generalmente los nodos de
dispositivos son accedidos sólo a través de la infraestructura del sistema de archivos
virtual del kernel; si se accede de cualquier otra forma a los nodos de dispositivo, es
posible destruir un sistema de archivos completo. Eso es justamente lo que se hace al
formatear una partición, como en el siguiente comando:
Los nodos de dispositivo para discos SCSI y SATA siguen una convención de nombres
simple:
El primer disco duro es /dev/sda.
El segundo disco duro es /dev/sdb.
etc.
En las sentencias de arriba, sd puede ser un disco SCSI o SATA. Cuando aún se
encontraban discos IDE, eran llamados /dev/hda3, /dev/hdb , etc.
El comando ls -l /dev mostrará los nodos de dispositivo disponibles.
Para dispositivos SCSI necesitamos elaborar un poco más en lo que se entiende por
primer disco duro, segundo, etc. Estos están determinados por la combinación del número
ID/número del controlador.
La designación de la unidad (a, b, c, etc.) está basada principalmente en el número de ID
del dispositivo SCSI en vez de su posición en el bus mismo.
Por ejemplo, si tuviéramos dos controladoras SCSI, uno con ID 1 y otro con ID 3 en la
controladora 0; uno con ID 2 y otro con ID 5 en la controladora 1 (note que el ID 2 está en
la última unidad):
ID 1 sería /dev/sda
ID 3 sería /dev/sdb
ID 2 (en la controladora 1) sería /dev/sdc
ID 5 sería /dev/sdd
blkid es una utilidad para localizar dispositivos de bloque y entregar información acerca
de sus atributos. Funciona con la biblioteca libblkid. Puede tomar como argumento un
dispositivo en particular o una lista.
dev/sda: PTTYPE=”dos”
/dev/sda10: UUID=”JQshRp-Jxa5-0oiC-X1Oe-si8d-lRQD-48aYNt”
TYPE=”LVM2_member”
/dev/sda3: PTTYPE=”dos”
/dev/sda6: UUID=”YJ2PA3-GSsm-m9rH-XNUM-Ca2X-fkju-OYtiO8”
TYPE=”LVM2_member”
/dev/sda8: UUID=”NdnbYk-ACCB-9UTX-i3kc-rK0m-Fbht-KjJZwP”
TYPE=”LVM2_member”
/dev/sda9: UUID=”CMc2EP-ijCM-jA8V-ZH5M-B6AA-z0TD-ILMFFE”
TYPE=”LVM2_member”
blkid funcionará solamente en dispositivos que contienen datos, es decir, una partición
vacía no generará un identificador de bloque UUID. blkid tiene dos formas principales de
operación: ya sea buscando un dispositivo con un par específico NOMBRE=valor, o
desplegando pares de NOMBRE=valor para uno o más dispositivos.
Aunque si bien es cierto es posible correr Linux con sólo la partición raíz, la
mayoría de los sistemas usan más particiones para realizar respaldos de forma
más fácil, usar de forma más eficiente las unidades de disco e implementar una
mejor seguridad.
El área de intercambio es usado como memoria virtual; cuando las páginas de procesos
son movidas fuera de la memoria física, generalmente son almacenadas en el área de
intercambio.
Note que los comandos mencionados copiarán solamente la tabla de partición primaria;
no se harán cargo de cualquier tabla de partición que esté almacenada en otras
partitiones (como particiones extendidas, por ejemplo).
Nota: usted debería asumir que modificar la tabla de partición del disco podría eliminar
toda la información de todos los sistemas de archivos en el disco (no debería, pero es
mejor ser precavido). Por lo tanto, siempre es prudente realizar una copia de seguridad de
toda la información antes de realizar cualquier trabajo de este tipo.
En particular, es necesario ser cuidadoso al usar dd: un error simple de tipeo o una opción
usada erróneamente podría destruir la información completa del disco, ¡en cualquier caso
lo mejor es hacer respaldos!
Hay una serie de utilidades que pueden ser usadas para modificar las tablas de partición:
fdisk Es un editor de tabla de particiones que tiene un menú. Es el más estándar y
uno de los editores más flexibles. Esta es la única herramienta de este tipo que
discutiremos.
Muchas distribuciones Linux tienen una versión Live CD que se puede ejecutar ya sea
desde un CDROM o un dispositivo USB. Esos medios suelen incluir una copia de gparted,
por lo cual puede ser usado fácilmente como una herramienta gráfica de particionamiento
en discos que no están siendo utilizados.
Note que gparted puede realizar muchas operaciones más que sólo agregar y eliminar
particiones (y las demás operaciones que realiza fdisk), como asignar el tipo de partición.
Es posible mover, redimensionar y formatear particiones, lo cual implica entender los
detalles de diversos tipos de sistemas de archivos. Lo anterior va mucho más lejos de las
funciones esenciales de un editor de particiones.
Si bien es cierto que esto es muy útil, es difícil hacerlo bien y los errores pueden tener
consecuencias serias. Por lo anterior, se recomienda ir a la línea de comandos y realizar
cada una de estas operaciones por separado, con herramientas de bajo nivel (como
fdisk). De hecho Red Hat Enterprise Linux ya no soporta gparted.
fdisk estará incluido siempre en toda instalación de Linux, por lo cual es buena idea
aprender a usarlo. Usted debe ser root para ejecutar fdisk. Puede ser algo complejo de
usar y se recomienda hacerlo con precaución.
$ sudo partprobe -s
para tratar de leer la tabla de partición modificada. Sin embargo, esto no siempre funciona
de manera confiable y lo mejor es reiniciar antes de formatear particiones nuevas y
realizar otras operaciones, ya que mezclar particiones o sobreponer una en otra puede
ser catastrófico.
En cualquier momento es posible ejecutar el siguiente comando:
$ cat /proc/partitions
Para los propósitos de los ejercicios en este curso usted necesitará espacio en disco sin par/cionar.
No es necesario que sea de gran tamaño, uno o dos GB es su.ciente.
Si está usando su máquina na/va y no /ene espacio disponible, va a tener que encoger una
par/ción y el sistema de archivos en ella (esto úl/mo se debe realizar primero), y luego disponer
de ella usando gparted y/o los pasos que tratamos en la sección de manejo de par/ciones.
También puede usar el mecanismo loop device con o sin el programa parted program, como lo
haremos en los primeros dos ejercicios en esta sección.
Si /ene espacio Osico sin par/cionar usted no necesita realizar el procedimiento que se describe a
con/nuación, sin embargo, aún es un ejercicio de aprendizaje muy ú/l.
Vamos a crear un archivo que será usado como contenedor de una imagen de par/ción del disco
duro, y para todos los propósitos puede u/lizarse como una par/ción real. En el siguiente ejercicio
mostraremos cómo poner más de una par/ción en ella y cómo usarlo como si fuera un disco
completo.
1. Crear un archivo lleno de ceros de 1 GB de tamaño:
$ mkfs.ext4 image.le
mke2fs 1.42.9 (28-Dec-2013)
image.le is not a block special device.
Proceed anyway? (y,n) y
Discarding device blocks: done
.....
$ mkdir mntpoint
$ sudo mount -o loop image.le mntpoint
Revisaremos losetup en un ejercicio más adelante. Puede usar /dev/loop[0-7] pero tenga cuidado
de que no estén en uso actualmente.
Si bien es cierto que usar un disposi/vo de /po loop en vez de una par/ción real puede ser ú/l,
debe saber que es es bastante inú/l para propósitos de realizar cualquier /po de benchmarking.
Esto se debe a que está poniendo una capa de sistema de archivos sobre otra, lo cual tendrá un
efecto nega/vo en el rendimiento. Por lo anterior, cualquier juicio al respecto va a estar basado en
cómo se comporta un sistema de archivos arriba de otro.
El siguiente paso consiste en dividir el archivo de contenedor en múl/ples par/ciones, cada uno de
los cuales puede ser usado para almacenar un sistema de archivos o un área de intercambio.
Usted puede reu/lizar el archivo de imagen creado en el ejercicio previo o puede crear uno nuevo.
1. Ejecute fdisk en su archivo de imagen:
Changes will remain in memory only, un/l you decide to write them.
Par//on number (1-4, default 1): 1 First sector (2048-2097151, default 2048):
Using default value 2048
Par//on type:
Syncing disks.
Si bien esta ha sido una buena prác/ca, aún no hemos visto una forma de u/lizar las
par/ciones que creamos recién. En el próximo ejercicio vamos a ver una forma que nos
permi/rá hacerlo.
Es de nuestro interés que usted lea las páginas man de losetup y parted antes de realizar los
procedimientos que vienen a con/nuación.
Una vez más, usted puede reu/lizar el archivo de imagen, o mejor a´un, recrearlo para comenzar
con un archivo nuevo.
1. Asocie el archivo de imagen con un disposi/vo loop:
$ losetup -f
/dev/loop1
$ sudo losetup /dev/loop1 image.le
Donde el primer comando encuentra el primer disposi/vo loop libre. La razón para hacer esto es
que su sistema podría estar usando uno o más disposi/vos loop. Lo siguiente es ejecutado como
ejemplo en un sistema de pruebas, antes de crear el disposi/vo loop:
$ losetup -a
/dev/loop0: []: (/usr/src/KERNELS.sqfs)
Nota: la salida del comando anterior puede variar en función de la distribución. Si ignoráramos lo
anterior y ejecutamos losetup en /dev/loop0 probablemente corromperiaamos el archivo.
$ fdisk -l /dev/loop1
Disk /dev/loop1: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/op/mal): 512 bytes / 512 bytes
Disk label type: dos
Disk iden/.er: 0x00050c11
$ ls -l /dev/loop1*
brw-rw---- 1 root disk 7, 1 Oct 7 14:54 /dev/loop1
brw-rw---- 1 root disk 259, 0 Oct 7 14:54 /dev/loop1p1
brw-rw---- 1 root disk 259, 3 Oct 7 14:54 /dev/loop1p2
brw-rw---- 1 root disk 259, 4 Oct 7 14:54 /dev/loop1p3
los que u/lizaremos a con/nuación. Sin embargo, en RHEL 6 los nodos no aparecerán. En
cambio, es necesario hacer lo siguiente:
$ sudo kpartx -lv /dev/loop1
$ sudo kpartx -av /dev/loop1
$ ls -l /dev/mapper/loop1*
lrwxrwxrwx 1 root root 7 Oct 9 07:12 /dev/mapper/loop1p1 -> ../dm-8
lrwxrwxrwx 1 root root 7 Oct 9 07:12 /dev/mapper/loop1p2 -> ../dm-9
lrwxrwxrwx 1 root root 8 Oct 9 07:12 /dev/mapper/loop1p3 -> ../dm-10
para asociar los nodos de disposi/vo con las par/ciones. En lo que sigue puede reemplazar
/dev/loop1p[1-3] con los nombres reales bajo /dev/mapper, o incluso más fácil, puede hacer
esto:
$ sudo ln -s /dev/mapper/loop1p1 /dev/loop1p1
$ sudo ln -s /dev/mapper/loop1p2 /dev/loop1p2
$ sudo ln -s /dev/mapper/loop1p3 /dev/loop1p3
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 29G 8.5G 19G 32% /
....
/dev/loop1p1 ext3 233M 2.1M 219M 1% mnt1
/dev/loop1p2 ext4 233M 2.1M 215M 1% mnt2
/dev/loop1p3 vfat 489M 0 489M 0% mnt3
8. Una vez que ha terminado de u/lizar los sistemas de archivos puede deshacer lo realizado con:
Si usted /ene un disco duro real con espacio disponible y que no está par/cionado, experimente
con fdisk para crear par/ciones nuevas, ya sean primarias o lógicas con una par/ción extendida.
Escriba la tabla de par/ciones nueva al disco y luego formatee y monte las par/ciones recién
creadas.
Los sistemas de archivos pueden ser cifrados para proteger la información de accesos
no autorizados y de intentos de corromper los datos que contienen. El cifrado puede ser
elegida en la instalación o ser incorporada más tarde. Las distribuciones de Linux usan a
menudo el método LUKS y llevan a cabo tareas de cifrado usando la herramienta
cryptsetup.
Objetivos de aprendizaje
Al final del capítulo usted debería ser capaz de:
Proveer buenas razones para el uso de cifrado y saber cuándo se requiere.
Entender cómo opera LUKS a través del uso de cryptsetup.
Ser capaz de configurar y usar particiones y sistemas de archivos cifrados.
Saber cómo configurar el sistema para montar particiones cifradas en el arranque.
El cifrado de datos debería ser usado en cualquier lugar en donde hay información
sensible que está siendo almacenada y transmitida. La configuración y el uso de cifrado a
nivel de dispositivo de bloque es una de las protecciones más robustas contra los daños
producidos por pérdida o compromiso de información contenida en discos duros y otros
medios.
10.2 Luks
LUKS está basado en cryptsetup, una herramienta potente que también puede usar
otros métodos como volúmenes dm-crypt (planos), loop-AES y formato compatible
con TrueCrypt. No vamos a discutir esas alternativas, ya que LUKS es el método
estándar y usado más a menudo en Linux (fue diseñado originalmente para Linux, pero
también ha sido exportado a otros sistemas operativos).
El módulo del kernel dm-crypt usa la infraestructura de device mapper del kernel, la cual
es usada también de forma importante en LVM, lo cual veremos más adelante.
LUKS también puede ser usado para cifrar particiones de intercambio de forma
transparente.
10.3 crypsetup
Básicamente, todo se realiza con el programa cryptsetup. Una vez que los volúmenes han
sido cifrados, pueden ser montados y desmontados con las utilidades normales.
La sintaxis común de un comando es la siguiente:
cryptsetup [OPTION...] <action> <action-specific>
y una lista con todas las opciones puede ser generada con:
$ cryptsetup –help
Se le pedirá ingresar una contraseña, la cual tendrá que usar para abrir el volumen cifrado
más tarde. Note que tendrá que hacer esto una vez solamente, durante la configuración
del cifrado.
Usted podría enfrentar ciertas dificultades si el kernel del sistema no soporta el método de
cifrado que usa cryptsetup por defecto. En ese caso usted puede
examinar /proc/crypto para ver los métodos que soporta el sistema, y luego especificar
uno, como se muestra a continuación:
Y montarlo:
A partir de este momento usted dispone de una partición sin cifrar montada en /mnt, con
la cual puede trabajar a su gusto. Cuando haya terminado de realizar las tareas en
cuestión, la puede desmontar de la siguiente forma:
luego remueva la asociación mapper por el momento (siempre podrá usar la partición
nuevamente):
Para montar una partición cifrada en el arranque hay que satisfacer dos condiciones:
1. Agregar una línea apropiada en /etc/fstab. No hay nada de especial en esta línea
y no se refiere al cifrado en ningún sentido.
2. Agregar una entrada a /etc/crypttab. Puede ser tan simple como esto:
SECRET /dev/mapper/MYSECRET
Usted puede hacer otras cosas en este archivo, como especificar la contraseña si no
desea ingresarla en el arranque (lo cual sería contraproducente para la seguridad del
sistema). Haga man crypttab para ver todo lo que puede hacer con este archivo.
En este ejercicio usted cifrará una par/ción en el disco para proveer de seguridad en caso de que
su disco duro o portá/l es robado. Revisar la documentación de cryptsetup antes de comenzar es
una buena idea (man cryptsetup y cryptsetup—help).
1. Cree una par/ción nueva para el disposi/vo de bloque cifrado con fdisk. Asegúrese que el
kernel está al tanto de la nueva tabla de par/ción. Un reinicio lo logrará, pero hay otros
métodos también.
2. Formatee la par/ción con cryptsetup usando LUKS para la capa de cifrado.
3. Cree la clave para abrir el disposi/vo de bloque cifrado.
4. Agregue una entrada a /etc/cryp@ab para que el sistema pregunte la clave en el reinicio.
5. Formatee el sistema de archivos con ext4.
6. Cree un punto de montaje para el sistema de archivos nuevo, por ejemplo /secret.
7. Agregue una entrada a /etc/fstab para que el sistema sea montado en el arranque.
8. Intente montar el sistema cifrado.
9. Reinicie y valide la con.guración completa.
Cree una par/ción nueva (en el ejemplo trabajaremos con /dev/sda4) y luego ejecute:
$ sudo partprobe -s
para que el sistema relea la tabla de par/ción modi.cada, o reinicie (lo cual es lejos lo más
seguro).
Nota: Si no puede usar una par/ción real, use el método descrito en el capítulo anterior
para trabajar con un disposi/vo loop o un archivo de imagen.
secret-disk /dev/sda4
$ sudo mount –a
9. Reinicie.
El proceso de cifrado es similar al del ejercicio previo, con la excepción de que no crearemos un
sistema de archivos en este disposi/vo de bloques cifrado.
En este caso vamos a usar el área de intercambio existente; primero la desac/varemos y luego
formateada para el uso como área de intercambio cifrada. Podrá ser un poco más seguro usar una
par/ción nueva, o también usar la par/ción que creó en el ejercicio previo. Al .nal explicaremos
qué hacer en caso de que tenga problemas para restablecer el sistema al punto original.
Vamos a discu/r la administración del área de intercambio en un capítulo posterior, pero de todas
formas mostraremos algunos comandos para trabajar con esta componente.
Una vez que haya terminado, puede volver a la par/ción original sin cifrar ejecutando el comando
mkswap en el disposi/vo.
1. Determine cuál es la par/ción que está usando actualmente para el área de intercambio y
desacmvela:
$ cat /proc/swaps
2. Realice los mismos pasos del ejercicio anterior para con.gurar el cifrado:
Los sistemas Linux son capaces de usar una amplia variedad de sistemas de archivos.
Esta versatilidad se consigue a través de la capa de abstracción del Sistema de Archivos
Virtual (VFS), la cual se sitúa entre el software y el sistema de archivos en el disco. Los
sistemas de archivos transaccionales avanzados se han convertido en el estándar en las
distribuciones empresariales.
Objetivos de aprendizaje
Los programas necesitan leer y escribir archivos, en vez de tener que lidiar con los
lugares físicos en el hardware en el cual los archivos están almacenados.
Los archivos y sus nombres son una abstracción de la capa física de E/S. Escribir en el
disco de forma directa(ignorando la capa del sistema de archivos) es muy peligroso y se
realiza sólo por programas de bajo nivel del sistema operativo, nunca por una aplicación
de usuario.
Los sistemas de archivos locales generalmente residen en una partición de disco, la cual
puede ser una partición física en un disco o una partición lógica controlada por un Logical
Volume Manager (LVM). Los sistemas de archivos también pueden estar en la red, de tal
forma que el encapsulado físico queda totalmente oculto al sistema local.
Todos los sistemas Linux usan una jerarquía de árbol invertido del directorio raíz (/).
Mientras que todo el árbol puede estar contenido en un sistema de archivos local en una
partición, usualmente hay varias particiones (o sistemas de archivos de red) trabajando de
forma unida en los puntos de montaje. Estos también pueden incluir medios extraíbles
como dispositivos USB, discos ópticos, etc.
Cada uno de los elementos montados en el árbol puede tener su propio tipo de sistema
de archivos. Pero ante las aplicaciones y el sistema operativo se muestra como una una
sola estructura de árbol unificado.
Linux implementa un Virtual File Sistem (VFS), sistema de archivos virtual), como lo
hacen todos los sistemas operativos modernos. Cuando una aplicación necesita acceder
a un archivo, ésta interactúa con la capa de abstracción del VFS, el cual traduce todas las
llamadas E/S (operaciones de lectura/escritura, etc) en código específico relacionado con
el sistema de archivos real en particular.
De esta forma, tanto el sistema de archivos real como el medio físico y hardware sobre el
cual reside, no necesitan ser considerados por las aplicaciones. Por otro lado, los
sistemas de archivos de red (como NFS) pueden ser manejados de forma transparente.
Esto permite a Linux trabajar con una variedad de sistemas de archivos mayor que
cualquier otro sistema operativo. Este atributo ha sido un factor importante en su éxito.
btrfs es el sistema de archivos con journaling más nuevo y todavía está bajo un
desarrollo fuerte y rápido.
Usted puede ver una lista de los tipos de sistemas de archivos soportados por el
kernel Linux en ejecución con el siguiente comando:
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cgroup
nodev cpuset
nodev tmpfs
nodev devtmpfs
nodev binfmt_misc
nodev debugfs
nodev sockfs
nodev pipefs
nodev devpts
squashfs
nodev hugetlbfs
iso9660
nodev mqueue
ext3
ext2
ext4
fuseblk
nodev fuse
nodev fusectl
nodev autofs
nodev rpc_pipefs
nodev nfsd
Note que para algunos tipos de sistemas de archivos adicionales, el código de soporte
puede ser cargado sólo cuando el sistema trata de acceder la partición que los contiene.
Linux hace un uso amplio de sistemas de archivos especiales para ciertas tareas.
Estos son particularmente útiles para acceder varias estructuras de datos y ajustes de
rendimiento del kernel, o para implementar funciones específicas.
tmpfs es uno de muchos sistemas de archivos especiales usados en Linux. Algunos de estos no son
usados realmente como sistemas de archivos, pero toman ventaja de la capa de abstracción que
poseen. Sin embargo, tmpfs es un sistema de archivos real sobre el cual las aplicaciones pueden
realizar operaciones de E/S.
Esencialmente, tmpfs opera como ramdisk; reside completamente en memoria. Pero /ene algunas
caracterís/cas interesantes que las implementaciones convencionales y an/guas de ramdisk no
tenían:
1. El sistema de archivos ajusta su tamaño ( The .lesystem adjusts its size (y por lo tanto la
memoria que se usa) dinámicamente; parte en cero y se expande tanto como sea
necesario hasta el tamaño máximo de la par/ción en la que está montada.
2. Si la RAM se agota, tmpfs puede u/lizar espacio del área de intercambio. De todas formas
no es posible poner más en el sistema de archivos de la capacidad máxima que soporta.
3. tmpfs no requiere tener un sistema de archivos normal, tales como ext3 o vfat; posee sus
métodos propios para lidiar con archivos y operaciones de E/S, los cuales están conscientes
de que es sólo espacio en memoria (y que en realidad no es un disposi/vo de bloque), y
como tal está op/mizado para velocidad. Por lo tanto no hay necesidad de preformatear el
sistema de archivos con el comando mkfs ; simplemente hay que montarlo y usarlo.
Monte una instancia nueva de tmpfs en cualquier lugar en su estructura de directorios, con un
comando como el siguiente:
$ sudo mkdir /mnt/tmpfs
$ sudo mount -t tmpfs none /mnt/tmpfs
Prác/camente todas las distribuciones modernas de Linux montan una instancia de tmpfs en
/dev/shm:
$ df -h /dev/shm
Filesystem Type Size Used Avail Use% Mounted on
Tmpfs tmpfs 3.9G 24M 3.9G 1% /dev/shm
Muchas aplicaciones hacen esto en casos como cuando se usa memoria compar/da POSIX como
un mecanismo de comunicación interprocesos. Cualquier usuario puede crear, leer y escribir
archivos en /dev/shm, por lo que es un buen lugar para crear archivos temporales en memoria.
Cree algunos archivos en /dev/shm y observe con df cómo el sistema de archivos se va llenando.
Adicionalmente, muchas distribuciones montan instancias múl/ples de tmpfs; por ejemplo, se
observa lo siguiente en un sistema RHEL 7:
$ df -h | grep tmpfs
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 24M 3.9G 1% /dev/shm
tmpfs tmpfs 3.9G 9.2M 3.9G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/tmp/vmware-coop/564d9ea7-8e8e-29c0-2682-e5d3de3a51d8 tmpfs 3.3G 0 3.3G 0%
/tmp/vmware-coop/564d9ea7-8e8e-29c0-2682-e5d3de3a51d8 /tmp/vmware-
coop/564d7668-ec55-ee45-f33e-c8e97e956190 tmpfs 2.3G 2.0G 256M 89%
/tmp/vmware-coop/ 564d7668-ec55-ee45-f33e-c8e97e956190
Note que el comando anterior fue ejecutado en un sistema con 8GB de RAM, por lo cual usted
probablemente no tendrá todos esos sistemas de archivos tmpfs usando los 4 GB con los cuales
han sido asignados.
Algunas distribuciones como Fedora podrían montar por defecto /tmp como un sistema tmpfs; en
estos casos uno podría evitar poner archivos grandes en /tmp para que el sistema no se quede sin
memoria. Otra posibilidad es deshabilitar ese comportamiento, como se mencionó anteriormente
al describir /tmp.
Objetivos de aprendizaje
Nota: los nombres de los archivos no se almacenan en el inodo asociado al archivo, sino
que lo hacen en el archivo de directorio.
Toda la actividad E/S concerniente a un archivo usualmente involucra el inodo del archivo
como información que debe ser actualizada.
Note que hay otros atributos que se pueden configurar: al ejecutar man chattr se
mostrará la lista completa. El formato para chattr es el siguiente:
$ lsattr filename
Cada tipo de sistema de archivos tiene una herramienta para formatear un sistema de
archivos en una partición. El nombre genérico para esas utilidades es mkfs. Sin embargo
es sólo una interfaz para los programas del sistema de archivos específico:
$ ls -lh /sbin/mkfs*
rwxr-xr-x 1 root root 11K Apr 10 03:50 /sbin/mkfs
-rwxr-xr-x 1 root root 181K Oct 15 2012 /sbin/mkfs.btrfs
-rwxr-xr-x 1 root root 26K Apr 10 03:50 /sbin/mkfs.cramfs
-rwxr-xr-x 5 root root 68K Jul 16 15:31 /sbin/mkfs.ext2
-rwxr-xr-x 5 root root 68K Jul 16 15:31 /sbin/mkfs.ext3
-rwxr-xr-x 5 root root 68K Jul 16 15:31 /sbin/mkfs.ext4
-rwxr-xr-x 5 root root 68K Jul 16 15:31 /sbin/mkfs.ext4dev
lrwxrwxrwx 1 root root 7 Dec 6 2011 /sbin/mkfs.msdos -> mkdosfs
lrwxrwxrwx 1 root root 12 Sep 28 2011 /sbin/mkfs.nSs -> /sbin/mknSs
lrwxrwxrwx 1 root root 7 Dec 6 2011 /sbin/mkfs.vfat -> mkdosfs
Cada tipo de sistema de archivos tiene una utilidad diseñada para verificar errores (y en lo
posible repararlos, en caso que se encuentren). El nombre genérico para esas
herramientas es fsck. Sin embargo esto es sólo una interfaz para los programas
específicos de cada sistema de archivos:
$ ls -l /sbin/fsck*
-rwxr-xr-x 1 root root 34680 Apr 10 03:50 /sbin/fsck
-rwxr-xr-x 1 root root 15976 Apr 10 03:50 /sbin/fsck.cramfs
rwxr-xr-x 5 root root 197352 Jul 16 15:31 /sbin/fsck.ext2
-rwxr-xr-x 5 root root 197352 Jul 16 15:31 /sbin/fsck.ext3
-rwxr-xr-x 5 root root 197352 Jul 16 15:31 /sbin/fsck.ext4
-rwxr-xr-x 5 root root 197352 Jul 16 15:31 /sbin/fsck.ext4dev
lrwxrwxrwx 1 root root 7 Dec 6 2011 /sbin/fsck.msdos -> dosfsck
lrwxrwxrwx 1 root root 13 Sep 28 2011 /sbin/fsck.ntfs ->
../bin/ntfsck
lrwxrwxrwx 1 root root 7 Dec 6 2011 /sbin/fsck.vfat -> dosfsck
El archivo /forcefsck desaparecerá luego de que la verificación sea exitosa. Esta forma
de verificación es muy útil, ya que permite ejecutar fsck en el sistema de archivos root, lo
cual es muy difícil de realizar en un sistema que está corriendo.
Es posible controlar si los errores encontrados deben repararse uno a uno manualmente
con la opción -r, o automáticamente de la mejor forma posible usando la opción -a.
Adicionalmente, cada tipo de sistema de archivo puede tener sus propias opciones
particulares que pueden ser configuradas al momento de la verificación.
Note que los sistemas de archivos con journaling son mucho más rápidos para verificar
que los sistemas de archivos de generaciones anteriores por dos razones:
Incluso si uno verifica el estado del sistema de archivos completo, los sistemas de
archivos nuevos han sido diseñados con fsck rápido; de hecho los sistemas de
archivos antiguos no consideraron este tema cuando fueron diseñados, debido a
que los tamaños eran mucho más pequeños.
Para ver los detalles de los programas fsck.* vea la página man de cada uno.
Todos los archivos accesibles en Linux están organizados en una gran estructura de
árbol jerárquica con la parte superior del mismo en el directorio root ( / ). Sin embargo, es
común tener más de una partición (cada una de las cuales puede tener su propio tipo de
sistema de archivos), las que trabajan juntas en el mismo árbol de sistema de archivos.
Estas particiones pueden estar en diferentes dispositivos físicos, o incluso localizadas en
una red.
Cada sistema de archivos es montado bajo un directorio específico, como en el caso que
se muestra a continuación:
El sistema de archivos está localizado en una partición específica del disco duro
(/dev/sdb4).
Cualquier archivo que esté en el directorio original /home estará oculto hasta que
la partición se desmonte.
Las etiquetas son asignadas por utilidades específicas de cada tipo de sistema de
archivos, tal como e2label. Los UUIDs se asignan cuando las particiones son creadas
como contenedores para el sistema de archivos.
Mientras cualquiera de estos tres métodos para especificar el dispositivo puede ser
usado, los sistemas modernos desestiman el uso del nodo de dispositivo debido a que los
nombres pueden cambiar de acuerdo a cómo el sistema arranca, qué discos duros son
encontrados primero, etc. Las etiquetas son una mejora, pero en raras ocasiones se
podría tener dos particiones que se muestran con la misma etiqueta. Los UUIDs, sin
embargo, siempre deberían ser únicos y son creados cuando las particiones se crean.
mount tiene muchas opciones, algunas genéricas como -a (lo cual monta todos los
sistemas de archivos mencionados en /etc/fstab) y muchas que son específicas al sistema
de archivos; de hecho, mount tiene una página man muy larga. Un ejemplo común sería
el siguiente:
$ mount—help
Usage:
mount [-lhV]
mount -a [options]
mount [options] [--source] <source> | [--target] <directory>
mount [options] <source> <directory>
mount <operation> <mountpoint> [<target>]
Options:
-a, --all mount all filesystems mentioned in fstab
-c, --no-canonicalize don’t canonicalize paths
-f, --fake dry run; skip the mount(2) syscall
-F, --fork fork off for each device (use with -a)
-T, --fstab <path> alternative file to /etc/fstab
-h, --help display this help text and exit
-i, --internal-only don’t call the mount.<type> helpers
-l, --show-labels lists all mounts with LABELs
-n, --no-mtab don’t write to /etc/mtab
-o, --options <list> comma-separated list of mount options
-O, --test-opts <list> limit the set of filesystems (use with -a)
-r, --read-only mount the filesystem read-only (same as -o ro)
-t, --types <list> limit the set of filesystem types—source <src>
explicitly specifies source (path, label, uuid)
--target <target> explicitly specifies mountpoint
-v, --verbose say what is being done
-V, --version display version information and exit
-w, --rw, --read-write mount the filesystem read-write (default)
-h, --help display this help and exit
-V, --version output version information and exit
.....
Durante el arranque del sistema se ejecuta el comando mount -a. Esto monta todos los
sistemas de archivos listados en el archivo de configuración /etc/fstab. Las entradas
pueden referirse a sistemas de archivos locales o remotos, montados a través de la red.
A continuación hay un ejemplo mostrando cómo montar todos los sistemas de archivos
listados en el archivo de configuración /etc/fstab durante el arranque del sistema:
$ cat /etc/fstab
LABEL=RHEL6-64 / ext4 defaults 1 1
LABEL=RHEL6-32 /RHEL6-32 ext4 defaults 1 2
LABEL=boot /boot ext3 defaults 1 2
....
LABEL=local /usr/local ext4 defaults 1 2
LABEL=tmp /tmp ext4 defaults 1 2
LABEL=src /usr/src ext4 defaults 1 2
LABEL=VIRTUAL /VIRTUAL ext4 defaults 1 2
LABEL=BEAGLE /BEAGLE ext4 defaults 1 2
/dev/sda1 /c ntfs-3g uid=500,gid=500 0 0
/teaching/FTP/LFT /var/ftp/pub2 none bind 0 0
laptop:/share /share nfs defaults 0 0
LABEL=SWAP swap swap defaults 0 0
Tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=6200 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
Este archivo muestra qué sistemas de archivos serán montados en el arranque y dónde
pueden encontrarse en el sistema local o en la red. Puede especificar quién podría
montarlos y con qué permisos, y otras opciones relevantes. Algunas de esas líneas se
refieren a seudosistemas de archivos especiales como proc, sys y devpts.
Cada registro en el archivo contiene campos separados por espacios en blanco, listando
lo siguiente:
en vez de
$ sudo mount LABEL=src /usr/src
Solución 12.1
1. $ cd /tmp
$ touch appendit
$ ls -l appendit
Una vez que esté listo puede volver a la situación original removiendo la entrada desde /etc/fstab.
A veces partprobe no funciona y para asegurarse de que el sistema esté al tanto de la par/ción
nueva es necesario reiniciar.
2. $ sudo mkfs -t ext4 -v /dev/sda11
$ sudo mkfs -t ext4 -b 2048 -v /dev/sda11
$ sudo mkfs -t ext4 -b 4096 -v /dev/sda11
Note que el parámetro -v (reporte detallado) le proveerá la información requerida; verá que
para una par/ción pequeña como está el valor por defecto es de 1024 bloques de byte.
Será adver/do en relación a que este es un archivo y no una par/ción, sólo siga adelante.
Note que el parámetro -v (reporte detallado) le proveerá la información requerida; verá que
para una par/ción pequeña como esta el valor por defecto es de 1024 bloques de byte.
3. $ sudo mkdir /mnt/tempdir
$ sudo mount -o loop /tmp/image.le /mnt/tempdir
$ mount | grep tempdir
Objetivo de aprendizaje
Tal movimiento en el área de intercambio sea realiza usualmente a una o más particiones
o archivos; Linux permite múltiples áreas de intercambio, por lo cual las necesidades
pueden ser ajustadas dinámicamente. Cada área tiene una prioridad asociada; las de
prioridad baja no son utilizadas hasta que otras de prioridad mayor están llenas.
En la mayoría de los casos el tamaño recomendado de intercambio es el total de RAM en
el sistema. Es posible ver lo que el sistema está usando actualmente en las áreas de
intercambio de la siguiente forma:
$ cat /proc/swaps
Filename Type Size Used
Priority
/dev/sda9 partition 4193776 0
-1
/dev/sdb6 partition 4642052 0
-2
$ free -o
Los únicos comandos que implican el área de intercambio son los siguientes:
Vale la pena señalar que en Linux la memoria que usa el kernel, de forma opuesta a la
memoria de aplicaciones y a diferencias de otros sistemas operativos, nunca se traslada
al área de intercambio.
13.2 Cuotas
Linux puede usar y aplicar cuotas en sistemas de archivos. Las cuotas de disco les
permite a los administradores controlar el espacio máximo que usuarios o grupos en
particular tienen habilitados para su uso. Se permite una flexibilidad considerable y las
cuotas pueden ser asignadas en base a cada sistema de archivos. Se provee de
protección para que los usuarios no agoten los recursos colectivos.
Las siguientes herramientas permiten controlar las cuotas:
quotacheck: genera y actualiza los archivos que llevan la cuenta de las cuotas
Para crear una cuota de sistema de archivos hay que asegurarse de haber montado el
sistema de archivos con las opciones de cuotas de usuario y/o grupo. Sin eso nada
funcionará. Los pasos básicos son los siguientes:
Montar el sistema de archivos con las opciones de cuota de usuario y/o grupo:
- Agregar las opciones usrquota y/o grpquota a la entrada del sistema de
archivos en /etc/fstab
Por lo tanto, para crear una cuota de sistema de archivos primero hay que asegurarse de
haber montado el sistema de archivos con las opciones de cuota para usuarios y/o
grupos. Recuerde que sin ellos no va a funcionar.
Primero es necesario agregar las opciones correctas en el archivo /etc/fstab, como se
muestra a continuación:
/dev/sda5 /home ext4 defaults,usrquota 1 1
donde hemos asumido que /home está en una partición dedicada.
Luego realice un test con los siguientes comandos:
Usted también podría querer configurar períodos de gracia con edquota. Las opciones
de montaje que deberían ser usadas en el archivo /etc/fstab son usrquota para cuotas
de usuario y grpquota para cuotas de grupo.
La herramienta quotacheck crea y actualiza los archivos que llevan la cuenta de las
cuotas (aquota.user y aquota.group) en el sistema de archivos.
Para actualizar los archivos de usuarios para todos los sistemas de archivos
en /etc/fstab con opciones de cuota de usuario, haga lo siguiente:
Para actualizar los archivos de grupo para todos los sistemas de archivos
en /etc/fstab con opciones de cuota de grupo, haga lo siguiente:
quotaon se usa para habilitar las cuotas en el sistema de archivos; quotaoff se usa para
deshabilitarlas. Los comandos anteriores se usan de la siguiente forma:
Note que estos dos programas son realmente uno y funcionan de acuerdo al nombre con
el cual son invocados.
Por ejemplo:
Por ejemplo:
$ sudo quota
Disk quotas for user user1 (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda5 837572 500 1000 5804 0 0
El tercer y cuarto comandos son útiles para ser incluidos en scripts, con el fin de crear
cuentas nuevas y configurar cuotas para ellas.
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda5 ext4 9.8G 8.1G 1.3G 87% /
tmpfs tmpfs 3.9G 2.3M 3.9G 1% /dev/shm
/dev/sda6 ext4 9.8G 5.0G 4.3G 54% /RHEL6-32
/dev/sda2 ext4 380M 3.2M 353M 1% /boot_master
/dev/mapper/VG-local ext4 24G 16G 7.2G 68% /usr/local
/dev/mapper/VG-src ext4 16G 6.4G 8.6G 43% /usr/src
/dev/mapper/VG-pictures
ext4 12G 8.9G 2.3G 80% /PICTURES
/dev/mapper/VG-dead ext4 59G 35G 22G 62% /DEAD
/dev/mapper/VG-virtual
ext4 222G 162G 49G 77% /VIRTUAL
/dev/mapper/VG-iso_images
ext4 59G 35G 21G 63% /ISO_IMAGES
/usr/src/KERNELS.sqfs
squashfs 3.8G 3.8G 0 100% /usr/src/KERNELS
du (disk usage, o uso del disco) se usa para evaluar cuánto espacio está usando un
directorio (y sus subdirectorios) en un sistema de archivos.
Para desplegar el uso del disco del directorio actual: $ du
Para desplegar todos los archivos, no sólo los directorios: $ du -a
Para listar en formato “legible por humanos”: $ du -h
Para desplegar el uso del disco para un directorio específico: $ du -h somedir
Para desplegar los totales solamente, suprimiendo la salida de los subdirectorios: $ du -s
Por ejemplo:
$ du -ch /teaching/CRASH
16K /teaching/CRASH/crash-7.0.3/memory_driver
136K /teaching/CRASH/crash-7.0.3/extensions
35M /teaching/CRASH/crash-7.0.3
101M /teaching/CRASH
101M total
$ cat /proc/swaps
Filename Type Size Used Priority
/dev/sda11 par//on 4193776 0 -1
Agregaremos más espacio de área de intercambio ya sea usando una par/ción o un archivo. Para
usar un archivo realizaremos lo siguiente:
$ dd if=/dev/zero of=swp.le bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.30576 s, 822 MB/s
$ mkswap swp.le
Senng up swapspace version 1, size = 1048572 KiB
no label, UUID=85bb62e5-84b0-4fdd-848b-4f8a289f0c4c
En el caso de una par/ción real sólo ejecute mkswap con el disposi/vo de la par/ción, pero tenga
en cuenta que toda la información sobre ésta será eliminada.
Ac/ve el espacio de intercambio nuevo:
RHEL 7 advierte que hay un problema de seguridad en los permisos, lo cual solucionaremos de la
siguiente:
LFS201: Fundamentos de Administración de Sistemas Linux 188
$ sudo chown root:root swp.le
$ sudo chmod 600 swp.le
$ cat /proc/swaps
Filename Type Size Used Priority
/dev/sda11 par//on 4193776 0 -1
/tmp/swp.le .le 1048572 0 -2
Fíjese en el campo Priority; las par/ciones o archivos de intercambio de menor prioridad no serán
u/lizadas hasta que las de mayor prioridad están llenas. Desac/ve el archivo de área de
intercambio y bórrelo para ahorrar ese espacio:
$ sudo swapod swp.le
$ sudo rm swp.le
Solución 13.2
$ quota
Disk quotas for user student (uid 500):
Filesystem blocks quota limit grace .les quota limit grace
/dev/sda11 1000* 500 1000 6days 3 0 0
$ ls –l
total 1068 -rw------- 1 root root 7168 Dec 10 18:56 aquota.user
• rw-rw-r-- 1 student student 204800 Dec 10 18:58 big.le1
• rw-rw-r-- 1 student student 409600 Dec 10 18:58 big.le2
• rw-rw-r-- 1 student student 409600 Dec 10 19:01 big.le3
drwx------ 2 root root 16384 Dec 10 18:47 lost+found
• rwxr-xr-x 1 root root 41216 Dec 10 18:52 more
Objetivos de aprendizaje
El sistema de archivos ext2 fue una variedad nativa de Linux y está disponible en todos
los sistemas Linux, pero rara vez se utiliza hoy en día.
El sistema de archivos ext3 fue la primera extensión de ext2 que incluyó journaling.
Tenía el mismo diseño en disco queext2, excepto por la existencia de un archivo de
journal.
El sistema de archivos ext4 se incluyó por primera vez en la versión 2.6.19 del kernel, y
su designación como experimental fue quitada en la versión 2.6.28. Incluyó mejoras
significativas como el uso de extents para archivos largos, en vez de listas de bloques de
archivos.
El sistema de gestión de memoria del kernel Linux requiere que solamente un número
entero de bloques quepa en una página de memoria; por lo tanto no es posible tener
bloques de 8 KB en una plataforma x86 en donde las páginas de memoria son de 4KB de
tamaño.
El número de inodos en el sistema de archivos también puede ser ajustado, lo cual podría
ahorrar espacio en disco.
Todos los campos son escritos a disco en orden little-endian, con excepción del journal.
Los bloques de disco se dividen en grupos de bloques, cada uno de los cuales contiene
inodos y bloques de dato almacenados de forma adyacente, con lo que se reduce el
tiempo de acceso.
Los bloques de datos son preasignados a archivos antes de que sean usados. Así
cuando el tamaño de un archivo se incrementa, se hace uso de espacio adyacente que ha
sido previamente reservado, por lo cual la fragmentación se reduce.
El superbloque del sistema de archivos contiene campos de bit, los cuales son usados
para determinar si el sistema de archivos requiere o no verificación cuando se monta por
primera vez durante la inicialización del sistema. El estado puede ser:
unknown: no se desmontó de forma limpia, como cuando hay un bloqueo o caída del
sistema
En los últimos dos casos fsck será ejecutado para verificar el sistema de archivos y
resolver cualquier problema antes de que sea montado.
Después del bloque de arranque hay una serie de grupos de bloques, en donde cada
uno de ellos tiene el mismo tamaño. El diseño de cada grupo de bloques se muestra en la
figura siguiente:
Figura 14.1: Diseño de los sistemas de archivos ext2/3/4
Mapa de Data
Mapa de Tabla de
Descriptores Bits de Bloques de
Superbloque Bits de Inodos
de Grupo Bloques de Datos
Inodos (n bloques)
Datos (n bloques)
El primer y segundo bloque son los mismos para cada grupo de bloques y comprenden
el Superbloque y los Descriptores de Grupo. Bajo circunstancias normales, sólo los
bloques que están en el primer grupo son utilizados por el kernel; las copias duplicadas
son referenciadas solamente cuando el sistema de archivo está siendo verificado. Si todo
está bien, el kernel los copia desde el primer grupo de bloques. Si hay algún problema
con las copias maestras, va al siguiente y así sucesivamente hasta que se encuentra uno
en buen estado y la estructura del sistema de archivos se reconstruye. Esta redundancia
hace que sea muy difícil que un sistema de archivos ext2/3/4 se estropee, siempre y
cuando las verificaciones del sistema de archivos se ejecuten de forma periódica.
En las versiones tempranas de la familia ext, cada grupo de bloques contenía los
descriptores de grupos de cada uno de ellos, como también una copia del superbloque.
Debido a las optimizaciones actuales, no todos los grupos de bloques tienen una copia del
superbloque y de los descriptores de grupos. Para ver la situación en el sistema usted
podría hacer lo siguiente:
14.5 dumpe2fs
14.6 tune2fs
tune2fs puede ser usado para cambiar parámetros del sistema de archivos.
Para cambiar el número máximo de montajes entre verificaciones del sistema de archivos
(max-mount-count):
Para listar el contenido del superbloque incluyendo los valores actuales de los parámetros
que pueden ser modificados:
El bloque de datos y el mapa de bits de inodos son bloques cuyos bits contienen 0 para
cada bloque o inodo libre y 1 para cada uno que está usado. Hay uno de cada uno de
estos mapas de bits por grupo de bloques.
La tabla de inodos contiene tantos bloques consecutivos como sea necesario para cubrir
el número de inodos en el grupo de bloques. Cada inodo requiere 128 bytes; por lo tanto,
un bloque de 4 KB puede contener 32 inodos.
Note que hay espacio reservado para cierta cantidad de información dependiente del
sistema operativo; diferentes SOs podrían montar un sistema de archivos ext2/3/4, tal
como Linux puede montar muchos sistemas de archivos no nativos.
Los sistemas de archivos ext2 y ext3 no han incorporado aún el uso de extents para
organizar archivos grandes. En vez de eso, el arreglo de punteros a bloques de
datos i_block[], de largo EXT2_N_BLOCKS=15, es descrito por el inodo. La forma en
que esto se maneja es algo compleja:
Los primeros 12 elementos en este arreglo apuntan a los primeros 12 bloques de
datos en el archivo.
El elemento 13avo apunta a un bloque que representa un arreglo de segundo orden
de números de bloque; el 14avo a un arreglo de tercer orden y el 15avo a un arreglo
de cuarto orden.
Este algoritmo hace que el abordar archivos pequeños sea más rápido, como es de
esperar. Por ejemplo, con un tamaño de bloque de 4 KB, un archivo de 48 KB puede ser
abordado directamente. Un archivo de 2 MB requiere un proceso de segundo orden, uno
de 1 GB uno de tercer orden, uno de 4 GB uno de cuarto orden.
Sin embargo, los sistemas de archivos na/vos en sistemas opera/vos /po UNIX, incluyendo Linux,
/enden a no sufrir problemas serios de fragmentación.
Esto se debe principalmente a que no tratan de poner archivos en las regiones más internas del
disco, en donde el acceso es más rápido. En vez de eso, dejan espacio libre a través del disco, de tal
forma de que cuando un archivo va a ser creado, hay mejores posibilidades de que haya una región
de bloques libres lo su.cientemente grande como para contener el archivo completo, ya sea en
una o pocas partes.
En cuanto al hardware moderno, el concepto de regiones internas del disco no es tan claro debido
a los cambios que está experimentando la tecnología; en cuanto a los disposi/vos SSDs, la
defragmentación podría acortar la vida ú/l del almacenamiento, debido a que posee ciclos .nitos
de lectura/borrado/escritura.
Además, los sistemas de archivos con journaling más nuevos (incluyendo ext4), trabajan con
extents (regiones con/guas grandes) por diseño.
Pese a lo anterior, existe una herramienta para desfragmentar sistemas de archivos ext4:
$ sudo e4defrag
Usage : e4defrag [-v] .le...| directory...| device...
: e4defrag -c .le...| directory...| device...
e4defrag es parte del paquete e2fsprogs y debería estar en todas las distribuciones modernas de
Linux, aunque no viene en RHEL 6, la cual se está quedando atrás. Las únicas dos opciones son las
siguientes:
-v: Muestra los detalles de la operación.
-c: No haga nada realmente, sólo analizar y reportar.
Ejemplos:
Fragmenta/on score 1 [0-30 no problem: 31-55 a li@le bit fragmented: 56- needs defrag]
This directory (/var/log) does not need defragmenta/on.
Done.
...
[152/152]/var/log/Xorg.1.log.old: 100% [ OK ]
Success: [ 112/152 ]
Failure: [ 40/152 ]
Ejecute e4defrag en varios archivos, directorios y disposi/vos completos, siempre intentando con
-c primero.
Encontrará que generalmente los sistemas de archivos Linux /enden a necesitar defragmentación
cuando están cercanos a llenarse, sobre el 90 por ciento, o cuando son pequeños y /enen archivos
rela/vamente grandes, como sucede con las par/ciones usadas para boot.
Vamos a modi.car algunas propiedades de un sistema de archivos formateado con ext4. Esto no
requiere desmontar el sistema de archivos.
En el ejercicio de a con/nuación puede trabajar con un archivo de imagen que puede crear de la
siguiente forma:
$ dd if=/dev/zero of=image.le bs=1M count=1024
o puede reemplazar image.le por /dev/sdaX , usando cualquier par/ción que contenga el sistema
de archivos que desea modi.car.
1. Usando dumpe2fs obtenga información acerca del sistema de archivos del cual desea ajustar
las propiedades.
2. Determinar la con.guración para el conteo máximo de montaje luego del cual el sistema de
archivos será forzado a veri.cación y modiOquelo a 30.
3. Con.gure el parámetro Check interval a tres semanas (la can/dad de /empo luego del cual un
sistema de archivos es forzado a una veri.cación).
4. Calcule el porcentaje de bloques reservados y luego recon.gúrelo a 10%.
Mount count: 0
Maximum mount count: 30 3.
Objetivos de aprendizaje
El alto rendimiento es uno de los elementos clave del diseño de XFS, el cual implementa
métodos para:
Defragmentar
Ampliar
Realizar respaldo/Restaurar
Para crear respaldos y restaurar se usan las siguientes herramientas nativas de XFS:
xfsdump
xfsrestore
los cuales pueden ser pausados de forma conveniente y retomados luego. Debido a que
estos programas son multihebra, los respaldos y restauraciones de XFS pueden ser
llevadas a cabo muy rápidamente.
Tanto desarrolladores como usuarios de Linux con sistemas de alto rendimiento y alta
capacidad o necesidades específicas, están siguiendo el desarrollo e implementación
gradual del sistema de archivos btrfs, el cual fue creado por Chris Mason. El nombre
viene de sistema de archivos B-tree. La documentación completa puede ser encontrada
en http://btrfs.wiki.kernel.org/index.php/Main_Page .
Algunas tareas deben ser terminadas antes de que btrfs esté listo para el trabajo diario
en sistemas de archivos críticos. Para revisar la historia de desarrollo de btrfs y la
evolución que se espera revise http://lwn.net/Articles/575841.
No tenemos un ejercicio de laboratorio detallado para xfs; muchos sistemas todavía no /enen
instalados los módulos del kernel y herramientas de usuario importantes. Sin embargo, si su kernel
Linux y su distribución lo soportan, puede crear un sistema de archivos fácilmente con mkfs -t xfs.
$ man -k xfs
a@r (1) - extended a@ributes on XFS .lesystem objects
.lesystems (5) - Linux .le-system types: minix, ext, ext2, ext3, ext4,...
fs (5) - Linux .le-system types: minix, ext, ext2, ext3, ext4,...
fsck.xfs (8) - do nothing, successfully
fsfreeze (8) - suspend access to a .lesystem (Linux Ext3/4, ReiserFS...
mkfs.xfs (8) - construct an XFS .lesystem
pmdaxfs (1) - XFS .lesystem performance metrics domain agent (PMDA)
xfs (5) - layout of the XFS .lesystem
xfs_admin (8) - change parameters of an XFS .lesystem
xfs_bmap (8) - print block mapping for an XFS .le
xfs_copy (8) - copy the contents of an XFS
.lesystem xfs_db (8) - debug an XFS .lesystem
xfs_es/mate (8) - es/mate the space that an XFS .lesystem will take
xfs_freeze (8) - suspend access to an XFS .lesystem
xfs_fsr (8) - .lesystem reorganizer for XFS
xfs_growfs (8) - expand an XFS .lesystem
xfs_info (8) - expand an XFS .lesystem
xfs_io (8) - debug the I/O path of an XFS .lesystem
xfs_logprint (8) - print the log of an XFS .lesystem
xfs_mdrestore (8) - restores an XFS metadump image to a .lesystem image
xfs_metadump (8) - copy XFS .lesystem metadata to a .le
xfs_mk.le (8) - create an XFS .le
xfs_ncheck (8) - generate pathnames from i-numbers for XFS
Lea acerca de estos programas y vea si puede realizar algunas operaciones con el sistema de
archivos que creó.
LVM permite tener un sistema de archivos lógico sobre múltiples volúmenes físicos y
particiones, la cual al usarla se presenta como una sola partición. Cuando se usa LVM es
muy fácil contraer y expandir los sistemas de archivos según se necesite; sin embargo,
tales operaciones son difíciles de realizar en particiones físicas fijas.
Objetivos de aprendizaje
LVM (Logical Volume Manager) separa una partición virtual en varias partes, cada de una
de las cuales puede estar en distintas particiones y/o discos.
Hay muchas ventajas al usar LVM; en particular, se torna bastante fácil el modificar el
tamaño de las particiones lógicas y sistemas de archivos, agregar más espacio de
almacenamiento y reorganizarlo.
LVM tiene un impacto en el rendimiento. Hay un costo adicional definido que proviene de
la sobrecarga de la capa de LVM. Sin embargo, aún en sistemas sin RAID, si se
usa striping (dividir los datos en más de un disco) es posible lograr algunas mejoras de
paralelización.
Al igual que RAID (lo cual discutiremos en el próximo capítulo), el uso de volúmenes
lógicos es un mecanismo para crear sistemas de archivos que pueden abarcar más de un
disco físico.
Para crear volúmenes lógicos primero se ponen todos los dispositivos en un pool grande
de espacio de disco (el grupo de volúmenes). Luego de eso, se asigna espacio desde el
pool con el cual se crea un volumen lógico.
LVM tiene mejor escalabilidad que RAID: los volúmenes lógicos pueden ser fácilmente
redimensionados, tanto para agrandarlos como reducirlos. Si se requiere más espacio, es
posible agregar dispositivos adicionales en cualquier momento.
Para obtener una lista completa de las herramientas LVM ejecute man lvm.
Hay una serie de herramientas que manipulan volúmenes lógicos. Como era de esperar,
todos comienzan con lv. Revisaremos los más utilizados, pero una lista corta puede ser
obtenida con:
$ ls -lF /sbin/lv*
Nota:
Estas herramientas están en /sbin y no en /usr/sbin , ya que pueden ser
necesitados para arrancar o reparar y recuperar un sistema.
lvcreate asigna volúmenes lógicos desde los grupos de volúmenes. El tamaño puede
especificarse ya sea en bytes o número de extents (recuerde que son de 4 MB por
defecto). Los nombres son a elección.
lvdisplay informa acerca de los volúmenes lógicos disponibles.
Los sistemas de archivos se localizan en los volúmenes lógicos y se formatean como de
costumbre, con mkfs.
Si se comienza con un grupo de volúmenes nuevo, los pasos asociados a la configuración
y uso de un volumen lógico nuevo son los siguientes:
1. Crear particiones en las unidades de disco (escriba 8e en fdisk)
2. Crear volúmenes físicos desde las particiones.
3. Crear el grupo de volúmenes.
4. Asignar volúmenes lógicos desde el grupo de volúmenes.
5. Montar los volúmenes lógicos (y actualizar /etc/fstab según sea necesario).
Por ejemplo, asumiendo que uno ya creó las particiones /dev/sdb1 y/dev/sdc1 , y que les
asignó un tipo 8e:
$ sudo pvdisplay
$ sudo pvdisplay /dev/sda5
$ sudo vgdisplay
$ sudo vgdisplay /dev/vg0
$ sudo lvdisplay
$ sudo lvdisplay /dev/vg0/lvm1
Una de las grandes ventajas de usar LVM es que es fácil y rápido cambiar el tamaño de
un volumen lógico, especialmente cuando se intenta hacer lo mismo con una partición
física que ya contiene un sistema de archivos.
Cuando se hace esto, los extents pueden agregarse o substraerse desde el volumen
lógico, y pueden provenir desde cualquier parte en el grupo de volúmenes; de hecho no
necesitan ser de regiones físicas contiguas del disco.
Si el volumen contiene un sistema de archivos, expandirlo o contraerlo es una operación
completamente diferente que cambiar el tamaño del volumen:
Cuando se expande un volumen lógico que tiene un sistema de archivos, se debe
expandir primero el volumen y luego el sistema de archivos.
Cuando se contrae un volumen lógico que contiene un sistema de archivos,
primero se debe contraer el sistema de archivos y luego el volumen.
El sistema de archivos no puede estar montado mientras se reduce el tamaño del mismo.
Sin embargo, algunos sistemas de archivos permiten ser expandidos mientras están
montados.
Obviamente, las herramientas para modificar el tamaño del sistema de archivos dependen
del tipo del mismo; para ext4el programa es resize2fs.
Si usted tiene una versión reciente de las herramientas lvm, puede realizar estas
operaciones en un paso en vez de dos, usando la opción -r, como se muestra a
continuación:
$ sudo
$ sudo lvextend -r -L +100M /dev/vg/mylvm
$ sudo lvreduce -r -L -100M /dev/vg/mylvm
en donde las cantidades usan el signo más o menos para indicar el cambio requerido.
Esto usa la herramienta subyacente fsadm, la cual puede redimensionar cualquier tipo de
sistema de archivos para cual cual el sistema operativo tenga soporte. Le recomendamos
leer la página man de fsadm.
Es posible reducir un grupo de volúmenes de la siguiente forma:
Son muy útiles para realizar respaldos, probar aplicaciones e implementar VMs (máquinas
virtuales). El estado original de la snapshot se mantiene, como por ejemplo el mapa de
bloques.
Los snapshots usan espacio para almacenar las diferencias (conocidas como deltas):
Cuando el volumen lógico original cambia, los bloques de datos originales son
copiados a la snapshot.
Si la información se agrega directamente al snapshot, se almacena ahí solamente.
$ mkdir /mysnap
$ mount -o ro /dev/vg/mysnap /mysnap
Vamos a crear un volumen lógico usando dos par/ciones de 250 MB. Supondremos que /ene
espacio Osico disponible en disco para par/cionar.
1. Crear dos par/ciones de 250 MB de /po volumen lógico (8e).
2. Conver/r las par/ciones a volúmenes Osicos.
3. Crear un grupo de volúmenes llamado myvg y agregue los dos volúmenes Osicos al mismo.
Use el tamaño por defecto para el extent.
4. Asignar un volumen lógico de 300 MB, llamado mylvm desde el grupo de volúmenes myvg.
5. Formatear y montar el volumen lógico mylvm en /mylvm
6. Use lvdisplay para ver información del volumen lógico.
7. Ex/enda el volumen lógico y el sistema de archivos correspondiente a 350 MB.
use el disco duro que sea apropiado y cree las dos par/ciones. Estando en fdisk escriba t para
con.gurar el /po de par/ción a 8e. Si bien es cierto no es requerido de.nir el /po, es buena
idea hacerlo para evitar confusiones. Use w para reescribir la tabla de par/ción y salga. Luego
haga.
$ sudo partprobe -s
6. $ sudo lvdisplay
7. $ df -h
$ sudo lvextend -L 350M /dev/myvg/mylvm
$ sudo resize2fs /dev/myvg/mylvm
$ df -h
or
$ sudo lvextend -r -L +50M /dev/myvg/mylvm
Objetivos de aprendizaje
RAID puede ser implementado ya sea en software (es una parte madura del kernel Linux)
o en hardware. Si su hardware de RAID es conocido por tener una buena calidad, podría
ser más eficiente que usar RAID de software. En una implementación de hardware, el
sistema operativo no está consciente de que está usando RAID, esto es transparente. Por
ejemplo, tres discos duros de 512 GB (dos para datos, uno para paridad) configurados
con RAID-5, se verán como un disco único de 1 TB.
Por otro lado, una desventaja de usar RAID de hardware es que si la controladora del
disco falla, debe ser reemplazado por una compatible, la cual puede no ser fácil de
obtener en todos los casos. Cuando se usa RAID de software, los mismos discos pueden
conectarse y funcionar con cualquiera controladora de disco. Tales consideraciones
pueden ser relevantes para hardware de gama media y baja.
Existe una serie de especificaciones de RAID de complejidad y uso creciente. Los más
comúnmente conocidos son los niveles 0, 1 y 5.
RAID 0 usa striping solamente. Los datos se reparten a través de discos últiples.
Sin embargo, a pesar del nombre, no hay redundancia y no hay estabilidad o
capacidades de recuperación. De hecho, si cualquier disco falla la información se
perderá. Pero el rendimiento puede ser mejorada significativamente debido a la
paralelización de tareas de E/S.
RAID 1 usa mirroring solamente; cada disco tiene un duplicado, lo cual es bueno
para la recuperación de los datos. Se requieren al menos dos discos.
RAID 5 usa una banda de paridad de rotación; si una unidad de disco falla, no se
producirá una pérdida de datos, solamente se reducirá el rendimiento. Tienen que
haber al menos 3 discos.
RAID 6 tiene discos con stripping y paridad dual; puede soportar la pérdida de dos
discos y requiere al menos 4. Debido a que RAID 5 puede imponer un estrés
significante sobre los discos, lo cual puede conducir a fallas durante el proceso de
recuperación, RAID 6 se ha vuelto más importante.
RAID 10 es un set de datos con mirroring y striping. Se necesitan al menos 4
discos.
El comando:
$ sudo mdadm -S
Puede examinar /proc/mdstat para ver el estado del RAID, tal como se muestra aquí:
$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb8[1] sdc7[0]
---------- 521984 blocks [2/2]
unused devices: <none>
$ cat /proc/mdstat
MAILADDR eddie@haskell.com
Una de las cosas importantes que provee RAID es redundancia. Para asegurar que
cualquier reducción en esa redundancia es resuelta lo antes posible, se usa un disco de
reserva.
y cree las par/ciones como lo hemos hecho anteriormente. Para propósitos del ejercicio los
llamaremos /dev/sdaX y /dev/sdaY. Necesitará correr partprobe, kpartx o reiniciar luego que
ha terminado para asegurarse de que el sistema reconozca las par/ciones nuevas.
Las par/ciones LVM estarán perfectamente bien para este ejercicio. Pueden crearse de la
siguiente forma:
donde hemos nombrado el grupo de volúmenes como VG. No es necesario hacer nada más
luego de la creación de las par/ciones LVM nuevas para que el sistema esté al tanto de ellas.
y agregar a /etc/fstab
5. $ cat /proc/mdstat
Personali/es : [raid1]
md0 : ac/ve raid1 dm-14[1] dm-13[0]
204736 blocks [2/2] [UU]
Objetivos de aprendizaje
Ningún computador puede ser absolutamente seguro. Todo lo que podemos hacer es
ralentizar y desalentar a los intrusos con el fin de que abandonen el ataque, para buscar
blancos más fáciles, o para atraparlos en el acto y tomar las acciones apropiadas.
La seguridad puede ser definida en términos de la habilidad del sistema para hacer con
regularidad lo que se supone que tiene que hacer, su integridad y exactitud, como también
en la garantía de que el sistema está disponible solamente para quienes están
autorizados a usarlo.
Las cuatro áreas que necesitamos proteger incluyen la física, local, remota y el personal.
En esta sección no nos concentraremos en la seguridad de la red, sino más bien en los
factores locales.
Las políticas deben ser genéricas y fáciles de entender, ya que eso las hace más fáciles
de seguir. Deben salvaguardar la información que necesita ser protegida, denegar acceso
a los servicios asociados y proteger la privacidad de los usuarios.
Estas políticas deberían ser actualizadas regularmente; de hecho las políticas necesitan
cambiar en la medida en que los requerimientos lo hacen. Tener una política
desactualizada puede ser peor que no tener una.
Disponibilidad
Consistencia
Control
Auditoría
Este es el primer paso a tomar para construir una política de seguridad informática. Es un
prerrequisito para planear y luego aplicar políticas y procedimientos para proteger sus
sistemas.
PATH=./:$PATH
Si usted fuera al directorio que contiene ese archivo y ejecutara ls, borraría todo su
directorio de usuario.
Proteger los teclados en donde las contraseñas son ingresadas para asegurar que
no puedan ser alterados.
Configurar una contraseña en la BIOS protege de que personas sin autorización cambien
las opciones de arranque para ganar acceso al sistema. Sin embargo, solo importa si
alguien puede conseguir acceso físico a la máquina, ya que esto requiere de presencia
local.
También se recomienda generalmente que la BIOS se mantenga al día con la última
versión del firmware. Sin embargo, la mayoría de las actualizaciones de las BIOS no
tienen relación con el tema de seguridad y los administradores de sistemas suelen instalar
esos parches con mucho cuidado, ya que una pieza de código incompetente en
actualizaciones innecesarias podría inutilizar un sistema.
Usted puede asegurar el proceso de arranque con una contraseña segura para prevenir
que alguien evite el paso de autenticación de usuario. Esto puede funcionar en conjunto
con una protección por contraseña de la BIOS.
Tenga en cuenta que al usar una contraseña en el cargador de arranque va a prevenir que
un usuario edite la configuración del mismo durante el proceso de arranque, sim embargo
no prevendrá que un usuario arranque desde un medio alternativo, tales como CDs/DVDs
o dispositivos USB. Por lo anterior, esto debería ir acompañado con una contraseña en
la BIOS para tener una protección total en esta etapa.
password—md5 $1$Wnvo.1$qz781HRVG4jUnJXmdSCZ30
Para la versión 2 de GRUB (la actual) las cosas son más complicadas. Sin
embargo, existe una mayor flexibilidad y es posible hacer cosas como configurar
contraseñas individuales de usuario, las cuales incluso pueden ser las del inicio de
sesión.
nosuid
Los bits set-user-identifier y set-group-identifier no tienen efecto. Vamos a
discutir en breve setuid y setgid.
noexec
Restringe la ejecución directa de cualquier binario en el sistema de archivos
montado.
ro
Monta el sistema de archivos en modo de solo lectura, como se muestra a
continuación:
o en /etc/fstab:
/dev/sda2 /mymountpt ext4 ro,noexec,nodev 0 0
Normalmente un programa corre con los privilegios del usuario que lo ejecutó. Esto
significa que sin importar quien es el dueño del binario que está corriendo, el proceso de
todas formas tiene privilegios restringidos.
Ocasionalmente puede tener sentido que haya usuarios con capacidades extendidas que
no tienen generalmente, tales como la habilidad para iniciar o detener una interfaz de red,
o editar un archivo del cual el superusuario es dueño.
Al configurar el bit setuid (set user ID) en un archivo ejecutable, se modifica el
comportamiento normal y se otorgan derechos de acceso del dueño en vez
del usuario que ejecuta el programa.
Además es posible configurar el bit setgid, de tal forma que el proceso se ejecute con los
privilegios del grupo que es dueño del binario, en vez del de quien lo está corriendo.
Quisiéramos enfatizar que esto es generalmente una mala idea y que es recomendable
evitarlo en la mayoría de las circunstancias. A menudo es mejor escribir un
programa demonio con menos privilegios para este tipo de uso. Algunas distribuciones
recientes han deshabilitado completamente esta característica.
LFS201: Fundamentos de Administración de Sistemas Linux 238
18.14 Configuración de los bits setuid/setgid
Los archivos creados en este directorio pertenecen al grupo del dueño del directorio (y no
al grupo del usuario que lo crea).
Tenga en cuenta que efectivamente no puede cambiar el setuid de un script shell; de
hecho, no sucederá nada a menos que usted cambie el bit setuid en la consola, lo cual
podría ser un tremendo agujero de seguridad. Solo se puede hacer en binarios
ejecutables.
Solución 18.1
1. $ dd if=/dev/zero of=image bs=1M count=100
$ sudo mkfs.ext3 image
$ mkdir mountpoint
$ sudo mount -o loop image mountpoint
4. $ mountpoint/ls
5. $ sudo umount mountpoint
$ rm image
$ rmdir mountpoint
Tenga en cuenta que esto no es persistente. Para hacerlo persistente tendría que agregar la
opción a /etc/fstab, con una línea como la siguiente:
/home/student/image /home/student/mountpoint ext3 loop,rw,noexec 0 0
Si está tomando la versión de autoaprendizaje de este curso, el código fuente está disponible para
su descarga desde la pantalla Laboratorio.
Si el programa se llama writeit.c, puede ser compilado haciendo:
$ make writeit
o de forma equivalente:
$ gcc -o writeit writeit.c
wrote -1 bytes
pero si lo ejecuta como root:
$ sudo ./writeit
wrote 15 bytes
Por lo tanto, el usuario root fue capaz de sobreescribir el archivo del cual es dueño, pero un
usuario normal no podría. Tenga en cuenta que no ayudará cambiar el dueño de writeit a root:
$ sudo chown root.root writeit
$ ./writeit
wrote -1 bytes
porque todavía no le permi/rá sobreescribir a.le. Al con.gurar el bit setuid usted puede habilitar a
cualquier usuario normal para que lo haga:
$ sudo chmod +s writeit
$ ./writeit
wrote 15 bytes
Usted se podría preguntar por qué simplemente no escribimos un script que realice la operación,
en vez de escribir y compilar un programa ejecutable.
Bajo Linux, si se cambia el setuid en un script ejecutable, no hará nada a menos que usted cambie
el bit setuid en la shell (tal como bash), lo cual sería un gran error; cualquier cosa que se corra
desde ahí podría escalar privilegios.
Un sistema computacional moderno tiene que ser seguro, pero las necesidades varían de
acuerdo a la sensibilidad de la información, número de cuentas de usuario, exposición a
redes externas, requerimientos legales y otros factores. La responsabilidad de habilitar
buenos controles de seguridad recae tanto en los diseñadores de las aplicaciones,
desarrolladores y mantenedores del kernel Linux. Por supuesto, los usuarios también
deben seguir los buenos procedimientos establecidos, pero en un sistema gestionado
adecuadamente, los usuarios no privilegiados deberían tener una capacidad muy limitada
para exponer el sistema a violaciones de seguridad.
En esta sección nos ocuparemos de cómo el kernel Linux mejora la seguridad a través
del uso de Módulos de Seguridad de Linux (LSM), particularmente con la
implementación de SELinux.
Objetivos de aprendizaje
La idea básica es interceptar las llamadas al sistema; insertar código cada vez que una
aplicación solicita una transición a modo kernel con el fin de realizar la tarea que requiere
habilidades extendidas. Este código se asegura de que los permisos son válidos y que
exista protección contra intentos malintencionados. Esto se lleva a cabo al invocar pasos
de seguridad funcionales antes y/o después de que una llamada al sistema es satisfecha
por el kernel.
SELinux: http://selinuxproject.org/page/Main_Page
AppArmor: http://apparmor.net
Smack: http://schaufler-ca.com
TOMOYO: http://tomoyo.sourceforge.jp
Solo un LSM puede ser usado a la vez, ya que potencialmente modifican las mismas
partes del kernel Linux.
Un contexto de SELinux es un nombre usado por una regla para definir cómo los
usuarios, procesos y puertos interactúan entre ellos. Como la política por defecto es
denegar cualquier acceso, las reglas se usan para describir las acciones permitidas en el
sistema.
setenforce se usa para cambiar entre modo enforcing y permissive al vuelo, mientras el
sistema está en operación. Sin embargo, no se puede habilitar o deshabilitar el modo
disabled de esta forma. Mientras que setenforce permite cambiar entre los
modos Permissive y Enforcing, no permite deshabilitar SELinux completamente. Hay al
menos dos formas diferentes de deshabilitar SELinux:
Archivo de configuración: edite el archivo de configuración
(generalmente/etc/selinux/config) y configure SELINUX=disabled. Este es el
método por defecto y debería usarse para deshabilitar SELINUX
permanentemente.
Como se mencionó anteriormente, los contextos son etiquetas que se aplican a archivos,
directorios, puertos y procesos. Estas etiquetas se usan para describir reglas de acceso.
Existen cuatro contextos de SELinux:
User (usuario)
Role (rol)
Type (tipo)
Level (nivel)
Sin embargo, nos focalizaremos en type (tipo), el cual es el contexto más usado
comúnmente. La convención de nombres de etiquetas determina que las etiquetas de
contexto type deben terminar con _t, como en kernel_t.
$ ps axZ
LABEL PID TTY STAT TIME COMMAND
system_u:system_r:init_t:s0 1 ? Ss 0:04 /usr/lib/systemd/systemd—
switched-root ...
system_u:system_r:kernel_t:s0 2 ? S 0:00 [kthreadd]
...
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2305 ? D 0:00 sshd:
peter@pts/0
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2306 pts/0 Ss 0:00
-bash
...
system_u:system_r:httpd_t:s0 7490 ? Ss 0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0 7491 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
...
$ ls -Z /home/ /tmp/
/home/:
drwx------. peter peter unconfined_u:object_r:user_home_dir_t:s0 peter
/tmp/:
-rwx------. root root system_u:object_r:initrc_tmp_t:s0 ks-script-c4ENhg
drwx------. root root system_u:object_r:tmp_t:s0 systemd-private-0ofSvO
-rw-------. root root system_u:object_r:initrc_tmp_t:s0 yum.log
Los archivos nuevos heredan el contexto del directorio padre, pero al mover o copiar
archivos, el contexto del directorio fuente es el cual debe ser preservado, lo cual puede
causar problemas.
Continuando con el ejemplo anterior, vemos que el contexto de tmpfile no ha cambiado al
mover el archivo desde/tmp a /home/peter:
$ cd /tmp/
$ touch tmpfile
$ ls -Z tmpfile
$ cd
$ touch homefile
$ ls -Z homefile
$ mv /tmp/tmpfile .
$ ls -Z
$ ls -Z
rw-rw-r--. peter peter unconfined_u:object_r:user_home_t:s0 homefile
rw-rw-r--. peter peter unconfined_u:object_r:user_tmp_t:s0 tmpfile
$ ls -Z
rw-rw-r--. peter peter unconfined_u:object_r:user_home_t:s0 homefile
rw-rw-r--. peter peter unconfined_u:object_r:user_home_t:s0 tmpfile
Note que el contexto de tmpfile fue reconfigurado al contexto por defecto para archivos
creados en el directorio home. El tipo fue cambiado desde user_tmp_t a user_home_t.
Otro problema es cómo configurar el contexto por defecto para un directorio nuevo. La
herramienta semanage fcontext(proveída por el paquete policycoreutils-python)
despliega y cambia el contexto por defecto de archivos y directorios. Tenga en cuenta
que semanage fcontext cambia la configuración por defecto solamente y no se aplica a
objetos existentes. Esto requiere ejecutar restorecon luego. Por ejemplo:
...
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 virtualHosts
[root@rhel7 /]# semanage fcontext -a -t httpd_sys_content_t /virtualHosts
[root@rhel7 /]# ls -Z
...
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 virtualHosts
[root@rhel7 /]# restorecon -RFv /virtualHosts
restorecon reset /virtualHosts context
unconfined_u:object_r:default_t:s0-
>system_u:object_r:httpd_sys_content_t:s0
[root@rhel7 /]# ls -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0
virtualHosts
Para listar todos los booleanos de la política actual, incluyendo el estado actual y una
descripción corta, haga lo siguiente:
Una alternativa para desplegar la información booleana que produce una salida más
simple, es getsebool -a, la cual imprime solo el nombre booleano y su estado actual.
setsebool se usa para cambiar el estado booleano. El comportamiento por defecto es
aplicar los cambios inmediatamente y no son persistentes luego del reinicio. Sin embargo,
el parámetro -P puede ser proveído para hacer que los cambios sean persistentes.
Un ejemplo de cambio no persistente usando setsebool:
$ getsebool ssh_chroot_rw_homedirs
ssh_chroot_rw_homedirs --> off
$ sudo reboot
...
$ getsebool ssh_chroot_rw_homedirs
ssh_chroot_rw_homedirs --> off
$ getsebool ssh_chroot_rw_homedirs
ssh_chroot_rw_homedirs --> off
$ sudo reboot
...
$ getsebool ssh_chroot_rw_homedirs
ssh_chroot_rw_homedirs --> on
Do
# semodule -i mypol.pp
Hash: httpd,httpd_t,admin_home_t,file,getattr
En esta sección hemos cubierto las tareas de administración de sistemas básicas y más
comunes relacionadas a SELinux. Existen recursos gratuitos que están disponibles en
línea para ítems avanzados de SELinux, los cuales incluyen (documentación disponible
en inglés):
19.15 AppArmor
AppArmor es una alternativa LSM a SELinux. El soporte para ésta fue incorporado en el
kernel Linux desde 2006. Ha sido usado por SUSE, Ubuntu y otras distribuciones.
AppArmor:
Provee Control de Acceso Obligatorio (MAC).
Es considerado más fácil de usar (por algunos, pero no todos) que SELinux.
Solución 19.1
1. $ sudo yum install vsNpd Np
2. $ sudo useradd user1
$ sudo passwd user1
Changing password for user user1.
New password: password
BAD PASSWORD: The password fails the dic/onary check - it is based on a dic/onary word
Retype new password: password
passwd: all authen/ca/on tokens updated successfully.
5. $ ftp localhost
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.2)
Name (localhost:peter): user1
331 Please specify the password.
Password: password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> get user1file
local: user1file remote: user1file
229 Entering Extended Passive Mode (|||35032|).
550 Failed to open file.
ftp> quit
221 Goodbye.
6. $ tail /var/log/messages
Nov 21 14:23:26 rhel7 setroubleshoot: SELinux is preventing /usr/sbin/vsftpd from read
access on the file .
For complete SELinux messages. run sealert -l 7f8e5e6f-bcee-4c59-9cd1-
72b90fb1f462
***** Plugin catchall_boolean (47.5 confidence) suggests ***************
If you want to allow ftp to home dir
Then you must tell SELinux about this by enabling
the ’ftp_home_dir’ boolean.
Do
setsebool -P ftp_home_dir 1
Notice that the suggestion to fix the issue can be found at the log file, and it is not even
necessary to run sealert.
Objetivos de aprendizaje
En otros sistemas operativos puede haber una gran diferencia entre procesos pesados y
ligeros (full heavy weight processes/light weight); en forma estricta, los procesos pesados
pueden incluir procesos livianos, o solo uno de ellos.
Al mismo tiempo, Linux respeta el POSIX y otros estándares de multihebra; por ejemplo,
cada hebra devuelve el mismo ID de proceso (llamado internamente como ID de grupo de
hebra), mientras que devuelve un ID de hebra distinta (llamado internamente como el ID
de proceso). Esto puede conducir a los desarrolladores a una confusión, pero debería ser
transparente a los administradores.
El primer proceso de usuario en el sistema es init, el cual tiene ID = 1. Este se inicia tan
pronto como el kernel ha sido inicializado y se montado el sistema de archivos raíz.
init se ejecutará hasta que el sistema se apague; este será el último proceso de usuario
que será terminado en ese punto. Este sirve como el padre ancestral de todos los demás
procesos de usuario, tanto directa como indirectamente.
Si el proceso padre muere antes que el hijo, el ppid del hijo se configura en 1; es decir, el
proceso es adoptado por init. Nota: en sistemas Linux recientes que usan systemd,
el ppid será configurado en 2, lo cual corresponde a una hebra interna del kernel
conocida como kthreadd, el que ha asumido de init el rol de adopción de los hijos
huérfanos.
Un proceso hijo que termina su ejecución (ya sea normal o anormalente) antes que su
padre, el cual no esperó por este ni examinó su código de salida, se conoce como un
proceso zombie (o difunto). Los procesos zombies liberan prácticamente todos los
recursos y se mantienen en ese estado solo para transmitir su estado de salida. Una
función del proceso init consiste en verificar los hijos adoptivos y dejar que mueran de
forma adecuada aquellos que ya han terminado. Por lo anterior, a veces se le denomina
el asesino de zombies, o de forma más sombría, el segador de niños.
Por razones históricas, el PID más grande ha sido limitado a un número de 16 bit, el cual
corresponde a 32768. Es posible modificar este valor cambiando
/proc/sys/kernel/pid_max, ya que el valor por defecto puede ser inadecuado para
servidores más grandes. A medida en la que los procesos son creados, eventualmente
alcanzarán elpid_max, punto en el cual comenzarán de nuevo en PID = 300.
Cada proceso ejecuta algún programa. En cualquier momento el proceso puede tomar
una snapshot de sí mismo a través de la captura del estado de los registros de la CPU,
dónde se está ejecutando, qué hay en la memoria del proceso y alguna otra información.
Esto es el contexto del proceso.
Ya que los procesos pueden ser agendados para entrar y salir del tiempo compartido de
CPU con otros (o a veces tienen que ser puestos a dormir mientras esperan que alguna
condición se cumpla, tal como una petición de usuario o datos que están por llegar), es
posible almacenar el contexto completo cuando cambia la condición del proceso y se
restablece su ejecución. Lo anterior es crítico para que el kernel sea capaz de cambiar al
contexto que se requiera en un instante determinado.
ulimit está construido sobre la base de un comando bash, el cual despliega o restablece
una serie de límites de recursos asociados con procesos corriendo bajo una shell. Si se
ejecuta con el argumento -a muestra lo siguiente:
$ ulimit -a
como en
$ ulimit -n 1600
Tenga en cuenta que los cambios afectarán solamente a la shell actual. Para que los
cambios sean efectivos para todos los usuarios logueados, es necesario
modificar /etc/security/limits.conf, un archivo muy bien autodocumentado, y luego
reiniciar.
Tal como se comentó en la sección de seguridad local, los programas que están
marcados con una s en el bit de ejecución tienen un user id efectivo diferente al de
su usuario real. Estos se conocen como programas setuid. Se ejecutan con el user id del
usuario que es dueño del programa; los programas que no tienen setuid definidos se
ejecutan con los permisos del usuario que los corre. Los programas setuid de los cuales
root es dueño tienen el potencial de ser un problema de seguridad conocido.
Los procesos pueden estar en uno de varios estados posibles. Los principales son los
siguientes:
En ejecución:
El proceso está siendo ejecutado actualmente ya sea en una CPU, o núcleo de
CPU o en la cola de ejecución, esperando una nueva tajada de tiempo. Se
reanudará cuando el planificador decide que merece utilizar la CPU, o cuando otra
CPU queda libre y el planificador migra el proceso a esa CPU.
Durmiendo (es decir, esperando):
El proceso está esperando una solicitud (generalmente E/S) que se realizó y que
no puede continuar hasta que se complete. Cuando la petición se ha completado,
el kernel despertará el proceso y lo pondrá de vuelta en la cola de ejecución, y se
le otorgará una tajada de tiempo en una CPU cuando el planificador decida
hacerlo.
Detenido:
El proceso ha sido suspendido. Este estado se experimenta comúnmente cuando
un programador quiere examinar la memoria del programa en ejecución, los
registros de la CPU, banderas u otros atributos. Una vez que esto se ha realizado
el proceso podría ser reanudado. Esto generalmente se realiza cuando el proceso
está siendo ejecutado desde un depurador o el usuario teclea Ctrl-Z.
Zombie:
El proceso entra en este estado cuando termina su ejecución y ningún otro
proceso (generalmente el padre) ha inquirido acerca de su estado de salida. Tales
procesos también se denominan difuntos. Un proceso zombie ha liberado todos
sus recursos con excepción de su estado de salida y su entrada en la tabla de
procesos. Si el padre de cualquier proceso muere, el proceso
es adoptado por init (PID=1) o kthreadd (PID=2).
Las instrucciones que pueden ser ejecutadas dependen del modo, el cual se aplica a nivel
de hardware, no de software.
Con la excepción de cuando se ejecuta una llamada al sistema (lo cual se describirá en
la sección siguiente), los procesos se ejecutan en modo usuario, donde tienen menos
privilegios que en modo kernel.
Cada proceso que se ejecuta en modo usuario tiene su propio espacio de memoria,
partes del cual pueden ser compartidos con otros procesos; excepto para los segmentos
de memoria compartida, un proceso de usuario no puede leer desde o escribir hacia el
espacio de memoria de cualquier otro proceso.
Incluso un proceso ejecutado por el usuario root o un programa con setuid se ejecuta en
modo usuario, excepto cuando realiza una llamada al sistema, caso en el cual tiene una
capacidad limitada para acceder al hardware.
En modo kernel (de sistema) la CPU tiene acceso completo a todo el hardware en el
sistema, incluyendo periféricos, memoria, discos, etc. Si una aplicación necesita acceso a
estos recursos debe realizar una llamada al sistema, lo cual causa un cambio de
contexto desde modo usuario a modo kernel. Este procedimiento se debe realizar
cuando se lee y escribe archivos, se crean procesos nuevos, etc.
El código de las aplicaciones nunca se ejecuta en modo kernel, solo las llamadas al
sistema en sí, lo cual corresponde a código del kernel. Cuando la llamada al sistema está
completa, se devuelve un valor y el proceso vuelve a modo usuario con un cambio de
contexto en el sentido contrario.
Hay oportunidades en las que el sistema está en modo kernel y no tiene relación con los
procesos, tales como manejo de interrupciones de hardware, ejecutar las rutinas del
planificador y otras tareas administrativas del sistema.
Cuando se usa SysVinit, los scripts en el directorio /etc/init.d inician varios demonios del
sistema. Estos scripts invocan comandos como argumentos de una función de shell
llamada daemon, definida en el archivo/etc/init.d/functions.
Para ver un ejemplo de cómo se hace esto, mire el script del servicio httpd en el
directorio /etc/init.d.
Los sistemas que usan systemd utilizan métodos similares para los demonios.
No todos los procesos son creados (o forked) a raíz de los procesos padre del usuario. El
kernel Linux crea directamente dos tipos de procesos por iniciativa propia. Estos son:
Procesos internos del kernel:
Estos se ocupan de tareas de mantención, tales como asegurar que los buffers
fluyen hacia los discos, que la carga se equilibra de manera uniforme en las
diferentes CPUs, que los controladores de dispositivos se hacen cargo del trabajo
que ha sido encolado para ellos, etc. Estos procesos a se ejecutan mientras el
sistema está corriendo y generalmente están durmiendo, a menos de que tengan
algo específico que realizar.
Procesos externos de usuario:
Estos son procesos que corren en espacio como las aplicaciones normales, pero
que son iniciados por el kernel. Hay muy pocos procesos de este tipo y
generalmente tienen una vida corta.
Es fácil ver los procesos de este tipo; cuando se ejecuta el siguiente comando
$ ps -elf
se listan todos los procesos en el sistema y se muestran los IDs de los procesos padres;
todos los que tienen PPID = 2se refieren a kthreadd, el hilo del kernel, cuyo trabajo es
crear tales procesos. Los nombres de estos procesos estarán encapsulados en paréntesis
cuadrados, como [ksoftirqd/0], por ejemplo.
LFS201: Fundamentos de Administración de Sistemas Linux 269
20.13 Creación de procesos y forking
A menudo, en vez de un fork, se sigue con un exec, en donde el proceso padre termina y
el proceso hijo hereda el ID del proceso padre. Los términos fork y exec se usan tan a
menudo que la gente piensa que son la misma palabra.
Los sistemas UNIX antiguos a menudo usan un programa llamado spawn, el cual es
similar en diversas formas a fork y exec, pero difiere en algunos detalles. No es parte del
estándard POSIX ni de Linux.
Para tener una idea de cómo un proceso podría iniciarse, considera un servidor web que
maneja muchos clientes. El servidor web puede lanzar un proceso nuevo cada vez que
una conexión nueva se hace a través de un cliente. Por otro lado, podría iniciar
simplemente un nuevo hilo como parte del mismo proceso; en Linux realmente no existe
mucha diferencia en el aspecto técnico entre crear un proceso completo o solo un hilo
nuevo, ya que cada mecanismo toma aproximadamente el mismo tiempo y usa una
cantidad similar de recursos.
Otro ejemplo es el demonio sshd: este es iniciado cuando el proceso init ejecuta el script
de inicio sshd, el que a su vez es responsable de iniciar el demonio sshd. Este proceso
demonio escucha solicitudes ssh de usuarios remotos.
Cuando se recibe una solicitud, sshd crea una copia nueva de sí mismo para atender el
requerimiento de servicio. Cada usuario remoto obtiene su propia copia del
demonio sshd que está en ejecución, para atender su conexión remota. El
proceso sshd inciará el programa login para validar el usuario remoto. Si la autenticación
es exitosa, el proceso login hará un fork de shell (por ejemplo, bash) para interpretar los
comandos de usuario, y así sucesivamente.
La shell padre se despierta nuevamente por la muerte del proceso hijo y procede a
crear un nuevo intérprete de comandos. Entonces la shell padre espera por la
próxima solicitud de comando desde el usuario, momento en el cual el ciclo se
repetirá.
El rango de nice va desde -20 (la prioridad más alta) a +19 (la prioridad más baja). La
forma normal de ejecutar nice es la siguiente:
$ nice
0
$ nice cat &
[1] 24908
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 500 4670 4603 0 80 0 - 16618 wait pts/0 00:00:00 bash
0 S 500 24855 4670 0 80 0 - 16560 wait pts/0 00:00:00 bash
0 T 500 24908 24855 0 90 10 - 14738 signal pts/0 00:00:00 cat
0 R 500 24909 24855 0 80 0 - 15887 - pts/0 00:00:00 ps
Tenga en cuenta que al aumentar el valor de nice de un proceso no significa que este no
se ejecutará; incluso podría obtener todo el tiempo de la CPU si no hay nada con lo cual
competir.
Si usted provee un gran incremento o decremento que sale del rango -20 a 19, el valor de
incremento será truncado.
Por defecto solo un superusuario puede disminuir el valor de nice, es decir, incrementar la
prioridad. Sin embargo es posible darle a los usuarios normales la habilidad de disminuir
el valor de nice para sus procesos, en un rango predeterminado, lo cual se realiza
editando el archivo /etc/security/limits.conf.
$ renice +3 13848
lo cual incrementará en valor de nice en 3, del proceso con pid = 13848. Puede hacerlo
con más de un proceso a la vez y hay algunas otras opciones interesantes que puede ver
con man renice.
$ ulimit -S -n 1024
$ ulimit -H -n
4096
2. $ ulimit -n hard
$ ulimit -n
4096
3. $ ulimit -n 2048
$ ulimit -n
2048
$ ulimit -n 4096
bash: ulimit: open .les: cannot modify limit: Opera/on not permi@ed
$ ulimit -n
2048
Tenga en cuenta que si hubiéramos escogido un límite diferente, como el tamaño del stack (-s),
podríamos aumentar el valor nuevamente debido a que el límite hard es unlimited.
System V IPC es un método bastante an/guo de Comunicación Entre Procesos (IPC) que se
remonta a los primeros días de UNIX. Este involucra tres mecanismos:
Segmentos de memoria compar/da
Semáforos
Colas de mensajes
Algunos programas modernos /enen a usar los métodos de POSIX IPC para esos tres mecanismos,
pero todavía se puede encontrar un montón de aplicaciones System V IPC.
Ejecute el siguiente comando para obtener un resumen general de la ac/vidad System V IPC en su
sistema:
$ ipcs
------ Message Queues --------
key msqid owner perms used-bytes messages
------ Shared Memory Segments --------
muestra un segmento de memoria compar/da que no /ene procesos asociados y que no está
marcado para ser destruido. Por lo anterior, si el proceso con/núa así para siempre y no se asocia a
ningún proceso, podría signi.car una fuga de memoria.
Objetivos de aprendizaje
Las señales son uno de los métodos más antiguos de Comunicación Inter-
Procesos (IPC) y se usan para notificar procesos acerca de eventos asincrónicos (o
excepciones).
Por asincrónico entendemos que el proceso receptor de la señal puede:
Por ejemplo, si un usuario decide terminar un programa en ejecución, podría enviar una
señal al proceso a través del kernel para interrumpir y finalizar el proceso.
Hay dos vías a través de las cuales se envían señales a los procesos:
Las señales solamente pueden enviarse entre procesos de propiedad del mismo usuario,
o desde un proceso del superusuario a cualquier proceso.
Cuando un proceso recibe una señal, lo que hará a continuación depende de la forma en
la cual el programa está escrito. Puede tomar acciones específicas, codificadas en el
programa para manipular la señal, o solo responder de acuerdo a los valores por defecto
en el sistema. Dos señales (SIGKILL y SIGSTOP, que se mencionarán en seguida) no
pueden ser manipuladas y siempre finalizarán el programa.
Hay una variedad de tipos de señales, y la señal en particular que es enviada indica el
tipo de evento (o excepción) ocurrida. Generalmente las señales se usan para manejar
dos cosas:
1. Excepciones detectadas por el hardware (tal como una referencia ilegal a
memoria).
Para ver una lista de las señales en Linux, junto con los números correspondientes, haga
lo siguiente:
Las señales de SIGRTMIN se denominan como de tiempo real y son una adición
relativamente reciente. No tienen un propósito predefinido y difieren de forma importante
en algunos aspectos con relación a las señales normales; pueden ser encoladas y son
manejadas en orden FIFO (First In First Out).
El significado implícito en el tipo de señal indica qué evento causó que fuera enviada.
Mientras los usuarios pueden explícitamente enviar cualquier tipo de señal a uno de sus
procesos, el significado implícito podría no estar relacionado al número o tipo de la señal,
y puede usarse en cualquier forma que el proceso desea.
21.3 kill
Un proceso no puede enviar una señal directamente a otro proceso; este debe pedirle al
kernel que envíe la señal mediante la ejecución de una llamada al sistema. Los usuarios
(incluyendo el superusuario) pueden enviar señales a otros procesos desde la línea de
comandos o scripts usando kill, tal como se muestra a continuación:
$ kill 1991
$ kill -9 1991
$ kill -SIGKILL 1991
en el comando anterior enviamos una señal al proceso con PID = 1991. Si no se provee
un número de señal (como en el primer ejemplo), el valor por defecto a enviar es SIGTERM
(15), una señal de finalización que puede ser manipulada; el programa puede tomar una
acción evasiva o limpiarse a sí mismo en vez de finalizar inmediatamente. Si esta señal es
ignorada, el usuario puede enviar una SIGKILL (9), la cual no puede ser ignorada.
El nombre kill es un nombre realmente malo, el cual sobrevive por razones históricas.
Aunque a menudo se utiliza para matar (terminar) procesos, la función real del comando
es enviar cualquier y todas las señales a los procesos, incluso a los que son benignos y
totalmente informativos.
killall termina todos los procesos con un nombre dado, en el caso que el usuario tenga
los permisos necesarios. Usa un nombre de comando en vez de un ID de proceso y
puede ser ejecutado así:
$ killall bash
$ killall -9 bash
$ killall -SIGKILL bash
Por ejemplo:
/*
* Examining Signal Priori/es and Execu/on.
*
* The code herein is: Copyright the Linux Founda/on, 2014
* Author: J. Cooperstein
*
* This Copyright is retained for the purpose of protec/ng free
* redistribu/on of source.
*
* This code is distributed under Version 2 of the GNU General Public
* License, which you should have received with the source.
* @*/
/*
* Now, use sigac/on to create references to local signal
* handlers * and raise the signal to myself
*
/ prins
("\nInstalling signal handler and Raising signal for signal number:\n\n");
for (signum = 1; signum <= NUMSIGS; signum++) {
if (signum == SIGKILL || signum == SIGSTOP || signum == 32
|| signum == 33) {
prins(" --");
con/nue;
}
sigac/on(signum, &sigact, &oldact);
/* send the signal 3 /mes! */
rc = raise(signum);
rc = raise(signum);
rc = raise(signum);
if (rc) {
prins("Failed on Signal %d\n", signum);
} else {
prins("%4d", signum);
if (signum % 16 == 0)
prins("\n");
}
}
yush(stdout);
Si está tomando la versión autodidacta en línea de este curso, encontrará el código fuente
disponible para su descarga en la pantalla Lab. Necesitará compilarlo y ejecutarlo como se muestra
a con/nuación:
La señal SIGCONT (18 en x86 puede que no logre llegar a des/no, ¿se le ocurre por qué?
Nota:
En algunas distribuciones Linux las señales 32 y 33 no pueden ser bloqueadas y causarán que el
programa falle. A pesar de que los archivos de cabecera del sistema indican SIGRTMIN=32, el
comando kill -l indica SIGRTMIN=34. Tenga en cuenta que POSIX dice que se deberían usar
nombres en vez de números, los cuales están habilitados para ser completamente dependientes de
la implementación. En general se debeía evitar el envío de estas señales.
Objetivos de aprendizaje
Las distribuciones Linux vienen con diversas herramientas estándar instaladas por
defecto para medir el rendimiento y visualizar el estado del sistema. Muchas de ellas
provienen de otros sistemas operativos tipo UNIX, mientras que otras fueron
desarrolladas específicamente para Linux.
La mayoría de estas herramientas hacen uso de pseudosistemas de archivos montados,
especialmente /proc, y /sys de forma secundaria (los cuales discutimos anteriormente
cuando tratamos los sistemas de archivos y configuración del kernel). En este capítulo
trabajaremos con ambos.
Aunque existe una serie de monitores gráficos del sistema, los cuales esconden muchos
detalles, en este curso consideraremos solamente las herramientas de la línea de
comandos.
Antes de considerar algunas de las herramientas principales veremos un resumen
clasificado por tipo; tenga en cuenta que algunas de las herramientas tienen dominios
superpuestos de cobertura.
Los pseudosistemas de archivos /proc y /sys contienen bastante información acerca del
sistema. Por otro lado, muchas de las entradas en estos árboles de directorios son
escribibles y pueden usarse para cambiar el comportamiento del sistema; en la mayoría
de los casos esto requiere del usuario root.
Por otra parte, la información que se despliega es obtenida solamente cuando se lee; no
hay un sondeo constante o periódico para actualizar las entradas.
El pseudosistema de archivos /proc tiene una historia larga; tiene su origen en otras
variantes de sistemas operativos tipo UNIX y en un comienzo fue desarrollado para
desplegar información acerca de los procesos en el sistema, cada uno de los cuales
tiene su propio directorio en /proc, con todas las características importantes de los
procesos.
A través del tiempo creció para contener mucha información acerca de las propiedades
del sistema, tales como interrupciones, memoria, red, etc, en una forma un tanto
anárquica. Todavía es usado de forma extensiva y a menudo nos referiremos a él.
$ ls -F /proc
1/ 11214/ 15887/ 19/ 26/ 3706/ 509/ 614/ 7402/ asound/
modules
10/ 12/ 15891/ 1929/ 260/ 3707/ 510/ 619/ 741/ buddyinfo
mounts@
1017/ 1284/ 15896/ 1934/ 26218/ 3708/ 511/ 620/ 742/ bus/
mtrr
1018/ 1290/ 15899/ 1959/ 264/ 3709/ 512/ 622/ 743/ cgroups
net@
1023/ 13/ 15905/ 19950/ 265/ 3713/ 513/ 623/ 744/ cmdline
pagetypeinfo
1031/ 1301/ 15909/ 2/ 267/ 3714/ 514/ 625/ 761/ config.gz
partitions
10544/ 14/ 15912/ 2008/ 268/ 375/ 515/ 626/ 763/ consoles
sched_debug
10545/ 1400/ 15919/ 2079/ 27/ 396/ 517/ 641/ 7699/ cpuinfo
schedstat
1061/ 1444/ 15928/ 21/ 28/ 398/ 519/ 642/ 8/ crypto
Primero vemos que hay un subdirectorio por cada proceso en el sistema, ya sea si están
durmiendo, en ejecución o programados. Revisando uno al azar:
$ ls -lF /proc/16477
total 0
-r-------- 1 coop coop 0 Sep 10 18:11 auxv
-r—r—r-- 1 coop coop 0 Sep 10 12:28 cgroup—w------- 1 coop coop 0 Sep 10
18:11 clear_refs
-r—r—r-- 1 coop coop 0 Sep 10 08:30 cmdline
-rw-r—r-- 1 coop coop 0 Sep 10 12:28 comm
-rw-r—r-- 1 coop coop 0 Sep 10 18:11 coredump_filter
-r—r—r-- 1 coop coop 0 Sep 10 18:11 cpuset
lrwxrwxrwx 1 coop coop 0 Sep 10 18:11 cwd -> /usr/local/coop7/
-r-------- 1 coop coop 0 Sep 10 18:11 environ
vemos que este corresponde al cliente de correo electrónico thunderbird. Este directorio
está lleno de información, tanto acerca del estado y de los recursos que el proceso está
usando. Por ejemplo:
$ cat /proc/16477/status
Name: thunderbird
State: S (sleeping)
Tgid: 16477
Ngid: 0
Pid: 16477
PPid: 15912
TracerPid: 0
Uid: 500 500 500 500
Gid: 500 500 500 500
FDSize: 256
Groups: 500
VmPeak: 1262996 kB
VmSize: 1139452 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 241644 kB
VmRSS: 201404 kB
Otras entradas proveen información de todo el sistema. Por ejemplo, las estadísticas
de interrupciones se muestran aquí:
$ cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0: 127 0 0 0 IO-APIC-edge timer
1: 22610 26632 22019 24652 IO-APIC-edge i8042
8: 0 0 1 0 IO-APIC-edge rtc0
9: 0 0 0 0 IO-APIC-fasteoi acpi
16: 10 13 13 11 IO-APIC-fasteoi uhci_hcd:usb3
18: 81801 33810 269011 97396 IO-APIC-fasteoi ehci_hcd:usb1,
uhci_hcd:usb5, uhci_hcd:usb8,enp4s2
19: 0 0 0 0 IO-APIC-fasteoi uhci_hcd:usb7
21: 0 0 0 0 IO-APIC-fasteoi uhci_hcd:usb4
23: 459503 414973 2294258 1886762 IO-APIC-fasteoi ehci_hcd:usb2,
uhci_hcd:usb6
43: 7839477 12 17 14 PCI-MSI-edge enp2s0
44: 90833 73862 431567 197408 PCI-MSI-edge ahci
45: 2308942 2324143 2037740 2226651 PCI-MSI-edge nouveau
46: 1706 1853 1806 1740 PCI-MSI-edge snd_hda_intel
NMI: 4021 3150 3201 3076 Non-maskable interrupts
LOC: 8186969 8028365 8257507 7848638 Local timer interrupts
SPU: 0 0 0 0 Spurious interrupts
PMI: 4021 3150 3201 3076 Performance monitoring interrupts
IWI: 455847 423644 402570 390176 IRQ work interrupts
RTR: 0 0 0 0 APIC ICR read retries
RES: 6489645 6430364 6430834 6271845 Rescheduling interrupts
CAL: 4816017 4550737 4171364 4829737 Function call interrupts
TLB: 909001 1140883 879189 1152043 TLB shootdowns
TRM: 0 0 0 0 Thermal event interrupts
THR: 0 0 0 0 Threshold APIC interrupts
MCE: 0 0 0 0 Machine check exceptions
Para cada interrupción vemos su tipo, cuántas veces ha sido manipulada en cada CPU y
qué dispositivos están registrados para responder a ella. También obtenemos estadísticas
globales.
22.5 /proc/sys
$ ls -F /proc/sys
total 0
dr-xr-xr-x 1 root root 0 Sep 10 18:17 abi/
dr-xr-xr-x 1 root root 0 Sep 10 18:17 debug/
dr-xr-xr-x 1 root root 0 Sep 10 15:53 dev/
dr-xr-xr-x 1 root root 0 Sep 10 02:14 fs/
dr-xr-xr-x 1 root root 0 Sep 10 02:14 kernel/
dr-xr-xr-x 1 root root 0 Sep 10 18:17 net/
dr-xr-xr-x 1 root root 0 Sep 10 16:10 vm/
Cada uno de estos subdirectorios contiene información como también controles que
pueden ser ajustados (con cuidado):
abi/
Contiene archivos con información binaria de aplicaciones; raramente se usa.
debug/
Parámetros de depuración; por ahora solo un control de reportes de excepción.
dev/
Parámetros de dispositivo incluyendo subdirectorios para
cdrom, scsi, raid y parport.
fs/
Parámetros de sistemas de archivos, incluyendo cuota, identificadores de archivos
usados y máximos, información de inodos y directorios, etc
kernel/
Parámetros del kernel. Hay muchas entradas importantes aquí.
net/
Parámetros de red. Hay subdirectorios para ipv4, netfilter, etc.
vm/
Parámetros de memoria virtual. Hay muchas entradas importantes aquí.
$ ls -l /proc/sys/kernel/threads-max
$ cat /proc/sys/kernel/threads-max 129498
Los usuarios normales pueden visualizar los valores, sin embargo para modificarlos se
requiere de privilegios de superusuario.
Tiene una estructura más definida que /proc. La mayoría de las entradas contienen solo
una línea de texto, aunque existen excepciones, no llega a ser como su precedesor
(/proc), el cual tiene entradas de múltiples líneas cuyo contenido exacto ha ido
cambiando entre versiones del kernel. Por lo tanto, la interfaz de /sys es más estable
hasta el momento.
Hay propiedades del sistema que tienen entradas tanto en /proc como en /sys; los ítems
antiguos se están eliminando gradualmente con el fin de mantener una compatibilidad
entre las utilidades de sistema usadas ampliamente.
El soporte para el sistema de archivos virtual sysfs está construido en todos los kernel
modernos, y debería montarse bajo /sys. Sin embargo, el modelo unificado de
dispositivos no requiere que sysfs sea montado para entrar en operación.
Echemos un vistazo a lo que podemos encontrar usando el kernel 3.18; advertimos que el
diseño exacto de este sistema de archivos tiene una tendencia a cambiar. Al visualizar los
directorios de nivel superior encontramos:
$ ls -F /sys
block/ bus/ class/ dev/ devices/ firmware/ fs/ kernel/ module/ power/
$ ls -lF /sys/class/net
total 0
lrwxrwxrwx 1 root root 0 Apr 30 11:38 eth0 -> \
../../devices/pci0000:00/0000:00:1c.5/0000:02:00.0/net/eth0/
lrwxrwxrwx 1 root root 0 Apr 30 11:38 eth1 -> \
../../devices/pci0000:00/0000:00:1e.0/0000:04:02.0/net/eth1/
lrwxrwxrwx 1 root root 0 Apr 30 06:38 lo -> \
../../devices/virtual/net/lo/
$ ls -l /sys/class/net/eth0/
total 0
-r—r—r-- 1 root root 4096 Apr 30 13:43 addr_assign_type
-r—r—r-- 1 root root 4096 Apr 30 11:38 address
-r—r—r-- 1 root root 4096 Apr 30 11:38 addr_len
-r—r—r-- 1 root root 4096 Apr 30 13:43 broadcast
-r—r—r-- 1 root root 4096 Apr 30 13:43 carrier
lrwxrwxrwx 1 root root 0 Apr 30 11:38 device -> ../../../0000:02:00.0
-r—r—r-- 1 root root 4096 Apr 30 13:43 dev_id
-r—r—r-- 1 root root 4096 Apr 30 13:43 dormant
-r—r—r-- 1 root root 4096 Apr 30 13:43 duplex
-rw-r—r-- 1 root root 4096 Apr 30 11:38 flags
-rw-r—r-- 1 root root 4096 Apr 30 13:43 ifalias
-r—r—r-- 1 root root 4096 Apr 30 11:38 ifindex
-r—r—r-- 1 root root 4096 Apr 30 13:43 iflink
-r—r—r-- 1 root root 4096 Apr 30 13:43 link_mode
-rw-r—r-- 1 root root 4096 Apr 30 13:43 mtu
-rw-r—r-- 1 root root 4096 Apr 30 13:43 netdev_group
-r—r—r-- 1 root root 4096 Apr 30 13:43 operstate
drwxr-xr-x 2 root root 0 Apr 30 13:43 power
LFS201: Fundamentos de Administración de Sistemas Linux 297
drwxr-xr-x 4 root root 0 Apr 30 11:38 queues
-r—r—r-- 1 root root 4096 Apr 30 13:43 speed
drwxr-xr-x 2 root root 0 Apr 30 13:43 statistics
lrwxrwxrwx 1 root root 0 Apr 30 11:38 subsystem ->
../../../../../../class/net
-rw-r—r-- 1 root root 4096 Apr 30 13:43 tx_queue_len
-r—r—r-- 1 root root 4096 Apr 30 11:38 type
-rw-r—r-- 1 root root 4096 Apr 30 11:38 uevent
$ cat /sys/class/net/eth0/mtu
1500
La intención de sysfs es tener un valor de texto por línea, aunque no se espera que esto
se aplique rigurosamente.
$ ls -l /sys/class/net/eth0/device/
total 0
-rw-r—r-- 1 root root 4096 Apr 30 13:47 broken_parity_status
-r—r—r-- 1 root root 4096 Apr 30 06:38 class
-rw-r—r-- 1 root root 4096 Apr 30 11:38 config
-r—r—r-- 1 root root 4096 Apr 30 13:47 consistent_dma_mask_bits
-r—r—r-- 1 root root 4096 Apr 30 11:38 device
-r—r—r-- 1 root root 4096 Apr 30 13:47 dma_mask_bits
lrwxrwxrwx 1 root root 0 Apr 30 11:38 driver ->
../../../../bus/pci/drivers/sky2/
-rw------- 1 root root 4096 Apr 30 13:47 enable
-r—r—r-- 1 root root 4096 Apr 30 11:38 irq
-r—r—r-- 1 root root 4096 Apr 30 13:47 local_cpulist
-r—r—r-- 1 root root 4096 Apr 30 11:38 local_cpus
-r—r—r-- 1 root root 4096 Apr 30 13:47 modalias
-rw-r—r-- 1 root root 4096 Apr 30 13:47 msi_bus
drwxr-xr-x 3 root root 0 Apr 30 13:47 msi_irqs/
drwxr-xr-x 3 root root 0 Apr 30 11:38 net/
drwxr-xr-x 2 root root 0 Apr 30 13:47 power/
--w—w---- 1 root root 4096 Apr 30 13:47 remove—w—w---- 1 root root
4096 Apr 30 13:47 rescan—w------- 1 root root 4096 Apr 30 13:47 reset
-r—r—r-- 1 root root 4096 Apr 30 13:45 resource
-rw------- 1 root root 16384 Apr 30 13:47 resource0
-rw------- 1 root root 256 Apr 30 13:47 resource2
-rw------- 1 root root 131072 Apr 30 13:47 rom
lrwxrwxrwx 1 root root 0 Apr 30 11:38 subsystem ->
../../../../bus/pci/
-r—r—r-- 1 root root 4096 Apr 30 11:38 subsystem_device
-r—r—r-- 1 root root 4096 Apr 30 11:38 subsystem_vendor
-rw-r—r-- 1 root root 4096 Apr 30 06:38 uevent
-r—r—r-- 1 root root 4096 Apr 30 11:38 vendor
-rw------- 1 root root 32768 Apr 30 13:47 vpd
Para ver la gama completa de información que está disponible en sysfs tendrá que
examinar el directorio.
sar viene de Systems Activity Reporter (informador de actividad del sistema). Es una
herramienta multipropósito para obtener información acerca de la actividad y rendimiento
del sistema, como también para crear reportes de lectura fácil.
Entonces sar lee esa información (ya sea desde la ubicación por defecto o usando el
archivo especificado con la opción -f) y luego produce un reporte.
$ sar 3 3
Linux 3.15.9 (q7) 09/26/2014 _x86_64_ (4 CPU)
12:27:32 PM CPU %user %nice %system %iowait %steal %idle
12:27:35 PM all 1.34 0.00 0.33 0.67 0.00 97.66
12:27:38 PM all 7.08 0.00 2.98 0.34 0.00 89.60
12:27:41 PM all 10.60 0.00 1.09 0.08 0.00 88.23
Average: all 6.32 0.00 1.46 0.37 0.00 91.85
Aquí hay una lista de las opciones o modos más importantes de sar, en donde cada una
tiene sus propias subopciones:
Almacena los datos en el archivo especificado, para ser leído más tarde
-o
con la opción -f
$ sar -B 3 3
Linux 3.15.9 (q7) 09/26/2014 _x86_64_ (4 CPU)
$ sar -b 3 3
El programa ksar es una herramienta basada en java para generar gráficos agradables a
partir de datos de sar. Puede descargarse desde http://sourceforge.net/projects/ksar .
Pueden exis/r paquetes binarios descargables en los formatos .deb y .rpm; revise el si/o web para
detalles y ubicaciones de los mismos. Una vez que está instalado, puede hacer:
$ stress—help
$ info stress
Luego de haber instalado stress, usted puede iniciar el monitor de sistema grá.co, el cual
seguramente encontrará en el menú de aplicaciones. También lo puede ejecutar desde la línea de
comandos, ya sea gnome-system-monitor o ksysguard.
Ahora comience a poner estrés en el sistema. Los números exactos que usarán estarán en función
de los recursos de su sistema, tales como el número de CPU y el tamaño de la RAM.
Por ejemplo, si hace
$ stress -m 4 -t 20s
estresa solamente la memoria del sistema. Juegue con las combinaciones de los parámetros y vea
el impacto que generan entre ellos. Probablemente se de cuenta que el programa stress es ú/l
para simular diversas condiciones de carga alta.
Sin embargo, debido a que la herramienta ha tenido una larga y compleja historia de ser
usada de forma diferente en una variedad de sistemas operativos, tiene muchas opciones
que al combinarlas pueden llevar a confusión. Otra herramienta valiosa es top, la cual
monitorea el estado del sistema de forma interactiva.
Objetivos de aprendizaje
En esta sección nos concentraremos en monitoreo de procesos. Para llevar a cabo esto,
los administradores de Linux hacen uso de muchas herramientas, tales como
ps, pstree y top, todos los que tienen una larga historia en los sistemas operativos
tipo UNIX.
Tener todas estas opciones posibles puede tornar la vida del administrador de sistemas
un poco confusa. Muchos de ellos tienden a usar una o dos combinaciones estándar para
su uso diario.
LFS201: Fundamentos de Administración de Sistemas Linux 305
23.3 Opción de formato BSD para ps
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 198384 6232 ? Ss 07:14 0:01
/usr/lib/systemd/systemd—switched-root -
root 2 0.0 0.0 0 0 ? S 07:14 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 07:14 0:03 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 07:14 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 07:14 0:22 [rcu_preempt]
root 8 0.0 0.0 0 0 ? S 07:14 0:00 [rcu_sched]
root 9 0.0 0.0 0 0 ? S 07:14 0:00 [rcu_bh]
root 10 0.0 0.0 0 0 ? S 07:14 0:03 [migration/0]
....
root 237 0.0 0.0 0 0 ? S 07:14 0:00 [scsi_eh_0]
root 238 0.0 0.0 0 0 ? S< 07:14 0:00 [scsi_tmf_0]
root 239 0.0 0.0 0 0 ? S 07:14 0:00 [scsi_eh_1]
root 240 0.0 0.0 0 0 ? S< 07:14 0:00 [scsi_tmf_1]
....
root 684 0.0 0.0 16744 2648 ? SNs 07:15 0:00 /usr/sbin/alsactl
-s -n 19 -c -E ALSA_CONF
root 690 0.0 0.0 326396 5472 ? Ssl 07:15 0:00
/usr/sbin/ModemManager
root 697 0.0 0.1 181804 8740 ? Ss 07:15 0:00 /usr/sbin/cupsd
-f
....
coop 24400 2.2 0.6 816720 50876 ? Sl 20:19 0:02
/opt/google/chrome/chrome—type=ppapi—c
coop 24819 0.0 0.3 634244 27952 ? Sl 09:01 0:30
/usr/libexec/gnome-terminal-server
coop 30170 0.0 0.0 116660 4816 pts/2 Ss+ 16:14 0:00 bash
....
donde la opción aux muestra todos los procesos. Los comandos que están encerrados en
paréntesis cuadrados (como [ksoftirqd/0]) son hilos que existen totalmente en el kernel;
si hay uno para cada CPU el comando es seguido por un número entero, especificando la
CPU en la cual está ejecutándose.
RSS tamaño de la memoria residente; la memoria física que una tarea está
usando en KB
$ ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 49596 SYSC_e 07:14 ? 00:00:01
/usr/lib/systemd/systemd—switc
1 S root 2 0 0 80 0 - 0 kthrea 07:14 ? 00:00:00
[kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 07:14 ? 00:00:03
[ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 07:14 ? 00:00:00
[kworker/0:0H]
1 S root 7 2 0 80 0 - 0 rcu_gp 07:14 ? 00:00:22
[rcu_preempt]
1 S root 8 2 0 80 0 - 0 rcu_gp 07:14 ? 00:00:00
[rcu_sched]
1 S root 9 2 0 80 0 - 0 rcu_gp 07:14 ? 00:00:00
[rcu_bh]
1 S root 10 2 0 -40 - - 0 smpboo 07:14 ? 00:00:03
[migration/0]
....
1 S root 237 2 0 80 0 - 0 scsi_e 07:14 ? 00:00:00
[scsi_eh_0]
1 S root 238 2 0 60 -20 - 0 rescue 07:14 ? 00:00:00
[scsi_tmf_0]
1 S root 239 2 0 80 0 - 0 scsi_e 07:14 ? 00:00:00
[scsi_eh_1]
1 S root 240 2 0 60 -20 - 0 rescue 07:14 ? 00:00:00
[scsi_tmf_1]
....
0 S root 684 1 0 99 19 - 4186 poll_s 07:15 ? 00:00:00
/usr/sbin/alsactl -s -n 19 -c -E
....
1 S coop 24400 5536 2 80 0 - 204180 futex_ 20:19 ? 00:00:09
/opt/google/chrome/chrome—type
0 S coop 24819 1 0 80 0 - 158561 poll_s 09:01 ? 00:00:31
/usr/libexec/gnome-terminal-serv
0 S coop 30170 24819 0 80 0 - 29165 n_tty_ 16:14 pts/2 00:00:00 bash
....
Tenga en cuenta que en este caso se muestra el PID del proceso padre (PPID) y el factor
de nice (NI). En este ejemplo (tomado en RHEL 7, usando systemd) es posible observar
que muchos procesos muestran PPID=2, el cual es un proceso interno del
kernel, kthreadd, el cual está diseñado para adoptar hijos cuando el proceso padre
muere. En sistemas con versiones antiguas del kernel veríamos PPID=1, haciendo
mención a /sbin/init, pero básicamente es la misma idea.
A continuación un ejemplo:
$ ps -o pid,uid,command
PID UID COMMAND
7989 500 bash
8228 500 ps -o pid,uid,command
Usted puede consultar la página man de ps para obtener muchas otras opciones de
salida.
$ ls -l /proc/18036/task
total 0
dr-xr-xr-x 5 coop coop 0 Sep 11 07:15 18036
dr-xr-xr-x 5 coop coop 0 Sep 11 07:15 18040
dr-xr-xr-x 5 coop coop 0 Sep 11 07:15 18046
dr-xr-xr-x 5 coop coop 0 Sep 11 07:15 18047
Cuando se desea saber qué está haciendo el sistema operativo, la primera herramienta
que se suele usar es top. Si se ejecuta sin argumentos muestra lo siguiente:
$ top
top es una herramienta antigua y tiene muchísimas opciones, como también comandos
interactivos que se inician cuando se presionan ciertas teclas. Por ejemplo, si se
presiona 1, cada CPU se muestra por separado. Si se presiona i, solo se muestran los
procesos activos. Haciendo ambas cosas se obtiene lo siguiente:
top - 12:51:50 up 1 day, 5:31, 6 users, load average: 0.09, 0.14, 0.22
Tasks: 288 total, 1 running, 287 sleeping, 0 stopped, 0 zombie
%Cpu0 : 3.4 us, 1.3 sy, 0.0 ni, 94.6 id, 0.7 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 3.7 us, 0.7 sy, 0.0 ni, 95.0 id, 0.7 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 3.6 us, 1.3 sy, 0.0 ni, 95.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 2.3 us, 1.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 8170032 total, 6360684 used, 1809348 free, 46888 buffers
KiB Swap: 4193776 total, 4848 used, 4188928 free. 4292304 cached Mem
Se tiene mucho control sobre cómo se ordenan los procesos y qué campos se despliegan;
hay muchas otras opciones además de las por defecto. Por ejemplo, si se
presiona h o ? se obtiene una lista breve de los comandos interactivos y q se usa para
salir.
Tenga en cuenta que hay alternativas populares al comando estándar top, algunos de los
cuales proveen interfaces más visuales o información adicional, tales
como htop, ntop y atop. La mayoría de las distribuciones Linux tienen un monitor gráfico
del sistema (como gnome-system-monitor o ksysguard), los cuales tienen una ventana
de despliegue similar a top.
2. $ ps -o pid,pri,ni,cmd
PID PRI NI CMD
2389 19 0 bash
22079 19 0 ps -o pid,pri,ni,cmd
3. $ bash
$ nice -n 10 bash
$ ps -o pid,pri,ni,cmd
2389 19 0 bash
22115 19 0 bash
22171 9 10 bash
22227 9 10 ps -o pid,pri,ni,cmd
4. $ renice 15 -p 22227
$ ps -o pid,pri,ni,cmd
PID PRI NI CMD
2389 19 0 bash
22115 19 0 bash
22171 4 15 bash
22246 4 15 ps -o pid,pri,ni,cmd
5. $ top
3. $ fg
$ ^Z
$ ps -C dd -o pid,cmd,stat
PID CMD STAT
25899 dd if=/dev/urandom of=/dev/ T
$ jobs
[1]+ Stopped dd if=/dev/urandom of=/dev/null
5. Lleve la tarea de vuelta al segundo plano, luego termínela usando el comando kill desde otra
ventana.
$ fg
$ kill 25899
Existe una fuerte y complicada relación entre E/S y rendimiento del sistema. No es fácil
desentrañar la competencia entre procesos por ancho de banda de E/S para
almacenamiento, uso de CPU, memoria y cuellos de botella de la red.
Dos herramientas que pueden ayudar a identificar y aislar problemas de este tipo
son iostat e iotop. La herramienta ionice puede usarse para ayudar a priorizar la
competición entre procesos.
Objetivos de aprendizaje
Como regla, un sistema puede considerarse como atascado en E/S cuando la CPU está
esperando de forma ociosa que alguna operación de E/S se complete para poder
continuar. Otra posibilidad es que la red esté esperando a que los búferes se limpien.
Sin embargo, es posible ser engañado. Lo que parece ser memoria insuficiente puede
resultar de E/S muy lenta; si los búferes de memoria que están siendo usados para leer y
escribir se llenan, esto puede indicar que el problema está en la memoria, cuando el
problema real es que los búferes no se están llenando o vaciando lo suficientemente
rápido. De manera similar, las transferencias de red pueden estar esperando por
operaciones de E/S que tienen que completarse, lo cual tiene un efecto negativo en el
rendimiento de red.
Tanto el monitoreo en tiempo real como el seguimiento son herramientas necesarias para
localizar y mitigar cuellos de botella. Sin embargo, problemas extraños o que no son
reproducibles pueden hacer que estas tareas sean difíciles de lograr.
24.2 iostat
$ iostat
Linux 3.15.9 (q7) 09/11/2014 _x86_64_
(4 CPU)
La información está dividida por particiones del disco (y si LVM está siendo usada por
particiones lógicas de dm, device mapper).
Si se especifica la opción -k, se genera una vista un tanto diferente, la cual muestra los
resultados en KB en vez de bloques:
$ iostat -k
Linux 3.15.9 (q7) 09/11/2014 _x86_64_ (4
CPU)
iostat -N
Se puede obtener un informe mucho más detallado si se usa la opción -x (de extendido):
$ iostat -xk
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await
w_await svctm %util
sda 1.04 2.61 7.68 4.33 169.34 61.23 38.39 0.16 12.96 10.53
17.27 1.86 2.24
dm-0 0.00 0.00 1.15 4.40 45.92 48.38 34.01 0.03 6.23 7.38
5.92 2.42 1.34
Campo Significado
Device Dispositivo o nombre de la partición
rrqm/s Número de solicitudes de lectura por segundo, encoladas al dispositivo
wrqm/s Número de solicitudes de escritura por segundo, encoladas al dispositivo
r/s Número de solicitudes de lectura por segundo, emitidas al dispositivo
w/s Número de solicitudes de escritura por segundo, emitidas al dispositivo
rkB/s KB por segundo leídos desde el dispositivo
wkB/s KB por segundo escritos al dispositivo
avgrq-sz Tamaño promedio de solicitud en sectores de 512 bytes por segundo
avgqu-sz Longitud promedio de la cola de solicitudes emitidas al dispositivo
Tiempo promedio (en milisegundos) de solicitudes de E/S entre cuando
await se emite una solicitud y cuando se ha completado: tiempo de la cola más
tiempo de servicio
svctm Tiempo promedio de servicio (en milisegundos) para solicitudes de E/S
Porcentaje de tiempo de CPU durante las solicitudes servidas a
%util
dispositivos
Otra herramienta muy útil es iotop, la cual debe ser ejecutada como root. Esta despliega
una tabla del uso actual de E/S y se actualiza periódicamente, de la misma forma que lo
hace top. Si se ejecuta sin opciones muestra lo siguiente:
$ sudo iotop
Total DISK READ : 132.32 M/s | Total DISK WRITE : 132.79 M/s
Actual DISK READ: 132.32 M/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
9791 be/4 root 132.32 M/s 132.79 M/s 0.00 % 72.48 % cp
/usr/s~.sqfs /tmp
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd
-~rialize 22
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
5 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H]
2054 be/4 coop 0.00 B/s 0.00 B/s 0.00 % 0.00 % gsd-printer
7 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_preempt]
8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]
9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh]
10 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
.....
$ sudo iotop—help
DISK READ and DISK WRITE are the block I/O bandwidth used during the
sampling
period. SWAPIN and IO are the percentages of time the thread spent
respectively
while swapping in and waiting on I/O more generally. PRIO is the I/O
priority at
which the thread is running (set using the ionice command).
Controls: left and right arrows to change the sorting column, r to invert
the
sorting order, o to toggle the—only option, p to toggle the—processes
option, a to toggle the—accumulated option, i to change I/O priority, q
to
quit, any other key to force a refresh.
Options:
--version show program’s version number and exit
-h, --help show this help message and exit
-o, --only only show processes or threads actually doing I/O
Usar la opción -o puede ser útil para tener una salida más limpia.
Si se pasa un pid a través del argumento -p, el resultado aplica al proceso solicitado, de
lo contrario se aplicará al proceso iniciado por COMMAND con los argumentos
correspondientes. Si no se proveen argumentos, ionice provee la clase de planificación y
prioridad del proceso de shell actual, como se muestra aquí:
$ ionice
idle: prio 7
El parámetro -c especifica la clase de planificación de E/S, la cual puede tener los tres
valores que siguen:
Tabla 24.2: Clases de planificación de E/S
Clase de
valor
planificación de de -c Significado
E/S
No tiene acceso a E/S de disco a menos que ningún otro
Idle 1
programa lo haya solicitado por un período definido.
Todos los programas se atienden con el método round-
Best effort 2 robin, de acuerdo a los ajustes de prioridad. Esta es la
configuración por defecto.
Obtiene acceso primero al disco, lo cual puede desplazar
Real Time 3 a otros procesos. La prioridad define el tamaño de la
tajada de tiempo que recibe cada proceso.
Las clases Best Effort y Real Time toman el argumento -n, el cual da la prioridad, la que
puede estar en un rango de 0 a 7, en donde 0 es la prioridad mayor. Un ejemplo:
$ ionice -c 2 -n 3 -p 30078
Nota: ionice funciona solo cuando se usa el planificador de E/S CFQ, el cual se
mencionará en el capítulo siguiente.
LFS201: Fundamentos de Administración de Sistemas Linux 321
Comprobación de conocimientos 24.1
[-n number-to-stat[:max-size[:min-size][:num-directories[:chunk-size]]]]
[-m machine-name] [-r ram-size-in-MiB]
[-x number-of-tests] [-u uid-to-use:gid-to-use] [-g gid-to-use]
[-q] [-f] [-b] [-p processes | -y] [-z seed | -Z random-.le]
[-D]
Version: 1.96
Un test rápido puede obtenerse con un comando como el siguiente:
$ /me sudo bonnie++ -n 0 -u 0 -r 100 -f -b -d /mnt
Si no suministra una cifra para el tamaño de memoria, el programa averiguará cuánta memoria
/ene el sistema y creará un archivo de prueba de 2 a 3 veces ese tamaño. No haremos eso aquí
debido a que tomaría mucho /empo para probar el programa.
En un sistema RHEL 7:
$ /me sudo bonnie++ -n 0 -u 0 -r 100 -f -b -d /mnt
Using uid:0, gid:0.
Wri/ng intelligently...done
Rewri/ng...done
Reading intelligently...done start ’em...done...done...done...done...done...
Luego de leer la documentación, ejecute pruebas más largas y ambiciosas. Intente alguna de las
pruebas que no realizamos. Si su sistema se comporta bien, guarde los resultados para realizar
comparaciones de benchmarking en el futuro, en caso de que su sistema mani.este algún
problema de rendimiento.
Lea el archivo README para obtener más información, ya que vamos a realizar lo básico. Si la
compilación falla con un error como este:
$ make
....
/usr/bin/ld: cannot .nd -lc
es porque no está instalada la versión está/ca de glibc. En sistemas basados en Red Hat lo puede
hacer como sigue:
En sistemas basados en Debian la biblioteca está/ca está instalada junto a la compar/da, por lo
cual no es necesario instalar algún paquete adicional.
A modo de prueba, vamos a crear 1000 archivos, cada uno de 10 KB, luego de lo cual ejecutaremos
fsync para escribir los cambios al disco. Esto puede hacerse en el directorio /tmp con el comando:
Mientras esto está ejecutándose, obtenga estadís/cas extendidas en otra terminal con iostat:
$ iostat -x -d /dev/sda 2 20
Vea cómo cambian los resultados. Tenga en cuenta que estas opciones podrían causar problemas si
usted /ene un corte de energía eléctrica o cualquier otro apagado inesperado; es decir, es
probable que exista una relación inversa entre estabilidad y velocidad. La documentación acerca de
algunas opciones de mount se puede encontrar junto a las fuentes del kernel en
Documenta/on/.lesystems y en la página man de mount
Linux ofrece una variedad de planificadores de E/S a elegir, cada uno de los cuales
tiene parámetros ajustables, como también un número de herramientas para generar
reportes y analizar el rendimiento de E/S.
Objetivos de aprendizaje
Al final de este capítulo usted debería ser capaz de:
Explicar la importancia de la planificación de E/S y describir los requisitos en
conflicto que deben ser resueltos.
Delinear y contrastar las opciones disponibles en Linux.
Comprender cómo funcionan los algoritmos CFQ (Completely FairQueue)
y Deadline.
La introducción gradual de los dispositivos SSD (discos de estado sólido), los cuales usan
memoria flash para emular discos duros, tienen importantes implicancias para la
planificación de E/S.
Tales dispositivos no requieren de un esquema de ascensor y se benefician de la técnica
conocida como nivelación de desgaste para difundir E/S sobre los dispositivos que
tienen ciclos limitados de escritura/borrado.
Es posible examinar /sys/block/<device>/queue/rotational para ver si el dispositivo
es SSD o no, como se muestra a continuación:
$ cat /sys/block/sda/queue/rotational
1
Cada uno de los planificadores de E/S presentan parámetros que se pueden usar para
ajustar el comportamiento en tiempo de ejecución. Los parámetros se acceden a través
del pseudosistema de archivos montado en /sys.
Adicionalmente, es posible usar diferentes planificadores de E/S para diversos
dispositivos. La elección puede realizarse fácilmente desde la línea de comandos. Por
ejemplo:
$ cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
$ echo noop > /sys/block/sda/queue/scheduler
$ cat /sys/block/sda/queue/scheduler
$ ls -l /sys/block/sda/queue/iosched
total 0
El método CFQ (Completely Fair Queue) tiene el objetivo de propagar un ancho de banda
de E/S igual entre todos los procesos.
En teoría, cada proceso tiene su propia cola de E/S, la cual trabaja en conjunto a una cola
de despacho que recibe las solicitudes hacia el dispositivo. En la práctica, el número de
colas es fijo (64) y un proceso hash basado en el ID del proceso se usa para seleccionar
una cola cuando se ingresa una solicitud.
El desencole de las solicitudes se realiza con el mecanismo round robin en todas las
colas, cada una de las cuales funciona en orden FIFO (primero en entrar, primero en
salir). De esa forma se lleva a cabo el trabajo. Para evitar operaciones excesivas de
búsqueda, se selecciona una ronda completa y se pasa a la cola de despacho antes de
que las solicitudes reales de E/S se emitan al dispositivo.
queued
Solicitud mínima de asignación por cola (valor por defecto = 8).
fifo_expire_sync
timeout FIFO para solicitudes de sincronización (valor por defecto = HZ/2).
fifo_expire_async
timeout FIFO para solicitudes asincrónicas (valor por defecto = 5 * HZ).
fifo_batch_expire
Velocidad a la cual expira FIFO (valor por defecto = HZ/8).
back_seek_max
Búsqueda hacia atrás máxima, en KB (valor por defecto = 16K).
back_seek_penalty
Penalización por una búsqueda hacia atrás (valor por defecto = 2).
Exactamente cómo las solicitudes son removidas de las primeras cuatro colas y puestas
en la quinta (cola de envío) es donde entra en juego el arte del algoritmo.
# *
# * This Copyright is retained for the purpose of protecting free
# * redistribution of source.
# *
# * This code is distributed under Version 2 of the GNU General Public
# * License, which you should have received with the source.
# *
# */
NMAX=8
NMEGS=100
[[ -n $1 ]] && NMAX=$1
[[ -n $2 ]] && NMEGS=$2
done
done
done
done
antes de realizar el test de lectura. Puede hacer cat a /dev/null para evitar escribir en el
disco.
Asegúrese de que todas las lecturas están completas antes de obtener información del
/empo tomado; esto puede llevarse a cabo ejecutando el comando wait en una shell.
Las pruebas de escritura se hacen simplemente copiando un archivo (el cual estará en el
caché luego de la primera lectura) múl/ples veces de forma simultánea. Para asegurarse
que todas las operaciones de escritura se han completado antes de obtener información
del /empo tomado, puede ejecutar el comando sync.
A través del tiempo los sistemas se han vuelto más demandantes de recursos de
memoria, al mismo tiempo que los precios de la RAM han disminuido y el rendimiento ha
mejorado. De todas formas aún sucede que los cuellos de botella en el rendimiento
general del sistema están relacionados a la memoria; las CPUs y el subsistema de E/S
podrían estar esperando que los datos se obtengan o escriban a memoria. Hay muchas
herramientas para monitoreo, depuración y ajuste del comportamiento de un sistema en
relación a su memoria.
Objetivos de aprendizaje
Ajustar el subsistema de memoria puede ser un proceso complejo. Primero que todo hay
que notar que el uso de memoria y el rendimiento de E/S están intrínsicamente
relacionados, ya que en la mayoría de los casos la memoria se usa para poner en caché
el contenido de los archivos en disco.
Al ajustar parámetros en /proc/sys/vm, la mejor práctica suele ser modificar una cosa a la
vez y analizar los efectos. Las tareas principales son las siguientes:
Aquí hay una lista de algunas herramientas básicas importantes para monitorear y
optimizar la memoria en Linux:
Entrada Propósito
admin_reserve_kbytes Cantidad de memoria libre reservada para
usuarios con privilegios.
block_dump Habilita depuración de bloques de E/S.
Habilita o deshabilita la compactación de
compact_memory memoria (esencialmente la defragmentación)
cuando está configurada como parte del kernel.
dirty_background_bytes Umbral de memoria sucia que provoca que las
páginas se escriban a disco.
dirty_background_ratio Porcentaje total de páginas con el que el kernel
comenzará a escribir datos sucios al disco.
dirty_bytes La cantidad de memoria sucia que un proceso
necesita para iniciar la escritura por sí solo.
Cuando los datos sucios son los suficientemente
dirty_expire_centisecs antiguos para ser escritos en centésimas de
segundo.
Porcentaje de páginas en el cual un proceso de
dirty_ratio escritura comenzará a escribir datos sucios por sí
solo.
Intervalo en el cual los demonios de reescritura
dirty_writeback_centisecs periódica se despiertan para limpiar. Si se
configura en cero, no hay reescritura periódica
automática.
Echo 1 se usa para liberar el caché de páginas, 2
para los cachés dentry e inodo, 3 para liberar
drop_caches todos. Tenga en cuenta que solo las páginas
limpias en caché se eliminan; primero haga sync
para eliminar las páginas sucias.
extfrag_threshold Controla cuando el kernel debe compactar
memoria.
hugepages_treat_as_movable Se usa para cambiar la forma en la que huge
pages es tratada.
hugetlb_shm_group Configura un ID de grupo que puede usarse para
huge pages System V.
laptop_mode Puede controlar una serie de características para
ahorrar energía en portátiles.
legacy_va_layout Use el diseño antiguo (kernel 2.4) en relación a
cómo se muestran las asignaciones de memoria.
lowmen_reserve_ratio Controla cuánta memoria baja está reservada para
Usted puede encontrar información completa del directorio /proc/sys/vm en las fuentes
del kernel bajo Documentation/sysctl/vm.txt (o en el paquete de documentación del
kernel de su distribución).
26.4 vmstat
$ vmstat 2 4
procs -----------memory---------- ---swap-- -----io---- -system--
------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 4521672 375560 1792484 0 0 49 17 363 275 3 1 95 1 0
0 0 0 4521408 375560 1792516 0 0 0 0 490 352 1 1 98 0 0
0 0 0 4521408 375568 1792516 0 0 0 14 436 316 1 0 99 0 0
1 0 0 4521408 375576 1792516 0 0 0 10 452 330 1 0 98 0
0
donde la primera línea muestra los promedios desde el último reinicio, mientras que las
líneas subsiguientes muestran la actividad durante el intervalo especificado.
La memoria se puede mover entre las listas de memoria activa e inactiva en tanto hay
cambios, o por otra parte, pueden permanecer en su lugar si se deja mucho tiempo entre
usos.
Para obtener una tabla de estadísticas de memoria y ciertos contadores de eventos use la
opción -s:
$ vmstat -s
$ vmstat -d
$ vmstat -p /dev/sda1 2 4
sda1 reads read sectors writes requested writes
23913 1969794 11412 291672
23913 1969794 11417 291712
23913 1969794 11417 291712
23913 1969794 11419 291736
26.5 /proc/meminfo
$ cat /proc/meminfo
MemTotal: 8170032 kB
MemFree: 4506996 kB
MemAvailable: 6747268 kB
Buffers: 376744 kB
Cached: 1865956 kB
SwapCached: 0 kB
Active: 2155424 kB
Inactive: 1036312 kB
Active(anon): 951000 kB
Inactive(anon): 49300 kB
Active(file): 1204424 kB
Inactive(file): 987012 kB
Unevictable: 32 kB
Mlocked: 32 kB
SwapTotal: 4193776 kB
SwapFree: 4193776 kB
Dirty: 48 kB
Writeback: 0 kB
AnonPages: 949168 kB
Mapped: 397340 kB
Shmem: 51312 kB
Slab: 336148 kB
SReclaimable: 302240 kB
SUnreclaim: 33908 kB
KernelStack: 8352 kB
PageTables: 29752 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 8278792 kB
Committed_AS: 3790248 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 327116 kB
VmallocChunk: 34359398732 kB
AnonHugePages: 344064 kB
HugePages_Total: 0
Significado
Entrada
MemTotal RAM total disponible (memoria física menos la memoria reservada por el
kernel)
MemFree Memoria libre tanto en zonas bajas como altas
Buffers Memoria usada para almacenamiento temporal de bloques de E/S
Cached Memoria de caché de páginas, principalmente para E/S de archivos
SwapCached Memoria que fue sacada del área de intercambio pero que todavía
permanece en el archivo de intercambio
Active Memoria usada recientemente, no va a ser recuperada primero
Inactive Memoria que no ha sido usada recientemente, más elegible para ser
recuperada
Active(anon) Memoria activa para páginas anónimas
Inactive(anon) Memoria inactiva para páginas anónimas
Active(file) Memoria activa para páginas de archivos respaldados
Inactive(file) Memoria inactiva para páginas de archivos respaldados
Unevictable Páginas que no pueden ser sacadas del área de intercambio ni liberadas
Mlocked Páginas que están bloqueadas en memoria
SwapTotal Espacio total de intercambio disponible
SwapFree Espacio de intercambio que no está en uso
Dirty Memoria que necesita ser escrita nuevamente al disco
Writeback Memoria que está siendo escrita activamente de nuevo a disco
AnonPages Páginas respaldadas (que no corresponden a archivos) en caché
Mapped Páginas mapeadas a memoria, tales como bibliotecas
Shmem Páginas usadas para memoria compartida
Slab Memoria usada en slabs
SReclaimable Memoria de caché en slabs que puede ser recuperada
SUnreclaim Memoria de caché en slabs que no puede ser recuperada
KernelStack Memoria usada en el stack del kernel
Tenga en cuenta que las entradas exactas dependerán de la versión específica del kernel
en ejecución.
La manera más simple de lidiar con presión de memoria sería permitir las asignaciones de
memoria en tanto hay memoria disponible y luego denegarlas cuando la memoria se ha
agotado.
La segunda forma más simple es usar un área de intercambio en disco para hacer
espacio en memoria; en este caso la memoria disponible total (al menos en teoría) es
la RAM más el tamaño del área de intercambio. La parte compleja de esto es determinar
qué páginas de memoria van a ir al área de intercambio cuando el sistema esté bajo
presión. Bajo este enfoque, una vez que el área de intercambio se llena, las solicitudes
para asignar memoria deben ser denegadas.
Sin embargo, Linux tiene una solución mejor; permite que el sistema realice un
overcommit de memoria, de tal forma que puede conceder solicitudes de memoria que
exceden el tamaño de la RAM más el área de intercambio. Si bien es cierto esto puede
parecer temerario, muchos de los procesos (si no la mayoría) no usan toda la memoria
solicitada.
Así, el kernel permite el overcommit de memoria, pero solo para páginas dedicadas a
procesos de usuario; las páginas usadas en el kernel no van al área de intercambio y
siempre se asignan al momento de ser solicitadas.
Es posible modificar e incluso desactivar el overcommit ajustando el valor
de /proc/sys/vm/overcommit_memory:
Si la memoria se agota, Linux invoca el OOM-killer (Out Of Memory) para decidir qué
proceso(s) deben ser terminados para liberar memoria.
No hay una ciencia exacta para esto; el algoritmo debe ser heurístico y no puede
satisfacer a todos. En las mentes de muchos desarrolladores, el propósito del OOM-killer
es permitir un cierre exitoso, en vez de ser parte de las operaciones normales.
$ sudo /sbin/swapoff -a
Asegúrese de habilitar las áreas de intercambio una vez que haya terminado, con
$ sudo/sbin/swapon -a
Ahora vamos a poner el sistema bajo una presión de memoria creciente. Una forma de
hacerlo es con el programa stress que instalamos anteriormente, al ejecutarlo con los
argumentos que se muestran a continuación:
$ stress -m 8 -t 10s
Una función esencial de los distribuidores de Linux es desarrollar, mantener los paquetes
y asegurarse que las dependencias son mantenidas apropiadamente con el tiempo.
Objetivos de aprendizaje
Los sistemas de gestión de paquetes proveen las herramientas que les permiten a los
administradores de sistemas automatizar la instalación, actualización, configuración y
eliminación de paquetes de software, todo ello de una forma conocida, predecible y
consistente. Estos sistemas:
Reunir y comprimir archivos de software asociado en un solo paquete (archivo), lo
cual puede requerir que uno o más paquetes se instalen primero.
Permiten que la instalación y eliminación de software sea fácil.
Puede verificar la integridad del archivo a través de una base de datos interna.
Puede autenticar el origen de los paquetes.
Facilita las actualizaciones.
Agrupa los paquetes por características lógicas.
Administra las dependencias entre paquetes.
Los sistemas de gestión de paquetes de software son ampliamente vistos como uno de
los avances más grandes que Linux trajo a los ambientes empresariales de IT. Al llevar
un registro de archivos y metadatos de forma automatizada, predecible y confiable, los
administradores de sistemas pueden usar los sistemas de gestión de paquetes para para
escalar el proceso de instalación a miles de sistemas sin requerir de trabajo manual en
cada sistema por separado. Las características incluyen:
Repetibilidad y predictibilidad.
Seguridad y auditoría.
Los paquetes de código fuente se usan para generar paquetes binarios; uno
siempre debería tener la posibilidad de reconstruir un paquete binario (por
ejemplo, usando rpmbuild—rebuild en sistemas basados en RPM) desde el
código fuente. Un paquete de código fuente puede ser usado en múltiples
arquitecturas.
Los administradores de sistema tienen que lidiar la mayoría del tiempo con los paquetes
binarios. En sistemas de 64 bits que pueden ejecutar programas de 32 bits, es posible
tener dos paquetes binarios instalados para un programa dado; tal vez uno
con x86_64 o amd64 en el nombre y otro con i386 o i686.
Los paquetes de código fuente pueden ser útiles para mantener el seguimiento de los
cambios y el código usado que viene en los paquetes binarios. Generalmente no están
instalados por defecto en un sistema pero siempre pueden ser obtenidos desde el
proveedor de la distribución.
En este curso discutiremos solamente las interfaces de línea de comandos a los sistemas
de gestión de paquetes. Si bien es cierto que las interfaces gráficas usadas por cada
distribución Linux pueden ser útiles, nos gustaría estar menos atado a solo una de ellas y
también tener más flexibilidad.
Cada distribución tiene uno o más repositorios de paquetes desde donde las
herramientas del sistema obtienen software y las actualizaciones de versiones nuevas. Es
trabajo de la distribución asegurarse que todos los paquetes en los repositorios
interactúan bien unos con otros.
Hay otros repositorios, externos, que pueden agregarse a la lista estándar que soporta la
distribución. A veces están estrechamente asociadas a la distribución y raramente
generan problemas importantes; un ejemplo puede ser EPEL(Extra Packages
for Enterprise Linux), un conjunto de repositorios dependientes de la versión de la
distribución, los cuales encajan bien con RHEL ya que su fuente Fedora y los
mantenedores de ésta son cercanos a Red Hat.
No vamos a discutir los mecanismos acerca de cómo construir paquetes .rpm o .deb, ya
que ese es un asunto que atañe más a desarrolladores de software que a
administradores.
Objetivos de aprendizaje
RPM (Redhat Package Manager) fue desarrollado por Red Hat (como era de esperar).
Todos los archivos relacionados a una tarea específica están empaquetados en un
archivo rpm único, el cual también contiene información acerca de cómo y donde
instalar/desinstalar los archivos. Las versiones nuevas de software conducen a
archivos rpm nuevos, los que se usan para la actualización.
Los archivos rpm también contienen información acerca de las dependencias. Tenga en
cuenta que a menos que se especifique una URL para obtener los paquetes, rpm no irá a
buscar los paquetes a internet, sino que más bien los instalará desde la máquina local
solamente, usando rutas absolutas o relativas para tal efecto.
Distinguir los archivos de documentación del resto de los archivos del paquete, y
opcionalmente decidir no instalarlos para ahorrar espacio en disco.
Los nombres de los paquetes RPM están basados en campos que representan
información específica, tal como se documenta en el estándar RPM (http://www.rpm.org/).
<name>-<version>-<release>.<distro>.<architecture>.rpm
sed-4.2.1-10.el6.x86_64.rpm
<name>-<version>-<release>.<distro>.src.rpm
sed-4.2.1-10.el6.src.rpm
Tenga en cuenta que el campo distro a menudo especifica el repositorio del cual
proviene el paquete, dado a que una instalación puede usar varios repositorios de
paquetes como discutiremos en la sección de yum y zypper, herramientas que trabajan
sobre RPM.
Usted puede usar la opción—rebuilddb para reconstruir los índices de la base de datos
desde los headers de los paquetes instalados; esto es más bien una reparación y no una
reconstrucción desde cero.
Los programas auxiliares y scripts usados por RPM residen en /usr/lib/rpm. Hay un buen
número; por ejemplo, en un sistema RHEL 7:
$ ls /usr/lib/rpm | wc -l
69
/etc/rpmrc
~/.rpmrc
Tenga en cuenta que se leen todos esos archivo; rpm no se detiene tan pronto encuentra
uno de esos archivos. Puede especificarse un archivo rpmrc alternativo con la opción —
rcfile.
28.6 Consultas
Todas las consultas rpm incluyen la opción -q, la cual puede ser combinada con diversas
subopciones, como las que siguen:
¿Qué versión de un paquete está instalada?
$ rpm -q bash
Muestra información acerca del paquete desde el archivo del paquete en sí, no
desde la base de datos.
$ rpm -qa
donde la salida anterior muestra solo unos pocos ítems. Tenga en cuenta que este
comando podría tomar bastante tiempo ya que examina todos los archivos asociados a
cada paquete.
Se examinan los nombres de paquete que son pasados como argumento, como en los
ejemplos que siguen a continuación:
$ rpm -V bash
La salida indica que el tamaño de archivo, checksum y tiempo de modificación han
cambiado:
$ rpm -V talk
S.5....T in.ntalkd.8
$ rpm -V talk
missing /usr/bin/talk
en donde -i es para instalar, -v para tener una salida detallada y -h imprime marcas de
control para mostrar el progreso de la tarea.
RPM realiza varias tareas cuando se instala un paquete:
Verifica las dependencias:
Es necesario debido a que algunos paquetes no funcionarán correctamente a
menos que uno o más paquetes estén instalados también.
Realiza comprobaciones de conflictos:
Incluye intentos de instalar un paquete ya instalado o instalar una versión antigua
sobre unas más recientes.
Ejecuta comandos requeridos antes de la instalación:
El desarrollador que construye un paquete puede especificar ciertas tareas que
deben llevarse a cabo antes o después de la instalación.
Lidia inteligentemente con los archivos de configuración:
Cuando se instala un archivo de configuración, si el archivo existe y ha sido
modificado desde que se instaló la previa del paquete, RPM guarda la versión
antigua con el sufijo .rpmsave. Esto permite integrar los cambios realizados
anteriormente en el archivo de configuración antiguo en la versión nueva del
archivo. Esta característica depende de que los paquetes RPM hayan sido
creados correctamente.
Desempaqueta los archivos desde los paquetes y los instala con los atributos
adecuados:
Además de instalar archivos en el lugar correcto, RPM también configura atributos
tales como permisos, dueños y hora de modificación.
Una actualización reemplaza el paquete original (si es que está instalado), como se
muestra aquí:
Sin embargo, diferentes versiones del mismo paquete pueden estar instaladas si cada
versión del paquete no contiene los mismos archivos: los paquetes del kernel y de las
bibliotecas de otras arquitecturas son generalmente los únicos que pueden estar
instalados múltiples veces.
El siguiente comando:
$ sudo rpm -Fvh *.rpm
intentará refrescar todos los paquetes en el directorio actual. La forma en la cual funciona
es la siguiente:
Si una versión anterior del paquete está instalada, esta será actualizada a la más
nueva que está en el directorio.
El refrescar paquetes puede ser útil para aplicar un montón de partes de una vez (para
actualizar paquetes, por ejemplo).
Cuando se instala un kernel nuevo en el sistema, se requiere un reinicio para que tome
efecto (una de las pocas actualizaciones que lo requieren). No se debería hacer una
actualización (-U) de un kernel: una actualización desinstalaría el kernel que está
actualmente en ejecución.
Una vez que la versión nueva del kernel ha sido probada, usted puede desinstalar la
versión antigua si lo desea, aunque no es necesario. A menos que tenga poco espacio en
disco, es recomendable que mantenga una o más versiones anteriores del kernel.
Supongamos que necesita extraer archivos desde un rpm pero no desea instalar el
paquete.
4. En RHEL 7:
$ sudo rpm -e logrotrate
error: Failed dependencies:
En openSUSE 13.1:
$ sudo rpm -e logrotate
error: Failed dependencies:
logrotate is needed by (installed) xdm-1.1.10-24.2.1.x86_64
logrotate is needed by (installed) syslog-service-2.0-772.1.2.noarch
logrotate is needed by (installed) wpa_supplicant-2.0-3.4.1.x86_64
logrotate is needed by (installed) mcelog-1.0pre3.6e4e2a000124-19.4.1.x86_64
logrotate is needed by (installed) apache2-2.4.6-6.27.1.x86_64
logrotate is needed by (installed) net-snmp-5.7.2-9.8.1.x86_64
logrotate is needed by (installed) kdm-4.11.12-119.1.x86_64
Tenga en cuenta que el árbol exacto de dependencias de paquetes está en función tanto de la
distribución como del soNware instalado.
Solución 28.2
1. $ cd /var/lib
$ sudo cp -a rpm rpm_BACKUP
2. $ sudo rpm—rebuilddb
3. $ ls -l rpm rpm_BACKUP
5. $ ls -l rpm rpm_BACKUP
6. ¡Realice este paso una vez que esté seguro de que el sistema está funcionando
correctamente!
Objetivos de aprendizaje
Los archivos de paquete tienen un sufijo .deb y la base de datos de DPKG reside en el
directorio /var/lib/dpkg.
Tal como rpm, el programa dpkg tiene una vista parcial del universo: solamente sabe qué
está instalado en el sistema y cualquier cosa que se provee a través de la línea de
comandos. Pero no sabe nada de los otros paquetes disponibles, si están en otro
directorio en el sistema o en internet. Como tal, fracasará también si una dependencia no
se cumple, o si alguien trata de desinstalar un paquete que otros que están instalados
necesitan.
Los nombres de archivo de los paquetes de Debian están basados en campos que
representan información específica. El formato estándar de nombres para un paquete
binario es el siguiente:
<name>_<version>-<revision_umber>_<architecture>.deb
como en Debian:
logrotate_3.8.7-1_amd64.deb
y en Ubuntu:
logrotate_3.8.7-1ubuntu1_amd64.deb
logrotate-3.8.7:
total 228
-rw-r—r-- 1 root root 890 Aug 1 2012 basenames.c
-rw-r—r-- 1 root root 219 Aug 1 2012 basenames.h
....
$ dpkg -l
$ dpkg -L wget
$ dpkg -p wget
$ dpkg -I webfs_1.21+ds1-8_amd64.deb
$ dpkg -c webfs_1.21+ds1-8_amd64.deb
$ dpkg -S /etc/init/networking.conf
$ dpkg -s wget
$ dpkg -V package
29.5 Instalación/Actualización/Desinstalación
El comando:
se usa para desinstalar por completo un paquete instalado, con excepción de los archivos
de configuración. El comando:
se usa para desinstalar por completo un paquete instalado, incluyendo los archivos de
configuración.
Solución 29.1
1. $ dpkg -S /etc/logrotate.conf
logrotate: /etc/logrotate.conf
2. $ dpkg -L logrotate
...
3. $ dpkg -V logrotate
4. $ sudo dpkg -r logrotate
dpkg: dependency problems prevent removal of logrotate:
libvirt-bin depends on logrotate.
ubuntu-standard depends on logrotate.
Objetivos de aprendizaje
yum provee una interfaz a rpm. Su tarea principal es obtener paquetes desde múltiples
repositorios remotos y resolver dependencias entre paquetes. Es usado por la mayoría de
las distribuciones que usan rpm (aunque no todas), incluyendo RHEL, CentOS,
Scientific Linux y Fedora.
$ ls -l /etc/yum.repos.d
total 40
-rw-r—r-- 1 root root 957 Nov 4 2012 epel.repo
-rw-r—r-- 1 root root 1056 Nov 4 2012 epel-testing.repo
-rw-r—r-- 1 root root 188 May 28 2013 google-chrome.repo
-rw-r—r-- 1 root root 113 Dec 11 2011 google-earth.repo
-rw-r—r-- 1 root root 128 Dec 23 2013 google-talkplugin.repo
-rw-r—r-- 1 root root 477 Jan 29 2012 nux-dextop.repo
-rw-r—r-- 1 root root 529 Oct 30 2013 rhel-source.repo
-rw-r—r-- 1 root root 1113 Jan 4 2011 rpmforge.repo
-rw-r—r-- 1 root root 256 May 22 07:00 virtualbox.repo
Tenga en cuenta que en RHEL 6 no hay un archivo redhat.repo, pero está presente
en RHEL 7:
total 112
drwxr-xr-x. 2 root root 4096 Sep 24 13:44 ./
drwxr-xr-x. 151 root root 12288 Oct 2 12:52 ../
-rw-r—r-- 1 root root 957 Sep 2 11:14 epel.repo
-rw-r—r-- 1 root root 1056 Sep 2 11:14 epel-testing.repo
-rw-r—r-- 1 root root 116 Sep 3 11:40 google-chrome.repo
-rw-r—r-- 1 root root 477 Jul 31 02:50 nux-dextop.repo
-rw-r—r-- 1 root root 37763 Sep 24 13:44 redhat.repo
[repo-name]
name=Description of the repository
baseurl=http://somesystem.com/path/to/repo
enabled=1
gpgcheck=1
Tal como rpm, yum puede usarse para realizar consultas y búsquedas; sin embargo
puede buscar no solo lo que está instalado en el sistema local, sino que también en
repositorios remotos. Algunos ejemplos:
Búsqueda de paquetes con la palabra keyword en el nombre:
Estos dos comandos proporcionan información un tanto diferente. El primero provee más
información acerca de los paquetes en sí, mientras que el segundo se enfoca en lo que
está instalado y en lo disponible.
Lista todos los paquetes, o solo aquellos que están instalados, disponibles o
actualizaciones que aún no han sido instaladas.
como en
Tenga en cuenta que este es una extensión de yum, no un ejecutable. Hay muchos otros
plugins disponibles para yum, los cuales extienden el set de comandos y argumentos que
puede tomar.
Para verificar un paquete, entregando la mayor información posible:
30.7 Instalación/Actualización/Desinstalación
$ rpm -i package-file
Hay que ser cuidadoso con la desinstalación de paquetes, ya que yum no solo
removerá los paquetes seleccionados, sino que también los que dependen de él.
Puede que usted no desee esto, por lo cual no ejecute yum remove con la opción -y,
la cual asume una confirmación automática de desinstalación.
Actualizar un paquete desde un repositorio:
Si no se provee un nombre de paquete, todos los paquetes son actualizados (de existir
actualizaciones para todos ellos).
Es posible tener una gama amplia de capacidades adicionales de yum, de acuerdo a qué
extensiones están instaladas. Puede listarlas con:
$ sudo yum list “yum-plugin*”
En particular:
Mostrar una lista de los repositorios habilitados:
Si se provee text-file, yum leerá y ejecutará los comandos del archivo en vez de la
terminal.
Para ver la historia de los comandos yum, con las opciones correctas, incluso
deshacer o rehacer comandos anteriores:
Solución 30.1
1. $ sudo yum update
$ sudo yum check-update
$ sudo yum list updates
Ejecute los comandos del ejercicio tanto como root y usuario normal. ¿Nota alguna diferencia?
Solución 30.2
Nota: en RHEL 7 podría recibir algunos errores de permisos si no usa sudo con los siguientes
comandos, a pesar de que estamos obteniendo información solamente.
1. $ sudo yum search bash
Todos los comandos de arriba deberían funcionar tanto para usuarios normales como para root.
$ yum grouplist
3. Instálelo usando:
Tenga en cuenta que se le pedirá con.rmar la desinstalación, por lo que puede ejecutar el
comando de forma segura y ver cómo funciona.
Puede notar que groupremove no desinstala todo lo que estaba instalado; si se trata de un bug o
una caracterís/ca queda para una discusión.
[Webmin]
name=Webmin Distribu/on Neutral
baseurl=h@p://download.webmin.com/download/yum
mirrorlist=h@p://download.webmin.com/download/yum/mirrorlist
enabled=1
gpgcheck=0
Objetivos de aprendizaje
zypper obtiene los paquetes desde los repositorios, instala, desinstala, actualiza y
resuelve cualquier dependencia necesaria. En la práctica es equivalente a yum y apt-
get en cuanto a que obtiene paquetes desde un repositorio y que resuelve dependencias.
$ zypper list-updates
$ zypper repos
Tal como con yum, es necesario ser cuidadoso con el comando de desinstalación,
ya que cualquier paquete que necesite del que se está eliminando va a ser
removido también.
A veces es necesario ejecutar una serie de comandos zypper en secuencia. Para evitar
volver a leer todas las bases de datos para cada comando, es posible ejecutar
zypper en modo shell, como se muestra aquí:
Debido a que zypper soporta la biblioteca readline, es posible usar las mismas funciones
disponibles de edición de línea de comandos de la shell bash en la shell zypper.
el cual está ubicado en la URI proporcionada y que se usará con el alias que se pasó
como parámetro.
Ejecute los comandos de arriba tanto como root y como usuario normal. ¿Nota alguna diferencia?
Solución 31.2
1. $ zypper search -d bash
Sin la opción -d se muestran solamente los paquetes con bash en el nombre del archivo.
Tendría que hacer zypper info en el paquete para ver donde se menciona bash.
2. $ zypper search bash
3. $ zypper info bash
4. $ zypper info—requires bash
le dará una lista de archivos requeridos por bash. Tal vez la forma más fácil es ver las
dependencias de bash cuando está instalado, haciendo
$ sudo zypper remove—dry-run bash
Para este ejercicio bash es una mala elección ya que es una parte esencial del sistema. De
todas formas no podrá desinstalarlo.
Objetivos de aprendizaje
El sistema APT funciona con paquetes Debian, cuyos archivos tienen una extensión .deb.
Hay muchas distribuciones que descienden de Debian (incluyendo Ubuntu y Linux Mint),
las cuales han adoptado el sistema de empaquetamiento de Debian sin modificaciones
esenciales. De hecho no es raro que sus repositorios se usen en
distribuciones Linux basadas en Debian.
Una vez más vamos a ignorar interfaces gráficas en el equipo, tales como synaptic,
el Centro de Software de Ubuntu u otras interfaces gráficas de APT como aptitude.
32.2 apt-get
Tal como yum y zypper, apt-get funciona con múltiples repositorios remotos.
32.4 Instalación/Actualización/Desinstalación
Limpie los archivos del caché y cualquier archivo de paquete que haya sido
instalado:
$ apt-cache pkgnames
le mostrará una una lista completa; puede pasarle un comodín como argumento para reducir la
lista.
Solución 32.1
1. Primero sincronice los archivos de índice de paquetes con los repositorios remotos:
$ sudo apt-get update
Para actualizar realmente:
$ sudo apt-get upgrade
$ sudo apt-get -u upgrade
También puede usar dist-upgrade, como se discu/ó anteriormente. Solo la primera forma
tratará de realizar las instalaciones.
2. $ sudo apt-get upgrade bash
3. $ apt-cache search “kernel”
$ apt-cache search -n “kernel”
$ apt-cache pkgnames “kernel”
La segunda y tercera formas solo buscarán paquetes que tengan kernel en el nombre.
$ dpkg—get-selec/ons “*kernel*”
Ejecute los comandos de arriba tanto como root y como usuario normal. ¿Nota alguna diferencia?
Solución 32.2
1. $ apt-cache search bash
2. $ apt-cache search -n bash
3. $ apt-cache show bash
4. $ apt-cache depends bash
$ apt-cache rdepends bash
....
Usted puede instalarlos fácilmente como cualquier paquete individual, tal como se muestra aquí:
$ sudo apt-get install bacula-client
Reading package lists... Done
Building dependency tree
Reading state informa/on... Done
Suggested packages:
bacula-doc kde gnome-desktop-environment
The following NEW packages will be installed:
bacula-client bacula-common bacula-console bacula-fd bacula-traymonitor
Objetivos de aprendizaje
....
beav:x:1000:1000:Theodore Cleaver:/home/beav:/bin/bash
warden:x:1001:1001:Ward Cleaver:/home/warden:/bin/bash
dobie:x:1002:1002:Dobie Gillis:/home/dobie:/bin/bash
....
Contraseña de usuario
La contraseña asignada a cada usuario.
Directorio home
Para la mayoría de los usuarios este es un directorio único que le ofrece un área
de trabajo. Normalmente cada usuario es dueño de su directorio, y con la
excepción de root, se encontrará en el sistema bajo /home.
Shell de inicio
Generalmente este es un programa shell tal como /bin/bash o /bin/csh. Sin
embargo, en casos especiales se referencia un programa alternativo. En general
este campo aceptará cualquier ejecutable.
El comando:
$ sudo useradd stephane
creará una cuenta de usuario llamada stephane, usando los algoritmos predeterminados
para asignar el id de usuario y grupo, como también para la elección de shell.
Específicamente, el comando useradd anterior provocará la ejecución de los siguientes
pasos:
El próximo UID mayor a UID_MIN (especificado en /etc/login.defs) es asignado
de forma predeterminada como el UID de stephane.
También se crea un grupo llamado stephane con GID=UID y se asigna como el
grupo principal de stephane.
Se crea un directorio home /home/stephane del cual stephane es propietaria.
La shell de inicio de stephane será /bin/bash.
Los contenidos de /etc/skel se copian a /home/stephane. De forma
predeterminada, /etc/skel incluye archivos de inicio para bash y para el sistema X
Window.
Una entrada de ya sea !! o ! se pone en el campo password del
archivo /etc/shadow en la entrada de stephane, lo cual requiere que el
administrador le asigne una contraseña a la cuenta para que la misma se pueda
usar.
Los valores predeterminados pueden modificarse fácilmente a través del uso de opciones
en useradd, como se muestra aquí:
$ sudo useradd -s /bin/csh -m -k /etc/skel -c “Bullwinkle J Moose” bmoose
usermod puede usarse para cambiar características de una cuenta de usuario, tales
como la pertenencia a grupos, directorio home, nombre de usuario, contraseña, shell
predeterminada, ID de usuario, etc.
Su uso es bastante sencillo. Tenga en cuenta que usermod se hará cargo de cualquier
modificación de los archivos en el directorio /etc, según sea necesario.
$ sudo usermod—help
Usage: usermod [options] LOGIN
Options:
-c, --comment COMMENT new value of the GECOS field
-d, --home HOME_DIR new home directory for the user account
-e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-f, --inactive INACTIVE set password inactive after expiration
to
INACTIVE
-g, --gid GROUP force use GROUP as new primary group
-G, --groups GROUPS new list of supplementary GROUPS
-a, --append append the user to the supplemental GROUPS
mentioned by the -G option without removing
him/her from other groups
-h, --help display this help message and exit
-l, --login NEW_LOGIN new value of the login name
-L, --lock lock the user account
-m, --move-home move contents of the home directory to the
new location (use only with -d)
Linux viene con algunas cuentas del sistema que están bloqueadas, lo cual significa que
pueden ejecutar programas, pero no pueden iniciar sesión en el sistema y no tienen una
contraseña válida asociada. Por ejemplo,/etc/passwd tiene entradas como:
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lo cual significa que la cuenta se mantiene en el sistema pero que no puede iniciar sesión.
Es posible desbloquearla con la opción -U.
Una práctica habitual es bloquear una cuenta de usuario cada vez que dejan la
organización o que hacen uso de una ausencia extendida.
Otra forma de bloquear una cuenta es usar chage para cambiar la fecha de expiración de
una cuenta a una fecha en el pasado:
Ya hemos visto que /etc/passwd contiene un registro (una línea) por cada usuario en el
sistema, como se muestra aquí:
beav:x:1000:1000:Theodore Cleaver:/home/beav:/bin/bash
rsquirrel:x:1001:1001:Rocket J Squirrel:/home/rsquirrel:/bin/bash
La convención que la mayoría de las distribuciones Linux han usado es que cualquier
cuenta con un ID de usuario menor a 1000 se considera especial y pertenece al sistema;
las cuentas de usuario normal comienzan en 1000. El valor exacto es definido
por UID_MIN según el valor que tiene en /etc/login.defs.
daemon:*:16141:0:99999:7:::
.....
beav:$6$iCZyCnBJH9rmq7P.
$RYNm10Jg3wrhAtUnahBZ/mTMg.RzQE6iBXyqaXHvxxbKTYqj.d
9wpoQFuRp7fPEE3hMK3W2gcIYhiXa9MIA9w1:16316:0:99999:7:::
lastchange: días desde el 1ero de enero de 1970 desde que la contraseña fue
cambiada por última vez
A menos de que haya una buena razón para no hacerlo, usted debería usar el
archivo /etc/shadow.
Las contraseñas pueden cambiarse con passwd; un usuario normal puede cambiar su
contraseña solamente, mientras que root puede cambiar cualquiera. Cuando usted
escribe su contraseña, esta no se muestra, ya que desplegarla de vuelta a la pantalla está
suprimido.
$ passwd
Changing password for clyde
(current) UNIX password: <clyde’s password>
New UNIX password: <clyde’s-new-password>
Retype new UNIX password: <clyde’s-new-password>
passwd: all authentication tokens updated successfully
Tenga en cuenta que los usuarios normales no tienen permitido configurar contraseñas
malas, tales como las que son muy cortas o están basadas en palabras de diccionario.
Sin embargo, root puede hacerlo.
chage [-m mindays] [-M maxdays] [-d lastday] [-I inactive] [-E
expiredate] [-W warndays] user
Ejemplos:
Solo el usuario root puede usar chage. La única excepción a esto es que cualquier
usuario puede ejecutar chage -l para ver la información específica de su cuenta.
Ejemplos:
En Linux es posible usar una shell restringida, la cual se invoca de la siguiente forma:
$ /bin/bash -r
Tenga en cuenta que hay otras restricciones; la mejor manera de verlas es hacer man
bash y buscar por RESTRICTED SHELL.
Debido a que la shell restringida ejecuta $HOME/.bash_profile sin restricciones, el
usuario no debe tener permisos de escritura ni ejecución en el directorio /home.
Hay veces en las que es necesario conceder acceso a un usuario, pero con un alcance
limitado. Configurar una cuenta restringida puede ser útil en este contexto. Una cuenta
restringida:
Usa la shell restringida.
Tiene límites en los programas de sistema disponibles y en las aplicaciones de
usuario.
Tiene límites en los recursos del sistema.
Tiene límites en los tiempos de acceso.
Tiene límites en los directorios que puede acceder.
Una shell restringida puede ser invocada desde la línea de comandos o desde un script
con /bin/bash -r. Sin embargo, no se puede especificar parámetros en el
archivo /etc/passwd. Una forma simple de solucionar esta restricción podría ser una de
las siguientes:
La cuenta root debería usarse solamente con propósitos administrativos, cuando sea
absolutamente necesario y en ningún caso ser usada como una cuenta normal. Los
errores pueden ser muy costosos, tanto para la integridad, estabilidad y seguridad del
sistema.
Generalmente el inicio de sesión remoto está prohibido por defecto, debido a razones de
seguridad. Es posible permitir inicios de sesión a Secure Shell usando ssh, el cual se
configura en /etc/ssh/sshd_config y en PAM (PluggableAuthentication Modules), a
través del módulo pam_securetty.so y el archivo asociado /etc/securetty. El inicio de
sesión de root se permite solo desde los dispositivos listados en /etc/securetty.
Por lo general se recomienda que todos los accesos a la cuenta root se realicen a través
de su o sudo (generando un registro de auditoría de todos los accesos a root a través
de sudo). Tenga en cuenta que algunas distribuciones (tales como Ubuntu) prohíben
iniciar sesión directamente en la cuenta root.
PAM también puede usarse para restringir a qué usuarios se les permite hacer su a la
cuenta root. Podría valer la pena configurar auditd para registrar todos los comandos
ejecutados como root.
SSH (Secure SHell) existe para este propósito. Usa un cifrado basado en algoritmos
fuertes. Asumiendo que los paquetes ssh apropiados están instalados en el sistema, no
es necesario realizar una configuración adicional antes de comenzar a usar ssh.
$ whoami
student
$ ssh farflung.com
student@farflung.com's password: (escriba aquí)
$
donde estamos asumiendo que hay una cuenta student en farflung.com. Para conectarse
con un usuario diferente:
$ ssh root@farflung.com
root@farflung.com's password: (escriba aquí)
o
$ ssh -l root farflung.com
root@farflung.com's password: (escriba aquí)
Es posible configurar SSH para facilitar su uso, en particular para permitir la conexión sin
una contraseña. Los archivos de configuración específicos del usuario se crean bajo cada
directorio home, en el directorio oculto .ssh:
$ ls -l ~/.ssh
total 20
-rw-r—r-- 1 hilda
-rw------- 1 hilda
-rw------- 1 hilda
-rw-r—r-- 1 hilda
-rw-r—r-- 1 hilda
hilda 1172 Sep 27 2014
hilda 207 Aug 9 2011
hilda 1675 Dec 8 2010
hilda 393 Dec 8 2010
el cual contiene:
• id rsa: la clave de cifrado privada del usuario.
• id rsa.pub: la clave de cifrado pública del usuario.
• authorized keys: Una lista de claves públicas que tienen permiso para conectarse.
• known hosts: Una lista de hosts desde los cuales se han aceptado conexiones en el
pasado.
• config: Un archivo de configuración para especificar varias opciones.
Primero el usuario tiene que generar sus claves de cifrado privada y pública con ssh-
keygen:
$ ssh-keygen
La llave pública puede ser entregada a cualquier máquina con la cual usted desea permitir
acceso sin contraseña. También debería agregarse a su archivo authorized_keys, junto
con todas las llaves públicas de otros usuarios que tienen cuentas en su máquina, a los
que desea permitirles el acceso sin contraseña a sus cuentas.
$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQ
...0000aSd...hilda@sbc
$ cat known_hosts
192.30.252.129 ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSw
....BK6Tb...==
Usted puede examinar las páginas man para ver qué tipos de opciones pueden ir en el
archivo de configuración dessh, config.
Debería fallar porque se necesita una contraseña para user1; no ha sido con.gurada todavía.
4. Con.gure la contraseña de user1 como user1pw e intente conectarse de nuevo como user1.
5. Revise los registros nuevos que fueron creados en los archivos /etc/passwd, /etc/group y
/etc/shadow.
6. Revise el archivo /etc/default/useradd y vea cuáles son los valores por defecto actuales.
También eche un vistazo al archivo /etc/login.defs.
7. Cree una cuenta de usuario llamada user2 que use la shell Korn (ksh) por defecto (si no /ene
/bin/ksh en el sistema, instálela o use la shell Cubicada en /bin/csh). Con.gure la contraseña
en user2pw.
8. Eche un vistazo a /etc/shadow. ¿Cuál es la fecha de expiración para la cuenta user1?
9. Use chage para con.gurar la fecha de expiración del usuario user1 a Diciembre 1, 2013.
Eche un vistazo a /etc/shadow para ver cuál es la nueva fecha de expiración.
10. Use usermod para bloquear la cuenta user1. Eche un vistazo a /etc/shadow para ver qué ha
cambiado en relación a la contraseña del usuario user1. Restablezca la contraseña de la cuenta
a userp1 para completar este ejercicio.
Puede usar cualquier nombre de usuario normal en vez de student. Lo único que coincide es el
campo de nombre de usuario.
Tenga en cuenta que quizás tenga que iniciar primero el servicio sshd de la siguiente forma:
$ sudo service sshd restart
o
$ sudo systemctl restart sshd.service
4. $ sudo passwd user1
Changing password for user user1.
New password:
5. $ sudo grep user1 /etc/passwd /etc/shadow
/etc/passwd:user1:x:1001:100::/home/user1:/bin/bash
/etc/shadow:user1:$6$OBE1mPMw$CIc7urbQ9ZSnyiniVOeJxKqLFu8fz4whfEexVem2
TFpucuwRN1CCHZ19XGhj4qVujslRIS.P4aCXd/y1U4utv.:16372:0:99999:7:::
....
No vamos a pegar el contenido del segundo archivo porque es largo, pero examínelo en su
sistema.
New password:
8. $ sudo grep user1 /etc/shadow
user1:$6$OBE1mPMw$CIc7urbQ9ZSnyiniVOeJxKqLFu8fz4whfEexVem2TFpucuwRN1CCHZ
19XGhj4qVujslRIS.P4aCXd/y1U4utv.:16372:0:99999:7:::
user1:$6$OBE1mPMw$CIc7urbQ9ZSnyiniVOeJxKqLFu8fz4whfEexVem2TFpucuwRN1CCHZ
19XGhj4qVujslRIS.P4aCXd/y1U4utv.:16372:0:99999:7::16040:
Objetivos de aprendizaje
Explicar por qué es útil que los usuarios del sistema pertenezcan a uno o más
grupos.
Usar herramientas tales como groupadd, groupdel, groupmod yusermod para
crear, eliminar y gestionar grupos y sus miembros.
Describir los Grupos Privados de Usuario.
Explicar el concepto de pertenencia al grupo.
Los usuarios en Linux pertenecen a uno o más grupos. Los propósitos de esto incluyen:
Los grupos están definidos en /etc/group, el cual cumple el mismo rol para los grupos
como /etc/passwd lo hace para los usuarios. Cada línea del archivo luce de la siguiente
forma:
groupname:password:GID:user1,user2,...
donde:
Nota: Sea muy cuidadoso con el comando usermod -G; la lista de grupos que le sigue
corresponde a la lista completa, no solo a los cambios que desea realizar. Cualquier grupo
que quede afuera de la lista ya no incluirá al usuario. Para evitar ese comportamiento
utilice la opción -a, la cual preservará cualquier pertenencia previa a grupos al agregar
otros nuevos.
La idea detrás de UPG es que cada usuario tendrá su propio grupo. Sin embargo, no se
garantiza que los UPG sean privados; miembros adicionales pueden ser agregados al
grupo privado de alguien en /etc/group.
Por defecto, los usuarios cuyas cuentas son creadas con useradd tienen: GID principal
= UID y el nombre del grupo es idéntico al de usuario.
El grupo primario es el GID, el cual se usa cada vez que el usuario crea archivos o
directorios. La pertenencia a grupos secundarios le concede permisos adicionales al
usuario.
1. Cree dos cuentas de usuario (rocky y bullwinkle) y asegúrese de que tengan directorios home.
2. Cree dos grupos, friends y bosses (con GID 490). Eche un vistazo al archivo /etc/group. Vea qué
GID se le asignó a cada grupo.
3. Agregue rocky a ambos grupos.
Agregue bullwinkle al grupo friends.
Eche un vistazo al archivo /etc/group para ver cómo cambió.
4. Conéctese como rocky. Cree un directorio llamado somedir y con.gure el propietario del
grupo en bosses (use chgroup, el cual se discu/rá en la próxima sesión).
Nota: probablemente necesitará agregar permisos de ejecución para todos en el directorio
home de rocky.
5. Conéctese como bullwinkle e intente crear un archivo en /home/rocky/somedir llamado
somele, usando el comando touch.
¿Puede hacer esto? No, debido al propietario del grupo y los permisos chmod a+x en el
directorio.
6. Agregue bullwinkle al grupo bosses e intente de nuevo. Note que tendrá que desconectarse y
conectarse de nuevo para que la par/cipación en el grupo sea efec/va.
$ ssh bullwinkle@localhost
$ touch /home/rocky/somedir/some.le
touch: cannot touch /home/rocky/somedir/some.le: Permission denied
$ exit
Explicar por qué es útil que los usuarios del sistema pertenezcan a uno o más
grupos.
Usar herramientas tales como groupadd, groupdel, groupmod yusermod para
crear, eliminar y gestionar grupos y sus miembros.
Describir los Grupos Privados de Usuario.
Explicar el concepto de pertenencia al grupo.
Objetivos de aprendizaje
$ ls -l a_file
-rw-rw-r-- 1 coop aproject 1601 Mar 9 15:04 a_file
después del primer caracter, el cual indica el tipo del objeto archivo, hay nueve más que
indican los derechos de acceso a potenciales usuarios de archivos. Estos se agrupan en
tres grupos de tres caracteres:
Adicionalmente, existen otros permisos especializados para cada categoría, tales como
los permisos setuid/setgid.
Estos permisos de acceso a archivos son una parte crítica del sistema de seguridad
de Linux. Cualquier solicitud de acceso a un archivo requiere la comparación de las
credenciales e identidad del usuario con las del propietario del archivo.
La modificación de permisos de archivos se realiza con chmod. Usted puede cambiar los
permisos de los archivos que son de su propiedad solamente, a menos que sea el
superusuario.
Hay diversas formas de usar chmod. Por ejemplo, para otorgar permisos de ejecución al
propietario y al mundo, y eliminar el permiso de escritura del grupo:
$ ls -l a_file
-rw-rw-r-- 1 coop coop 1601 Mar 9 15:04 a_file
$ chmod uo+x,g-w a_file
$ ls -l a_file
-rwxr--r-x 1 coop coop 1601 Mar 9 15:04 a_file
Los permisos pueden ser representados ya sea como un mapa de bits, escrito
generalmente en octal, o en una forma simbólica. Los mapas de bits octales generalmente
lucen como 0755, mientras que las representaciones simbólicas lucen
como u+rwx,g+rwx,o+rx.
La sintaxis simbólica puede ser difícil de escribir y recordar, por lo que a menudo se utiliza
la abreviatura octal, la cual permite configurar todos los permisos en un paso. Esto se
hace un con algoritmo simple, en donde una cifra es suficiente para especificar los tres
bits de permisos para cada entidad. Esta cifra es la suma de:
Cuando esto se aplica con chmod, es necesario darle un valor para cada uno de los tres
dígitos, tal como aquí:
Usted puede cambiar el propietario de los archivos del cual es dueño, a menos que sea el
superusuario. De la misma forma, usted puede cambiar el propietario de los grupos a los
cuales pertenece.
en donde se separa el usuario propietario del grupo con dos puntos (o uno).
$ chown -R coop:aproject ./
$ chown -R coop:aproject subdir
35.7 umask
Los permisos por defecto dados al crear un archivo son lectura/escritura para el
propietario, grupo y mundo (0666). Para un directorio es lectura/escritura/ejecución para
todos (0777). Sin embargo, si hace lo siguiente:
$ touch afile
$ mkdir adir
$ ls -l | grep -e afile -e adir
drwxrwxr-x 2 coop coop 4096 Sep 16 11:18 adir
-rw-rw-r-- 1 coop coop 0 Sep 16 11:17 afile
notará que los permisos actuales cambiaron a 664 para el archivo y 775 para el directorio.
Han sido modificados por el umask actual, cuyo propósito es mostrar qué permisos
deberían ser denegados. El valor actual se puede mostrar con:
$ umask
0002
el cual es el valor más comúnmente configurado por los administradores de sistema para
los usuarios. Este valor se combina con los permisos de creación de archivos para
obtener el resultado real, es decir:
$ umask 0022
Linux tiene una implementación completa de ACLs POSIX (listas de control de acceso),
la cual extiende el modelo simple de usuario, grupo, mundo, lectura, escritura y ejecución.
Privilegios en particular pueden ser concedidos a usuarios específicos o grupos de
usuarios al acceder ciertos objetos o clases de objetos. Es posible compartir archivos y
directorios sin usar permisos 777.
Mientras que el kernel Linux habilita el uso de ACLs, aún debe ser implementado en el
sistema de archivos en particular. Todos los sistemas de archivos principales usados en
las distribuciones modernas de Linux incorporan las extensiones ACL, y es posible
usarlas con la opción -acl al montar el sistema de archivos. Durante la instalación del
sistema de archivos se crea un conjunto de ACLs por defecto.
$ getfacl file|directory
Ejemplo:
$ getfacl file1
Ejemplos:
$ setfacl -m u:isabelle:rx /home/stephane/file1
$ setfacl -x u:isabelle /home/stephane/file
Tenga en cuenta que los archivos nuevos heredan la ACL predeterminada (si ha sido
configurada) desde el directorio en el cual residen. Note también que mv y cp
-p mantienen las ACLs.
Es posible usar ya sea el método de dígitos octales o simbólico para especi.car los permisos al usar
chmod. Elaboremos un poco más en el método simbílico.
Se puede otorgar permisos directamente, agregar o quitar permisos. La sintaxis es bastante obvia.
Intente los siguientes ejemplos:
$ ls -l a.le
lo que demuestra que por defecto se crea tanto con permisos de lectura y escritura para el
propietario y el grupo, pero solo de lectura para el mundo.
En realidad, a nivel de sistema opera/vo los permisos por defecto que se dan al crear un archivo o
directorio son lectura/escritura para el propietario, grupo y mundo (0666); los valores
predeterminados han sido modi.cados por el actual umask.
Si ejecuta umask obtendrá su valor actual:
$ umask
0002
lo cual es el valor más convencional que los administradores de sistemas con.guran para los
usuarios. Este valor se combina con los permisos de creación de archivos para obtener el resultado
actual. Es decir:
Intente modi.car el umask, cree archivos y vea los permisos resultantes, como en:
$ umask 0022
$ touch a.le2
$ umask 0666
$ touch a.le3
$ ls -l a.le*
Objetivos de aprendizaje
Cada aplicación o servicio que trabaja con PAM debe ser configurada en relación a PAM,
en un archivo de configuración individual en /etc/pam.d.
Un usuario invoca a la aplicación que trabaja con PAM, tal como login, ssh o su.
La aplicación llama a libpam.
La biblioteca verifica si hay archivos relacionados en /etc/pam.d; estos definen
qué módulos PAM se invocarán, incluyendo system-auth.
Cada módulo referenciado se ejecuta de acuerdo con las reglas del archivo de
configuración relevante para esta aplicación.
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the
"wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the
"wheel" group.
#auth required pam_wheel.so use_uid
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so
Observe que aquí hay una serie de dependencias; su requerirá cargar system-auth, etc.
Hay otros parámetros para control, tales como include y substack. Por favor
haga man pam.d para ver los detalles.
/etc/openldap/ldap.conf
/etc/pam_ldap.conf
/etc/nslcd.conf
/etc/sssd/sssd.conf
/etc/nsswitch.conf
Usted puede editar estos archivos manualmente o usar uno de los programas disponibles
(system-config-authentication o authconfig-tui)
Una de las con.guraciones más comunes de PAM es denegar el acceso luego de un cierto número
de intentos fallidos. Esto se hace con el módulo pam-tally2. En este ejercicio vamos a denegar el
acceso a través de ssh después de tres intentos fallidos de acceso.
1 Edite /etc/pam.d/sshd y con.gúrelo para denegar el acceso luego de tres intentos fallidos.
Pista: agregue las siguientes dos líneas al archivo
2 Intente acceder tres veces con un usuario en par/cular (uno que tenga cuenta) y escriba mal la
contraseña.
3 Intente acceder con el mismo usuario, pero esta vez con la contraseña correcta.
Solución 36.1
2. $ ssh student@localhost
Password:
Password:
Password:
Permission denied (publickey,keyboard-interac/ve).
3. $ ssh student@localhost
Password:
Account locked due to 3 failed logins
4. $ sudo pam_tally2
Login Failures Latest failure From
student 3 11/01/14 20:41:12 localhost
7. $ ssh student@localhost
Password:
Last failed login: Sat Nov 1 20:41:14 CDT 2014 from localhost on ssh:no@y
There were 6 failed login a@empts since the last successful login.
Last login: Sat Nov 1 20:28:38 2014 from localhost
Have a lot of fun...
Los sistemas que no tienen una estrategia bien definida de copias de seguridad están
mal administrados, independientemente de si hospedan un entorno de usuario único o
una red empresarial con múltiples sistemas y usuarios. Tarde o temprano la información
crítica se va a perder, ya sea debido a una falla de hardware, errores del usuario o del
administrador, o a ataques maliciosos. Ser capaz de recuperar el sistema con la mínima
pérdida posible de forma rápida y eficiente es una responsabilidad crítica que debe
llevarse a cabo.
Objetivos de aprendizaje
Ya sea que usted esté administrando solo un sistema personal o una red con muchas
máquinas, las copias de seguridad del sistema son muy importantes. Algunas de las
razones son las siguientes:
Fallas de hardware.
A medida en la que la fiabilidad ha aumentado, también lo ha hecho la capacidad
en disco. Aún si la tasa de falla por byte disminuye, todavía se producirían fallas
impredecibles. Puede ser pesimista decir que hay solo dos tipos de discos:
aquellos que fallaron y los que fallarán, pero es esencialmente cierto. El uso
de RAID ayuda, pero las copias de seguridad aún son necesarias.
Fallas de software.
Ningún software es perfecto. Algunos bugs pueden destruir o corromper la
información. Aún los programas estables que se han usado por mucho tiempo
pueden tener problemas.
Eventos inexplicables.
Los archivos pueden desaparecer sin que usted sepa cómo, quién o incluso
cuándo ocurrió.
1. Definitivamente:
- Datos relacionados con el negocio.
- Archivos de configuración del sistema.
- Archivos de usuarios (generalmente en /home).
2. Tal vez:
- Directorios de cola (para imprimir, email, etc).
- Archivos del registro (que se encuentran en /var/log y en otras partes).
3. Probablemente no:
- Software que puede ser reinstalado fácilmente; en un sistema bien gestionado esto
sería prácticamente todo.
- El directorio /tmp, porque su contenido está pensado para ser temporal solamente.
4. Definitivamente no:
- Pseudosistemas de archivos tales como /proc, /dev y /sys.
- Cualquier partición o archivo de intercambio.
Los archivos del registro pueden ser importante si usted tiene que investigar la historia del
sistema, lo cual puede ser particularmente importante para detectar intrusiones y otras
violaciones a la seguridad.
Las unidades de cinta no son tan comunes como solían ser. Son relativamente lentas y
permiten el acceso secuencial solamente. En cualquier configuración moderna rara vez
se utilizan como respaldo primario. A veces se usan para almacenamiento fuera de línea
para disponer de referencias en el largo plazo. Sin embargo, las cintas magnéticas tienen
un ciclo de vida finito antes de que se degraden físicamente y comiencen a perder datos.
Los dispositivos modernos de cinta son generalmente del tipo LTO (Linear Tape Open),
cuyas primeras versiones aparecieron a fines de los '90 como una alternativa de
estándares abiertos; la mayoría de los primeros formatos fueron propietarios. Las
versiones tempranas almacenaban hasta 100 GB; las versiones más nuevas pueden
contener 2.5 TB o más en un cartucho del mismo tamaño.
Día a día las copias de seguridad son tomadas con alguna forma de NAS
(Network Attached Storage) o con soluciones basadas en la nube, lo cual hace que las
instalaciones basadas en cintas sean cada vez menos atractivas. Sin embargo, todavía se
pueden encontrar sistemas que las usan y los administradores de sistemas podrían
requerir trabajar con ellas.
De aquí en adelante trataremos de no enfocarnos en algún tipo particular de equipo para
el medio de respaldo, por lo cual nos referiremos a ello de forma abstracta.
No se debe tener todas las copias de seguridad en el mismo lugar físico que el de los
sistemas que se están protegiendo. De otra forma, un incendio u otro daño físico podría
causar una pérdida completa. En el pasado esto generalmente significaba tener que
transportar físicamente las cintas magnéticas a un lugar seguro. Actualmente esto
significa más bien transferir las copias de seguridad a través de la red a un lugar físico
alternativo. Obviamente esto tiene que realizarse de forma segura, usando cifrado de
datos y otras precauciones de seguridad.
Es posible usar diferentes métodos de respaldos, los cuales a menudo trabajan de forma
coordinada entre ellos:
Completo:
Respalda todos los archivos en el sistema.
Incremental:
Respalda todos los archivos que han cambiado desde la última copia de seguridad
incremental o completa.
Diferencial:
Respalda todos los archivos que han cambiado desde la última copia de seguridad
completa.
Usuario:
Solamente se respalda el contenido del directorio de un usuario específico.
Debemos tener en cuenta que los métodos de respaldo son inútiles sin métodos
de recuperación asociados. Uno tiene que considerar la robustez, claridad y facilidad de
ambas estrategias al seleccionarlas.
Una buena regla de oro es disponer de al menos dos semanas en copias de seguridad.
Son varios los programas que se usan con propósitos de realizar copias de seguridad:
cpio
tar
gzip, bzip2, xz
cpio y tar crean y extraen archivos que contienen archivos. Los archivos a
menudo están comprimidos congzip, bzip2, o xz. El archivo contenedor puede
escribirse a disco, cinta magnética o cualquier otro dispositivo que pueda
almacenar archivos. Los archivos de este tipo son muy útiles para transferir
archivos desde un sistema de archivos a otro o entre máquinas.
dd
Esta es una herramienta poderosa que se usa a menudo para transferir datos en
bruto entre medios. Es capaz de copiar particiones o discos completos.
rsync
Esta herramienta potente puede sincronizar árboles de subdirectorios o sistemas
de archivos completos a través de una red, o entre diferentes lugares del sistema
de archivos en una máquina local.
dump y restore
Estas herramientas son antiguas y fueron diseñadas específicamente para realizar
copias de seguridad. Leen directamente desde el sistema de archivos, lo cual es
más eficiente. Sin embargo, los archivos deben ser restaurados en el mismo tipo
de sistema de archivos del cual provienen. Hay alternativas más nuevas.
mt
Es útil para consultar y posicionar cintas antes de realizar copias de seguridad y
restaurarlas.
cpio (copy in and out) es una herramienta general de compresión de archivos que ha
existido desde los primeros días de UNIX y fue diseñada originalmente para realizar
copias de seguridad de cintas. Pese a que se han desarrollado otros programas más
nuevos de este tipo (como tar, el cual no es exactamente nuevo) para realizar muchas de
las tareas que estaban en el dominio de cpio, este sobrevive todavía.
Por ejemplo, ya hemos visto el uso de rpm2cpio para convertir paquetes RPM en
archivos cpio y luego extraerlos. También el kernel Linux usa una versión
de cpio internamente para tratar con sistemas de archivos de ram
inicialinitramfs e initrd, como también con discos durante el arranque. Una de las
razones por las cuales cpio vive todavía es que es más liviano que tar y sus sucesores,
aunque es un poco menos robusto.
$ cpio -t -I /dev/st0
Usted puede especificar la entrada (-I dispositivo) o salida (-O dispositivo), o usar una
redirección en la línea de comandos.
Note que también puede combinar opciones (al usar la notación corta), de tal forma que
no
es necesario tipear cada guión.
Además, las opciones cortas de tar pueden usarse con o sin guiones; es decir, tar cvf
file.tar dir1 tiene el mismo resultado que tar -cvf file.tar dir1.
La opción -t o --list lista los archivos incluidos en el archivo comprimido, pero no los
extrae.
Ejemplos:
Extrae un archivo:
Cualquiera de estas formas crea una copia de seguridad en /var/tmp de todos los
archivos que fueron creados después del 1ero de diciembre de 2011.
Debido a que tar solo revisa la fecha de un archivo, no considera otros cambios al
archivo, tales como permisos o nombre de archivo. Para incluir archivos con este tipo de
cambios en el respaldo incremental, use find y cree una lista de archivos a ser tomados
en cuenta.
A menudo se desea comprimir archivos para ahorrar espacio en disco y/o tiempo de
transmisión por la red, especialmente porque las máquinas modernas encontrarán que el
ciclo comprimir>transmitir>descomprimir más rápido que simplemente transmitir (o copiar)
un archivo sin comprimir.
El formato .zip se usa raramente en Linux excepto para extraer archivos antiguos desde
otros sistemas operativos.
para generar un archivo comprimido. Note que el primer comando tiene exactamente el
mismo efecto que si uno hace:
las versiones modernas de tar pueden detectar el método de compresión y hacerse cargo
automáticamente.
Obviamente no vale la pena usar estos métodos en archivos cuyos archivos ya están
comprimidos, tales como imágenes .jpg, archivos .pdf, etc.
37.12 dd
dd se usa a menudo para leer cantidades fijas de datos desde nodos de dispositivos
especiales tales como /dev/zero o/dev/random. La sintaxis básica es la siguiente:
$ dd --help
mostrará una lista de opciones muy larga, algunas usadas frecuentemente y otras en muy
raras ocasiones.
37.13 Ejemplos de dd
Hacer una copia de seguridad de un disco duro completo a otro (datos en bruto):
$ dd if=/dev/sda of=/dev/sdb
$ dd if=/dev/sda of=sdadisk.img
$ dd if=/dev/sda1 of=partition1.img
37.14 rsync
rsync (sincronización remota) se usa para transferir archivos a través de una red (o entre
diferentes lugares en la misma máquina), con la siguiente sintaxis:
La fuente y el destino toman la siguiente forma: target:path, donde target puede estar
en el formato [user@]host. La parte user@ es opcional y se usa si el usuario remoto es
diferente al local. Por lo tanto, estos son todos los comandos rsync posibles:
Tiene que ser muy cuidadoso con rsync en relación a las localizaciones específicas
(especialmente si usa la opción --delete), por lo que es altamente recomendado usar la
opción dry-run primero y luego llevar a cabo la acción si la proyección luce correcta.
rsync es muy inteligente; verifica los archivos locales contra los remotos en trozos
pequeños. Es muy eficiente cuando copia a un directorio destino similar, ya que solo se
copian las diferencias a través de la red. Esto sincroniza el segundo directorio con el
primero. A menudo se usa la opción -r, la cual causa que rsync copie todo el contenido
del directorio recursivamente, por debajo de lo que figura como sourcefile. Por lo tanto
una forma muy útil de respaldar un directorio de un proyecto en curso sería similar a:
Una estrategia de respaldo simple (también muy efectiva y rápida) consiste en duplicar
directorios o particiones a través de la red, con comandos rsync y hacerlo de forma
frecuente.
Las herramientas dump y restore han existido desde los primeros días de UNIX y no
fueron diseñadas originalmente para hardware, sistemas de archivos y almacenamiento
modernos.
dump y restore a veces son usados por programas de respaldo de más alto nivel,
como Amanda. Cierta familiaridad con estas herramientas antiguas es útil.
dump tiene una serie de opciones, las que incluyen configurar parámetros. Algunas de
estas son:
-0-9
Nivel de dump: Nivel 0 es un respaldo completo y los números mayores son
incrementales.
-B records
Registros por volumen.
-f file
Dispositivo o archivo de salida.
-u
Actualiza /etc/dumpdates.
-W
Imprime la fecha más recientes de dump de cada sistema de archivos
en /etc/dumpdates.
Los valores de los parámetros no necesitan ser suministrados después de la opción, pero
deben incluirse en el mismo orden en que las opciones los especifican.
restore se usa para leer archivos comprimidos, cintas o archivos que fueron creados
con dump. Por ejemplo, para restaurar todos los archivos que fueron objeto de dump, en
relación al directorio actual:
-r
Restaura todo. Se lee el material creado con dump y el contenido completo se
carga en el directorio actual.
-t
Los archivos y directorios especificados son listados en la salida estándar si están
en el respaldo. Si no se especifica un archivo como parámetro, se lista el directorio
raíz en la copia de seguridad. Esta opción en realidad no restaura archivos.
-x
Los archivos y directorios nombrados se extraen desde la copia de seguridad. Si el
archivo mencionado coincide con un directorio en el respaldo, el directorio se
extrae recursivamente. Si no se proveen argumentos, entonces se extrae todo el
contenido desde el respaldo.
-i
Este modo permite la restauración interactiva de archivos desde la copia de
seguridad. Después de leer la información del directorio en el respaldo, restore
provee una interfaz tipo shell que le permite al usuario moverse a través del árbol
de directorios y seleccionar los archivos a extraer.
37.19 mt
Tenga en cuenta que solo el usuario root puede usar mt. La sintaxis es la siguiente:
$ mt status
Rebobinar la cinta:
$ mt rewind
Borrar la cinta:
$ mt erase
$ mt fsf
El programa viene en dos versiones: Clonezilla live, la cual es apropiada para realizar
respaldos y restauraciones a una máquina. La otra es Clonezilla SE (server edition), la
cual puede clonar muchos computadores a la vez.
1. Cree un directorio llamado backup y ponga aquí un archivo tar comprimido de todos los
archivos bajo /usr/include, en donde el nivel de directorio más alto sea include. Puede usar
cualquier método de compresión, ya sea gzip, bzip2 o xzip.
2. Liste los archivos del archivo comprimido.
3. Cree un directorio llamado restore, desempaque y descomprima el archivo aquí.
4. Compare el contenido con el directorio original desde el cual el archivo tar fue creado.
1. $ cd backup
$ cd /usr ; tar zcvf include.tar.gz include
$ du -sh /usr/include
55M /usr/include
2. $ ls -lh include.tar.*
-rw-rw-r-- 1 coop coop 5.3M Nov 3 14:44 include.tar.bz2
-rw-rw-r-- 1 coop coop 6.8M Nov 3 14:44 include.tar.gz
-rw-rw-r-- 1 coop coop 4.7M Nov 3 14:46 include.tar.xz
Vamos a realizar el mismo ejercicio ahora, pero usando cpio en vez de tar. Vamos a repe/r las
instrucciones con leves modi.caciones para facilitar el uso.
1. Cree un directorio llamado backup y ponga aquí un archivo cpio comprimido de todos los
archivos bajo /usr/include, en donde el nivel de directorio más alto sea include. Puede usar
cualquier método de compresión, ya sea gzip, bzip2 o xzip. 2.
4. Compare el contenido con el directorio original desde el cual el archivo tar fue creado.
$ cd ../restore
$ cat ../backup/include.cpio | cpio -ivt
$ gunzip -c include.cpio.gz | cpio -ivt
3. $ rm -rf include
$ cpio -id < ../backup/include.cpio
$ ls -lR include
or
Usando rsync vamos a crear de nuevo una copia completa de /usr/include en su directorio de
respaldo:
1. $ rm -rf include
$ rsync -av /usr/include .
sending incremental .le list
include/
include/FlexLexer.h
include/_G_con.g.h
include/a.out.h
include/aio.h
.....
3. Un asunto confuso de rsync es que usted podría haber esperado que el comando correcto
fuera:
Sin embargo, si hace esto se dará cuenta que en realidad se crea un nuevo directorio,
include/include.
$ rm -rf include/xen
$ rsync -av --delete --dry-run /usr/include .
sending incremental .le list
include/
include/xen/ include/xen/evtchn.h
include/xen/privcmd.h
#!/bin/sh
set –x
rsync --progress -avrxH -e "ssh -c blow.sh" --delete $*
el cual funcionará en una máquina local como también en red. Tenga en cuenta la importancia
de la opción -x, la cual impide que rsync cruce los límites del sistema de archivos.
Para mayor diversión, si /ene acceso a más de un computador, intente realizar estos pasos con
una fuente y des/no en dis/ntas máquinas.
Objetivos de aprendizaje
Las direcciones IP se usan para identificar globalmente y de forma única a los nodos en
la red. Están registradas a través de los ISPs (Internet Service Providers).
IPv4: Una dirección de 32 bits, compuesta de 4 octetos (un octeto son 8 bits, o
un byte). Ejemplo:
148.114.252.10
2003:0db5:6123:0000:1f4f:0000:5529:fe23
Unicast:
Una dirección asociada a un host específico. Puede ser algo como
140.211.169.4 o 64.254.248.193.
Red:
Una dirección cuya posición del host está en cero (todos los dígitos binarios en 0).
Ejemplo: 192.168.1.0 (la posición del host puede estar en los últimos 1 a 3
octetos como veremos más adelante. Aquí solo nos referimos al último octeto).
Broadcast:
Una dirección en la cual cada miembro de una red en particular escuchará. Tendrá
la sección del host en 1, tal como en 172.16.255.255, 148.114.255.255
o 192.168.1.255 (la posición del host son los dos últimos octetos en los primeros
dos casos, y en el tercer caso es el último octeto).
Multicast:
Una dirección en la que los nodos configurados apropiadamente escucharán. La
dirección 224.0.0.2 es un ejemplo de dirección multicast. Solo los nodos
específicamente configurados para prestar atención a una dirección multicast
interpretarán los paquetes para ese grupo multicast.
127.x.x.x
Reservada para la interfaz loopback (sistema local), donde 0 <= x <= 254.
Generalmente es 127.0.0.1.
0.0.0.0
255.255.255.255
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
etc.
Cada uno de estos rangos tiene un propósito. Por ejemplo, el rango de direcciones
conocidas 192.168.x.x solo se usa para comunicaciones locales dentro de una
red privada.
Puede ver una lista larga de direcciones reservadas tanto para IPv4 como IPv6 en
http://en.wikipedia.org/wiki/Reserved_ IP_addresses.
Unicast:
Un paquete se entrega a una interfaz solamente.
- Enlace local: Autoconfigurado para que toda interfaz tenga uno. No enrutable.
- Global: Asignado dinámica o manualmente. Enrutable.
- Reservado para documentación.
Multicast:
Un paquete se entrega a múltiples interfaces.
Anycast:
Un paquete se entrega a la interfaz más cercana de un conjunto (en términos de
distancia de enrutamiento).
IPv4-mapped:
Una dirección IPv4 mapeada a IPv6. Por ejemplo ::FFFF:a.b.c.d/96
Adicionalmente, IPv6 tiene algunos tipos especiales de direcciones, tales como loopback,
la cual se asigna a la interfazlo, como ::1/128.
La máscara de red (netmask) se usa para determinar qué porción de la dirección se usa
para la red y cuánto para la parte del host. También se usa para determinar las
direcciones de la red y de broadcast.
Clase de
Decimal Hexadecimal Binario
Red
11111111 00000000 00000000
A 255.0.0.0 ff:00:00:00
00000000
11111111 11111111 00000000
B 255.255.0.0 ff:ff:00:00
00000000
11111111 11111111 11111111
C 255.255.255.0 ff:ff:ff:00
00000000
Las direcciones de Clase A usan 8 bits para la porción de red de la dirección y 24 bits para
la del host.
Las direcciones de Clase B usan 16 bits para la porción de red de la dirección y 16 bits
para la del host.
Las direcciones de Clase C usan 24 bits para la porción de red de la dirección y 8 bits
para la del host.
Las direcciones de Clase D se usan para multicast.
Las direcciones de Clase E no se usan actualmente.
La dirección de red se obtiene a través de una operación AND lógica entre la dirección IP
y la máscara de red. Nos interesan las direcciones de red porque definen una red local, la
cual consiste en un conjunto de nodos conectados a través del mismo medio de
comunicación, compartiendo la misma dirección de red. Los nodos en una misma red se
pueden ver entre sí.
Ejemplo:
172.16.2.17 dirección ip
&255.255.0.0 máscara de red
-----------------
172.16.0.0 dirección de red
El hostname es una etiqueta que se usa para identificar un dispositivo en la red, con el fin
de diferenciarlo de otros elementos. Históricamente también ha sido llamado nodename
(nombre de nodo).
Para efectos del DNS, a los hostnames se les agrega un punto y un nombre de dominio,
de tal forma que un hostname llamado antje podría tener un fully qualified domain
name (FQDN) como antje.linuxfoundation.org.
$ hostname
wally
Como es usual, para que los cambios sean persistentes es necesario cambiar un archivo
de configuración en el árbol de directorios /etc. En sistemas basados en Red Hat esto se
ha hecho desde un comienzo en/etc/sysconfig/network, como se muestra aquí:
$ cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=gilbert
NTPSERVERARGS=iburst
Commands:
status Show current hostname settings
set-hostname NAME Set system hostname
set-icon-name NAME Set icon name for host
set-chassis NAME Set chassis type for host
Obtener, configurar y cambiar el nombre del host, de acuerdo al sistema que está
utilizando.
Se usa un número importante de herramientas para activar los dispositivos, configurar sus
características, establecer rutas, etc. Y los administradores de sistemas deben convertirse
en expertos en su uso.
Objetivos de aprendizaje
Usar ifconfig para configurar, controlar y consultar parámetros de una interfaz red,
ya sea desde la línea de comandos o desde scripts de configuración del sistema.
Estos nombres consisten en un identificador de tipo seguido por un número, como los
siguientes:
A veces múltiples dispositivos virtuales pueden estar asociados con dispositivos físicos
individuales; estos se nombran con dos puntos y números, de tal forma que eth0:0 sería
el primer alias en el dispositivo eth0. Esto se hace para soportar múltiples direcciones IP
en una tarjeta de red.
El método más simple sería que el primer dispositivo encontrado fuera eth0, el
segundo eth1, etc. Desafortunadamente el sondeo de los dispositivos no es
determinístico en los sistemas modernos y los dispositivos pueden ser ubicados o
conectados en un orden impredecible. Por lo anterior, se podría terminar con la interfaz de
internet intercambiada con la local. Incluso si el hardware no cambia, el orden en el cual
las interfaces se detectan podría variar según la versión del kernel y la configuración.
Por ejemplo, en una máquina con dos interfaces de red PCI que habrían
sido eth0 y eth1:
Estos nombres están correlacionados con las ubicaciones físicas del hardware en el
sistema PCI:
De la misma forma, para un dispositivo que anteriormente se hubiese sido llamado wlan0:
$ ifconfig grep wl
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
$ lspci | grep Centrino
03:00.0 Network controller: Intel Corporation Centrino Advanced-N 6205
[Taylor Peak] (rev 34)
Vemos el mismo patrón. Es fácil desactivar el nuevo esquema y volver a los nombres
clásicos. Vamos a dejar eso como un proyecto de investigación. De aquí en adelante
vamos a usar los nombres clásicos en pro de la claridad y simplicidad.
En RHEL 6 tenemos:
$ cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=bethe
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="00:0C:29:26:3F:B3"
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="5b52bee2-8fda-450d-729e-3996dd12ef7d"
$ cat /etc/sysconfig/network/ifcfg-eno16777736
$ cat /etc/sysconfig/network/ifcfg-eno2ps1
nux-n292:/etc/sysconfig/network> sudo cat ifcfg-enp2s1
BOOTPROTO='dhcp'
BROADCAST=''
ETHTOOL_OPTIONS=''
IPADDR=''
MTU=''
NAME='82545EM Gigabit Ethernet Controller (Copper)'
NETMASK=''
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
USERCONTROL='no'
$ cat /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.1.5
netmask 255.255.255.0
gateway 192.168.1.254
auto eth1
iface eth1 inet dhcp
$ ifdown eth0
$ ifup eth0
Las interfaces de red también pueden configurarse al vuelo usando ya sea ifconfig o las
herramientas ip. Sin embargo estas configuraciones no son persistentes.
39.6 ifconfig
ip es una herramienta de la línea de comandos más nueva (y lejos más versátil) que la
conocida ifconfig. A nivel técnico es más eficiente porque usa sockets netlink en vez de
llamadas ioctl al sistema.
ip puede usarse para una amplia variedad de tareas. Puede ser usado para desplegar y
controlar dispositivos, enrutamiento, políticas de enrutamiento y túneles (tunneling).
OBJECT Función
address Dirección del dispositivo de protocolo IPv4 o IPv6
link Dispositivos de red
maddress Dirección Multicast
monitor Monitorear mensajes netlink
route Entrada de la tabla de enrutamiento
rule Regla en la base de datos de políticas de enrutamiento
tunnel Túnel sobre IP
$ ip link
39.9 Enrutamiento
o con ip:
$ ip route
default via 192.168.1.1 dev enp2s0 proto static metric 1024
172.16.132.0/24 dev vmnet1 proto kernel scope link src 172.16.132.1
192.168.1.0/24 dev enp2s0 proto kernel scope link src 192.168.1.100
192.168.113.0/24 dev vmnet8 proto kernel scope link src 192.168.113.1
La ruta por defecto corresponde a la vía por la cual se envían paquetes cuando no hay
otra coincidencia en la tabla de enrutamiento para alcanzar la ruta especificada.
GATEWAY=x.x.x.x
gateway=x.x.x.x
en /etc/network/interfaces.
En cualquier sistema es posible configurar el router por defecto con un comando como el
siguiente:
Tenga en cuenta que esto podría dejarlo sin conexión a la red. Usted puede restaurarla ya
sea reconfigurando la red, o haciendo lo siguiente en relación al ejemplo anterior:
Las rutas estáticas se usan para controlar el flujo de paquetes cuando hay más de un
router o ruta. Están definidas para cada interfaz y pueden ser persistentes o no.
Cuando el sistema puede acceder más de una ruta, o tal vez donde hay varias interfaces
de red, es útil controlar selectivamente qué paquetes van a qué router.
Se puede usar ya sea el comando route o ip para configurar una ruta no persistente, tal
como aquí:
$ cat /etc/sysconfig/network-scripts/route-eth0
10.5.0.0/16 via 172.17.9.1
39.13 /etc/hosts
/etc/hosts mantiene una base de datos local de hostnames y direcciones IP. Contiene
un conjunto de registros (uno por línea), el cual mapea direcciones IP con sus
correspondientes hostnames y alias.
Esta resolución de nombres estática se usa principalmente para redes locales, pequeñas
y aisladas. Generalmente se verifica antes de usar un servidor DNS para resolver una
dirección; sin embargo, esta prioridad puede ser controlada en/etc/nsswitch.conf.
lo cual:
# Generated by NetworkManager
192.168.1.1
ping:
Envía paquetes de prueba de 64 bytes a determinados hosts en la red, y si los
encuentra, trata de enviar un reporte de vuelta en relación a los tiempos
requeridos para alcanzarlo (en milisegundos). También se incluyen los paquetes
perdidos y algunos otros parámetros. Considere que la salida exacta variará de
acuerdo al host objetivo, pero al menos podrá ver que la red está funcionando y
que el host es accesible.
traceroute:
Se usa para mostrar una ruta de red a un destino. Muestra los paquetes a través
de los routers hasta alcanzar el host, como también el tiempo que toma en
cada salto (hop).
mtr:
Combina la funcionalidad de ping y traceroute, y muestra una salida
continuamente actualizada, como top.
dig:
Es útil para probar la funcionalidad de DNS. Tenga en cuenta que también se
puede usar host o nslookup, programas más antiguos que también devuelven
información del DNS de un host.
Note que algunas distribuciones recientes (como RHEL 7) requieren privilegios de root
(o sudo) para ejecutar las primeras tres herramientas de diagnóstico mencionadas.
Ejemplos:
$ ping -c 10 linuxfoundation.org
$ traceroute linuxfoundation.org
$ mtr linuxfoundation.org
Nota: puede que tenga que usar una interfaz de red diferente a eth0. Usted puede hacer este
ejercicio desde una interfaz grá.ca, pero nosotros presentaremos una solución en la línea de
comandos.
1. Muestre la dirección IP actual, ruta por defecto y la con.guración del DNS para eth0. Tome
una copia de los valores para recon.gurarlos más tarde.
2. Deshabilite eth0 y recon.gúrela para usar una dirección está/ca en vez de DCHP, usando la
información que registró en el punto anterior.
3. Habilite la interfaz y con.gure el cliente del servidor de nombres con la información que
anotó previamente. Veri.que el hostname del sistema y luego hágale ping.
4. Asegúrese que la con.guración que realizó funciona después de reiniciar el sistema.
1. $ ifcon.g eth0
$ route -n
$ cp /etc/resolv.conf resolv.conf.keep
DEVICE=eth0
BOOTPROTO=sta/c
ONBOOT=yes
IPADDR=noted from step 1
NETMASK=noted from step 1
GATEWAY=noted from step 1
4. $ sudo reboot
$ ping hostname
1. Edite /etc/hosts y agregue una entrada para mysystem.mydomain que apunte a la dirección IP
asociada a su tarjeta de red.
2. Agregue una segunda entrada que haga que todas las referencias a ad.doubleclick.net
apunten a 127.0.0.1.
3. Como ejercicio opcional, descargue el archivo de host desde:
h@p://winhelp2002.mvps.org/hosts2.htm o más directamente desde
h@p://winhelp2002.mvps.org/hosts.txt e instalelo en su sistema. ¿Nota alguna diferencia en su
navegador al usar/remover el archivo nuevo de host?
Solución 39.2
1. As root do:
2. As root do:
$ wget h@p://winhelp2002.mvps.org/hosts.txt
--2014-11-01 08:57:12-- h@p://winhelp2002.mvps.org/hosts.txt
Resolving winhelp2002.mvps.org (winhelp2002.mvps.org)... 216.155.126.40
Connec/ng to winhelp2002.mvps.org (winhelp2002.mvps.org)|216.155.126.40|:80...
connected. HTTP request sent, awai/ng response... 200 OK
Length: 514744 (503K) [text/plain]
Saving to: hosts.txt
100%[======================================>] 514,744 977KB/s in 0.5s
2014-11-01 08:57:13 (977 KB/s) - hosts.txt saved [514744/514744]
3. As root do:
1. Con.gure su sistema con un nuevo alias de disposi/vo de red llamado eth0:0, que use una
nueva dirección IP que usted le asignará. Esta dirección debe ser persistente.
Solución 39.3
1. $ cd /etc/syscon.g/network-scripts
$ cp ifcfg-eth0 ifcN-eth0:0
Edite este archivo (como root) y asegúrese que /ene las siguientes líneas:
DEVICE=eth0:0
BOOTPROTO=sta/c
ONBOOT=yes
IPADDR=192.168.1.110
NETMASK=255.255.255.0
usando cualquier dirección que desee, En RHEL 7 usted debería usar NAME en vez de DEVICE.
Para habilitar el disposi/vo puede usar ifcong, ifup o ip, pero haciendo simplemente:
Objetivos de aprendizaje
Los primeros cortafuegos (que datan de finales de los 80s) estaban basados en filtrado
de paquetes; el contenido de cada paquete de red era inspeccionado y era ya sea
eliminado, rechazado o enviado. No se tenía en cuenta el estado de la conexión; a qué
stream o tráfico pertenecía el paquete.
iptables
firewall-cmd
ufw
system-config-firewall
firewall-config
gufw
yast
40.3 firewalld
$ firewall-cmd --help
Usage: firewall-cmd [OPTIONS...]
....
Status Options
--state Return and print firewalld state
--reload Reload firewall and keep state
information
--complete-reload Reload firewall and loose state
information
--runtime-to-permanent Create permanent from runtime configuration
....
lo cual muestra alrededor de 200 líneas, demasiado largo para incluirlo aquí.
Sin embargo, verá que la mayoría de las opciones son obvias ya que están correctamente
nombradas. Como servicio,firewalld reemplaza el antiguo iptables. Es un error ejecutar
ambos servicios - firewalld e iptables - al mismo tiempo.
Tenga en cuenta que si tiene más de una interfaz de red al usar IPv4, usted tiene que
activar ip forwarding. Puede hacer esto en tiempo de ejecución con una de las dos
alternativas:
Sin embargo esto no es persistente. Para hacerlo persistente, tiene que agregar la
siguiente línea a
/etc/sysctl.conf:
net.ipv4.ip_forward=1
$ sudo sysctl -p
firewalld trabaja con zonas, cada una de las cuales tiene un nivel definido de seguridad y
un cierto comportamiento ya definido para paquetes entrantes y salientes. Cada interfaz
pertenece a una zona en particular. Normalmente NetworkManager le informa
a firewalld acerca de la zona que aplica, pero esto puede modificarse con firewall-cmdo
la GUI firewall-config.
block
Todas las conexiones entrantes son rechazadas. Las únicas conexiones permitidas
son las internas del sistema.
public
No confíe en ningún computador en la red; solo ciertas conexiones entrantes
seleccionadas conscientemente están permitidas.
external
Se utiliza cuando masquerading está en uso, como en los routers. Los niveles de
confianza son los mismos que en public.
work
Confía (pero no completamente) en los nodos conectados que no son perjudiciales.
Solo se permiten ciertas conexiones entrantes.
home
Usted confía en la mayoría de los demás nodos en la red, pero aún selecciona qué
conexiones entrantes están permitidas.
internal
Es similar a la zona work.
trusted
Todas las conexiones de red están permitidas.
Cualquier zona puede estar ligada no solo a una interfaz de red, sino que también a una
dirección de red en particular. Un paquete está asociado a una zona si:
Este proviene desde una dirección fuente que ya está asociada a la zona. O por
otra parte:
Este proviene desde una interfaz asociada a la zona.
Cualquier paquete que no encaje en los criterios anteriores se asigna a la zona por
defecto (que generalmente es public).
Esto dice que cualquier paquete con dirección IP 192.168.1.x será agregado a la
zona trusted.
Tenga en cuenta que puede remover una fuente previamente asignada a una zona
usando la opción --remove-source, o cambiar la zona usando --change-source.
Hasta el momento hemos asignado interfaces particulares y/o direcciones a zonas, pero
no hemos delineado quéservicios y puertos deben estar accesibles en una zona.
El segundo comando, con --reload, es necesario para que los cambios sean efectivos.
También es posible agregar servicios editando los archivos
en /etc/firewalld/services.
Si bien es cierto que el paquete rewalld (el cual incluye la herramienta mul/propósito rewall-
cmd) está disponible en la mayoría de las distribuciones Linux recientes, es posible que no esté
instalado en su sistema.
Si no encuentra el programa, entonces instálelo de la forma usual, usando una de las treas
maneras que se muestran aquí, dependiendo de su distribución:
Si esto falla, entonces el paquete rewalld no está disponible en su distribución. Por ejemplo, este
sería el caso de las distribuciones RHEL6/CentOS6. En este caso tendrá que instalarlo desde las
fuentes.
Tendrá que seguir el procedimiento general para instalar desde las fuentes:
Tendrá que lidiar con cualquier problema que se presente en el paso ./congure, tal como una
biblioteca faltante, etc. Cuando realiza una instalación desde un sistema de paquetes, la
distribución se hace cargo de esto, pero en el caso de instalar desde las fuentes esto puede ser un
complejo. Si ha ejecutado en su sistema el script ready-for.sh de la Linux Founda/on, es poco
probable que tenga problemas.
subs/tuyendo por el nombre adecuado de la versión que descargó. Esperemos que la próxima
versión de openSUSE elimine la necesidad de compilar desde las fuentes, ya que han habido
solicitudes de agregar rewalld a las opciones disponibles.
Solo hemos revisado la super.cie de cómo se puede usar el paquete rewalld. Casi todo se hace a
través de la herramienta lewall-cmd, la cual está facultada para realizar una gran variedad de
tareas, usando opciones con nombres muy claros.
$ .rewall-cmd --help
Usage: .rewall-cmd [OPTIONS...]
....
Service Op/ons
--new-service=<service>
Add a new service [P only]
--delete-service= <service>
Delete and exis/ng service [P only]
....
Para una explicación más detallada de todo lo que despierte su interés, haga man rewall-cmd, lo
cual provee de un resumen, como también una lista de otras páginas man que describen los
diversos archivos de con.guración en /etc. También se aclaran conceptos como zonas y servicios.
Agregue los servicios hTp y hTps a la zona pública y veri.que que se muestran correctamente.
Solución 40.3
después de agregar los servicios nuevos, van a desaparecer de la lista. Este comportamiento
curioso se debe a que no incluimos el parámetro --permanent, y la opción --reload recarga los
servicios persistentes solamente.
Cada distribución /ene su propia herramienta grá.ca para administrar el cortafuegos. En sistemas
basados en Red Hat es posible ejecutar rewall-cong. En Ubuntu se llama gufw y en openSUSE la
puede encontrar como parte de yast en el menú grá.co de sistema.
Una vez que ha iniciado la GUI de con.guración del cortafuegos, haga el ejercicio previo de agregar
hTp y hTps a la zona public, y asegúrese de que tomó efecto. Asegúrese de tomarse el /empo
para entender la interfaz grá.ca.
Objetivos de aprendizaje
3. Experto: Algunas personas piensan que el experto nació para esto, pero no tiene
sentido, ya que todas las habilidades necesarias se pueden adquirir. Todas las
organizaciones deberían tener al menos una persona en este nivel de experiencia a la
cual recurrir cuando sea requerido.
La resolución de problemas involucra realizar una serie de pasos, los cuales necesitan
repetirse de forma iterativa hasta encontrar soluciones. Una receta básica podría ser la
siguiente:
Si por otro lado, decide seguir su intuición y verificar algunas corazonadas, debe
asegurarse de recopilar información lo suficientemente rápido para decidir si continuar o
abandonar el camino de la intuición, basado en si esto parece que va a ser productivo o
no.
Si bien es cierto que ignorar la intuición puede alargar el proceso de resolver un problema,
el registro de la persona que solucionaba personas anteriormente es el punto de
referencia fundamental para determinar si se continúan invirtiendo recursos de esta forma.
Es necesario verificar los siguientes ítems cuando hay problemas relacionados a la red:
Configuración de la IP:
Use ifconfig o ip para comprobar si la interfaz está arriba, y si es así, ver si está
configurada.
Conectividad:
Use ping para ver si la red es visible, verifique el tiempo de respuesta y si hay
pérdida de paquetes. Traceroute puede seguir paquetes a través de la red,
mientras que mtr puede hacerlo de forma continua. El uso de estas herramientas
puede decirle si el problema es local o está en internet.
Resolución de hostname:
Ejecute dig o host con una URL y verifique si el DNS está funcionando
apropiadamente.
Los problemas de red pueden ser causados ya sea por software o hardware, y puede ser
tan simple como que el controlador del dispositivo no está cargado o el cable de red no
está conectado. Si la red está arriba pero el rendimiento es terrible, el asunto cae en el
canasto de ajuste del rendimiento, no en la resolución de problemas básicos. Los
problemas pueden ser externos a la máquina, o requerir el ajuste de varios parámetros de
red, incluyendo tamaños del búfer y otros.
$ rpm -V some_package
$ rpm -Va
lo cual verificará los checksums en los archivos del paquete. Sin embargo, no todos los
paquetes tienen checksums, de tal forma que esto podría no ser completamente útil. Es
posible usar las opciones -V o --verify en las versiones recientes de dpkg.
aide detecta intrusiones y es otra forma de verificar si hay cambios en los archivos:
ejecutará un análisis de los archivos y los comparará con el último reporte. Por supuesto,
tendrá que mantener la base de datos de aide luego de inicializarla.
Si /etc/fstab parece estar correcto, siga con fsck. Primero debería intentar:
$ sudo mount -a
para intentar montar todos los sistemas de archivos. Si esto no tiene éxito por completo,
puede tratar de montar manualmente los que tienen problemas. Primero debería ejecutar
Las opciones exactas van a variar de una distribución Linux a otra, pero cuando usted
arranca desde un CD/DVD de instalación/live o disco USB tiene la posibilidad de
seleccionar una opción con un nombre como Rescue Installed System.
La imagen de rescate realizará una serie de preguntas al iniciar. Una de ellas es si desea
o no montar los sistemas de archivos (de ser posible).
Usted puede instalar paquetes de software desde dentro del ambiente chrooteado.
También estará habilitado para instalarlos desde fuera del ambiente chrooteado. Por
ejemplo, en un sistema basado en RPM, a través de la opción --root para especificar la
ubicación del directorio root:
Tarde o temprano un sistema va a caer en una falla importante, como no poder arrancar
adecuadamente, montar sistemas de archivos, iniciar un ambiente gráfico de escritorio,
etc. Los medios de rescate del sistema en la forma de discos ópticos o
unidades USB portables pueden usarse para resolver la situación. Arrancar ya sea en
modo de emergencia o monousuario puede permitir el uso completo de las
herramientas de Linux para reparar el sistema y devolverlo a su operación normal.
Objetivos de aprendizaje
Al final de este capítulo usted debería ser capaz de:
Explicar en qué formas vienen los medios de rescate del sistema, como se pueden
preparar y disponer de ellos.
Saber cómo entrar en modo de emergencia y qué se puede hacer ahí.
Saber cómo entrar en modo monousuario, qué se puede hacer ahí, y en qué se
diferencia del modo de emergencia.
Los medios de rescate pueden ser útiles si la contraseña de root se perdió y necesita ser
reseteada.
Los medios Live (o vivos, y en cualquier formato) proveen un sistema operativo completo
y arrancable, el cual se ejecuta en memoria, en vez de cargar desde el disco. Los
usuarios pueden experimentar y evaluar el sistema operativo y/o la distribución Linux sin
instalarla realmente, o realizar cualquier cambio al sistema operativo existente en el
computador.
Los medios extraíbles Live son únicos en cuanto a que pueden correr en un computador
que no tiene un almacenamiento secundario, tal como un disco duro, o con un disco duro
o sistema de archivos dañado, permitiendo a los usuarios rescatar datos.
Ya sea que esté usando un medio Live, de instalación o rescate, los procedimientos para
entrar en un sistema operativo especial de rescate y recuperación son los mismos, y
como hemos señalado, estos tres medios sirven para el mismo propósito.
No le podemos decir todas las posibilidades ya que cada distribución tiene algo diferente,
pero es fácil determinar el procedimiento a seguir.
Lo siguiente es que puede esperar que se le hagan algunas preguntas tales como el
lenguaje a utilizar, como también tomar algunas elecciones dependiendo de su
distribución. Entonces se le pedirá seleccionar la ubicación de una imagen válida de
rescate: CD/DVD, Disco Duro, NFS, FTP o HTTP.
La ubicación seleccionada debe contener un árbol de instalación válido, y este debe ser
de la misma versión Linux que tiene el disco de rescate. Y si está usando medios
extraíbles, el árbol de instalación debe ser el mismo desde el cual fue creado el medio en
cuestión. Si está utilizando una imagen boot.iso proporcionada por el vendedor,
entonces también necesitará un árbol de instalación basado en la red.
Puede usar chroot para acceder de mejor forma al sistema de archivos raíz (/).
$ dd if=boot.iso of=/dev/sdX
Asumiendo que su sistema tiene la capacidad de arrancar desde medios USB y que
la BIOS está configurada para ello, usted entonces podrá arrancar desde este disco USB.
Este funcionará de la misma forma que un CD o DVD de rescate. Sin embargo, tenga en
cuenta que el árbol de instalación no estará presente en la unidad USB; por lo tanto este
método requiere de un árbol de instalación basado en la red, en el caso de requerirse.
La principal ventaja del modo de emergencia sobre el modo monousuario (el que se
describe en la página siguiente) es que si init está dañado o no funciona, usted todavía
puede montar sistemas de archivos para recuperar información que podría perderse
durante una reinstalación.
Para entrar en modo de emergencia usted debe seleccionar una entrada desde el menú
de arranque de GRUB y luego presionar e para editar. Luego agregue la
palabra emergency a la línea de comandos del kernel antes de indicarle al sistema que
arranque. Se le pedirá la contraseña de root antes de llevarlo a una shell.
Tenga en cuenta que también puede entrar en modo de emergencia cuando el arranque
falla debido a una serie de razones, incluyendo sistemas de archivos dañados.
init es iniciado.
La red no se activa.
En este modo su sistema arranca en runlevel 1 (en lenguaje SysVinit). Debido a que el
modo monousuario intenta montar los sistemas de archivos automáticamente, no lo puede
usar cuando el sistema de archivos raíz no puede montarse satisfactoriamente, o si la
configuración de init está dañada.
Para arrancar en modo monousuario se usa el mismo método descrito para modo de
emergencia, pero con la excepción de reemplazar la palabra emergencia con single.
En los siguientes ejercicios vamos a dañar deliberadamente el sistema y luego recuperarlo a través
del uso de medios de rescate. Por lo tanto, resulta obviamente prudente asegurarse de que puede
arrancar desde el medio de rescate antes de intentar cualquier cosa más ambiciosa.
Reinicie y asegúrese de que sabe cómo forzar el sistema para que arranque desde el medio de
rescate (es probable que tenga que jugar con la con.guración de la BIOS). Elija el modo de rescate
en el inicio del sistema.
Si está usando una máquina virtual el procedimiento es lógicamente el mismo, con dos diferencias:
Acceder a la BIOS puede ser diOcil dependiendo del hipervisor que u/lice. Algunos de ellos
requieren combinaciones de teclas muy rápidas, así es que lea la documentación y
asegúrese que sabe cómo hacerlo.
Puede usar un disco óp/co o Osico, asegurándose que esté montado en la máquina virtual,
y si es USB podría tener algunos obstáculos para asegurarse de que la máquina virtual
puede reclamar el disposi/vo Osico. Generalmente lo más fácil es conectar un archivo de
imagen .iso directamente a la máquina virtual.
Si está trabajando con una máquina virtual, obviamente las cosas son menos peligrosas, y si /ene
miedo de corromper el sistema de forma irreparable, simplemente haga una copia de seguridad de
la imagen de la máquina virtual antes de realizar estos ejercicios. Siempre puede reemplazar la
imagen con la del respaldo más tarde. ¡No realice los siguientes ejercicios a menos que está seguro
de que puede arrancar su medio de rescate/recuperación
1. Como root (no con sudo), cambie la contraseña de root. Vamos a pretender que no conocemos
la contraseña nueva.
2. Desconéctese e intente conectarse de nuevo como root, usando la contraseña an/gua.
Obviamente no podrá.
3. Arranque usando el medio de rescate y seleccione Rescue cuando se le presente la opción.
Permita que se monten los sistemas de archivos y luego vaya a una línea de comandos.
4. Vaya al ambiente chroot, de tal forma que tenga acceso a su sistema:
5. $ chroot /mnt/sysimage
6. y recon.gure la contraseña de root a su valor original.
7. Salga, remueva el medio de rescate y reinicie. Debería poder conectarse de forma normal
ahora
Sea cuidadoso: asegúrese de ejecutar el comando correcto y que el archivo /ene el largo
adecuado:
$ sudo ls -l /root/mbrsave
-rw-r--r-- 1 root root 446 Nov 12 07:54 mbrsave
1. Este ejercicio ha sido creado especí.camente para sistemas basados en Red Hat. Usted debería
ser capaz de construir fácilmente las subs/tuciones adecuadas para otras familias de
distribuciones.
Tenga en cuenta que hemos elegido un paquete que generalmente no /ene dependencias con
el .n de simpli.car las cosas. Si usted elige algo que las /ene, tenga el cuidado de reinstalar
cualquier cosa que desinstale y que sea necesario.
3. Reinstale (o instale) zsh desde el ambiente de rescate. Primero monte el medio de instalación
en /mnt/source:
La opción --force le indica a rpm que use el directorio fuente para determinar la información
de las dependencias y otras cosas. Tenga en cuenta que si la imagen de instalación es mucho
más an/gua que su sistema, el cual ha tenido probablemente muchas actualizaciones, el
procedimiento completo podría colapsar.
4. Salga y reinicie.
$ rpm -q zsh
zsh-5.0.2-7.el7.x86_64 6.
6. $ zsh
....
[coop@q7]/tmp/LFS201%
Explicar en qué formas vienen los medios de rescate del sistema, como se pueden
preparar y disponer de ellos.
Saber cómo entrar en modo de emergencia y qué se puede hacer ahí.
Saber cómo entrar en modo monousuario, qué se puede hacer ahí, y en qué se
diferencia del modo de emergencia.