domingo, 25 de enero de 2009

Gestión de usuarios y grupos: Introducción

Todo usuairo de un sistema UNIX debe tener una cuenta para poder acceder
→ Cuenta UNIX: colección de características lógicas que especifican quien es el usuairo y lo que puede hacer en el sistema
→ Estas características incluyen:
→el nombre de usuairo (login o user name)
→la contraseña (passwd)
→ grupo o grupos a los que pertenece
→un identificador numérico(UID)
→ un identificador numérico del gurpo por defecto (GID)
→ un directorio home
→ un login shell
→ una colección de ficheros de inicio
Dentro de las cuentas asociadas a usuarios podemos encontrar diferentes tipos.
→ cuentas normales de usuario
→ cuenta del administrador (root)
→ cuentas especiales de los servicios (nobdoy,lp,bin,etc):
→ usadas por servicios internos del sistema
→ aumentan la seguridad, al permitir que servicios del sistema no se ejecuten como root

Dispositivos

Dispositivo (device): cualquier tipo de sistema físico o lógico con el que interactúa el kernel
→ Dispositivo físico: p.e. discos, dispositivos serie, CD..
→ Dispositivo lógico: p.e. terminales virtuales, memoria, puertos..
Driver de dispositivos: parte del kernel que se encarga de interactuar con el dispositivo
→ puede estar compilado en el kernel o puede cargarse como un módulo
→ el fichero /proc/devices lista los drivers cargados en el kernel
Fichero de dispositivos: ficheros especiales que permiten a als aplicaciones interactuar con los dispositivos mediante rutinas estándar de manejo de ficheros (open,read, etc.)
→ están localizados en el directorio /dev


Tipos de dispositivos:

Dispositivos terminales: para comunicarnos con el sistema
→ terminales virutales: dispositivos /dev/ttyX con X d 0 a 63
→asociados a las distintas consolas de texto
→Pseudoterminales: pares de archivos de dispositivo que sirven como canal de comunicación entre procesos
→ no controlan ningún dispositivo físico real
→ lo que se escriba en cualquiera de los dos será recibido por el otro
→ se utilizan en conexiones remotas y en terminales del entorno de ventanas
→ los archivos del par se llaman maestro y esclavo
→Notación BSD: maestros /dev/ptyXX, esclavos /dev/ttyXX
→Notación Unix98: maestro /dev/ptmx (sólo uno), esclavos /dev/ptx/X (son creados automáticamente por un sistema de archivos virtual, devpts)
→ Dispositivos terminales serie: dispositivos /dev/ttySX
→ dispositivos asociados a los distintos puertos serie
→ Comando relacionados:
→ tty muestra el terminal en el que estamos conectados
→ stty permite cambiar características del terminal

Otros dispositivos
→ Discos:
→ IDE: /dev/hda, /dev/hdb, /dev/hdc, /dev/hdd
→ SCSI: /dev/sdX con X siendo a,b, ...
→ Floppy: /dev/fdX (pueden llevar un código indicando el tipo de disco y capacidad)
→ Particiones: el dispositivo seguido de un número
→ Dispositivos de loop: /dev/loop0, /dev/loop1,...
→ permiten usar un fichero como si de un dispositivo de disco se tratase: los datos se escriben y se leen en el fichero, en vez de en pistas y sectores del disco real
→ Ejemplo: monta una imagen de un CD: # mount -o loop,ro -t iso9660 imagen.iso /mnt/iso
→ es posible incluso crear ficheros encriptados que nos monten una partición del disco
→ Otros
→ dispositivos de memoria /dev/mem, /dev/kmem,etc..
→ dispositivos de audio: /dev/audio, /dev/mixer, etc
→ dispositivo /dev/zero: generador de valores nulo
→ dispositivo /dev/urandom: generador de valores aleatorios
→ estos dos últimos se suelen usar con el comando dd para crear ficheros con valores iniciales nulos o aleatorios

Características de los ficheros de dispositivos:
Un fichero de dispositivos es diferente aun fichero normal
→Ejemplo: $ ls -l /dev/hda
brw-rw---- 1 root disk 3, 0 2004-09-18 13:51 /dev/hda
→ La primera letra (c o b) indica dispositivo de caracteres o de bloques
→ caracteres: lee o escribe byte a byte
→ bloques: lee o escribe bloque a bloque (bloques usualemnte de 512bytes)
→ Los dos números antes de la fecha representan los números principal (major) y secundario (minor) que identifican al dispositivo
→Major numbre: identifica el driver que maneja el dispositivo
→Minor numbre: permite al driver identificar un dispositivo concreto entre varios controlados por el mismo driver

Creación de ficheros de dispositivos
Para crear un fichero de dispositivos se usa el comando mknod
→ Comando mknod: crea ficheros de caracteres o bloques (también puede crear tuberías)
→ Formato: mknod [opciones ] nombre tipo [major minor ]
→ Ejemplo: # mknod /dev/hda b 3 0
El script MAKEDEV permite crear dispositivos de una forma fácil( sin necesidad de conocer los números principal y secundario)

Gestión dinámica de dispositivos:
Los UNIX tradicionales mantienen en /dev una lista estática de posibles dispositivos
→ la mayoría de estos dispositivos no existe realmente en el sistema
→ esto puede suponer un problema para dispositivos que se enchufan "en caliente"
En Linux existen herramientas para manejar estos dipsositivos de forma dinámica:
devfs: filesystem especial presente en varios UNIX, como FreeBSD y Linux
→ controla la creación , borrado y gestión de permisos de los ficheros de dispositivos
→ el Linux 2.6 se ha abandonado en favor de udev
udev: reemplazo de devfs en Linux 2.6, apra lagestión de ficheros de dispositivos
→ udev tiene un conjunto de ventajas respecto a devfs
→ se ejecuta en el espacio de usuairo, y no en el del kernel, como devfs
→ permite personalizar el nombre de dispositivo
→ esta última característica permite resolver el problema del nombre asignado a dispositivos, que se enchufan en caliente (que puede variar en función del orden en que se conectan)

Módulos

Módulos.
Cuando se solicita la ejecución de una función no disponible en el kernel residente, el módulo correspondiente se carga dinámicamente en memoria
→ Después de un período específico de inactividad, el módulo se puede quitar de la memoria
→ Un subproceso del kernel se encarga de la carga dinámica de los módulos
→ No todos los módulos se cargan automáticamente:
→ alguna aplicaciones cargan los módulos que necesitan en el arranque ( ficheros /etc/init.d)
→ se pueden cargar / descargar módulos "a mano" usando comandos como modprobe
→ en algunas distribuciones (debian), es posible cargar mulos al inicio indicándolo en el fichero /etc/modules
Los ficheros de módulos se almacenan, normalmente, en el directorio /lib/modules//


Comandos para el manejo de módulos:
→ Comando lsmod: lista los módulos cargados
→ obtiene la información del fichero /proc/modules
→ Comando insmod: carga un módulo en el kernel
→ formato: insmod [opciones] módulo
→ es preferible usar el comando modprobe
→ Comando rmmod: sca un módulo del kernel
→ formato rmmod [opciones] módulo
→ es preferible usar el comando modprobe -r
→ Comando modprobe: añade y quita módulos del kernel de forma inteligente
→ formato: modprobe [opciones] módulo
→ Algunas opciones:
→ -r o --remove descarga el módulo
→ -C o --config configfile usa el fichero configfile en vez de la configuración.
→ -c o --showconfig muestra los ficheros de configuración
→ -n o --dry-run simulaciónh, no carga los módulos
→ -v o --verbose imprime mensajes sobre lo que hace el programa
→ modprobe maneja las dependencias entre módulos en base al fichero modules.dep generado por el comando depmod
→ Comando depmod: genera un fichero con las dependencias entre módulos
→ fichero /lib/modules//modules.dep
→ si modificamos los módulos, se debe ejecutar depmod para actualizar el fichero de dependencias
→ Comando modinfo permite obtener información sobre los módulos


Ficheros de configuración:
Los ficheros de configuración que usa modprobe dependen de los paquetes de administración de módulos que tengamos instalados
→ Kernel 2.4,paquete modutils, fichero /etc/modules.conf + directorio /etc/modutils/
→ Kernel 2.6, paquete module-init-tools, fichero /etc/modprobe.conf + directorio /etc/modprobe.d/
En estos ficheros se especifican alias para los módulos, opciones para módulos, acciones a realizar en la carga y descarga del módulo, etc.

El kernel de linux

El kernel de Linux:
Algunas características:
• Kernel de tipo monolítico, con soporte para carga/descarga de porciones del kernel (módulos) bajo demanda
• Soporte para aplicaciones multithread
• Soporte para multiprocesamiento simétrico (SMP)
• Soporte de múltiples sistemas de ficheros
• Distribuido bajo licencia GPL


Versiones del kernel:
Cada versión del kernel se identifica con tres o cuatro números,p.e. 2.4.27
• El primer número representa la versión (actualmente la 2)
• El segundo representa la revisión principal (major revision); cambia cuando se introducen nuevos drivers o características al kernel
→si es un número impar, se trata de un kernel experimental (no recomendado para instalar)
→si es par, es un kernel estable o de producción (revisión actual 2.6)
→el tercer número indica la revisión secundaria (minor revision); la ultima versión, a 11/01/2009 es la 2.6.28
→el cuarto número (opcional) indica modificaciones pequeñas en el kernel
• Las diferentes distribuciones pueden introducir otra numeración o para indicar parches, p.e. 2.6.24-20
• Podemos obtener la ultima versión en www.kernel.org
• Para ver la versión instalada en el sistema usar el comando uname

Actualización del kernel:
La mayoría de las distribuciones incluyen versiones compiladas del kernel
• ¿Para qué compilarlo entonces?
→tenemos un dispositivo o queremos dar soporte a un servicio no soportado por el kernel oficial
→algunas aplicaciones que queremos usar requieren soporte de un kernel nuevo o de alguna de sus prestaciones, que no aparecen activadas en el kernel precompilado
→queremos optimizar las prestaciones de nuestros dispositivos

Si lo unico que queremos es actualizar a una versión superior del kernel, podemos bajar un paquete ya compilado:
• en Debian instalar kernel-image- o linux-image-
• este paquete nos instala la versi ́n comprimida del kernel en /boot/vmlinuz- y los módulos en /lib/modules/
• además modifica el GRUB (o LILO) para permitir cargar el nuevo kernel

Para compilar el kernel, tenemos que obtener los fuentes
• en Debian, paquetes kernel-source- o linux-source-

Este paquete instala las fuentes comprimidas en /usr/src
1. descomprimirlo con tar xvjf kernel-source-.tar.bz2
2. crear un enlace simbólico de nombre linux en /usr/src


Actualización mediante parches:

Podemos actualizar el kernel mediante parches incrementales
1. Descargar los parches para la nueva versión del kernel
• si queremos pasar de la versi ́n 2.4.15 a la 2.4.17 hay que aplicar parches para pasar a la 2.4.16 y luego a la Arranque y parada 2.4.17
2. Aplicarlos con el comando patch
# zcat parche | patch -p0
Los parches también sirven para añadir funcionalidades (p.e. nuevos drivers) no incluidos en el kernel oficial
• después de instalar el parche tenemos que recompilar el kernel

Comandos patch y diff
Permiten crear y aplicar parches
• diff muestra la diferencia entre ficheros de texto, línea a línea
el formato de la salida permite usarlo para crear parches
• patch aplica un fichero de diferencias, creado con diff a un
original

• Ejemplo:
[patch]$ cat old/file.txt
Este es un
fichero simple
[patch]$ cat new/file.txt
Este es un
fichero algo más complicado
[patch]$ diff -uNr old new > parche
[patch]$ cat parche
diff -uNr old/file.txt new/file.txt
--- old/file.txt 2005-10-10 18:22:51.000000000 +0200
+++ new/file.txt 2005-10-10 18:19:41.000000000 +0200
@@ -1,2 +1,2 @@
Este es un
-fichero simple
+fichero algo más complicado
[patch]$ cd old
[old]$ cat ../parche | patch -p1
patching file file.txt
[old]$ cat file.txt
Este es un
fichero algo mas complicado

• la opción -p1 de patch quiere decir: “Elimina la parte del path en el nombre hasta la primera barra e intenta aplicar el parche con el nombre reducido de esa forma"

Configuración del kernel:
Dentro del directorio /usr/src/linux accedemos podemos acceder al menú de configuración de distintas formas
1. make config: interfaz básica en modo texto; complejo y poco recomendable
2. make menuconfig: interfaz de menú para consola, fácil de usar(necesita instalar los ficheros de desarrollo de la librería ncurses, en Debian paquete libncurses5-dev)
3. make xconfig: interfaz gráfico para entorno de ventanas; basada en la librería QT (en Debian, instalar paquete libqt3-dev)
4. make gconfig: otro interfaz gráfico para entorno de ventanas; basado en la librería GTK (en Debian, instalar paquete libglade2-dev, libgtk2.0-dev)

Dentro de los menús se pueden configurar las opciones que incluirá el nuevo kernel.
→Algunas opciones pueden ser compiladas directamente en el kernel o como módulos que se cargarán o no cuando el kernel esté en fucnionamiento y sean necesarios
→ Otras opciones activan la disponibilidad de opciones nuevas al ser marcadas
Si deseamos utilizar alguna configuración anterior copiamos su fichero de configuración, normalmente /boot/config - al fichero .config dentro del directorio del kernel
→make oldconfig: usa la configuración del .config
→make oldconfig xconfig: parte de la configuración vieja para modificarla


Compilación del kernel
Varios pasos:
1. make dep :(sólo kernels anteriores a 2.6) contruye las dependencias para realizar la compilación real
2. make bzImage :(o make para kernels 2.6) compila y crea una imagen comprimida
3. make modules : (sólo kernels anteriores a 2.6) compila las partes que han sido marcadas como módulos
4. make modules_install : instala los módulos del kernel en el sistema
→ normalmente se instalan en /lib/modules//
Para kernels 2.6 make reemplaza a make dep, make bzImage y make modules

La compilación puede fallar por:
→ Problemas con al versión usada de gcc
→ por errores al configurar el kernel, algunas de sus dependencias no se cumple (posible bug de la herramienta de configuración, o se terminó mal..)
→ la versión bajada del kernel tiene errores(poco probable)
Si falla y se subsana el error, es recomendable limpiar el kernel antes de volver a compilar:
→ make clean: borra ficheros objeto, ficheros intermedios y las imágenes generadas.
→ make mrproper : deja el kernel en el estado en el qu estaba cuando se descomprimió (borra también la configuración realizada)
Para más detalles leer los ficheros README de la documentación del kerenl (directorio /usr/share/doc/)


Instalación del kernel:
Ya sólo resta crear el RAMDisk inicial e instalar el kernel:
1. Crear la imagen initrd
→ RAM disk que contiene los módulos necesarios para iniciar el sistema y montar la partición raíz, y cargar el resto de módulos.
→sólo necesario si los controladores de disco se han compilado como módulos
→ para crearlo se usa:
update-initramfs -c -k kernel-versión
2. Instalar el nuevo kernel
(a) Copiar lo ficheros bzImage y System.map al directorio de arranque del kernel (/boot)
→ Renombrar bzImage a vmlinuz- y System.map a System.map
(b) Configurar GRUB o LILO para poder cargar la nueva imagen


Instalar el kernel en Debian:
Debian tiene una utilidad para simplificar el proceso de compilar e instalar el kernel:
→make-kpkg (paquete kernel-package) compila y crea un paquete Debian con el kernel compilado
→ Ejmplo:
make-kpkg --revision=custom.1.0 kernel_image
→ el paquete creado se instala con dpkg -i
→ si es necesario, crear el initrd y modifciar GRUB o LILO para que carguen este initrd

Arranque y parada del Sistema

Durante el arranque, el sistema pasa por la siguientes fases:
→ Carga e inicialización del kernel
→ Detección de dispositivos y configuración
→ Creación de procesos de inicio
→ Ejecución de los scripts de inicio del sistema
→ Creación de terminales.


Carga del Kernel:
Usualmente en 2 pasos:
1. La RIM del sistema carga un pequeño programa (bootstrap o gestor de arranque) en memoria desde el disco.
→ la localización dle programa depende del sistema UNIX
→ en un PC, se sitúa en el MBR (Master Boot Record), primer sector del disco
2. El bootstrap localiza y carga en memoria el kernel
→ en Linux normalmente localizado en /boot (fichero vmzlinuz-versión)
3. Los gestores de arranqu más populares en Linux son LILO y GRUB.

Una vez cargado, el kernel realiza los siguientes pasos:
1. inicializa sus estructuras de datos internas (colas,tabla de procesos,etc)
2. chequea el hardware.
3. verifica la integridad del filesystem root y lo monta
→ en Linux, se cra un RAM disk a partir del fichero /boot/initrd.img-versión
4. se crean los procesos de inicio
→ en BSD, 3 procesos: swapper (0), init (1) y pagedaemon (2)
→ en System V: shed(0), init (1) y varios procesos de manejo del kernel y memoria.
→ en Linux: init (1) y varios procesos del manejo del kernel y la memoria (ksoftirqd,migration,events,etc., que en realidad son parte del kernel)
→ init se encarga de arrancar el resto de procesos

Una vez arrancado init, este inicia los scripts de inicio, que activan los demonios:
→ en BSD: ejecuta el script /etc/rc que a su vez ejecuta otros scripts
→ en System V: lee el fichero /etc/inittab desde el que se invocan scripts situados en los directorios /etc/rcx.d
→ x es el nivel de ejecución o runlevel


Niveles de ejecuión (runlevels);
El proceso init inicia el sistema en un determinado runlevel.
→ el runlevel inicial especificado en /etc/inittab
Runlevel: determinada configuración software que permite la ejecución de una serie de procesos en la máquina
Los runlevels se identifican por números de 0 a 6
0 → parada del sistema
1 → modo monousuario; solo root puede entrar
2,3,4,5 → modos multiusuario
6 → reiniciar el sistema
S → también monousuarios (usado por scripts)

La utilización de los runlevels 2-5 varía con la distribución de Linux:
→ en Debian los 4 son idénticos: modo multiusuarios completo (con entorno de ventanas, si disponible); por defecto se usa el 2
→ en RedHat y similares:
→2:multiusuario sin NFS
→3:multiusuario completo (sin ventanas)
→4:no usado
→5:multiusuario completo (con ventanas)
Es posible cambiar de runlevel en cualquier momento usando el comando telinit o init:
Formato: telinit [-t SEC] runlevel
SEC es el número de segundos que esperará init a que un procesos se detenga con un SIGTERM antes de matarlo con un SIGKILL (por defecto, 5)
Es posible hacer que init relea el fichero de configuración /etc/inittab: telinit q
Podemos saber en que runlevel nos encontramos con el comando runlevel


El fichero /etc/initab:
Define como se ejecutan los runlevels
→ indica el runlevel por defecto
→ indica los scripts a ejectuar en cada runlevel
Formato de las líneas de inittab:
identificador:runlevels:acción:proceso
→ identificador: nombre asociado a cada línea del fichero generalmente no superior a 4 caracteres
→ runlevels: lista de runlevels (todos seguidos) para los cuales esta línea se tendrá en cuenta
→ acción: indica de qué forma o bajo qué condiciones se ejecuta el comando del campo siguiente
→ proceso: comando que se ejecuta para esta entrada en los runlevels especificados

Algunas de las acciónes de init son:
→ respawn: el proceso se reinicia si termina
→ wait: init iniica el proceso y espera q ue termina para seguir
→ once: init inicia el proceso una vez, cuando se entra en el runlevel
→ sysinit: el proceso se ejecuta durante el arranque del sistema
→ ctrlaltdel: el proceso se ejecuta si se recibe un CTRL-ALT-DEL
→ powerwait: el proceso se ejecuta cuando se acaba la batería
→ powerokwait: el proceso se ejecuta cuando se recupera la energía
→ powerfailnow: el proceso se ejecuta cuando la batería está casi vacía

El script /etc/init.d/rcS se ejecuta en el arranque
→ este script llama a los scripts del directorio /etc/rcS.d
Por cada runlevel, se ejecuta el script /etc/init.d/rc X
→ este script llama a los scripts del directorio /etc/rcX.d


Directorios /etc/rcX.d:
Los ficheros de estos directorios son de la forma:
[K|S] NN Servicio
Al entrar en un runlevel se ejecutan todos los ficheros del /etc/rcX.d correspondiente
→ los que empiezan por K detienen servicios
→ los que empiezan por S los inicias
→ los scripts se ejecutan por orden alfabético (primero K y después S)
Todos los ficheros son enlaces a los scripts reales, que están en el directorio /etc/init.d
→estos script admiten, al menos, uno d elos siguientes parámetros:
→start: inicia el servicio
→stop: para el servicio

Si queremos iniciar un nuevo servicio en un determinado runlevel:
→ colocar el script de inicio en /etc/init.d
→ hacer un enlace de nombre SxyServicio en el runlevel
→ tener en cuenta posibles dependencias con otros servicios
→ hacer un enlace de nombre tipo K en el runlevel en que se quiera pararlo
→ un buen número de secuencia es 100-xy (el orden de matar los procesos inverso debe ser al de iniciarlos)
→ existen programas que nos facilitan la labor:
→ upadte-rc.d: crea y borra enlaces a los scripts init
→ sysv-rc-conf: GUI para consola
→ ksysv: entorno gŕafico para KDE



Terminales:
Despues de ejecutar los cripts de inicio, init crea un confjunto de terminales virtuales, siguiendo lo que se indica en /etc/inittab
.......
# Lanzar las terminales para el login de los usuarios
# Notar que el la mayor ́a de los sistemas tty7 es usado por X Window, . . .
# así, para añadir mas getty’s se debe saltar tty7
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

→ en esta configuración, los runlevels 2 y 3 arrancan 6 terminales y los 4 y 5 sólo 1.
→ podemos cambiar de tty con CTRL-ALT-F[1-6]
→ el tty7 se utiliza para pasar al entorno de ventanas
→ los terminales se lanzan con spawn para que se vuelvan a crear cuando salimos de la sesión.
En este momento se puede acceder al sistema:
→ al iniciar la sesión en un terminal
→el proceso tty se convierte en un proceso login que chequea usuario y contraseña
→ si se accede con éxito, el proceso login se convierte en un shell
→ al salir de la sesión
→ el proceso bash muere
→ init relanza (respawn) un nuevo tty



Gestores de arranque:

LILO:
LILO(LInux LOader): sistema de arranque muy extendido
• no depende de un sistema de ficheros específico no sabe leer sistemas de ficheros: sólo entiende localizaciones físicas dentro del disco.
• puede arrancar núcleos de Linux desde diskettes y discos duros
• permite arrancar Linux y otros sistemas operativos instalados en el sistema
PC/MS-DOS, DR DOS, OS/2, Windows 9*/NT/XP, 386 BSD, SCO UNIX, Unixware,. . .
• permite pasar parámetros a cada kernel

Estructura de LILO
• El bootloader propiamente dicho reside normalmente en /boot/boot.b
y se divide en dos partes:
Primera etapa: de pequeño tamaño para que quepa en un sector de arranque, localiza y carga la segunda etapa.
Segunda etapa: de mayor tamaño, con el resto de la lógica, se carga directamente desde el fichero.
• La primera etapa se puede guardar en varios sitios, dependiendo del sistema y del modo de arranque preferido:
en el MBR.
en el sector de arranque de una partición o de un disco flexible
• Los datos que necesita el bootloader para arrancar el sistema
se encuentran el fichero map, generalmente en /boot/map

Configuración de LILO
• La configuraci ́n se encuentra generalmente en el archivo /etc/lilo.conf
• cada vez que modifiquemos este archivo es necesario ejecutar el comando /sbin/lilo
Lee el fichero de configuración, construye el map, lee las
posiciones de los ficheros que necesita leer y escribe la
primera etapa del bootloader en su lugar

Problemas:
• LILO depende de las funciones de la BIOS para acceder al disco
• Si la BIOS no soporta el acceso a discos grandes (anteriores a 1998), la segunda etapa y todos los dem ́s ficheros que se usen, deberán estar en sectores dentro de los 1024 primeros cilindros del disco.
• LILO debe saber la posici ́n física en disco de los ficheros que carga: si esta posición cambia y LILO no se reinstala,el arranque fallará

Ejemplo de fichero /etc/lilo.conf
# Opciones globales
lba32
boot=/dev/hda
install=/boot/boot.b
map=/boot/map
prompt
timeout=50
default=linux
# im ́genes del kernel:
a
image=/boot/vmlinuz--2.4.27-2-386
label="Linux 2.4.24"
root=/dev/hda2
initrd=/boot/initrd.img-2.4.27-2-386
read-only
image=/boot/vmlinuz-2.4.20-3-686
label="Linux 2.4.20"
root=/dev/hda2
initrd=/boot/initrd.img-2.4.27-2-386
append="single"
# otros sistemas operativos:
other=/dev/hda1
label="Windows"
table=/dev/hda

Opciones globales:
• lba32 permite acceso a discos de más de 8 GB
• boot=/dev/hda dispositivo o partición donde se instala LILO
• install=bootloader indica el bootloader a usar, modo texto (boot-text.b), modo men ́ (boot.b) o modo gráfico (boot-bmp.b)
• map=map-file posición del fichero map
• prompt hace que se muestre el prompt
• timeout=50 si no se recibe una entrada del usuario en 5 segundos arranca la imagen predeterminada
• default=linux la imagen predeterminada que será cargada

Opciones para las imágenes
• image=/boot/vmlinuz... indica el fichero del kernel a cargar
• label=... nombre como aparece en el menú
• root=/dev/hda2 dispositivo que tiene la partición raiz
• initrd=/boot/initrd... archivo que contiene la imagen que será cargada en el disco RAM inicial
• append=... añade la línea especificada a los parámetros iniciales del kernel
• read-only cuando se arranca la imagen del kernel se montara el filesystem raiz de sólo lectura, para que pueda ser chequeado por fsck
• other=... permite indicar otros SO
• table=/dev/hda indica donde está la tabla de particiones de este SO


GRUB:
GRUB(GRand Unified Bootloader) es un sistema de arranque más potente que el anterior.
• desarrollado dentro del proyecto GNU
• es el preferido en muchas de las distribuciones actuales de
Linux
• diseñado para unificar el arranque entre los SO para x86
→implementa el estándar Multiboot, que permite cargar varias imágenes de arranque, necesarias para cargar kernels modulares(GNU Hurd)
• a diferencia de LILO, GRUB entiende los sistemas de ficheros
en tiempo de arranque.
→ no es necesario conocer posiciones físicas a priori
→ no es necesario ejecutar ningún programa cada vez que se cambia la configuración: sólo cuando se instala o actualiza GRUB
• Detecta automáticamente si el direccionamiento LBA está soportado por la BIOS
• Permite arrancar un kernel desde la línea de comandos del arranque sin configuración previa

Arranque con GRUB
• el arranque pasa por varias etapas:
→ en la etapa 1 se lee el MBR, que se encarga de pasar a las etapas siguientes
→ en la etapa 2 se accede al filesystem y se lee el fichero de configuración
• el fichero de configuració́n es, normalmente, /boot/grub/menu.lst
• a diferencia de LILO, si se modifica el fichero de configuración no es necesario reinstalar el MBR

Un ejemplo de /boot/grub/menu.lst
timeout 10
default 0
# Men ́ para arrancar Linux
u
title Debian GNU/Linux, kernel 2.4.27-2-386
root (hd0,1)
kernel /vmlinuz-2.4.27-2-386 root=/dev/hda3 ro
initrd /initrd.img-2.4.27-2-386
savedefault
boot
# Men ́ para arrancar Linux en modo monousuario
u
title Debian GNU/Linux, kernel 2.4.27-2-386
root (hd0,1)
kernel /vmlinuz-2.4.27-2-386 root=/dev/hda3 ro single
initrd /initrd.img-2.4.27-2-386
savedefault
boot
# Men ́ para arrancar Windows
u
title Windows
rootnoverify (hd0,0)
makeactive
chainloader +1

Opciones generales
• timeout 10 espera 10 segundos para arrancar
• default 0 arranca la primera de las imágenes
→ si default saved arranca la última imagen salvada con savedefault
Opciones para la imágenes
• title título que aparece en el menú
• root (hd0,1)
indica que el kernel está en la segunda partición de hda
• kernel /vmlinuz...root=/dev/hda3 ...
indica el fichero del kernel y donde se encuentra el directorio raiz
→ si boot se encontrara en la misma partición que raíz (hda3) habría que poner
root (hd0,2)
kernel /boot/vmlinuz...root=/dev/hda3...

• savedefault usado con default save; salva esta entrada como entrada por defecto para el próximo arranque
• boot arranca la imagen cargada (puede no ponerse)
• rootnoverify arranca desde la partición pero no intentes montarla
• makeactive pon la partición como activa (para poder arrancar desde ella)
• chainloader +1 encadena con el cargador de Windows

Reinstalar GRUB
• podemos usar grub-install para reinstalar un GRUB estropeado
• Formato:
grub-install [opciones] dispositivo
• Ejemplo: instala GRUB en /dev/hda
# grub-install /dev/hda
• Opciones:
--root-directory DIR instala GRUB en DIR/boot en vez de en /boot

Paso de parámetros al kernel
Al iniciar LILO o GRUB es posible pasar parámetros al kernel
• o bien indicandolos directamente en el menú inicial,
• o añadiendolos en lilo.conf o menu.lst
Alguno de estos parámetros son:
init=comando → haz que el comando inicial sea comando en vez de init
root=device → cambia el dispositivo del filesystem raíz
mem=valor → indica al kernel la memoria del sistema
ro/rw → monta el filesystem raíz de sólo lectura/escritura
single → inicia en modo monousuario
acpi = [on | off] → activa/desactiva el soporte ACPI


Apagado del sistema:
El apagado del sistema debría implicar los siguientes pasos:
1.envío de avisos a los posibles usuarios conectados
2. enviar una señal de TERM para terminar los procesos (si no terminan enviar kill)
3. pasar a modo monusuario
4. realizar un sync para vaciar los buffers al disco
El comando shutdown realiza todos estos pasos

Formas de apagar el sistema:
→enviar una señal TERM a init
→ no siempre funciona
→ conveniente hacer varios sync antes
→cambiar al runlevel 0 (apagar) o 6(reiniciar)
→usar el comando shutdown
→forma más recomendable
→ usar otros comandos como halt, reboot o poweroff

Sistemas de ficheros con LVM

Ventajas de LVM:
→LVM proporciona mucha más flexibilidad a la hora de distribuir el espacio disponible.
→LVM permite mover y cambiar de tamaño los volúmenes creados bajo su control
→Es posible aumentar y decrecer los volúmenes en caliente: esto permite redistribuir el espacio en las particiones según nos sea necesario;también se puede dejar espacio sin asignar e ir asignándolo según vaya siendo necesario.
→Es posible añadir espacio de almacenamiento al sistema de volúmenes: si se añade un nuevo disco a la máquina se puede añadir este espacio a LVM y hacer crecer los volúmenes que contiene para aprovechar el nuevo espacio de almacenamiento.

Manejo de volúmenes físicos y grupos de volúmenes:
→ Creación de unm volumen físico (PV), sobre una partición tipo Linux LVM (8e)
#pvcreate /dev/hdc1
→ Crear un grupo de volúmenes (VG), de nombre NuevoGrupo a partir de dos PVs
#vgcreate NuevoGrupo /dev/hda2 /dev/hdc1
→ Activar un grupo de volúmenes: es necesario hacer esto antes de usarlo, pero normalmente el sistema lo hace por nosotros en el arranque
#vgchange -a y NuevoGrupo
→ Borrar un VG (es necesario desactivarlo antes)
#vgchange -a n NuevoGrupo
#vgremove NuevoGrupo
→ Añadir el PV /dev/hdc1 a un VG ya creado
#vgextend GrupoVolumen /dev/hdc1
→ Quitar PVs de un VG
#vgreduce NuevoGrupo /dev/hda2

Trabajar con volúmenes lógicos:
→ Crear un volumen lógico (LV) de nombre testlv en el VG NuevoGrupo con un tamaño de 4.20 GB
#lvcreate -L4.20G -n testlv NuevoGrupo
→ Crear un volumen lógico con nombre otrotestlv, con 2 stripes (número de volúmentes físicos entre los que se reparte el LV)
#lvcreate -i2 -L1G -n otrotestlv vg
→ Destruir un volumen lógico (hay que desmontarlo antes)
#umount /dev/NuevoGrupo/otrotestlv
#lvremove /dev/NuevoGrupo/otrotestlv
→ Agrandar un LV; se puede especificar el nuevo tamaño en bytes (-L) o LEs (-l), o la diferencia (para aprovecharlo es necesario alargar el sistema de ficheros que contiene)
# lvextend -L12G /dev/GrupoVolumen/homelv
# lvextend -L+1G /dev/GrupoVolumen/tmplv
# lvextend -l+200 /dev/GrupoVolumen/tmplv
→ Reducir un LV: lvreduce funciona igual que el lvextend
→ Información acerca de un grupo de volúmenes
#vgdisplay GrupoVolumen
→ Información acerca de un volumen lógico
#lvdisplay /dev/GrupoVolumen/homelv
→ Información acerca de un volumen físico
#pvdisplay /dev/hda2

Una vez creados los volúmenes lógicos sólo resta crear los sistemas de ficheros y montarlos.
→ Se hace de la forma habitual (mkfs,mount)
# mkfs.ext3 /dev/GrupoVolumen/homelv
# mount -t ext3 /dev/GrupoVolumen/homelv /home
→ La forma de hacerlo depende de cada filesystem particular
para ext2/ext3 varios comandos:
→resize2fs (en Debian, paquete e2fsprogs): permite alargar o encoger un filesystem ext2/ext35.
→ext2resize (en Debian, paquete ext2resize): programa de GNU para alargar o encoger un filesystem ext2/ext3 que no esté montado.
→ext2online (en Debian, paquete ext2resize): programa de GNU para alargar o encoger un filesystem ext2/ext3 que puede estar montado y siendo usado.
para ReiserFS comando resize_reiserfs o resizefs.reiserfs
para XFS se usa xfs_growfs
para JFS como en XFS el filesystem debe montarse que sea extensible; se especifcia el tamaño en el proceso de remontado:
#mount -o remount,resize=1048567 /home

Particiones y sistemas de ficheros

→ Si añadimos un nuevo disco al sistema ya instalado deberemos crear las particiones y los sistemas de ficheros
→ Esta operación implica los siguientes pasos:
1. creacion de particiones (comando fdisk)
2. creación de los sistemas de ficheros (comando mkfs)
3. montado de los sistemas de ficheros (comando mount)



Creación de particiones: se usa el comando fdisk
Formato: fdisk [opciones] dispositivo
Debemos tener permiso de administrador para usarlo
Opciones:
-l: muestra la tabla de particiones del dispositivo
fdisk se usa mediante un menú:
Para crear una partición primaria de 5GB usamos n(new), despues elegimos si es extendida (e) o primaria (p). Por defecto, se cra la partición tipo Linux (Id 83)
→con l (list) vemos el tipo de particiones soportadas
→para cambiar el tipo de partición se usa t (type)

Otras herramientas:
cfdisk → interfaz para el fdisk(tambié escribe la tabla de particiones)
parted → programa de GNU que permite crear, destruir, cambiar el tamaño chequear y copiar particiones
qtparted → clónico del Partition Magic para Linux (basado en libparted)
Partition Magic → programa comercial de la compañía Symantec que puede manejar diversos filesystems


Creación de los sistemas de ficheros: sobre cada partición debemos crear sistemas de ficheros con el comando mkfs.
Formato: mkfs [-V] [-t filesystem] dispositivo [n_bloques]
Opciones:
-V → verbose
-t → filesystem tipo de sistema de ficheros a crear (ext2,ext3,xfs,etc..)
n_bloques → número de bloques usados para el sistema de ficheros (si no se pone, se usa toda la partición)

mkfs es un front-end a distintos comandos, que permiten crear particiones de los tipos específicos:
→ mkfs.ext2 o mke2fs crea sistemas ext2
→ mkfs.ext3 crea sistemas ext3, equivalente a mkfs.ext2 -j
→ mkfs.jfs, mkfs.reiserfs, mkfs.xfs crean sistemas JFS, ReiserFS y XFS, respectivamente.
→ mkfs.msdos, mkfs.vfat crea sistemas MS-DOS
→ mkswap crea un sistema de ficheros de tipo Linux swap

Comandos relacionados:
dumpe2fs → muestra información de sistemas de ficheros ext2/ext3, información sobre inodos, bloques y grupos.
tune2fs → permite ajustar parámetros en sistemas ext2/ext3, por ejemplo define el intervalo entre chequeos automáticos, convierte ext2 en ext3, etc.
e2label → cambia la etiqueta de un sistema ext2/ext3


Partición de intercambio:
→ Si lo que creamos es un partición de intercambio, la debemos inicializar con mkswap.
→ Una vez creada debemos activarla con swapon.
→ Finalmente para que se active en el arranque, debe inlcuirse la entrada correspondiente en el fichero /etc/fstab:
/dev/hda2 none swap sw 0 0


Montado de los sistemas de ficheros:
Comando mount: Permite asociar directorios a sistemas de ficheros
Ejemplo: mount -t ext3 /dev/hdb1 /home2
Formato: mount [opciones] [-t tipo] [disp.] [dir.]
Algunas opciones:
tipo→tipo de sistema de ficheros; si se pone auto intenta determinar de forma automática
-a → monta los filesystems listados en /etc/fstab
-r/-w → monta los sistemas de sólo lectura/escritura
-f → simulación; usado con -v(verbose) para chequear
-n → monta sin añadir la entrada a /etc/mtab; se usa cuando /etc es sólo lectura
-o opciones → opciones de montado; formato igual al usado en el fichero fstab

Comando umount : Desmonta los sistemas de ficheros
Formato: umount [opciones] directorio
Ejemplo: umount /home2
Algunas opciones:
-a → desmonta los filesystems listados en /etc/mtab
-r → si falla, intenta remontar sólo lectura
-f → fuerza al desmontado
Si hay algún proceso bloqueando el filesystem, este no se puede desmontar:
→ usar el comando fuser -c directorio para ver el PID del proceso

Fichero /etc/fstab : Al inicar el sistema se montan los filesystems listados en /etc/fstab:
Cada línea del fichero tiene las siguientes columnas:
(file system) (mount point) (tipo) (opciones) (dump) (pass)
Ejemplo:
/dev/hda9 /home ext3 defaults 0 2
Alguna de las opciones son:
rw → monta tipo lectura/escritura
ro → sólo lectura
auto/noauto → monta /no monta con mount -a (monta/no monta al inicio)
exec/noexec → Permite/no permite la ejecución de ficheros binarios en la partición.
suid/nosuid → permite/no permite la ejecución de ficheros binarios en la partición
dev/nodev → interpreta/no interpreta dispositivos de bloques o caracters en el filesystem
async → toda la I/O se realiza de forma asíncrona
user → puede montarlo un usuario (y sólo el que lo monta puede desmontarlo); implica las opciones noexec, nosuid y nodev, a menos que se fuercen (p.e user,exec, suid,dev).
users → puede montar/desmontarlo un usuario y el que desmonta no tiene que ser el que lo montó; implica las mismas opciones que user
defaults → selecciona opciones por defecto (rw,suid,dev,exec,auto,nouser y async)

Si un directorio aparece listado en el fstab puede montarse sin especificar el dispositivo: $mount /home

Campos dump y pass:
dump → lo usa el comando dump para determinar de que filesystems hacer copias de seguridad
→ valor 1 o 0 según si la partición va a tener un backup controlado por dump o no (normalmente no se usa)
pass → lo usa el comando fsck para determinar el orden en que se chquean los filesystems al inicar el sistema
→si 0, el filesystem no se chequea
→si > 0, los filesystems se chequean en el orden indicado por los números.


Fichero /etc/mtab : contiene una lista de los filesystems que están montados en el sistema.


Autofs : Sistema que permite montar los filesystems "bajo demanda"
→ cuando se accede al directorio, este se monta
→ se desmonta automáticamente después de un tiempo de inactividad
→ suele usarse para montar sistemas remotos con NFS
→ Ficheros de configuración
→/etc/auto.master define los puntos de montado
→por cada uno de los puntos definidos, se inicia un proceso automount usando los parámetros indicados
→ Ejemplo de auto.master:
/home /etc/auto.home
/misc /etc/auto.misc --timeout 60
→Los ficheros le indican al utomount los filesystems a montar
→Ejemplo de auto.misc
cdrom -fstype=iso9660,ro :/dev/cdrom
floppy -fstype=auto :/dev/fd0
windoz -fstype=vfat :/dev/hda1
→esto monta el cdrom, el floppy y la partción /dev/hda1 en los directorios /misc/cdrom, /misc/floppy y /misc/windoz respectivamente.


Supermount : tipo de pseudofilesystem que para manejar dispositivos removibles:
→el filesystem se monta/desmonta automáticamente cuando se introduce/saca el CD o disquete
→ la línea correspondiente en el fstab debe ser del tipo:
none /mnt/cdrom supermount dev=/dev/cdrom,fs=auto 0 0
→ se incluye "de serie" en algunas distribuciones


pmount : comando que permite al usuario montar dispositivos hotpluggable
→ el dispositivo se monta debajo del directorio /media
→ no necesita estar listado en /etc/fstab
→ puede usar HAL para obtener información de los dispositivos


gnome-volume-manager : En el entorno GNOME monta automáticamente dispositivos removibles cuando se conectan o se inserta un CD
→ usa udev y HAL
→ el usuario puede configurar la acción realizada al conectarse el dispositvo



Chequeo del sistema de ficheros
→ el comando básico para chequeo y reparación es fsck
Es un front-end a otros comandos:
→ e2fsck, fsck.ext2 o fsck.ext3 chequean sistemas ext2/ext3
→ fsck.msdos, fsck.vfat para sistemas MS-DOS
Algunas de las opciones de fsck son:
-t filesystem → tipo de filesystem a chequear
-A → chequea los filesystem listados en /etc/fstab
-N → no ejecuta; simplemente indica lo que haría
-R → usado con -A no chequea al filesystem raíz


Otras utilidades:
du → muestra el espacio de disco usado por los ficheros y subdirectorios de un directorio.
→ Formato: du [opciones] [directorio]
→ Algunas opciones:
∗ -a muestra valores para ficheros y directorios (por defecto, solo muestra directorios)
∗ -b, -k tamaños en bytes/KBytes
∗ -h salida más legible
∗ -s muestra sólo la ocupación total

df → muestra el espacio de disco usado y disponible de los sistemas de ficheros montados
→Formato: df [opciones]
→Algunas opciones:
∗ -a muestra todos los filesystems (incluso los de tamaño 0)
∗ -h salida más legible
∗ -i da información sobre los inodos
∗ -l sólo muestra filesystems locales
∗ -T muestra el tipo de sistema de ficheros

Localización de ficheros

Comando find: Busca a través de la jerarquía de directorios ficheros que cumplan determinado criterio.
→Formato: find [directorio_de_búsqueda] [expresión]
→Ejemplo:
→Busca desde /etc los ficheros de tipo socket: find /etc -type s
→Busca desde /etc y /usr/share los ficheros que se llamen magic o passwd: find /etc /usr/share -name magic -o -name passwd
→Muestra desde el directorio actual todos los ficheros de forma recursiva: find

La expresión tiene los siguietnes componentes:
→opciones: modifican la forma de operación de find
→ criterio de búsqueda
→ acciones: especifica que hacer con los ficheros que encuentra
→ operadores: permiten agrupar expresiones

Opciones de find (normalmente se colocan al principio de la expresión)
-maxdepth n → desciende como máximo n directorios
-mindepth n → empieza a buscar a partir del nivel n
-depth → procesa el contenido del directorio antes que el propio directorio
-daystart → para medidas con tiempo, empieza desde el principio del día actual
-mount o -xdev → no pasa a otras particiones
-name patrón → busca ficheros que coincidad con el patrón
-wholename → permite incluir nombres con el path
-iname →igual que name pero no distingue mayúsculas / minúsculas
-regex → igual pero usa REGEXPR
-type tipo → busca por tipo de fichero (b,c,d,p,l,s,f)
-size [+/-]n[bck] → busca por tamaño (tamaño igual, mayor o menor que n con b=bloques, c=bytes y k=KB)
-perm [+/-]permisos → busca por permisos(sin nada, permisos exactos, - todos los permisos y + alguno de los permisos)
-user nombre → busca por propietarios
-uid n, -gid n → busca por UID/GID
-nouser, -nogroup → busca ficheros con prop./grupo no válidos
-atime [+/-] n → busca ficheros cuya fecha de acceso para lectura coincide con, es anterior a (+) o es posterior a (-) n días
-mtime [+/-] → lo mismo, pero con la fecha de última modificación del fichero
-ctime [+/-] n → lo mismo, pero con la fecha en que se cambió el estado del fichero
-amin/-mmin/-cmin[+/-]n → lo mismo, pero ahora n representa minutos
-newer file → busca ficheros modificados más recientemente que file
-anewer file → ficheros con último acceso más reciente que la modificaicón de file
-cnewer file → ficheros con cambio de estado más reciente que la modificación de file

Acciones de find:
-print → imprime el nombre de los ficheros que encuentra (acción por defecto)
-ls → imprime el nombre de los ficheros con formato de listado largo
-exec comando \{\} \; → ejecuta comando sobre los ficheros encontrados
-ok comando \{\} \; → igual que -exec pero pregunta antes de ejecutar comando
-prune → si directorio no desciende por el (permite ignorar directorios)
**los caracteres {} se refieren al fichero que find acaba de encontrar y ; indica el fin del comando

Operadores de find:
expr1 -a expr2 → AND (expr2 no se evalúa si expr1 es falsa)
expr1 expr2 → igual que -a
expr1 -o expr2 → OR (expr2 no se evalúa si expr1 es cierta)
! expr1 → NOT (cierto si expr falsa)
( expr1 ) → agrupan expresiones (hay que espcapar los paréntisis con \)



Comando wich: muestra la localización de comandos
Formato: which [-a] comando
Opciones: -a muestra las localizaciones del comando


Comando whereis: muestra la localización del binario, fuente y página de manual de un comando
Formato: whereis [opciones] comando
Opciones: -b/-m/-s muestra sólo el binario/manual/fuente



Comando locate: localiza ficheros rapidamente
→ utiliza una base de datos donde guarda la localización de los ficheros (/var/cache/locate/locatedb)
→ esa base de datos la crea y actualiza el administrador con el comando updatedb

Enlaces

Hay dos tipos de enlaces:
Duros, asignan otro nombre al fichero
→ crean una entrada en el directorio apuntando al misom nodo-i que el fichero original.
→ el fichero no se borra hasta que se borran todos su enlaces duros
→ no se puede enlazar con ficheros de otra partición

Blando, un fichero que apunta al original:
→ si el fichero se borra, el enlace permanece sin apuntar a nada
→ no tienen problemas con la particiones

Comando ln:
Permite crear enlaces.
Formato:
→ln [-s] [opciones] destino [enlace]
→ln [-s] [opciones] destino1 destino 2 ... [directorio]
con -s se crean enlaces blandos
si no se pone nombre del enlace se usa el del destino

Atributos de un fichero y permisos

Podemos ver los atributos de un fichero con ls -l


Indicador de tipo:
- fichero normal
d directorio
l enlace simbólico
c fichero de dispositivo de caracteres
b fichero de dispositivo de bloques
p tubería
s socket

Número de enlaces: indica el número de nombres (enlaces duros) del fichero
→ en el caso de un directorio, esto corresponde con el número de subdirectorios (incluidos . y ..)

Tamaño es el tamño en bytes
→ con ls -lh se ve el tamño de forma más legible
→ el tamaño máximo de un fichero depende del filesystem usado

Fecha especifica la fecha de última modificación del fichero
→ podemos actualizarla con el comando touch

Nombre la longitud máxima del nombre es de 255 caracteres
→ evitar el uso de espacios y caracteres especiales


Permisos de ficheros y directorios:
Hay tres operaciones básicas: lectura(r), escritura(w), ejecución(x)
Efecto sobre un fichero:
→lectura(r): permite abrir y leer el fichero
→escritura(w): permite modificar o truncar el fichero(para borrarlo, basta con que el directorio tenga prmiso de escritura)
→ejecución(x): permite ejecutar el fichero (binario o script)

Efecto sobre directorios:
→ejecucion(x): permite entrar en el directorios(pero no listar su contenido, ni crar ficheros o directorios)
→lectura y ejecución(rx): permite listar el contenido del directorio (pero no crear ficheros o directorios)
→escritura y ejecución (wx): permite crear, borrar o renombrar ficheros (pero no listar su contenido)
→acceso total(rwx)

Los permisos se aplican en tres categorías:
→Permisos de usuario(u): asociados al propietario del fichero(por defecto, el usuario que lo creo)
→Permisos de grupo (g): usuarios del grupo del propietario
→Permisos de otros(o): resto de usuairos

Cada usuario cae en uno solo de estas categorías:
→p.e. al propietario se le aplican los permisos de usuario, aunque sean más restrictivos que los del grupo.


Cambio de permisos:

El comando para modificar los permisos es chmod
→ Formato: chmod [-R] operación ficheros.
→ -R indica acceso recursivo.
→ solo el propietario del fichero (o root) puede cambiar los permisos.
operación indica como cambiar los permisos, y puede especificarse mediante símbolos o números:
→ Permisos simbólicos: formato → quien op permisos
→quien especificado por u, g, o y a para todos
→op puede ser + para añadir permisos, - para quitar o = para establecer
→permisos especificados por r,w,x

Permisos especiales:
Además de rwx existen los permisos setuid/setgid(s) y sticky bit (t)

→setuid y setgid están relacionados con los atributos de los procesos:
→cuando un proceso se crea se le asigna un UID/GID real y un UID/GID efectivo.
→UID/GID real: identificadores de usuario y grupo del usuario que lanzó el proceso(y que puede matarlo)
→UID/GID efectivos: determinan las operaciones que el proceso puede hacer sobre los objetos del sistema
→ por ejemplo, un proceso con UID efectivo 0 (root) puede manipular todos los ficheros del sistema.
→lo normal es que los UID/GID normal y efectivo de un proceso coincidan

Los permisos setuid/setgid permiten que un proceso lanzado por un suuairo se ejecute con EUDI/EGID de otro usuario.
Para fijar setuid/setguid:
→chmod u+s fija setuid
→chmod g+s fija setgid
De forma numérica:
→ 4000 setuid, 2000 setgid


sticky bit (solo se usa en directorios):
Permite crear ficheros en el directorio (si tiene permiso de escritura), pero solo los puede borrar:
→el propietario del fichero
→el propietario del directorio
→el superusuario
Para activar el sticky bit:
→ chmod +t dir
→ chmod 1xxx dir


Permisos por defecto:
Cuando se crea un fichero se cambian los permisos por defecto:
→estos permisos pueden modificarse con umask: umask [opciones] valor.
donde valor son tres dígitos que especifican los permisos para u, g, o según la tabla:
Octal Permisos Octal Permisos
0 rwx 4 -wx
1 rw- 5 -w-
2 r-x 6 --x
3 r-- 7 ---
→Opciones:
-S muestra los permisos por defecto


Cambio de usuario/grupo:
Los comandos chown y chgrp permiten cambiar el propietario y el grupo de un fichero.
sólo root puede cambiar el propietario
el grupo puede cambiarse a otro al que pertenezcamos
Formato:
→chown [opciones] propietario ficheros
→chgrp [opciones] grupo ficheros
→chown [opciones] propietario:grupo ficheros
Algunas opciones:
→ -R recorre recursivamente
→ -v (verbose) indica la operaciones que realiza

Análisis básico del rendimiento del sistema

uptime:
Muestra la hora actual, el tiempo que el sistema lleva encendido, el número de usuarios conectados y la carga media del sistema para los últimos 1, 5 y 15 minutos.

w:
además de la información dada por uptime, el comando w meustra información sobre los usuarios y sus procesos.
Definiciones:
LOGIN@: la hora a la que se conectó el usuario.
IDLE: timepo que lleva ocioso el terminal
JCPU el tiempo de CPU consumido por los procesos que se ejecutan en el TTY
PCPU: tiempo consumido por el procesos actual (columna WHAT)

free:
Muestra la cantidad de memoria libre y usada en el sistema, tanto
para la memoria f ́ ısica como para el swap, así como los buffers
usados por el kernel (similar a lo mostrado en la cabecera de top).
Opciones:
-b,-k,-m,-g memoria en bytes/KBytes/MBytes/GBytes.
-t muestra una línea con el total de memoria (física + swap)
-s delay muestra la memoria de forma continua, cada delay segundos.


Herramientas Gráficas:
gnome-system-monitor: visor de procesos y monitorizador de recursos del sistema de GNOME
KDE System Guard (ksysguard): gestor de tareas y monitor de rendimiento de KDE.


El directorio /proc
se inicializa durante el arranque
está implementado en memoria y nose guarda en disco
la estructura del directorio /proc depende de la versión del kernel
los comandos como ps,toc,etc obtienen la información de este directorio.
Distintos ficheros de /proc son:
cpuinfo: información estática de la CPU
meminfo: información de uso de la memoria
partitions: información sobre las particiones
filesystems: sitemas de ficheros soprotados por el kernel
version: versión y fecha del kernel
bus/: directorio con información de los buses PCI y USB
cmdline: línea de arranque del kernel
devices: dispositivos del sistema de caracteres o bloques
ide/: directorio con información del bus IDE
modules: módulos del kernel
net/: directorio con información de red

Además existe un directorio por cada processo, que se identifica con el PID del proceso, en qel que se puede encontrar información sobre cada proceso, incluidos:
→ el directorio desde que se invoco el proceso (cwd)
→ nombre del ejecutable (exe) y la línea de comandos con la que fue invocado (cmdline)
→ entorno en que se ejecuta el proceso (environ)
→ estado del proceso (status)
→ descriptores de ficheros abiertos y archivos o rpocesos relacionados(fd)
→ mapa de memoria (maps)

Manejo de prioridad y recursos de un proceso

Las prioridades van desde -20(prioridad más alta) hasta 19 (prioridad más baja).

Por defecto, los procesos se ejecutan con prioridad 0.
-Un usuario normal solo puede asignar prioridades más bajas(números positivos)
-root puede asignar prioridades más altas (números negativos).

Los comandos para manejo de prioridades son nice y renice:

nice:
Permite lanzar un comando con una cierta prioridad.
Sintaxis: nice -n ajuste comando.

renice:
Permite cambiar la prioridad de un proceso en ejecución.
Sintaxis: renice pri [-p pid] [-g pgrp] [-u user]


En cuanto a recursos:
El comando interno de bash ulimit permite controlar los recursos de los que dispone un procesos arrancado por el shell.
Sintaxis: ulimit [opciones] [limite]
Algunas opciones:
-a muestra los límites actuales
-f máximo tamaño de los fichero creados por el shell
-n máximo número de fichero abiertos
-s máixmo tamaño de la pila
-t máximo tiempo de cpu
-S/ -H usa los límites soft y hard
→ el usuario puede incrementar su límite blando, pero sin superar el límite duro.
→ estos límites pueden ser fijados en el /etc/profile, /etc/bash.bashrc

Para más información: help ulimit

Ejemplo, limitar el tamaño d elos ficheros creados a 1kbyte: ulimit -f 1

Comando kill y señales

Con kill enviamos señales a los procesos.

kill -l → lista el conjunto de señales
man 7 signal → significado de cada señal

Sintaxis de kill:
kill [señal] PID
Donde señal puede indicarse mediante su nombre o identificador numérico.

Señales más comunes:
SIHUP(1): cuelgue del terminal o muerte del proceso controlador.
SIGKILL(9): mata el proceso sin permitirle terminar.
SIGSTOP(19): para el proceso.
SIGCONT(18): continúa si parado.
SIGINT (2): interrupción de teclado (Ctrl-C)
SIGTSTP (20): stop de teclado (Ctrl-Z)
SIGQUIT (3): salida de teclado (Ctrl-\)

Las señales KILL (9) y STOP (19) no pueden ignorarse.

En bash, cuando enviamos una se ̃al SIGHUP a un shell, este
se lo reenvñia a todos sus hijos.

La mayoría de los demonios (daemons) responden a la señal SIGHUP volviendo a leer sus ficheros de configuración:
-en vez de matar y reiniciar un demonio podemos hacer
un kill -HUP para reiniciarlo.

Comando top

top nos da una lista actualizada a intervalos.

En la cabecera se muestra un resumen del sistema:
-hora actual, tiempo que lleva encendido el sistema, numero de usuarios conectados, y carga media del sistema para los últimos 1,5 y 15 minutos
-número total de tareas y resumen por estado
-estado de ocupación de la CPU y memoria

Por defecto los procesos se muestran ordenados por porcentaje de uso de CPU

Si pulsamos h, tenemos todos los parámetros disponibles
Si pulsamos q, salimos


Algunos Campos de top:
VIRT: Tamaño total del proceso. VIRT=SWAP+RES
SWAP: Memoria que aun no ha sido cargada
RES: Memoria residente
CODE y DATA: Memoria ocupada por el código y datos del procesos
SHR: Memoria compartida.
P: Última CPU usada(CMP).
nFLT: Número de fallos de página para el proceso

Comando ps

Opciones de ps: ps tiene un gran número d eopciones, que se pueden especificar de 3 maneras:
-Opciones de UNIX, se pueden agrupar y se preceden por un guión: ps -ef
-Opciones de BSD, se pueden agrupar y van sin guión: ps uxa
-Opcionas largas GNU, van precedidas de dos guiones: ps --user usuario

Opciones de ps:

-e o ax: muestra todos los procesos.
-u (o U o --user) usuario: muestra los procesos de un usuario
u: salida en formato usuario
j: salida en formato job (PID,PPID,etc..)
-f o l: salida en formato largo
f: muestra un árbol con la jerarquía de procesos
k (o --sort) campo: ordena la salida por algún campo
-o (tambien o, y -- format) formato: permite definir el formato de salida

Ejemplos:

ps axu: %CPU, %MEM son porcentajes de uso de CPU y memoria; VSZ, memoria virtual del proceso; RSS, tamaño de memoria residente.

Códigos de STAT:
D -> Uninterruptible sleep.
R → ejecutándose o en cola de ejecución
S → Interruptible sleep
T → Detenido
Z → Zombie