Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MODULO 1
EXPERTO EN LINUX.
MODULO 1
Breve Historia
El núcleo Linux, desde la primera publicación de su código fuente en 1991, nacido desde un pequeño
número de archivos en lenguaje C bajo una licencia que prohíbe la distribución comercial a su estado
actual de cerca de 296 MiBs de fuente bajo la Licencia pública general de GNU.
En 1983 Richard Stallman inició el ambicioso Proyecto GNU, con el propósito de crear un sistema
operativo similar y compatible con UNIX y los estándares POSIX. Dos años más tarde, 1985, creó la
Fundación del Software Libre (FSF) y desarrolló la Licencia pública general de GNU (GNU GPL), para
tener un marco legal que permitiera difundir libremente el software. De este modo el software de
GNU fue desarrollado muy rápidamente, y por muchas personas. A corto plazo, se desarrolló una
multiplicidad de programas, de modo que a principios de los años 1990 había casi bastante software
disponible como para crear un sistema operativo completo. Sin embargo, todavía le faltaba un
núcleo.
Esto debía ser desarrollado en el proyecto GNU Hurd, pero Hurd demostró desarrollarse muy
inactivamente, porque encontrar y reparar errores (eliminación de fallos, debugging en inglés) era
muy difícil, debido a las características técnicas del diseño del micro núcleo.
Otro proyecto de sistema operativo software libre, en los años 1980 fue BSD. Este fue desarrollado
en la Universidad de Berkeley desde la 6. ª Edición de Unix de AT&T. Puesto que el código de AT&T
Unix estaba contenido en BSD, AT&T presentó una demanda a principios de los años 1990 contra la
Universidad de Berkeley, la cual limitó el desarrollo de BSD y redujo el desarrollo. Así a principios de
los años 1990 no produjo ningún sistema completo libre.
El futuro de BSD era incierto debido al pleito y detuvo el desarrollo. Además, el Proyecto GNU
gradualmente se desarrollaba pero, este carecía de un bien formado núcleo UNIX. Esto dejó un nicho
crítico abierto, que Linux llenaría muy pronto.
Mascota de Linux
En 1991 en Helsinki, Linus Torvalds comenzó un proyecto que más tarde llegó a ser el núcleo Linux.
Esto fue al principio un emulador terminal, al cual Torvalds solía tener acceso en los grandes
Como Torvalds escribió en su libro "Solamente por diversión"), él tarde o temprano comprendió que
había escrito un núcleo de sistema operativo. El 25 de agosto de 1991, anunció este sistema en un
envío a la red Usenet, en el newsgroup (grupo de noticias):
Estoy haciendo un sistema operativo (gratuito) (solamente una afición, no será grande ni profesional como el
GNU) para clones 386(486) AT. Este ha estado gestándose desde abril, y está comenzando a estar listo. Me
gustaría recibir cualquier comentario sobre las cosas que gustan/disgustan en minix, ya que mi SO (Sistema
Operativo) se le parece un poco (la misma disposición física del sistema de archivos, debido a motivos
prácticos, entre otras cosas).
Actualmente he portado bash(1.08) y gcc(1.40), y las cosas parecen funcionar. Esto implica que conseguiré
algo práctico dentro de unos meses, y me gustaría saber qué características quiere la mayoría de la gente.
Cualquier sugerencia es bienvenida, pero no prometeré que las pondré en práctica :-)
PD. Sí – es libre de cualquier código de minix, y tiene un sistema de archivos multi-hilo. NO es portable (usa
386 una conmutación de tarea etc.), y probablemente nunca será soportada por nada más que los discos
duros AT, porque es todo lo que tengo :-(.
Torvalds primero publicó el núcleo Linux bajo su propia licencia, la cual fue casi una licencia de
código fuente compartida (en inglés, share source) y que tenía una restricción contra la actividad
comercial. En 1992, él sugirió cambiar a la GNU GPL. Primero anunció este cambio en las notas de
lanzamiento de la versión 0.12.4, a mediados de diciembre de 1992 él publicó la versión 0.99 usando
la GNU GPL.5
Más tarde, Torvalds dijo en una entrevista, "registrar a Linux bajo la GPL fue definitivamente la mejor
cosa que alguna vez hice".
Actualmente kernel de Linux esta 4.8-rc2 pero la más estable es la versión 4.7.2.
Distribuciones de Linux
A continuación podes encontrar información sobre las distribuciones más importantes de
Linux (aunque no las únicas).
UBUNTU
• http://www.ubuntu.com/
REDHAT ENTERPRISE
• https://www.redhat.com/en
FEDORA
• http://fedora.redhat.com/
DEBIAN
• http://www.debian.org/
OpenSuSE
• https://www.opensuse.org/
• https://www.suse.com/
SLACKWARE
• http://www.slackware.com/
GENTOO
• https://www.gentoo.org/
KUBUNTU
• http://www.kubuntu.com/
MANDRIVA
• http://www.mandrivalinux.org/
Hay distribuciones que son especialmente para un servicio como Centos que es orientado a
servidores y Kali para realizar testeos de penetración.
PRACTICA 0
Cada alumno tiene que averiguar que distribuciones más existen con el kernel Linux y para cuál es
su función.
De la misma manera que el Unix, el Linux se puede dividir generalmente en cuatro componentes
principales: el núcleo (kernel), el shell, el sistema de archivos y las utilidades. El núcleo es el
programa medular que ejecuta programas y gestiona dispositivos de hardware tales como los discos
y las impresoras. El shell proporciona una interfaz para el usuario. Recibe órdenes del usuario y las
envía al núcleo para ser ejecutadas. El sistema de archivos, organiza la forma en que se almacenan
los archivos en dispositivos de almacenamiento tales como los discos. Los archivos están
organizados en directorios. Cada directorio puede contener un número cualquiera de
subdirectorios, cada uno de los cuales puede a su vez, contener otros archivos. El núcleo, el shell y
el sistema de archivos forman en conjunto la estructura básica del sistema operativo. Con estos tres
elementos puede ejecutar programas, gestionar archivos e interactuar con el sistema. Además,
Linux cuenta con unos programas de software llamados utilidades que han pasado a ser
considerados como características estándar del sistema. Las utilidades son programas
especializados, tales como editores, compiladores y programas de comunicaciones, que realizan
operaciones de computación estándar. Incluso uno mismo puede crear sus propias utilidades
Como una alternativa a la interfaz de la línea de órdenes, Linux proporciona una interfaz gráfica de
usuario (GUI) llamada X-Windows que cuenta con varios administradores de ventana que puede
utilizar. Un administrador de ventana trabaja de forma muy parecida a los GUI de Windows y del
Mac, posee ventanas iconos y menús, todos ellos gestionados por medio del ratón. Dos de los
administradores de programas más populares son el Free Virtual Window Manager y el Open Look
Window Managger, además de los administradores de ventanas X-Windows también utiliza un
administrador de archivos y uno de programas.
El sistema de archivos de Linux organiza los archivos en directorios, de forma similar al DOS. Todo
el sistema de archivos de Linux es un gran conjunto interconectado de directorios que están
organizados en una estructura jerárquica de árbol. Linux posee un gran número de utilidades que
se pueden clasificar en tres categorías: editores, filtros y programas de comunicaciones. Y a
diferencia de otros sistemas operativos se distribuye de forma gratuita bajo una licencia pública de
GNU de la Free Software Foundation (Fundación de programas libres) lo que básicamente significa
que puede ser copiado libremente, cambiado y distribuido dejando siempre disponible el código
fuente.
El software de Linux es frecuentemente desarrollado por varios usuarios que deciden trabajar
conjuntamente en un proyecto. Una vez que se ha completado se instala en una localización ftp de
Internet. Cualquier usuario de Linux puede acceder a la localización y descargar el software.
a) EL SHELL
El shell proporciona una interfaz entre el núcleo y el usuario. Se puede describir como un intérprete:
interpreta las órdenes que introduce el usuario y las envía al núcleo. La interfaz del shell es muy
sencilla. Normalmente consiste en un inductor desde el que se teclea una orden y después se pulsa
enter. En cierta forma, se está tecleando una orden en una línea. A menudo, esta línea se conoce
como la línea de órdenes.
Como una alternativa a la interfaz de la línea de órdenes, Linux proporciona una interfaz gráfica de
usuario (GUI) llamada X-Windows, que cuenta con varios administradores de ventanas que puede
utilizar. Dos de los administradores de ventanas más populares son el Free Virtual Window Manager
(fvwm) y el Open Look Window Manager (olwm).
Aunque un administrador de ventanas constituye una interfaz flexible y vistosa, hay que tener
presente que tan solo es un añadido al shell. El administrador de ventanas simplemente le pasa al
shell las órdenes que recibe, éste las interpreta y las envía de nuevo al núcleo, para ser ejecutadas.
A lo largo de los años se han hido desarrollando varios tipos de diferentes de shell. En la actualidad,
hay tres shells principales: Bourne, Korn y C-shell. El shell Bourne fue desarrollado en el Laboratorio
Bell para el sistemaV. El C-shell fue desarrollado para la versión BSD del Unix. El shell Korn es una
mejora y ampliación del shell Bourne. Linux usa versiones mejoradas o de dominio público de estos
shells: el shell Bourne Again, el TC-shell y el shell Korn. Una vez que inicie su sistema Linux, se
encontrará en el shell Bourne Again; donde se podrá acceder a los demás.
b) SISTEMA DE ARCHIVOS
Los directorios están organizados en una estructura jerárquica de árbol, que empieza en un
directorio raíz (root) inicial. Todos los demás directorios se derivan, en última instancia, de este
primer directorio raíz.
c) CARACTERISTICAS
• Multiplataforma: Las plataformas en las que en un principio se puede utilizar Linux son 386-, 486-
. Pentium, Pentium Pro, Pentium II, Amiga y Atari, también existen versiones para su utilización en
otras plataformas, como Alpha, ARM, MIPS, PowerPC y SPARC.
• Multiprocesador: Soporte para sistemas con más de un procesador está disponible para Intel y
SPARC.
• Protección de la memoria entre procesos, de manera que uno de ellos no pueda colgar el sistema.
• Carga de ejecutables por demanda: Linux sólo lee del disco aquellas partes de un programa que
están siendo usadas actualmente.
• Política de copia en escritura para la compartición de páginas entre ejecutables: esto significa que
varios procesos pueden usar la misma zona de memoria para ejecutarse. Cuando alguno intenta
escribir en esa memoria, la página (4Kb de memoria) se copia a otro lugar. Esta política de copia en
escritura tiene dos beneficios: aumenta la velocidad y reduce el uso de memoria.
• Memoria virtual usando paginación (sin intercambio de procesos completos) a disco: A una
partición o un archivo en el sistema de archivos, o ambos, con la posibilidad de añadir más áreas de
• La memoria se gestiona como un recurso unificado para los programas de usuario y para el caché
de disco, de tal forma que toda la memoria libre puede ser usada para caché y ésta puede a su vez
ser reducida cuando se ejecuten grandes programas.
• Todo el código fuente está disponible, incluyendo el núcleo completo y todos los drivers, las
herramientas de desarrollo y todos los programas de usuario; además todo ello se puede distribuir
libremente. Hay algunos programas comerciales que están siendo ofrecidos para Linux actualmente
sin código fuente, pero todo lo que ha sido gratuito sigue siendo gratuito.
• Emulación de 387 en el núcleo, de tal forma que los programas no tengan que hacer su propia
emulación matemática. Cualquier máquina que ejecute Linux parecerá dotada de coprocesador
matemático. Por supuesto, si el ordenador ya tiene una FPU (unidad de coma flotante), esta será
usada en lugar de la emulación, pudiendo incluso compilar tu propio kernel sin la emulación
matemática y conseguir un pequeño ahorro de memoria.
• Soporte para muchos teclados nacionales o adaptados y es bastante fácil añadir nuevos
dinámicamente.
• Consolas virtuales múltiples: varias sesiones de login a través de la consola entre las que se puede
cambiar con las combinaciones adecuadas de teclas (totalmente independiente del hardware de
video). Se crean dinámicamente y puedes tener hasta 64.
• Un sistema de archivos especial llamado UMSDOS que permite que Linux sea instalado en un
sistema de archivos DOS.
• Sistema de archivos de CD-ROM que lee todos los formatos estándar de CD-ROM.
• Diversos protocolos de red incluidos en el kernel: TCP, IPv4, IPv6, AX.25, X.25, IPX, DDP, Netrom,
etc.
CARACTERISTICAS GENERALES
- Tiene un diseño reentrante de modo que pueden existir varios procesos en modo núcleo
‘ejecutándose’ a la vez.
- Tiene soporte para aplicaciones de usuario multihilo
- Compatible con estándares: POSIX, las APIs del UNIX SysV y los sockets BSD
- Admite multiproceso simétrico (SMP)
- No expropiativo
SEGURIDAD
Se debe tener cuidado con este sistema. Verificando los registros (logs) del sistema, tales como
/var/log/messages y no perder de vista el sistema.
Se debe tener el sistema actualizado, estar seguro de que se ha instalado las versiones actuales de
los programas y estar al tanto de las nuevas alertas de seguridad.
El proceso de arranque en Linux es el proceso de inicialización del sistema operativo que realiza
Linux el núcleo o kernel (un componente de este sistema informático), el programa en el sistema
que asigna los recursos de la máquina a los otros programas que ejecuta.
En Linux, el flujo de control durante el arranque es desde el BIOS, al gestor de arranque y al núcleo
(kernel). El núcleo inicia el planificador (para permitir la multitarea) y ejecuta el primer espacio de
usuario (es decir, fuera del espacio del núcleo) y el programa de inicialización (que establece el
entorno de usuario y permite la interacción del usuario y el inicio de sesión), momento en el que el
núcleo se inactiva hasta que sea llamado externamente.
La etapa del cargador de arranque no es totalmente necesaria. Determinadas BIOS pueden cargar y
pasar el control a Linux sin hacer uso del cargador. Cada proceso de arranque será diferente
dependiendo de la arquitectura del procesador y el BIOS.
5. El planificador toma control efectivo de la gestión del sistema, y el núcleo queda dormido
(inactivo).
6. El proceso Init ejecuta secuencias de comandos (Scripts) necesarios para configurar todos
los servicios y estructuras que no sean del sistema operativo, a fin de permitir que el entorno
de usuario sea creado y pueda presentarse al usuario con una pantalla de inicio de sesión.
En el apagado, Init es llamado a cerrar todas las funcionalidades del espacio de usuario de una
manera controlada, de nuevo a través de secuencias de comandos, tras lo cual el Init termina y el
núcleo ejecuta el apagado.
Como en la mayoría de arquitecturas este programa se encuentra en el MBR, el cual es de 512 bytes,
este espacio no es suficiente para cargar en su totalidad un sistema operativo. Por eso, el cargador
de arranque consta de varias etapas. Las primeras operaciones las realiza el BIOS. En esta etapa se
realizan operaciones básicas de hardware. En esta primera etapa se localiza el sector de arranque
(o MBR) y se carga el cargador de este sector (normalmente una parte de LILO o GRUB).
La primera etapa del cargador de arranque carga el resto del gestor de arranque, que normalmente
da un mensaje que pregunta que sistema operativo (o tipo de sesión) el usuario desea inicializar.
Bajo LILO, esto se hace a través del mapa instalado que lee el archivo de configuración /etc/lilo.conf
para identificar los sistemas disponibles. Incluye datos como la partición de arranque y la
localización del kernel para cada uno, así como las opciones personalizadas en su caso. El sistema
operativo seleccionado es cargado en la memoria RAM, un sistema de archivos mínimo inicial se
establece en la memoria RAM desde un archivo de imagen (" initrd "), y junto con los parámetros
adecuados, el control se pasa al sistema operativo activado recientemente.
LILO no entiende los sistemas de archivos, por lo que utiliza desplazamientos de disco sin procesar
y el BIOS para cargar los datos. Se carga el código del menú y, a continuación, en función de la
respuesta, carga, o el sector MBR del disco de 512 bytes como en Microsoft Windows, o la imagen
del kernel de Linux.
GRUB por el contrario comprende los sistemas de archivos comunes ext2 , ext3 y ext4. Debido a que
GRUB almacena sus datos en un archivo de configuración en vez de en el MBR y a que contiene un
interfaz de línea de comandos, a menudo es más fácil rectificar o modificar GRUB si está mal
configurado o corrupto.
• GRUB
La primera etapa carga el resto del gestor de arranque (segunda etapa). Si la segunda etapa está en
una unidad grande, en ocasiones se carga una fase intermedia 1.5, que contiene código adicional
para permitir que los cilindros por encima de 1024, o unidades tipo LBA, puedan leerse. El gestor de
arranque 1.5 es almacenado (si es necesario) en el MBR o en la partición de arranque.
La segunda etapa del gestor de arranque ejecuta y muestra el menú de inicio de GRUB que permite
al usuario elegir un sistema operativo y examinar y modificar los parámetros de inicio.
GRUB soporta métodos de arranque directo, arranque chain-loading, LBA, ext2, ext3, ext4 y hasta
"un pre-sistema operativo en máquinas x86 totalmente basado en comandos". Contiene tres
interfaces: un menú de selección, un editor de configuración, y una consola de línea de comandos.
• LILO
LILO es más antiguo. Es casi idéntico a GRUB en su proceso, excepto que no contiene una interfaz
de línea de comandos. Por lo tanto todos los cambios en su configuración deben ser escritos en el
MBR y luego reiniciar el sistema. Un error en la configuración puede dejar el disco inservible para el
proceso de arranque hasta tal grado, que sea necesario usar otro dispositivo (disquete, etc) que
contenga un programa capaz de arreglar el error. Además, no entiende el sistema de archivos. En
su lugar, la ubicación de los archivos de imagen se almacenan directamente en el MBR y el BIOS se
utiliza para acceder a ellos directamente.
• Loadlin
Otra forma de cargar Linux es desde DOS o Windows 9x, donde el núcleo de Linux reemplaza
completamente la copia de funcionamiento de estos sistemas operativos. Esto puede ser útil en el
caso de hardware que necesita ser conectado a través del software y la configuración de estos
programas sólo está disponible para DOS y no para Linux, debido a cuestiones de secretos
industriales y código propietario. Sin embargo, esta tediosa forma de arranque ya no es necesaria
en la actualidad ya que Linux tiene drivers para multitud de dispositivos hardware. Aun así, esto era
muy útil en el pasado.
Otro caso es cuando Linux se encuentra en un dispositivo que el BIOS no lo tiene disponible para el
arranque. Entonces, DOS o Windows pueden cargar el driver apropiado para el dispositivo
superando dicha limitación del BIOS, y cargar Linux desde allí.
El kernel de Linux se encarga de todos los procesos del sistema operativo, como la gestión de
memoria, planificador de tareas, I/O, comunicación entre procesos, y el control general del sistema.
Este se carga en dos etapa: en la primera etapa el kernel (como un archivo imagen comprimido) se
carga y se descomprime en memoria, y algunas funciones fundamentales como la gestión de
memoria de base se establecen. El control entonces se cambia a la etapa final para iniciar el kernel
principal. Una vez que el núcleo está en pleno funcionamiento - y como parte de su puesta en
marcha, después de ser cargado y ejecutado - el kernel busca un proceso de inicio para ejecutar,
que (separadamente) fija un espacio de usuario y los procesos necesarios para un entorno de
usuario y ultimar la entrada . Al núcleo en sí entonces se le permite pasar a inactivo, sujeto a las
llamadas de otros procesos.
El kernel es cargado normalmente como un archivo imagen, comprimido dentro de otro con zlib
como zImage o bzImage. Contiene una cabecera de programa que hace una cantidad mínima de
instalación del hardware, descomprime la imagen completamente en la memoria alta , teniendo en
cuenta cualquier disco RAM si está configurado. A continuación, lleva a cabo su ejecución. Esto se
realiza llamando la función startup del kernel (en los procesadores x86 a través de la función
startup_32() del archivo /arch/i386/boot/head).
Por lo tanto, el núcleo inicializa los dispositivos, monta el sistema de archivos raíz especificado por
el gestor de arranque como de sólo lectura, y se ejecuta Init (/sbin/init), que es designado como el
primer proceso ejecutado por el sistema (PID=1). También puede ejecutar opcionalmente initrd
para permitir instalar y cargar dispositivos relacionados (disco RAM o similar), para ser manipulados
antes de que el sistema de archivos raíz está montado.
En este punto, con las interrupciones habilitadas, el programador puede tomar el control de la
gestión general del sistema, para proporcionar multitarea preventiva, e iniciar el proceso para
continuar con la carga del entorno de usuario en el espacio de usuario.
• El proceso de inicio
El trabajo de Init es "conseguir que todo funcione como debe ser" una vez que el kernel está
totalmente en funcionamiento. En esencia, establece y opera todo el espacio de usuario. Esto
incluye la comprobación y montaje de sistemas de archivos, la puesta en marcha los servicios de
usuario necesarios y, en última instancia, cambiar al entorno de usuario cuando el inicio del sistema
se ha completado. Es similar a los procesos Init de Unix y BSD, de la que deriva, pero en algunos
casos se ha apartado o se hicieron a la medida. En un sistema Linux estándar, Init se ejecuta con un
parámetro, conocido como nivel de ejecución, que tiene un valor entre 1 y 6, y que determina que
subsistemas pueden ser operacionales. Cada nivel de ejecución tiene sus propios scripts que
codifican los diferentes procesos involucrados en la creación o salida del nivel de ejecución
determinado, y son estas secuencias de comandos los necesarios en el proceso de arranque. Los
scripts de Init se localizan normalmente en directorios con nombres como "/etc/rc...". El archivo de
configuración de más alto nivel para Init es /etc/inittab.
Después de que se han dado lugar todos los procesos especificados, Init se aletarga, y espera a que
uno de estos tres eventos sucedan:- que procesos comenzados finalicen o mueran; un fallo de la
señal de potencia (energía); o una petición a través de /sbin/telinit para cambiar el nivel de
ejecución.
• Niveles de Ejecución
Los niveles de ejecución de Unix o runleves, en inglés, indican el modo en el que el sistema será
iniciado. Los niveles son indicados mediante los números del 0 al 6. En la mayoría de los Unix y
distribuciones Linux (aunque no podría decir que en todas) el nivel de ejecución son los siguientes:
Los modos específicos para una distribución particular se encuentran en el archivo /etc/inittab:
id:5:initdefault:
Esto quiere decir que cuando el sistema arranca, lo hace en el modo 5, que, como hemos visto,
indica multiusuario completo (con red y modo gráfico). Observe que en los comentarios de los
modos 0 y 6 aparece un par de recomendaciones importantes: NO establezca el valor default de init
en este número. ¿Por qué no?
Un administrador (root) puede editar el archivo /etc/inittab como mejor convenga al usuario, sin
embargo también tiene el poder de establecerlo en 0 ó en 6. Si se establece en 6, algo que hice
como experimento en mi Mandriva, la próxima vez que la máquina se encienda, se leerá el modo 6,
shutdown y reboot, y se hará exactamente eso. De hecho se crea un ciclo infinito de reinicios que
puede ser desconcertante para el usuario. Algo similar pasa al establecer el modo de ejecución en
0, cada vez que se enciende la computadora, inmediatamente se apaga. La manera de cambiar esto
es entrar en modo recover y editar de nuevo el archivo /etc/inittab.
Pero si no deben establecerse, ¿Por qué están ahí? La razón es que otros usuarios pueden
requerirlos realmente.
Cerrar un sistema Linux tiene algo de truco. Recuerde que nunca se debe cortar la corriente o pulsar
el botón de reset mientras el sistema este ejecutándose. El núcleo sigue la pista de la entrada/salida
a disco en buffers de memoria. Si se reinicializa el sistema sin darle al núcleo la oportunidad de
escribir sus buffers a disco, puede corromper sus sistemas de ficheros.
En tiempo de cierre se toman también otras precauciones. Todos los procesos reciben una señal
que les permite morir airosamente (escribiendo y cerrando todos los ficheros y ese tipo de cosas).
Los sistemas de ficheros se desmontan por seguridad. Si se desea, el sistema también puede alertar
a los usuarios de que se está cerrando y darles la posibilidad de desconectarse.
La forma más simple de cerrar el sistema es con el comando shutdown. El formato del comando es:
El argumento <tiempo> es el momento de cierre del sistema (en el formato hh:mm:ss), y <mensaje-
de-aviso> es un mensaje mostrado en todos los terminales de usuario antes de cerrar.
Alternativamente, se puede especificar el parámetro <tiempo> como "now", para cerrar
inmediatamente. Se le puede suministrar la opcion -r a shutdown para reinicializar el sistema tras
el cierre.
Por ejemplo, para cerrar el sistema a las 20:00, se puede utilizar el siguiente comando:
# shutdown -r 20:00
El comando halt puede utilizarse para forzar un cierre inmediato, sin ningún mensaje de aviso ni
periodo de gracia. halt se utiliza si se es el único usuario del sistema y se quiere cerrar el sistema y
apagarlo.
Es muy importante que cierre el sistema "limpiamente" utilizando el comando shutdown o el halt.
En algunos sistemas, se reconocerá el pulsar [ctrl][alt][Supr], que causará un shutdown; en otros
sistemas, sin embargo, el utilizar el "Apretón de Cuello de Vulcano" reinicializará el sistema
inmediatamente y puede causar un desastre.
El programa que se ejecutará al pasar al nivel de ejecución 0 será /etc/rc.d/rc con el parámetro 0,
como indicaba el fichero /etc/inittab. Como consecuencia se ejecutarán todos los scripts pasándoles
el parámetro stop.
Para parar el sistema se necesitan atributos de superusuario (root) y se debe tener en cuenta que
puede haber más usuarios en el sistema y que deberían estar avisados de la parada.
Esta una lección que sería mejor que viniera la primera antes de la anterior ya que aprenderemos
como instalar el sistema desde cero y cómo gestionar los distintos paquetes instalados. No obstante
entiendo el razonamiento del orden de estudio de la LPI ya que en la primera lección dábamos
cuestiones de hardware que son al fin y al cabo las de más bajo nivel.
Y dicho esto comencemos con la lección propiamente dicha. De nuevo se hará hincapié en que
vamos a estudiar instalaciones a nivel de Linux en general no se trata de guías de instalación de
ninguna distribución en concreto, se trataran temas generales. En cuanto la gestión de paquetería
nos centraremos en la gestión de paquetes en Debian (lección 4) y la gestión de paquetes en RedHat
(lección 5). No nos olvidamos del boot manager (lección 2) ni de las librerías (lección 3). Vamos pues
con el tema de hoy en el que hablaremos del diseño del layout del disco duro.
Al instalar un sistema Linux más allá de la decisión del idioma del instalador alguna otra pregunta lo
primero a lo que nos enfrentaremos será al particionado del disco duro. Que estructura queremos
que tenga esto. El particionado del sistema no es una cuestión meramente organizativa si no que
dependiendo del sistema que queramos montar será conveniente hacerlo de una determinada
forma o de otra. Y es precisamente lo que estudiaremos hoy. Comencemos:
• System considerations
Existen varias variables que harán que elijamos una estructura en nuestro disco duro u otra esas
son: tamaño del disco, lo que ocupa el sistema, para que será usado el sistema y como se realizarán
los backups.
El primer escenario en el que nos encontramos es uno con espacio en disco limitado. Normalmente
se tiende a tratar de conseguir dejar la mayor cantidad de espacio disponible en la parte del usuario,
para que este pueda trabajar con mayor holgura. No obstante he de añadir yo que esto puede variar
dependiendo de la función del sistema, en determinados sistemas es posible que el espacio
reservado para usuarios prácticamente no se utilice. Cada administrador de sistemas debe valorar
el uso de su sistema y tratar de elegir la opción más correcta. Pero algo en común de las instalaciones
en discos con espacio limitado es el reducir al mínimo el número de particiones. Podríamos decir
que el número mínimo para una buena instalación de linux es:
/boot Es suficiente con una pequeña cantidad de megas, es necesario tener en cuenta que debe ser
la primera de las particiones. Normalmente con un centenar de megas es más que suficiente y puede
reducirse hasta 50mb.
/ el directorio raíz es donde se instala el sistema. Aquí depende mucho del sistema que queráis
montar. Dado que los sistemas avanzan cada poco tiempo no creo que hagan preguntas en el
examen en términos absolutos. No obstante en la documentación nos dicen la cifra de 850mb. Pero
ahora mismo tenemos una debian base sin entorno gráfico con servidor LAMP y con poco más ya
que no hay mucha tontería y sube ligeramente del 1gb de ocupación en disco. Esta partición es
donde se guardará todo lo que no esté en /boot swap Es un tipo de partición especial.
En el libro de oreilly nos hablan de que si solo contamos con 1gb para la instalación dejaremos
100mb para la swap esto me parece totalmente obsoleto. Usualmente no suele dejarse una swap
menor que el tamaño de la memoria RAM instalada.
Larger systems:
En estos sistemas ya tendremos discos más grandes y podremos planear estrategias de backup así
como el fragmentar más la partición. En el libro de oreilly nos dan estos valores para un disco de
100gb:
/boot 100mb
swap 1gb
/ minimo 500mb
/var 2gb ya que aquí se guardan los logs de las distintas aplicaciones. Si se llenase la partición podría
afectar a la estabilidad del sistema así que es mejor ir sobrados de espacio aquí.
/tmp 500mb aquí se guardan los ficheros temporales. Conviene de nuevo que este separada y que
sea grande ya que si el sistema no puede escribir en /tmp podríamos decir que afecta a la estabilidad
del sistema, aunque es quedarse cortos ya que lo que suele ocurrir es que se bloquea la máquina.
/home aquí iría el resto del espacio para los usuario, es decir 90gb
Muchas veces estos discos están replicados o están montados en remoto y demás.
Nota propia: Encuentro que en este capítulo el libro de oreilly esta terriblemente obsoleto (a pesar
de estar revisado en el 2009) y no termino de ver el sentido real de estudiar tamaños absolutos del
disco. Personalmente me quedaría con los conceptos más que con las cifras, las particiones que es
conveniente crear y que particiones es conveniente que sean más grandes. Repito que dependiendo
del sistema es muy posible que no necesitemos carpetas de home tan grandes, por ejemplo en un
servidor web las carpetas de home a penas se utilizan. Entiendo que este layout está pensado para
servidores a los que accederán múltiples (bastantes) usuarios. Una vez hecha la aclaración
prosigamos.
• Mount points
Los mount points son conocidos en español como los puntos de montaje. Para poder acceder a una
partición es necesario que estos estén montados en un directorio y a esto se le conoce como mount
point. Para poder montar una partición en un directorio primero tendrás que crearla y ya una vez
creada montarla con el comando mount. Si no quieres montar la partición de forma manual será
necesario que las incluyas en el fichero /etc/fstab con la sintaxis adecuada. Lo que haya aquí se
montará en el arranque del sistema.
• Superblock
El superbloque es un bloque que tiene cada filesystem que contiene la información metadata con
la estructura de ese filesystem. La información que se incluye aquí es el tipo, el tamaño y el estado
del filsystem montado.
• MBR
Son las siglas para master boot record, se trata de un pequeño programa que contiene la
información con las particiones del disco y la carga del sistema operativo. El MBR está situado
siempre en los primero 512 bytes del disco. En caso de dañarse el MBR será imposible arrancar, por
lo que es más que conveniente guardar un backup de esto. Para ello podremos hacer uso del
comando dd y clonar solo los primeros 512 bytes gracias a las variables count = 1 bs=512. La
restauración del MBR se podrá hacer por tanto haciendo uso del mismo comando pero alterando el
orden de los comandos.
Al igual que se puede arrancar desde un cd es posible arrancar linux desde un usb. Pero hay que
tener en cuenta que los discos usb pueden ser modificados. Esto es muy útil para tener un sistema
portable que llevarte a donde quieras y además al arrancar desde aquí podemos montar los discos
del ordenador dentro desde nuestro sistema arrancado desde el usb y usarlo para hacer
troubleshooting.
Para poder arrancar desde el usb necesitamos hacer arrancable el usb para lo cual una partición
debe tener el flag de bootable activado, así como activar el arranque desde este dispositivo en la
BIOS.
• System role
• Backup
Es un hecho el que debemos implementar una política de backup en nuestros sistemas. Debemos
ser capaces de poder recuperar el sistema en caso de que ocurra un desastre. El mejor backup sería
aquel que cuenta que cuenta con todos los datos en todo momento y se pueden recuperar
instantáneamente. No obstante este backup ideal no existe y siempre hay algún inconveniente.
Una posibilidad de hacer backup sería el uso del comando dd que ya hemos comentado
anteriormente. Este comando hace un backup bit a bit de los datos de un disco/partición mediante
us uso podemos clonar discos duros completos. También es posible hacer un backup de la estructura
de las particiones mediante el comando “sfdisk -d /dev/disco_duro > particiones_bk.txt”. Para
recuperarlas haríamos algo parecido pero en sentido contrario “sfdisk /dev/disco_duro <
particiones_bk.txt"
• Swap space
Al instalar linux tendrás que instalar una partición de swap, esto es una partición para la memoria
virtual. Para que nos entendamos esto es una memoria ram que se almacena en el disco duro,
normalmente esto sucede cuando la memoria ram se agota. Históricamente la regla no escrita en
linux era la de hacer una partición que fuera el doble de la cantidad de ram, sucede que con el
aumento de la cantidad de ram en la actualidad muchas veces la swap se deja en el mismo tamaño
que la ram o incluso en una cantidad fija que es a veces menor que la cantidad de ram. En sistemas
de escritorio con grandes cantidades de ram se opta incluso por la desactivación de la ram, pero
digamos que esto es algo muy extremo.
• General guidelines
Mantener el filesystem de root (/) lo más sencillo posible dividiendo fragmentando el resto tanto
como sea posible.
Hacer una partición a parte para la partición de /boot en bios y kernels antiguos es necesario que
ésta esté por debajo del cilindro 1024
Separar /var y así asegurarnos de que tenemos suficiente espacio para gestionar los logs, spools y
los mails. Es conveniente ir rotando aquí los ficheros haciendo una copia de los más antiguos
ficheros y borrándolos.
Separar /tmp y así no correr el riesgo de bloquear el sistema porque tmp crezca desmesuradamente
Separar /usr y asegurarse de que va bien de espacio ya que aquí están los ejecutables y también
entre otras cosas el kernel del sistema.
Separar el /home así aunque tengamos varios usuarios podrán usar el sistema y aunque cambiemos
de máquina o hagamos un upgrade podremos conservar estos datos. Además así un usuario que
crezca demasiado no nos bloqueará el sistema.
LABORATIORIO 1:
Un sistema de gestión de paquetes, también conocido como gestor de paquetes, es una colección
de herramientas que sirven para automatizar el proceso de instalación, actualización, configuración
y eliminación de paquetes de software. El término se usa comúnmente para referirse a los gestores
de paquetes en sistemas Unix-like, especialmente GNU/Linux, ya que se apoyan considerablemente
en estos sistemas de gestión de paquetes.
Las diferencias principales entre un sistema de gestión de paquetes y un instalador son las
siguientes:
Sistema de Gestión de Paquetes Instalador
Cada producto viene unido a su propio
Forma parte del sistema operativo.
instalador.
Usa una única base de datos de instalación. Rastrea su propia instalación
Puede verificar y administrar todos los paquetes sobre
Sólo trabaja con su propio producto.
el sistema.
Un único vendedor de sistema de administración de
Múltiples vendedores de instalador.
paquetes.
Un único formato de paquetes. Múltiples formatos de instalación
Los sistemas de gestión de paquetes tienen la tarea de organizar todos los paquetes instalados en
el sistema y se encargan de mantener su usabilidad. Esto se consigue combinando las siguientes
técnicas:
- Comprobación de la suma de verificación para evitar que haya diferencias entre la versión
local de un paquete y la versión oficial.
- Comprobación de la firma digital
- Instalación, actualización y eliminación simple de paquetes
- Resolución de dependencias para garantizar que el software funcione correctamente
Muchos de los sistemas de gestión de paquetes ampliamente utilizados utilizan backends simples
para instalar los paquetes. Por ejemplo, YUM utiliza RPM como backend y APT utiliza dpkg.
• Paquetes RPM
RPM son para sistemas basados en SuSE y RedHat (de ahí el título que no especifique a que
distribución que corresponde ya que son más de una distribución primitiva que la usan). Es otro
sistema de empaquetado y conjunto de instrucciones que se encargará de dejarlo todo OK para
nosotros de una manera fácil y rápida. Así como al comando dpkg se le pueden pasar una variedad
de parámetros también al comando rpm, veámoslas:
Para instalar:
# rpm -i paquete.rpm
Para desinstalar:
# rpm -e paquete.rpm
Trabajar con la línea de comandos no es una tarea tan desalentadora como muchos pudieran
pensar. No se requieren conocimientos especiales para usar la línea de comandos, pues es un
programa como otro cualquiera. La mayoría de las acciones realizadas en Linux pueden llevarse a
cabo usando la línea de comandos. Aunque existen herramientas gráficas para la mayoría de
programas, a veces esto no es suficiente. Entonces es cuando la línea de comandos cobra su utilidad.
La terminal es llamada a menudo la línea de comandos, el "prompt", o el "shell". Antes, éste era el
único método por el cual el usuario interactuaba con lel ordenador; sin embargo, muchos usuarios
de Linux encuentran más rápido el uso de la terminal que un método gráfico e incluso hoy día tiene
algunas ventajas. Aquí aprenderá cómo usar la terminal.
El uso original de la terminal era como administrador de ficheros y de hecho todavía es usado con
este fin. Usted puede usar la terminal como un navegador de archivos para administrar sus ficheros
y deshacer los cambios realizados.
Para iniciar la consola debemos ingresar a nuestras máquinas virtuales una vez iniciada nuestro
servidor Linux
Para el Linux que no está instalado en modo grafico la figura anterior es nuestra consola, en caso
que nuestro Linux Centos este en modo grafico nuestra consola se encuentra en:
Por lo general es mejor trabajar en usuario root que en usuario normal por los privilegios de
ejecución permitidos, en otro capítulo lo veremos.
Órdenes comunes
Ver directorios: - ls
El comando ls (LiSta) muestra los archivos diferenciados por colores y texto con formato
La orden cp (CoPiar) copia los archivos que usted especifique. La orden cp -r copia cualquier
directorio que usted especifique.
El comando rm (del Inglés ReMove, eliminar) borra el fichero con el nombre especificado. El
comando rm -r borra el directorio especificado junto con todo su contenido.
Comando sed
Este comando modifica directamente el contenido del fichero, enviándolo a la salida estándar.
Fichero-entrada será en nombre del fichero que se desea modificar. Texto-script o fichero-script,
son el conjunto de comandos que queremos que ejecute sed.
Veamos algunos de los comandos de sed que puede emplear en sus scripts. El campo direcciones,
hace referencia a los números de línea. Pueden no recibir direcciones, en cuyo caso se opera con
el fichero completo. Si se recibe una dirección, se opera sobre la línea especificada. Si se reciben
dos direcciones (un rango), se opera sobre dicho rango de líneas, ambas inclusive.
Ejemplo:
Reemplazar 2015 por 2016 en el archivo hola_2.txt guardando en hola_1.txt
Comando cut
Flag Resultado
-b o –bytes Corta por el número de bytes especificados
-c o –characters Corta por el número de caracteres especificados
-f o –fields Corta por el número de campos especificados. Por
defecto los campos están delimitados por una
tabulación, aunque podemos cambiar el carácter
delimitador con “-d carácter_delimitador”).
Con ejemplos lo entenderemos mejor. Vamos a ver el formato del fichero passwd:
En este caso, los campos están delimitados por “:”, y no por tabulaciones. Tendremos que usar el
flag -d para cambiar el campo delimitador. Si quisiéramos obtener un listado de los usuarios del
sistema y su directorio home (campos 1 y 6), deberíamos ejecutar la siguiente orden:
Observamos que hemos utilizado -f1,6 para que nos corte los campos 1 y 6. Si quisiéramos que nos
cortara todos los campos que van del 1 al 6, la sintaxis sería -f1-6, y si en vez de campos, queremos
cortar por caracteres, seria -c1-6, para cortar los caracteres del 1 al 6.
Comando que genera un contador de palabras, lineas o bytes. Su uso es muy sencillo y útil.
El resultado nos indica que el fichero contiene 36 líneas, 56 palabras y 1788 bytes. Si queremos
especificar un único formato de salida, se haría con:
Flag Resultado
-l o –lines Cuenta las líneas
-w o –words Cuenta las palabras
-c o –bytes Cuenta los bytes
-m o –chars Cuenta los caracteres
Los comandos que vamos a comentar no cambian realmente el contenido de los ficheros, sino que
envían el fichero modificado a la salida estándar. Después, podemos canalizar la salida a otro
comando o fichero.
Interesante comando para los que programan pequeños scripts o programas desde un editor de
texto. Todavía recuerdo la primera vez que lo utilicé. Estuve varios días programando un programa
en java, era para una práctica que tenía que presentar. Después de que el profesor modificara las
líneas de código que creyera oportunas, el programa devolvía errores de indexación todos lados.
Motivo? pues el editor de texto que yo utilicé tenia definidos las tabulaciones como tabulaciones
(lógico), y mi profesor tenía la opción marcada de gedit de “insertar espacios en lugar de
tabulaciones” y ancho de tabulador. Cada vez que pulsaba el tabulador, insertaba cuatro espacios.
Fue tan sencillo como hacer:
El comando unexpand, hace lo opuesto, convierte varios espacios en tabulaciones. También acepta
la opción -t num.
sort (en inglés ordenar), es utilizado para ordenar la salida de un comando. Tenemos el documento
abecedario.txt que contiene letras al azar. Para mostrar una salida ordenada:
Recordemos que sort ordena por el valor ASCII, el cual distingue entre letras mayúsculas y
minúsculas.
Flag Resultado
-f o –ignore-case Ignora entre mayúsculas y minúsculas
-M o –month-sort Ordena por las abreviaturas de tres letras de los
meses (de JAN a DEC)
-r o –reverse Invierte el orden
-n o –numeric-sort Ordenación numérica
-k campo o –fey=campo Permite definir el campo de la ordenación
Este comando nos permite dividir un fichero en dos o más. Algunas de las opciones de este comando
son:
Flag Resultado
-b tamaño o –bytes=tamaño Divide el fichero por bytes. Puede cortar un
fichero por la mitad de una línea.
-C tamaño o –line-bytes=tamaño Divide un fichero por el número de bytes
especificado sin romper sus líneas.
-l lineas o –lines=lineas Divide un fichero en bloques no superiores al
número de líneas especificado.
El siguiente comando nos genera los ficheros aba, abe, abc, etc, con tres líneas cada uno, extraídas
del fichero abecedario.txt:
Nos permite eliminar todas las líneas que sean idénticas. Supongamos que al ordenar un fichero,
queda de la siguiente manera:
Veamos algunos ejemplos para entenderla mejor. Queremos convertir todas las vocales de la
siguiente frase a mayúsculas:
También podemos utilizar dicho comando para eliminar ciertos caracteres, con -d:
Ahora eliminaremos todos los espacios repetidos que tengamos en una frase con la opción -s:
Aunque este comando es utilizado para mostrar el contenido de ficheros pequeños, lo cierto es
que és una herramienta para combinar ficheros (cat es abreviatura de concatenar). Utilizando este
comando con una redirección de salida, se puede combinar dos ficheros en uno:
Flag Resultado
-E o –show-ends Muestra el signo dolar al final de cada linia ($)
-n o –number Numera las lineas al comienzo de cada una
-b o –number-nonblank Solo numera las lineas que contienen texto
-s o –squeeze-blank Substituye los grupos de lineas en blanco por una
sola
-T o –show-tabs Muestra los carácteres de tabulación como ^I
Este comando combina dos ficheros según el campo que hayamos especificado. Por defecto join
tiene en cuenta el primer campo para realizar la combinación.
Si fichero1.txt contiene:
Y el fichero2.txt
La función de este fichero es la de fusionar ficheros línea a línea, separando las líneas de cada
fichero mediante tabulaciones.
Teniendo en cuenta que el contenido de fichero1.txt y fichero2.txt es el mismo que en el ejemplo
anterior, el resultado de este comando:
De entre los diferentes tipos de flujo, definiremos los tres que destacan:
Entrada estándar (stdin): Es la utilizada para recoger información. En la mayoría de los casos es a
través del teclado.
Salida estándar (stdout): Se usa para enviar información al exterior. Suele ser el monitor.
Error estándar (stderr) : Es utilizada para llevar los mensajes de error y de alta prioridad.
Ahora veamos una tabla con los operadores comunes de redirección:
Operador Efecto
> Crea un fichero que contiene la salida estándar. Si el fichero
existe, se sobrescribe.
>> Añade al fichero la salida estándar. Si el fichero no existe, se
sobrescribe.
2> Crea un fichero con la salida de error estándar. Si el fichero
no existe, se crea.
2>> Añade a un fichero la salida de error estándar. Si el fichero no
existe, se crea.
&> Crea un fichero que contiene tanto el error estándar como la
salida estándar. Si el fichero existe, se reemplaza.
<> El fichero especificado se utiliza tanto para la salida estándar
como para la entrada estándar.
< El contenido del fichero especificado se envía para utilizarlo
como entrada estándar
<< Acepta el texto de las siguientes lineas como entrada
estándar.
Veamos ejemplos:
Operador “>”:
Operador “>>”:
En este ejemplo, vemos como el resultado de ejecutar la orden “ls etc” se añade a fichero.txt:
Operador “2>”:
Ahora vamos a intentar listar una carpeta que no existe, y enviar los errores a un fichero:
Como vemos, no muestra ningún error por pantalla diciendo que la carpeta no existe, ya que
hemos redirigido la salida de error al fichero “errores.txt”
Operador “2>>”:
Este comando haría exactamente lo mismo que el anterior, solo que las líneas de error se
añadirían a las ya existentes.
Operador “&>”:
Podríamos decir que este operador actúa como “>” y “2>” a la vez. Vamos a listar una carpeta que
existe y otra que no, redirigiendo su salida a fichero.txt.
Vemos que tanto los errores como el resultado de “ls /etc/” se guardan en el mismo fichero.
Operador “<>”:
Utilizamos fichero.txt para tanto para la salida estándar como para la entrada estándar.
Operador “<“:
En el siguiente ejemplo vemos como cambiamos a al vez la entrada y salida estándar de un
programa. Cogemos el contenido de “fichero.txt” y lo enviamos a “fichero2.txt”.
Podríamos haber omitido el uso de “<” y en este caso el resultado hubiera sido el mismo. Unix
dispone de un gran número de comandos que leen de la entrada estándar, realizan la operación
con el texto y escriben en la salida estándar: cat, grep, soft, cut, sed, tr…
Antes de empezar a trastear con los ficheros debemos tener en cuenta un par de cosas. La primera,
es que a diferencia de otros sistemas operativos, para Linux “fichero1.txt” y “Fichero1.txt” son
ficheros distintos. Linux distingue entre mayúsculas y minúsculas. La segunda es que la mayoría de
los comandos aceptan “comodines”, que nos gestionar los ficheros. Tenemos 3 clases de comodines:
Opción Resultado
? Representa un solo carácter. Por ejemplo, s?l podría
ser sol, sal o cualquier otro nombre de fichero que
empiece por s termine por l.
* El funcionamiento de asterisco es similar, solo que no
determina el número de caracteres que queremos.
Es decir, volviendo al ejemplo de antes, s*l podría ser
sol o soaeiuol. Si buscáramos con esa expresión, nos
devolvería todos los ficheros que empiecen por sy
acaben por l.
[] Se usan para determinar rangos. s[a-w]l podría ser
válido para cualquier fichero que empiece por s,
contenga cualquier letra del abecedario excepto la z,
pues la hemos dejado fuera del rango, y acabe por l.
tee: este comando se encarga de dividir la entrada estándar para que se muestre en la salida
estándar y en tantos ficheros como se desee. Esto es útil cuando no solo se quieren enviar datos
hacia una tuberia, sino también guardar una cópia en un archivo. Si este no existe, lo crea, y si existe
lo sobrescribirá, siempre y cuando no usemos el flag -a.
Supongamos que queremos ver el contenido de un archivo por pantalla y a su vez guardar el
contenido en un fichero:
xargs: este comando se utiliza para pasar un gran número de argumentos a otros comandos. En la
siguiente instrucción queremos buscar los archivos .log y copiarlos en nuestra dirección actual.
• Pipes
Empecemos traduciendo la palabra al español: pipe –> tubería. Tener claro esto va a ser
fundamental para entender su funcionamiento.
Las pipes o pipelines se representan mediante la barra vertical ( | ). Se utilizan para redireccionar la
salida estándar de un programa a la entrada estándar de otro. La mejor forma para comprenderlas
es viendo un ejemplo.
Queremos saber si el usuario “abel” existe en el sistema, y si es así, que Uid tiene. Dado que la
magnitud de este fichero puede ser muy grande, descartamos la búsqueda “a ojo” y haríamos lo
siguiente:
Hemos usado dos pipes, por lo tanto podemos diferenciar tres bloques:
grep ^super: de las líneas mostradas por el comando anterior, busca la que empiece por “super”.
cut -f3 -d”:” : corta el campo 3 de la línea, teniendo en cuenta que delimitamos los campos con “:”
Más adelante veremos mejor el funcionamiento del comando grep y cut, lo que nos debe quedar
claro ahora es como hemos entrelazado tres comandos distintos para obtener un resultado, que
en este caso será “1000”.
En este caso, nos devuelve el número de usuarios que tengan definida la shell bash.
Normalmente, cuando se inicia un programa, este toma el control del terminal, impidiendo realizar
otras tareas. Para solucionar dicho problema, existe la posibilidad de poder pasar los procesos de
primer plano a segundo plano.
Se nos abre el vi en el terminal y no podemos hacer otra cosa que no sea editar hola.txt. Pulsamos
control-z para pausar el proceso y regresar al terminal.
Este proceso suspende el programa, por lo que la tarea que esté realizando, también la detiene. En
este caso no tiene importancia porque estamos editando un documento, pero podría tenerla según
el proceso pausado.
Ahora si queremos volver al editor, debemos usar el comando fg (foreground). Si tuviéramos más
de un proceso detenido, deberemos utilizar este comando con un número (fg 2, fg 3, ….). Para saber
que numero va asociado a cada proceso detenido, tenemos el comando jobs.
La forma de pasar un proceso a segundo plano, para que así el proceso vuelva a estado de ejecución,
es mediante el comando bg (background):
No obstante, la manera más cómoda de ejecutar un programa en segundo plano, sin tener que
pararlo con control-z y luego usar la orden bg, es con el &. Podemos ejecutar un un programa en
segundo plano de la siguiente forma:
• Comando top
Este comando es una variante dinámica de ps. Es utilizado cuando queremos saber cuánto tiempo
de CPU consumen los procesos, y poder comparar unos con otros. Como vemos en la siguiente
imagen, ordena las entradas por el uso de la CPU y actualiza los datos cada pocos segundos, por lo
que la convierte en una buena herramienta para localizar procesos descontrolados.
Opciones de top:
Opción Resultado
Opción Resultado
q Sale de top.
Un dato importante que proporciona top es la carga media (load average), parámetro que indica la demanda
de tiempo de la CPU que utilizan los procesos. En la captura de top, más arriba, puedes ver tres cargas
medias: 0.29, 0.57 y 0.36, que corresponden a la carga media actual y a las dos anteriores. Un sistema donde
los programas no demandan tiempo de CPU la carga media es de 0, mientras que uno que si demanda, es de
1. Si un sistema suele tener una carga media de 0.5, por ejemplo, pero de repente se sitúa en 2,5, puede que
haya procesos colgados que estén acaparando la CPU. Un comando útil para ver la carga media del PC, así
como el tiempo que lleva encendido, es uptime.
• Comando ps
Este programa muestra el estado de los procesos. Admite muchas opciones útiles y sirve para
monitorizar procesos. Para el que venga de windows, podríamos decir que es como el
“Administrador de tareas” que aparece al presionar ctrl+alt+supr. Su sintaxis es muy sencilla:
ps [opciones]
Si no añadimos opciones, ps muestra los procesos del usuario con el que estamos logueado. No es
necesario colocar espacios entre las opciones, ya que se pueden agrupar, por ejemplo, en lugar de
poner ps -a -f, podríamos poner ps -af.
Como siempre, para conocer todas las opciones y posibilidades del programa deberemos consultar
el manual (man ps). Además, se nos muestran varios ejemplos que podrían sernos de utilidad:
Opción Resultado
Podemos combinar estas opciones de muchas maneras para obtener los resultados deseados. Una
de las combinaciones más útiles para el “día a día” podría ser:
ps -aux
que nos muestra los procesos de todos los usuarios con información añadida:
Interpretar la salida de ps
Es importante saber interpretar los campos mostrados por la anterior imagen. Como podemos
observar, la salida de ps comienza por un encabezado. Describamos esos campos:
Campo Descripción
• Zombie (Z).- Todo proceso al finalizar avisa a su proceso padre, para que éste elimine su
entrada de la tabla de procesos. En el caso de que el padre, por algún motivo, no reciba
esta comunicación no lo elimina de la tabla de procesos. En este caso, el proceso hijo
queda en estado zombie, no está consumiendo CPU, pero sí continua consumiendo
recursos del sistema.
• Ejecutando (O).- Sólo uno de los procesos preparados se está ejecutando (para sistemas
monoprocesador).
• Parado (T).- (traced) Un proceso parado. Pasará a estar preparado en cuanto vuelva a
recibir la señal.
Podemos definir el concepto “kernel” como el corazón de nuestro sistema operativo Linux. Entre
las funciones más importantes se encuentran:
Aunque no podemos administrar este proceso en la misma medida que el resto, con uname si
podemos obtener información sobre éste. Como siempre, veremos algunas de sus opciones y
después ejemplos.
Opción Resultado
Ejemplo:
podemos combinar los parámetros que queramos con tal de adquirir la información deseada:
En la práctica, dicho comando es utilizado en scripts multiplataforma que utilicen estas opciones
para adquirir información y así ajustar sus acciones al sistema en que se ejecuta.
Destruir procesos
El comando kill
Cuando queramos finalizar un proceso en ejecución, el comando a utilizar es kill. Este programa lo
que hace es enviar una señal al proceso. Podemos ver las señales poniendo el flag –l al comando.
Podemos especificar la señal empleando el número o el nombre de la misma. Las señales más
utilizadas son la 1 (finaliza los programas interactivos y hace que muchos demonios vuelvan a leer
sus ficheros de configuración), la 9 (hace que el proceso termine “a la fuerza”) y 15 (hace que el
proceso termine pero permite cerrar ficheros abiertos, etc).Esta última es la señal por defecto si no
especificamos señal.
El programa kill solo destruirá los procesos del usuario que los ejecuta, a excepción de root.
Una variante de este comando es killall. Permite destruir procesos en base a su nombre, en lugar
del PID. Por ejemplo, killall vi, destruirá todos los procesos llamados vi.
Al igual que con kill, con –s, podemos especificar la señal que queremos usar. Una opción importante
para killall es –i, que permite destruir procesos de forma interactiva:
Tanto kill como en killall admiten dos sintaxis para destruir un proceso:
Priorizar un proceso
Es posible administrar la prioridad con la que se ejecutan los procesos de nuestro sistema, con el
objetivo de priorizar el uso de la cpu a ciertos programas. Los comandos para realizar estas acciones
son nice y renice. Utilizamos nice para ejecutar un programa indicando la prioridad que queremos
que tenga y renice para modificarla de un programa ya en ejecución.
nice -n 12 vi hola.txt
Si omitimos el valor de regulación, nice utilizará por defecto la 10. Cuando ejecutamos un
programa sin nice, su prioridad es de 0. El rango de valores es de -20 a 19, siendo los valores
negativos los que tienen una prioridad más alta. Solamente con el usuario root podemos iniciar un
programa que una prioridad negativa.
Donde pids son los id de los procesos, pgrps los ids de los grupos y usuarios el nombre o nombres
de los usuarios. Cuando queramos restablecer la prioridad para un determinado grupo o usuarios,
debemos tener en cuenta que solo root puede realizar esta acción.
Un ejemplo:
renice 3 -p 12122 31313 -u antonio maría
Establecemos la prioridad 3 para los procesos 12122 y 31313 para los usuarios antonio y maría.
Comando grep
Este comando nos permite el uso de expresiones regulares para la búsqueda de archivos. Veamos
algunas de las opciones más importantes:
Flag Acción
Dicha orden buscará en el directorio /etc/ y en TODAS sus subcarpetas todos los ficheros que
contengan la cadena “eth0”.
Dado que los usuarios normales no pueden acceder a determinados ficheros de /etc/, es posible
que al probar la orden os devuelva algún error. Para solucionar esto, o bien probamos la orden
como root, o redirigimos los errores a “/dev/null”
Se nos muestran todos los ficheros del directorio /etc/ y sus subdirectorios que contengan las
cadenas http://www.ejemplo.es o http://www.ejemplo2.com
Se deben entrecomillar ciertas expresiones regulares para que la consola no las intente analizar
como un comando propio.
<div style=”background-color: #e0e0e0; padding: 1.2em 1.2em 1.2em 61px;”ps ax | grep xterm
El shell nos proporciona una característica que nos ahorra tiempo a la hora de teclear nombre de
ficheros con los que operan comandos. La característica se llama generación de ficheros o
expansión de nombres y permite utilizar caracteres especiales para especificar grupos de nombres
de ficheros.
Podemos encontrar nombre de ficheros que cumplen un determinado patrón, como por ejemplo
los que acaben en “.txt” o los que empiecen por “fichero” o los que tienen 3 caracteres. Veamos
los tipos de expresión regular:
Las expresiones que contengan caracteres rodeados entre corchetes, nos devolverán las cadenas
que coincidan con cualquiera de las letras que estén entre los mismos. Por ejemplo, el comando ls
C[AEIOU]L nos va a mostar todos los archivos que tengamos en el directorio que se llamen cal, cel,
cil, col y cul, y el comando ls [a-zA-z], todos los ficheros que empiecen por minúscula o mayúscula.
Operadores de repetición:
Se trata de símbolos especiales que se utilizan para denotar cuantas veces debe aparecer un
elemento coincidente.
Símbolo Resultado
Ejemplos:
La expresión A?B, nos podrá coincidir con AEB, ACB, AB, …..
Editor vi
vi (pronunciado ube-i) es el editor estándar de UNIX. El interés de aprender a manejar este editor
es que en cualquier máquina UNIX tendremos al menos esta herramienta para editar ficheros. vi
facilita 20 líneas en pantalla para realizar la edición. vi es un editor que, en un momento dado, se
encuentra en uno de dos modos básicos de operación: modo de comandos y modo de edición.
El modo por defecto es el modo de comandos. En este modo no se puede realizar la edición del
texto. vi espera al comando apropiado antes de realizar una operación. En general, vi volverá al
modo de comandos después de ejecutar un comando.
La ventaja de este modo de trabajar es que se pueden ejecutar comandos desde ficheros, y los
documentos pueden ser formateados o reestructurados simplemente ejecutando comandos de vi.
Si al presionar ESC el terminal emite un pitido quiere decir que estamos en modo de comandos.
Iniciando vi
vi nuevo_fichero
Este comando inicia el editor y, como el fichero no existe todavía, lo crea para ser editado. El
editor está ahora en modo de comandos esperando por un comando.
Moviendo el cursor
k arriba
j abajo
h izquierda
l derecha
Cuando se carga vi con un nuevo fichero, el cursor está en la esquina superior izquierda de la
pantalla, y no puede ser movido con las teclas de cursor.
Estos tres comandos son ejecutados en el modo de comandos, y vuelven al modo de comandos
después de ejecutarse.
Deshaciendo cambios
Hay veces que se realizan cambios y nos damos cuenta inmediatamente que hemos cometido un
error. El editor vi facilita mecanismos para deshacer acciones de comandos previos.
Es muy recomendable guardar los cambios que se van realizando de una forma regular. Para ello
se utiliza:w
Si decides que no quieres sobrescribir el fichero que estás editando, sino que quieres guardar los
cambios como un fichero nuevo, añade al comando :w el nombre del nuevo fichero, :w
nuevo_fichero2
Abandonando vi
Para dejar vi se utiliza, ZZ Guarda los cambios en el fichero original, y vuelve al intérprete de
comandos
• Scroll de pantalla
Los comandos para avanzar una pantalla arriba y abajo (12 líneas) son
ctrl-g
• Búsqueda
• Borrar texto
El comando dw borra la palabra actual. Nótese que el comando de borrado comienza por d,
seguido por el ámbito de aplicación (d para una línea, w para una palabra (word en inglés)).
• Quitar y poner
Cuando se borra algo, es almacenado en un buffer temporal. El contenido de este buffer puede ser
accedido y 'puesto' o pegado en cualquier sitio del texto.
nyw guarda en la memoria intermedia n palabras contadas desde la posición del cursor.
y$ guanda en la memoria intermedia desde la posición del cursor hasta el final de la línea.
yy guarda en la memoria intermedia la línea entera en la que se encuentra el cursor.
yn guarda en la memoria intermedia n+1 líneas desde la línea actual.
Tema 4: Dispositivos, sistemas de ficheros Linux, estándar de jerarquía del sistema de ficheros
Particionar un disco es como dividirlo en discos más pequeños contenidos dentro de la misma
carcasa.
Las particiones pueden ser de dos tipos: primarias o lógicas, las particiones lógicas se crean dentro
de una partición primaria especial llamada extendida.
Como mínimo en un disco debe de haber una partición primaria y como máximo puede haber cuatro
particiones primarias o tres primarias y una extendida, no puede haber más de una partición
extendida en un mismo disco duro.
Dentro de una partición extendida puede haber todas las particiones lógicas que queramos.
Cada partición puede contener un sistema de archivos diferentes.
Un sistema de archivos establece los mecanismos para acceder a los datos que contiene y permite
o no el acceso a dichos datos en determinadas circunstancias y en caso de alguna inconsistencia
posibilita medios para su restauración.
Existen diferentes sistemas de archivos y cada sistema operativo soporta diferentes sistemas de
ficheros, algunos de ellos son los siguientes:
GParted es un editor de particiones para Linux con el que podemos crear, borrar y redimensionar
particiones. También podemos crear el sistema de ficheros que tendrá cada partición. Con la versión
actual de Gparted 0.4.3 podemos crear los siguientes sistemas de ficheros:
GParted Es muy fácil e intuitivo de usar, muchas distribuciones Linux lo incluyen en su live CD, entre
ellas Ubuntu.
Una vez que tenemos creadas nuestras particiones en nuestro disco y formateadas con el sistema
de archivos que van a utilizar, para poder utilizar dichas particiones en Linux, tenemos que hacer un
paso más, que es crear como mínimo el punto de montaje para el directorio raíz (/). Linux utiliza una
estructura de directorios jerarquizada en forma de árbol invertido en donde todo es tratado como
si fuera un archivo y para poder acceder a él debe estar acoplado (montado) dentro de esa
estructura de directorios encabezada por el directorio raíz.
La interfaz gráfica de instalación de cualquier “distro” de linux nos permite montar el directorio raíz
del sistema donde se instalarán los archivos más importantes del sistema operativo, pero también
podemos crear otros puntos de montaje como /home (que es como la carpeta Mis documentos de
Windows pero mucho más potente) en otra partición diferente, de esta manera si formateamos la
partición donde está el sistema operativo, mis documentos (tú /home) quedará a salvo y tus datos
no se perderán.
En el tutorial sobre como instalar Ubuntu 9.04 paso a paso se explica cómo establecer puntos de
montaje en la instalación del sistema operativo.
He dicho antes que en Linux todo es tratado como un archivo, es decir, si tenemos una disquetera,
un lector de DVD, un disco externo, etc. para que podamos acceder a estos dispositivos antes tienen
que estar montados como un archivo más.
Después de la instalación del sistema operativo podemos montar o desmontar los dispositivos o
archivos que queramos, si no sabes cómo hacerlo mira el tutorial que hay sobre comandos
Unix/Linux que hay “montado” en este mismo sitio web.
Para la instalación de Linux, ya sea de la distribución que sea, se necesita como mínimo dos
particiones: la principal, donde se instalará el sistema operativo, formateada con el sistema de
archivos que permita la distribución que vayamos a instalar y otra partición llamada swap
(intercambio de memoria virtual), esta partición es utilizada como memoria RAM virtual cuando
tenemos muchas aplicaciones abiertas y la memoria RAM de nuestro ordenador es insuficiente, de
tamaño del swap se suele poner el doble de la memoria RAM, es decir, si tenemos 250 Mb de
memoria RAM el tamaño del swap debería de ser aproximadamente de 500 MB, pero estas cifras
están pensadas para equipos con poca memoria. Por ejemplo, si te has comprado un equipo nuevo
con 4GB de memoria RAM, no es obligatorio que ponga 8GB para el swap. También hay que
considerar que si instalas Linux en un equipo con poca memoria y haces mucho uso del swap, tu
ordenador se volverá más lento ya que se tarda más tiempo en leer y escribir del disco duro que de
la memoria física RAM, en este caso deberías reconsiderar el ampliar la memoria RAM de tu
ordenador.
Los sistemas de ficheros pueden enfermar de varias maneras: pueden verse desboradados por
exceso de información, pueden estar ajustados por el sistema de manera inapropiada o pueden
corromperse por culpa de drivers defectuosos o errores del hardware. En Linux existen varias
herramientas que ayudan a vigilar el estado, ajustar el rendimiento y reparar los sistemas de
ficheros. Muchas de estas herramientas deben ejecutarse cuando el sistema de ficheros no esté
montado, si lo hacemos con el sistema montado puede derivar en corrupción de datos.
Los sistemas de ficheros son grandes estructuras de datos y sirven para almacenar datos en un disco
de manera indexada; incluyen restricciones de diseño y, en muchos casos, no hay opción posible
ante tales restricciones. Existen herramientas que ayudan a definir las opciones del sistema de
ficheros que afectan al rendimiento. Las tres principales son: dumpe2fs, tune2fs y debugfs. La
primera de ellas proporciona información y las otras dos permiten cambiar las opciones del sistema
de ficheros. Esto es particularmente útil en sistemas de ficheros ext2fs, ext2fx y ext4fs.
El comando dumpe2fs proporciona información sobre el sistema de ficheros y tiene una sintaxis
muy sencilla:
El dispositivo es el fichero del dispositivo del sistema de ficheros; por ejemplo, /dev/hda2 o
/dev/sdb7 acepta varias opciones y la mayoría son poco conocidas. La más importante
probablemente sea -h, que omite la información sobre los descriptores de grupos; esta información
no se utiliza para ajustes básicos, sino para la depuración del sistema de ficheros. Este comando
devuelve una información, como por ejemplo la fecha de la última comprobación, el número de
nodos índice soportado por el sistema de ficheros, etc.
# xfs_info /dev/sda7
También se le puede pasar el punto de montaje, que requiere que el sistema de ficheros este
montado. La información que devuelve es bastante técnica, relacionada en su mayor parte con los
tamaños de bloque, tamaños de sectores, etc.
Otra herramienta es xfs_metadump, que copia los metadatos del sistema de ficheros (nombres,
tamaño de ficheros, etc.) en un fichero. Este comando no copia el contenido real del fichero, está
pensado como herramienta para la depuración.
El programa tune2fs permite cambiar parámetros del sistema de ficheros de los que informa
dumpe2fs, su sintaxis es muy sencilla:
A pesar de parecer sencillo, resulta de una enorme complejidad, ya que cada una de las
características que permite ajustar tune2fs requiere una opción propia:
Ajustar el número máximo de montados: los sistemas de ficheros de Linux realizan una
comprobación periódica para evitar que los errores no detectados acaben afectando al disco. -c
montados nos permite ajustar el número máximo de veces que un disco puede montarse sin
comprobación. Se puede también engañar al sistema para que crea que el disco ha sido montado
un número de veces determinado con la opción -C montados.
Ajustar el tiempo entre comprobaciones: las comprobaciones de disco se hacen en función del
tiempo y número de montados. Se puede modificar este intervalo de tiempo con la opción -i
intervalo; este intervalo debe ir acompañado de “d,w o m” para especificar días, semanas o meses.
Añadir un respaldo de transacciones: -j añade un respaldo de transacciones al sistema de ficheros,
convirtiendo un sistema de ficheros ext2 en un ext3.
Definir los bloques reservados: -m porcentaje define el porcentaje de disco que se reserva para que
lo utilice root. Por defecto es 5%, algo excesivo para discos duros grandes. Deberíamos asignar cero
a los discos extraibles utilizados para almacenar ficheros. También se puede definir este espacio
reservado en bloques con la opción -r bloques.
Tune2fs dispone de muchas más opciones; no se debe utilizar con el sistema de ficheros montado.
En XFS un comando parecido seria xfs_admin, y algunas de sus opciones son las siguientes:
Utilizar la versión dos del formato del respaldo de transacciones: se activa con la opción -j y puede
mejorar el rendimiento en determinadas situaciones.
Obtener la etiqueta y el UUID del sistema de ficheros: la opción -l nos devuelve la etiqueta del
sistema de ficheros y la opción -i su UUID. En GNU/Linux rara vez se utiliza el nombre, sino que se
suele utilizar el UUID, un código largo que se utiliza por las distribuciones para especificar el sistema
de ficheros a montar.
Definir la etiqueta y el UUID del sistema de ficheros: la opción -L etiqueta cambia la etiqueta del
sistema de ficheros; la opción -U UUID modifica el UUID del disco. El nombre de la etiqueta tiene,
como máximo, 12 caracteres; en el caso de el UUID, se puede utilizar el mismo que tenía antes de
ser formateado, pero también se puede utilizar el valor generate para xfs_admin cree una nueva
UUID.
# debugfs /dev/hda2
debugfs:
Mostrar información del superbloque del sistema de ficheros: show_super_stats o stats genera
información similar a lo que muestra dumpe2fs.
Mostrar la información del nodo índice: stat nobrefichero muestra los datos del nodo índice en un
fichero o directorio.
Deshacer el borrado de un fichero: escribiendo undelete inode nombre, donde inode es el número
de nodo índice del fichero borrado y nombre es el nombre de fichero que queremos darle (se puede
usar undel en lugar de undelete). Esta función es limitada, ya que, si no conocemos el número del
nodo índice del fichero que queremos recuperar, no nos sirve de nada. Para obtener una lista de los
nodos índice borrado escribiremos lsdel o list_deleted_inodes, lo malo es que puede que no
proporcione suficientes pistas para poder encontrar el fichero deseado.
Extraer un fichero: podemos extraer un fichero del sistema de ficheros escribiendo write fichero-
interno fichero-externo, donde fichero–interno es el fichero del sistema de ficheros que se manipula
y fichero–externo es el nombre de un fichero del sistema Linux principal. Este recurso es útil si el
sistema de ficheros tiene daños serios y queremos extraer un fichero crítico sin montar el sistema.
Manipular ficheros: se puede cambiar de directorio con cd, crear enlaces con ln, eliminar un fichero
con rm, etc.
Obtener ayuda: para generar un resumen de los comandos disponibles, escribiremos list_request,
lr, help o ?.
Salir: quit saldrá del programa.
Estas son sólo algunas de las posibilidades de debugfs; en manos de un experto, esta herramienta
permite recuperar un sistema de ficheros muy dañado o, al menos, extraer información crítica de
éste. No se debe utilizar esta herramienta en un sistema de ficheros montado.
El equivalente XFS más cercano a debugfs es xfs_db, que proporciona una herramienta interactiva
para acceder a un sistema de ficheros y manipularlo. Lo malo de xfs_db es que es una herramienta
sólo para expertos en XFS.
Los sistemas de ficheros sin respaldo de transacciones como ext2fs proporcionan un buen
rendimiento, pero tienen una gran limitación tras un corte de corriente, una caída del sistema u otro
apagado súbito, ya que el sistema de ficheros podría quedar en un estado inconsistente, lo que
provoca que haya que comprobar todo el disco de forma automática cuando se inicia el sistema,
esto puede prolongarse en el tiempo.
Para evitar esto, existen los sistemas de ficheros con respaldo de transacciones que mantienen un
registro que describe las operaciones pendientes. GNU/Linux describe en este registro lo que va a
hacer antes de realizar la acción; el resultado es que, si se cae el sistema o falla la alimentación, el
sistema examina el registro y revisa sólo las tareas descritas en él; si se encuentra en estado
inconsistente, el sistema puede revertir los cambios comprobando sólo las estructuras de datos
descritas en el registro de forma automática al iniciar el sistema, lo que ayuda a que la recuperación
del sistema se haga en mucho menos tiempo.
Hoy en día, este método de respaldo de transacciones suele ser el estándar en GNU/Linux, pero
también nos podemos encontrar particiones pequeñas y medios extraibles que no utilicen este
método. Hay cuatro sistemas de ficheros de GNU/Linux que utilizan respaldo de transacciones:
ext3fs, ReiserFS, XFS y JFS.
ext3fs es similar a ext2fs, pero con respaldo de transacciones incorporado. Esto significa que, con la
opción -j de tune2fs, podremos convertir un sistema de ficheros ext2 en un ext3. Sin embargo, para
poder utilizar este respaldo de transacciones, deberemos montar el sistema de ficheros con el
código ext3 en vez de ext2. El resultado de crear este respaldo de transacciones es un fichero
.journal que contiene el registro.
El respaldo de transacciones tiene su propio conjunto de parametros que se definen con la opción -
J de tune2fs. Las subopciones size=tamño-registro y device=registro-externo permiten definir el
tamaño del registro y el dispositivo donde almacenarlo; por defecto, se crea un registro con el
tamaño adecuado para el sistema de ficheros y se almacena en éste.
Esta es una tarea que probablemente tengamos que realizar de vez en cuando, por ejemplo en busca
de errores del sistema de ficheros. Si dejamos sin revisar durante mucho tiempo el sistema de
ficheros, puede derivar en pérdidas de datos. GNU/Linux incluye diversas herramientas para
comprobar la integridad de un sistema de ficheros, la principal para este fin se llama fsck, que es
una interface de usuario para otras herramientas como: e2fsck, xfs_check o xfs_repair, la sintaxis
de fsck es la siguiente:
Revisar todos los ficheros: -A hace que se verifiquen todos los sistemas de ficheros marcados para
revisión en /etc/fstab. Esta opción se suele utilizar en scripts de inicio del sistema.
Indicar el progreso: -C muestra un indicador de progreso en modo texto del proceso de revisión,
esta opción se incluye también en e2fsck.
Mostrar una salida detallada: -V produce una salida detallada del proceso de revisión, -N le dice a
fsck que muestre lo que haría sin hacerlo realmente.
Definir el tipo de sistema de ficheros: se puede forzar el tipo de sistema de ficheros con el indicador
-t tiposf(sf=sistema de ficheros); junto con -A, se comprobarán sólo los sistemas de ficheros que
coincidan con el tipo especificado y, si lleva el prefijo “no” delante de tiposf, revisará todos excepto
el que coincida con tiposf.
Opciones específicas del sistema de fichero: FSCK le pasa opciones que no entiende o aquellas que
llevan doble guion (–) al programa de revisión subyacente. Algunas de las opciones más habituales
son -a o -p que, realizan una comprobación automática, -r realiza una comprobación interactiva y -
f fuerza una comprobación completa del sistema de ficheros, incluso en el caso de que el sistema
de ficheros parezca inicialmente limpio.
Listas de sistemas de ficheros: es el parámetro final del comando y se pueden definir uno o varios
sistemas de ficheros,.
FSCK se suele ejecutar solo con el nombre del dispositivo. Debemos asegurarnos de que el sistema
de ficheros no se encuentra montado, ya que, de lo contrario, podría derivar en una corrupción del
sistema de ficheros. Se ejecuta automáticamente al iniciarse el sistema sobre las particiones
marcadas en /etc/fstab realizando sólo un rápido examen superficial. El resultado es que el proceso
de comprobación durante el inicio no retrasa el arranque del sistema, a no ser que no se haya
apagado adecuadamente.
Existen un par de excepciones a esta regla de inicio: si el disco lleva sin ser revisado más tiempo del
establecido (normalmente 6 meses) o si el sistema de ficheros se montó más de un cierto número
de veces (normalmente 20), el sistema realizará una comprobación completa del disco durante el
arranque del sistema y, por tanto, veremos que se realizan comprobaciones del sistema de ficheros
aunque el sistema se haya apagado correctamente.
ext2fs y ext3fs necesitan programas revisores que corrijan problemas de escritura, errores,
problemas de hardware y motivos similares. Si detectamos un comportamiento extraño en un
sistema de ficheros con respaldo de transacciones, deberemos desmontarlo y realizar una
comprobación.
En GNU/Linux existen herramientas para comprobar el espacio que consumen los ficheros, ya que
uno de los problemas más comunes de los discos es que se pueden llenar. Esta tarea es llevada a
cabo por los programas: df que resume el uso de disco en función de las particiones, y du, que lo
hace en función de los directorios.
# df [opciones] [ficheros]
En el caso más simple, escribiremos el nombre del comando para ver un resumen del espacio en
disco utilizado en las particiones, lo que nos mostrará el fichero de dispositivo asociado al sistema
de ficheros (por ejemplo /dev/sda1), el espacio utilizado y el espacio libre en éste, así como el
porcentaje de espacio en uso y el punto de montado. El límite apropiado de uso de espacio en el
disco varía dependiendo del tipo de partición, aunque normalmente deberíamos pensar en limpiar
la partición cuando el espacio en uso supera el 80%.
df puede modificar su salida con varias opciones y cada una lo hace de un modo específico:
Incluir todos los sistemas de ficheros: -a o –all incluyen pseudo sistemas de ficheros con tamaño
cero entre los que se pueden encontrar /proc, /sys y otros.
Utilizar unidades a escala: -h o –human-readable muestran una escala en el tamaño entendible por
los humanos; no utilizan bloques, sino medidas conocidas para resumir el tamaño de los ficheros. -
H o –si tienen un efecto similar, pero utilizan potencias de 10 en lugar de en potencias de 2. Las
opciones -k o –kilobytes y -m o –megabytes fuerzan la salida en sus unidades respectivas.
Obtener información sobre los nodos índice: -i o –inodes nos ayudan a obtener información sobre
los nodos índice, lo que puede ser de mucha utilidad si tenemos muchos ficheros pequeños que
pueden agotar los nodos índice disponibles antes que el espacio disponible en disco. Esta opción
funciona bien con sistemas de ficheros que crean un número fijo de inodos (ext2, ext3, xfs, etc); sin
embargo, en sistemas de ficheros que crean inodos dinámicamente (Reisefs, …), esta opción pierde
sentido.
Sólo sistemas de ficheros locales: -l o –local hacen que se omitan los sistemas de ficheros en red, lo
que acelera el funcionamiento.
Mostrar el tipo de sistema de ficheros: -T o –print-type mostrarán el tipo de sistema de ficheros.
Limitar por tipo de sistema de ficheros: -t tiposf o –type=tiposf muestran información sobre los
sistemas de ficheros del tipo especificado. -x tiposf o –exclude-type=tiposf excluyen los sistemas de
ficheros del tipo especificado.
La herramienta du permite refinar el diagnóstico y seguir el rastro a los directorios y ficheros que
están acaparando el espacio en disco, su sintaxis es similar a df:
# du [opciones] [directorios]
du busca los directorios especificados de forma recursiva e informa de cuánto espacio consume
cada uno y todos sus subdirectorios; tiene opciones para reducir el tamaño de la salida y realizar
algunas tareas útiles:
Indicar los ficheros además de los directorios: -a o –all harán que se informe sobre el espacio
utilizado por los ficheros de forma individual.
Hallar la suma total: -c o –total añaden una suma total al final de la salida.
Utilizar unidades a escala: -h o –human-readable muestran una escala en el tamaño entendible por
los humanos; no utilizan bloques, sino medidas conocidas para resumir el tamaño de los ficheros. -
H o –si tienen un efecto similar, pero utilizan potencias de 10 en lugar de en potencias de 2. Las
opciones -k o –kilobytes y -m o –megabytes fuerzan la salida en sus unidades respectivas.
Contar los enlaces de referencia: -l o –count-links hacen que du cuente individualmente cada enlace
de referencia que aparece. Normalmente, cuentan los ficheros que aparecen varias veces como
enlaces de referencia una sola vez.
Profundidad límite: –max-depth=n limita el informe a n niveles; los contenidos de los subdirectorios
son contados aunque no se informe sobre ellos.
Resumir: -s o –summarize evitan que obtengamos una línea de salida por cada subdirectorio y
muestran sólo aquellos ficheros y directorios que hallamos especificado.
Si hacemos una comprobación para saber el espacio consumido por un usuario en /home y
descubrimos que este consumo de espacio es un problema, deberíamos contactar con el usuario en
lugar de intentar limpiarlo nosotros. Debemos tener cuidado con qué ficheros borramos a pesar de
su tamaño, ya que algunos podrían ser ficheros de programa que se deberían eliminar a través del
sistema de administración de paquetes.
Dentro de GNU/Linux, los sistemas de ficheros se utilizan con más frecuencia al montarse, es decir,
asociarse con un directorio. Esto se puede hacer una única vez empleando herramientas como
mount (y desmontándolos después con umount) o de manera permanente en cada reinicio,
modificando el fichero /etc/fstab.
Linux posee el comando mount para montar un sistema de ficheros en un punto de montado. El
comando umount invierte este proceso. En la práctica, no es complicado utilizar estos comandos,
aunque admiten un gran número de opciones.
Montar todos los sistemas de ficheros: -a hace que se monten todos los sistemas de ficheros listados
/etc/fstab.
Montar en modo sólo lectura: -r hace que se monte el sistema de ficheros en sólo lectura, aunque
se trate de un sistema de ficheros de lectura/escritura.
Mostrar una salida detallada: -v produce una salida detallada donde se incluyen comentarios sobre
las operaciones mientras tienen lugar.
Montar en modo lectura/escritura: -w monta el sistema de ficheros para operaciones de lectura y
escritura; es el comportamiento por defecto para la mayoría de los sistemas de ficheros, aunque
algunos drivers experimentales sólo funcionan en modo lectura.
Especificar el tipo de sistema de ficheros: -t tiposf sirve para especificar el tipo de sistema de
ficheros; los más comunes son ext2 (para ext2fs), ext3 (para ext3fs), ext4dev (para ext4), reiserfs
(para ReiserFS), jfs (para JFS), xfs (para XFS), vfat (para FAT con nombres largos de ficheros), msdos
(para FAT con 8 letras y 3 para la extensión), iso9660 (para sistemas de ficheros de CD-Rom), udf
(para sistemas de ficheros de DVD y algunos CD-Rom), nfs (para montados en red NFS), smbfs (para
compartir en red smb/cifs) y cifs (driver más reciente para compartir en red smb/cifs)… Se admiten
muchos otros y, si omitimos el parámetro, se intentará detectar el sistema de ficheros
automáticamente.
Montar por etiqueta o UUID: -L etiqueta y -U UUID indican que se debe montar el sistema de ficheros
con la etiqueta o el UUID especificados, respectivamente.
Opciones adicionales: -o permite añadir muchas opciones específicas del sistema de ficheros.
Dispositivo: es el nombre del fichero del dispositivo asociado a la partición o el dispositivo de disco;
este parámetro suele ser obligatorio, aunque se puede omitir en ciertas circunstancias.
Punto de montado: es el directorio al que se debe asociar el contenido del dispositivo, suele ser
obligatorio pero se puede omitir en ciertas circunstancias.
Linux suele hacer un buen trabajo de detección del tipo de sistema de ficheros y los parámetros por
defecto se suelen comportar razonablemente bien; sólo root puede ejecutar el comando mount,
pero si en el /etc/fstab se especifican las opciones user, users, u owner, un usuario normal podría
montar un sistema de ficheros indicando únicamente el dispositivo o el punto de montado, aunque
no podría indicar ambos.
Los dispositivos extraíbles se suelen montar de forma automática y, en los entornos GUI, se puede
abrir un explorador de archivos para el disco insertado. Para expulsar el disco, el usuario empleará
umount o una opción del entorno GUI del equipo.
El archivo /etc/mtab registra los sistemas de ficheros montados. Posee un formato similar a
/etc/fstab, pero no se trata de un fichero de configuración, podríamos examinarlo para determinar
qué sistemas de ficheros están montados (df es otro medio para conocer este dato).
Opciones de mount
Al añadir opciones específicas del sistema de ficheros, necesitaremos utilizar parámetros especiales
(a través de -o o en /etc/fstab). Algunas de estas opciones sólo tienen sentido en el fichero
/etc/fstab.
SIstemas de ficheros
Opción Descripción
soportados
Hace que se utilicen las opciones por defecto del sistema
defaults Todos de ficheros, se incluye principalmente en el fichero
/etc/fstab.
Usa el dispositivo de circuito cerrado, permite montar un
loop Todos
fichero como si se tratase de una partición de disco.
Monta o no monta el sistema de ficheros en tiempo de
auto o arranque o cuando root ejecuta e comando mount -a.
Todos
noauto Por defecto es auto pero la adecuada para los
dispositivos extraibles es noauto, se utiliza en /etc/fstab.
Permite o impide a los usuarios normales el sistema de
ficheros por defecto es nouser pero para los medios
user o extraibles es user, se utiliza en /etc/fstab y permite a los
Todos
nouser usuarios montar un disco escribiendo mount
/punto_de_montado y solo el usuario que lo monto
puede desmontarlo.
Es como users pero cualquier usuario puede desmontar
users Todos
un sistema de ficheros una vez montado.
Es similar a user pero el usuario debe ser el propietario
owner Todos
del fichero del dispositivo.
Cambia una o más opciones del montado sin desmontar
una partición explicitamente, se puede utilizar para
remount Todos
activar o desactivar el acceso en modo escritura a una
partición, por ejemplo.
Especifica un montado en modo solo lectura, es la
opción por defecto para algunos sistemas de ficheros en
ro Todos
los que el soporte no es particularmente fiable en modo
escritura.
Para buscar información sobre opciones adicionales que soportan los sistemas de ficheros,
consultaremos la página MAN de mount o la documentación de los sistemas de ficheros que se
encuentra en /usr/src/linux/Documentation/filesystems o /usr/src/linux/fs/nombrefs (nombrefs es
el nombre del sistema de ficheros).
• Uso de umount
El comando umount es más sencillo que mount; la sintaxis básica de umount es la siguiente:
La mayoría de los parámetros son similares a los de mount, pero hay excepciones:
Desmontar todos: -a hace que el sistema intente desmontar todas las particiones /etc/mtab (es el
fichero que contiene los sistemas de ficheros montados). Si el sistema se ejecuta con normalidad,
esta operación sólo tendrá un éxito parcial, ya que no podrá desmontar algunos sistemas de ficheros
clave, como la partición raíz (/).
Forzar el desmontado: -f fuerza una operación de desmontado que fallaría en condiciones normales:
es útil cuando se desmontan servicios compartidos por servidores NFS que han quedado fuera de
alcance.
Pasar a modo sólo lectura: -r indica que si no se puede desmontar un sistema de ficheros, se debe
volver a intentar montar éste en modo sólo lectura.
Desmontar particiones de un tipo específico de sistema de ficheros: -t tipofs indica que se
desmonten sólo las particiones del tipo especificado; se pueden indicar varios tipos de sistema de
ficheros separándolos con comas.
El dispositivo y el punto de montado: sólo debemos especificar uno de ellos, no los dos.
Para que los usuarios normales puedan utilizar umount, la partición o el dispositivo deben estar
listados en /etc/fstab, con la opción user, users u owned especificada; estas opciones son más útiles
con los dispositivos extraíbles.
No debemos extraer un medio externo sin desmontarlo previamente con el comando umount o con
las herramientas GUI, ya que Linux guarda en caché el acceso a la mayoría de sistemas de ficheros,
lo que significa que puede que los datos no se escriban en disco hasta pasado un cierto tiempo tras
escribir el comando de escritura. El medio extraíble no debe tener muestras de indicadores de
actividad si queremos retirarlo.
Montar sistemas de ficheros de manera permanente
El fichero /etc/fstab controla cómo proporciona Linux acceso a las particiones de disco y a los
dispositivos extraíbles. En Linux, cada dispositivo de disco (partición o disco extraíble) se monta en
un punto en particular del árbol de directorios. El fichero /etc/fstab describe cómo se disponen estos
sistemas de ficheros. El contenido del fichero consiste en una serie de líneas que contienen seis
campos cada una. Cada campo está separado por uno o más espacios o tabulaciones y las líneas que
comienzan por almohadilla (#) son comentarios y se ignoran. El significado de cada campo es el
siguiente:
Dispositivo: es la primera columna y suele contener los nombres de fichero de dispositivo o,
actualmente, en la mayoría de las distribuciones se especifica el UUID o las etiquetas. Este método
ayuda a reducir los problemas en caso de que cambien los números de partición. También es posible
listar un dispositivo de red, como en server:/home, que es la exportación de /home en el ordenador
llamado server o //winsrv/shr que es el shr compartido en el servidor Windows o SAMBA llamado
winsrv.
Punto de montado: es la segunda columna donde se especifica dónde se montará la partición o el
disco, que normalmente es un directorio vacío.
Tipo de sistema de ficheros: es la tercera columna, es el mismo código de tipo que utiliza umount,
un valor auto para este código permite al kernel detectar automáticamente el tipo de sistema de
ficheros. Es muy cómodo para los dispositivos extraíbles, sin embargo, no funciona en todos los
sistemas de ficheros.
Opciones de montado: es la cuarta columna y permite especificar opciones que modifican el modo
en que el kernel trata al sistema de ficheros. Se pueden especificar varias opciones separadas por
coma, opciones de montado que son las mismas que para el comando mount.
Copia de seguridad: el quinto campo contiene un “1” si la utilidad dump debe hacer una copia de
seguridad de la partición o un “0 (cero)” en caso contrario. Si no se utiliza la opción dump para copias
de seguridad, esta opción carece de sentido, pero está incluida, ya que dump era una herramienta
habitual.
Orden de revisión del sistema de ficheros: la sexta columna indica que se debe emplear el programa
fsck para revisar la integridad del sistema de ficheros durante el inicio. Se puede especificar el orden
de la revisión: 1 para la de más prioridad, y 2 para las que se revisan a continuación. El valor 0 (cero)
significa que no se debe revisar el sistema de ficheros, algo util para sistemas de ficheros como
ReiserFS.
Si añadimos un nuevo disco duro o tenemos que volver a particionar uno que ya tenemos, es
probable que necesitemos modificar /etc/fstab. También puede que necesitemos modificar algunas
opciones. Si queremos darle a los usuarios normales la capacidad de montar determinadas
particiones o dispositivos extraíbles, crearemos una entrada normal en /etc/fstab, asegurándonos
de añadir las opciones user, users u owner.
Como ocurre con cualquier otro sistema de ficheros, se deben proporcionar los puntos de montado
para los dispositivos que puede montar el usuario. Los medios extraíbles se suelen montar en /mnt
o /media.
La mayoría de los recursos compartidos de smb/cifs requieren un nombre de usuario y contraseña
como medio de control de acceso. Para solucionar esto, usaremos las opciones username=nombre
y password=contraseña. Estas opciones no son recomendables, ya que dejan al descubierto la
contraseña, que cualquiera puede leer en /etc/fstab. La opción credentials=fichero ofrece una
alternativa, ya que podemos hacer que Linux apunte a un fichero que contenga el nombre y la
contraseña y darle permisos para que sólo pueda leerlo root y quiza el usuario de smb/cifs.
Las cuotas requieren soporte tanto en el kernel, para el sistema de ficheros utilizado, como en varias
utilidades del espacio de usuario. ext2fs, ext3fs, ReiserFS, JFS y XFS admiten cuotas. Se debe activar
explícitamente el soporte en el kernel mediante la opción quota support, que en la mayoría de las
distribuciones viene con este soporte precompilado.
Hay dos sistemas de soporte para cuotas: el del kernel 2.4.x, que se conoce como soporte quota v1
y el del kernel 2.6.x, que se conoce como sistema quota v2. Fuera del kernel, necesitaremos
herramientas de soporte para ampliar cuotas: para el sistema quota v2 el paquete se suele
denominar quota e instala varias utilidades, ficheros de configuración, scripts de inicio sys v, etc.
Para emplear las cuotas se deben activar en las entradas de /etc/fstab; más concretamente,
utilizaremos la opción usrquota para emplear cuotas de usuario y la opción grpquota para las cuotas
de grupo. Las entradas configuradas presentan un aspecto parecido al siguiente:
Dependiendo de la distribución, puede que sea necesario configurar los scripts de inicio del paquete
quota para que se ejecute al inicio del sistema. Para activar el soporte de cuotas una vez instalado
el paquete quota, ejecutaremos el comando quotaon.
Una vez instalado el software y realizados los cambios en el fichero de configuración, se debe activar
el sistema de quotas reiniciando el sistema si hemos compilado el kernel a mano; en caso contrario,
debería bastar con modprobe para instalar el modulo del kernel, tras lo que será necesario volver a
montar los sistemas de ficheros en los que se hallan activadas las cuotas, escribiendo mount -o
remount /punto-montado.
Para establecer las cuotas después de activarlas, se puede hacer utilizando edquota, que inicia el
editor vi con un fichero de configuración temporal (/etc/quotatab) que controla las cuotas para el
usuario especificado. Cuando cerremos la utilidad edquota, se escribirá la información de las cuotas
de disco en las estructuras de datos de bajo nivel del disco. El comando edquota se emplea seguido
del nombre de usuario del que queremos editar las cuotas.
/etc/quotatab informa sobre el número de bloques de disco en uso y el número de nodos índice
(inodos) en uso. Un número límite de nodos índice es el límite del número de ficheros de los que
puede ser propietario un usuario, mientras que el tamaño de bloques de un disco varía dependiendo
del tipo de sistema de ficheros y las opciones de creación de éste. Se pueden alterar los límites
flexible (soft limit) y estricto (hard limit) tanto para bloques como para nodos índice.
Límite estricto (hard limit): es el número máximo de bloques o nodos índice que puede consumir el
usuario; el kernel no permitirá sobrepasar estos límites.
Límite flexible (soft limit): son menos restrictivos y los usuarios pueden exceder temporalmente
estos valores durante el tiempo de gracia; el sistema emitirá avisos y cuando se termine este tiempo
y no le permitirá crear más ficheros. El periodo de gracia se define con la opción -t del comando
edquota para todo el sistema de ficheros, no para cada usuario.
Otros comandos útiles son:
quotacheck: verifica y actualiza la información de la cuota en los discos con cuota activada. Se
ejecuta normalmente como parte del script de inicio, pero se puede ejecutar periódicamente como
una tarea cron. También se encarga de asegurar que la contabilidad de las cuotas sea la adecuada.
repquota: resume la información de las cuotas del sistema de ficheros especificado o de todos los
sistemas de ficheros con la opción -a. Es una herramienta útil para seguir la pista del uso de disco.
La herramienta quota recibe opciones que modifican su salida, como por ejemplo -g, que muestra
las quotas de grupo; -l, que omite los montados NFS; y -q, que limita la salida a los sistemas de
ficheros cuyo uso sobrepase el límite establecido.
La seguridad de los ficheros reside en la propiedad y los permisos de éstos. La propiedad carece de
sentido sin permisos que hagan uso de ella, los permisos se basan en la asistencia de la propiedad.
La propiedad tiene 2 capas: cada fichero tiene un propietario individual y puede estar asociado a un
grupo. Ambos tipos de propiedad permiten ofrecer tres capas de permisos de acceso de control:
para el propietario, para el grupo y para todos los demás.
Para conocer el propietario de un fichero usaremos el comando ls -l, que genera un listado largo
que incluye información sobre la propiedad y el permiso de los ficheros. En la mayoría de los casos,
los nombres de usuario asociados a los ficheros son los mismos que los nombres con los que éstos
acceden. Algunos servidores tienen cuentas propias y pueden ser propietarios de ficheros
específicos del servidor. Si borramos una cuenta, los ficheros de ésta no se perderán, pero sí el
nombre de la cuenta.
El superusuario (root) puede cambiar el propietario de un fichero mediante el comando chown, cuya
sintaxis es la siguiente:
Nuevo propietario y nuevo grupo son el nuevo propietario y el nuevo grupo del fichero, se pueden
proporcionar ambos pero sólo se puede omitir uno de ellos. chown admite muchas opciones, pero
la más recursiva es -R o –recursive, que permite cambiar de propiedad un árbol de directorios
completo. Sólo root puede utilizar el comando chown; si trata de utilizarlo un usuario normal,
devolverá un mensaje de error.
El comando chgrp cambia el grupo de un fichero, lo pueden ejecutar tanto root como los usuarios
normales. Los usuarios sólo pueden cambiar el grupo de un fichero por un grupo al que pertenezcan.
Su sintaxis es la siguiente:
Este comando acepta muchas opciones, entre las que se incluyen -R o –recursive. Esta herramienta
es un subconjunto de funcionalidades de chown, pero la pueden utilizar los usuarios normales.
Son bastante complejos y, además de proporcionar acceso a los ficheros, también existen algunos
bits de permisos especiales que ofrecen unas funcionalidades poco habituales.
Esta cadena -rwxr-xr-x tiene diez caracteres de largo, el primer caracter es el código de tipo de
fichero y determina cómo interpretará Linux el fichero. La siguiente tabla resume los códigos de tipo
de linux:
Código Significado
Linux codifica en formato binario la información de los permisos, que se puede expresar como un
único número de 9 bits. Este número se suele expresar en formato octal (base 8) debido a que un
número en base 3 tiene 3 bits de longitud, lo que significa que la representación en base 8 de una
cadena de permisos tiene 3 dígitos de longitud que corresponden al propietario, el grupo y los
permisos globales. Los permisos de lectura, escritura y ejecución se corresponden con cada uno de
los bits. El resultado es que se pueden determinar los permisos añadiendo número en base 8.
Cadena de
Código octal Significado
permisos
El permiso de ejecución tiene sentido para los ficheros normales, pero no para el resto. Los
directorios utilizan el bit de ejecución de otra manera: si está definido significa que se puede buscar
en el contenido del directorio. Por eso, es difícil ver un directorio en el que el bit de ejecución no se
defina junto al de lectura. Si a un usuario se le da permiso para escribir en un directorio, este usuario
podrá crear, borrar o renombrar los ficheros del directorio aunque no sea el propietario de los
ficheros y no tenga permisos para escribir en ellos. Los enlaces simbólicos siempre tienen permisos
777, sin embargo, este acceso se aplica sólo al propio fichero del enlace y no al fichero enlazado. En
cambio, los permisos del enlace de referencia afectan al fichero enlazado.
La mayoría de las reglas de permisos no se aplican a root, por lo que puede leer o escribir en
cualquier fichero del ordenador, incluso en aquellos que tienen permisos 000, ya que root puede
cambiar los permisos de cualquier fichero. Hay algunos ficheros que pueden ser inaccesibles para
root, pero sólo porque existe una restricción subyacente, como por ejemplo que un disco duro no
esté instalado en el ordenador.
Existen unas cuantas opciones más para permisos que se pueden indicar mediante cambios en la
cadena de permisos:
Definir la ID de usuario (SUID): la opción set user id (suid) se utiliza junto a los ficheros ejecutables
e indica a Linux que ejecute el programa con los permisos del propietario del sistema, en lugar de
con los permisos del usuario que ejecuta el programa. Esto quiere decir que, si se define el bit suid
para un programa y root es propietario de este, cualquier usuario que ejecute el programa lo hará
con los privilegios de root. Los programas suid están indicados por una “s” en la posición del bit de
ejecución del propietario, como en rwsr-xr-x.
Definir la ID de grupo (SGID): la opción set group id (SGID) asigna el grupo del programa en
ejecución como grupo del fichero. Está indicado mediante una “s” en la posición del bit de
ejecución del grupo, como en, rwxr-sr-x. Si se define este bit en un directorio, los nuevos ficheros
o subdirectorios creados en él, heredarán el grupo propietario del directorio y no del usuario que
lo creó.
Todos estos bits de permisos especiales, sobre todo los programas suid, sgid y, en especial, suid
root, suponen riesgos potenciales para la seguridad. Algunos programas deben tener definido el
bit suid para funcionar correctamente, algo que no deberíamos hacer a menos que tengamos la
certeza de que es absolutamente necesario.
• Uso de ACL
Una lista de control de acceso (ACL) es una lista de usuarios o grupos y los permisos que tienen
asignados. Al igual que los permisos de propietarios, de grupo y globales, las ACL constan de 3 bits
para permisos de lectura, escritura y ejecución, el propietario del fichero puede asignar ACL a un
número arbitrario de usuarios y grupos, haciéndolas más flexibles que los permisos de Linux, que
están limitados a los grupos definidos por el administrador.
Actualmente, todos los sistemas de ficheros principales de Linux soportan ACL. Las ACL poseen sus
propios comandos para definirlas y visualizarlas. setfacl define una ACL y el comando getfacl
muestra la ACL de un fichero.
Con el comando chmod se pueden modificar los permisos de un fichero. Este comando se puede
ejecutar de varios modos para obtener el mismo efecto. Su sintaxis es:
Además de modificar los 3 dígitos de permisos del archivo, si al comando anterior se le añade un
cuarto bit al principio, se pueden definir permisos especiales: si añado un 4, definiremos el bit de la
ID de usuario (SUID); si añado un 2, definiremos la ID de grupo (SGID); y si añado un uno, definiremos
el sticky bit. Si omitimos el primer dígito como en el ejemplo anterior, Linux tomará los 3 bits como
bits para permisos y no como bits para permisos especiales.
El modo simbólico consta de tres componentes: un código que indica el conjunto de permisos que
deseamos modificar, un símbolo que indica si deseamos añadir, borrar o definir el modo del valor
indicado y un código que especifica cuál debería ser el permiso. Estos códigos distinguen entre
mayúsculas y minúsculas:
Permisos
Código del Código de
para
conjunto de Significado tipo de Significado Significado
modificar el
permisos cambio
código
definir igual
o global = x ejecución
que
ejecutar solo si el
fichero es un
a todos X directorio o tiene
permisos de
ejecución
s SUID o SGID
t sticky bit
permisos del
u propietario
existentes
permisos globales
o
existentes
Para utilizar los parámetros de los permisos simbólicos, combinaremos uno o más códigos de la
primera columna con un símbolo de la tercera columna y uno o más códigos de la quinta columna.
Se pueden combinar varios parámetros, separándolos por comas:
Cuando un usuario crea un fichero, por defecto, el propietario es el usuario que lo creó, y los
permisos por defecto los asigna el sistema. Estos permisos se pueden configurar y vienen definidos
por la máscara de usuario (umask), que se define con el comando umask. Como entrada, recibe un
valor octal que representa los bits a eliminar de los permisos 777 para los directros y los permisos
666 para los ficheros.
umask es una operación a nivel de bits; cualquier bit definido en la umask se elimina del permiso
final de los nuevos ficheros. Pero si un bit no está definido, su especificación en la umask no será
perjudicial. Los usuarios normales pueden introducir el comando umask para cambiar los permisos
de los nuevos ficheros que creen; root puede modificar la configuración de todos los usuarios en el
archivo /etc/profile. La definición en este archivo puede tener efecto o no, ya que puede ser
invalidada en otros puntos, como en los ficheros de configuración propios de los usuarios. La
mayoría de los sistemas Linux utilizan una umask por defecto de 002 o 022.
Para saber la umask actual, escribiremos umask sin parámetros y si le añadimos el parámetro -S la
obtendremos expresada simbólicamente en lugar de en forma octal. También podremos definir una
umask simbólicamente, como, por ejemplo, umask u=rwx, g=rx, o=rx, que es equivalente a umask
022.
Además de utilizar umask, los usuarios pueden cambiar su grupo por defecto nwegrp para crear
nuevos ficheros. Para esto, es necesario establecer un grupo diferente como grupo por defecto.
Para utilizar este comando, el usuario debe ser miembro del grupo especificado.
Algunos sistemas de ficheros nativos de Linux admiten varios atributos que se pueden ajustar con
el comando chattr:
Sólo añadir: el atributo “a” establece el modo añadir, que desactiva el acceso de escritura al fichero,
excepto para añadir datos, es útil para evitar cambios accidentales o maliciosos en los ficheros que
recompilan datos.
Comprimir: el atributo “c” hace que el kernel comprima los datos escritos en el fichero de forma
automática y los descomprima cuando se vuelvan a leer.
Inmutabilidad: el modificador “i” hace que un fichero sea inmutable. Es un paso más allá que
desactivar el acceso de escritura al fichero, ya que con este atributo, no se podrá borrar, no se
podrán crear enlaces al fichero y éste no se podrá renombrar.
Respaldo de transacciones para los datos: el modificador “j” le dice al kernel que registre todos los
datos escritos en el fichero. Mejora la recuperabilidad de los datos escritos en el fichero después de
una caída del sistema, pero puede ralentizar el funcionamiento. No tiene efecto en los sistemas de
ficheros ext2.
Borrado seguro: cuando borramos un fichero, se elimina su entrada de directorio y su nodo índice
se marca como disponible para su reciclado. Los bloques de datos que componen el grueso del
fichero no se borran, el modificador “s” cambia este comportamiento, cuando se borra el fichero,
el kernel pone a cero sus bloques de datos, algo que es recomendable para los ficheros que
contienen datos sensibles.
No fusionar colas: la fusión de colas (tail-merging) es un proceso en el que se fusionan algunos datos
pequeños del final de los ficheros que no llenan un bloque completo con elementos similares de
otros ficheros. Esto implica un menor consumo de espacio en disco, sobre todo si se almacenan
muchos ficheros pequeños y no unos cuantos grandes. El modificado “t” desactiva este
comportamiento. Es útil cuando el sistema de ficheros debe ser leído por drivers que no son del
kernel, como, por ejemplo, el GRUB.
No actualizar el tiempo de acceso: el atributo “A” hará que Linux no actualice la marca temporal de
acceso cuando se accede a un fichero. Esto puede reducir la entrada/salida de disco, lo que es útil
para aumentar la duración de la batería de los portátiles.
Las opciones se definen empleando los símbolos de la resta (-), de suma (+) o de igualdad (=). El
primer símbolo elimina una opción de un conjunto existente, el segundo la añade y el tercero define
un conjunto preciso de opciones, sobrescribiendo las que ya existen. Para añadir un modificador a
un fichero, lo haremos de la siguiente forma:
chattr +i archivo
chattr -i archivo
Enlaces Simbólicos
Un enlace simbólico (enlace blando, o acceso directo) es un archivo especial que contiene un
nombre de camino. Así, los enlaces blandos pueden apuntar a ficheros en sistemas de ficheros
diferentes (posiblemente montados por NFS desde máquinas diferentes, unidades extraibles), y no
tienen por qué apuntar a ficheros que existan realmente.
Un enlace simbólico permite dar a un fichero el nombre de otro, pero no enlaza el fichero con un
inodo, es decir, en realidad lo que hacemos es enlazar directamente al nombre del fichero. Los
enlaces simbólicos son ampliamente usados para las librerías compartidas.
Para comprendelo mejor, un "enlace simbólico" no es más que una referencia (enlace) a una carpeta
(directorio) o fichero que está situado en un lugar físico distinto.
La mejor forma de explicarlo es creando un enlace simbólico, pasemos a ello, el directorio publico
contiene varios documentos, y está localizado en /publico
ln -s /origen /enlace-a-origen
Entonces podemos crear un enlace simbólico desde donde nos encontramos escribiendo la ruta
completa con el siguiente comando:
ln -s /publico/2015 /home/pepe/enlace-a-publico
cd /home/pepe
ln -s /publico/2015 enlace-a-publico
Podemos comprobar los resultados por consola, si listamos veremos que el enlace tiene el carácter
l que lo identifica como enlace simbólico y se puede saber a que archivo están apuntando ya que se
muestra la ruta -->
ls -l /home/pepe/enlace-a-publico
Como se ve los bits de permisos en un enlace simbólico no se usan (siempre aparecen como
(rwxrwxrwx). En su lugar, los permisos del enlace simbólico son determinados por los permisos del
fichero o directorio apuntado.
Si intenta efectuar la orden chmod sobre el enlace simbólico recién creado, en realidad cambiará
los permisos del fichero al que apunta el enlace simbólico.
El comando anterior dará un mensaje de error, ya que el directorio 2015 no existe, esto significa
que ha podido crear un enlace simbólico al directorio aunque no exista.
ls -dl /publico/2015
Ahora no obtuvimos el error por que el directorio existe, si listamos vemos que el enlace simbólico
mantiene sus permisos y que el directorio /publico/2015 fue el que cambio los permisos, de 755 a
750.
ls -l /home/pepe/enlace-a-publico
ls -dl /publico/2015
A continuación vamos a crear un archivo, haciendo uso del enlace simbólico al directorio 2013:
touch /home/pepe/enlace-a-publico/mifichero
Esto crea un archivo en enlace-a-publico llamado mifichero, pero la ubicación de este archivo es
/publico/2015 vamos a listar para verlo.
ls -l /publico/2015
Hay que tener en cuenta, que si borramos el archivo o directorio origen, el enlace simbólico
permanece pero los datos desaparecen para siempre, pero si borramos el enlace simbólico no
borraremos el directorio o archivo real.
unlink /home/pepe/enlace-a-publico
rm /home/pepe/enlace-a-publico
Una vez que borramos el enlace simbólico comprobamos que el directorio al que estaba
apuntando aun existe.
ls -ld /publico/2015
En el caso que quisiéramos crear un enlace simbólico al archivo tesis-grupal que está en el
directorio /publico lo hacemos con los siguientes comandos.
Como sabemos podemos crear el enlace desde donde nos encontramos escribiendo la ruta
completa con el siguiente comando:
ln -s /publico/tesis-grupal /home/pepe/tesis-enlace-simbolico
cd /home/pepe
ln -s /publico/tesis-grupal tesis-enlace-simbolico
Y con el comando cat podemos ver que el enlace apunta hacia el archivo que creamos antes:
cat /home/pepe/tesis-enlace-simbolico
• Enlaces duros
Los enlaces duros lo que hacen es asociar dos o más ficheros compartiendo el mismo inodo. Esto
hace que cada enlace duro sea una copia exacta del resto de ficheros asociados, tanto de datos
como de permisos, propietario, etc. Esto implica también que cuando se realicen cambios en uno
de los enlaces o en el fichero este también se realizará en el resto de enlaces.
En sistemas GNU/Linux, los enlaces duros, tienen varias limitaciones. Una es que sólo se pueden
hacer enlaces duros a archivos, y no a directorios.
La segunda limitación es que no pueden expandirse a través de distintos sistemas de archivos. Esto
significa que no puede crear un enlace permanente desde /usr/bin/bash hacia /bin/bash si sus
directorios / y /usr pertenecen a distintos sistemas de archivos.
Vamos a crear un enlace duro al fichero "tesis-grupal" que antes usamos y veremos que
efectivamente comparten inodo y que los datos de propietario, grupo y permisos se mantienen
sincronizados:
ln /publico/tesis-grupal /home/pepe/tesis-enlace-duro
cd /home/pepe
ln /publico/tesis-grupal tesis-enlace-duro
ls -il /publico/tesis-grupal
ls -il /home/pepe/tesis-enlace-duro
ln /publico/tesis-grupal /home/pepe/tesis-enlace-duro2
cd /home/pepe
ln /publico/tesis-grupal tesis-enlace-duro2
ls -il /publico/tesis-grupal
ls -il /home/pepe/tesis-enlace-duro
ls -il /home/pepe/tesis-enlace-duro2
Si editamos o modificamos un enlace duro veremos que también se modifican el resto de los
enlaces y en el archivo origen.
Por ejemplo vamos a agregar texto al enlace tesis-enlace-duro2 para comprobar como el cambio
afecta al archivo tesis-grupal y al otro enlace duro
cat /publico/tesis-grupal
cat /home/pepe/tesis-enlace-duro
cat /home/pepe/tesis-enlace-duro2
y como podemos ver la edición al archivo tesis-enlace-duro también afecto al archivo tesis-grupal
y a tesis-enlace-duro2
Si queremos obtener más datos para comprobar que son iguales los 3 archivos podemos recurrir a
el comando stat
stat /publico/tesis-grupal
stat /home/pepe/tesis-enlace-duro
stat /home/pepe/tesis-enlace-duro2
En el caso de los enlaces duros si borras en archivo de origen no vamos a perder el fichero, ya que
los enlaces duros son una copia fiel de él.
rm /publico/tesis-grupal
cat /home/pepe/tesis-enlace-duro
stat /home/pepe/tesis-enlace-duro
Igual que con los enlaces simbólicos podemos usar dos comandos para borrar los enlaces duros:
unlink /home/pepe/tesis-enlace-duro2
rm /home/pepe/tesis-enlace-duro2
Con el comando anterior el único enlace duro que nos queda es el tesis-enlace-duro si lo
eliminamos ya perderíamos definitivamente el archivo, así que a no confundirse con este
concepto.
cat /home/pepe/tesis-enlace-duro
stat /home/pepe/tesis-enlace-duro
Localizar ficheros
Linux proporciona varias herramientas para localizar ficheros que queremos utilizar; la primera de
ellas es un estándar para la localización de ficheros; la segunda incluye programas especializados
que buscan en un árbol de directorios o una base de datos.
FHS
La estructura de Linux es bastante sencilla y coherente, aunque los nuevos administradores pueden
confundirse, pues algunos directorios parecen estar preparados para fines similares o incluso
idénticos, pero, en realidad, poseen sutiles aunque importantes diferencias.
FSSTND y FHS
Las primeras distribuciones de Linux no siempre siguieron patrones idénticos, lo que derivó en una
gran confusión. Para evitar problemas, se tomaron varias medidas, entre ellas el desarrollo de
FSSTND (File system standard), que se publicó por primera vez a principios de 1994, FSSTND
estandarizó varias funcionalidades específicas:
Estandarizó los programas que se encontraban en /bin y /usr/bin. Este aspecto causaba problemas
cuando los scripts hacían referencia a los ficheros de una u otra ubicación.
Se especificó que los ficheros ejecutables no deberían estar en /etc, ubicación habitual hasta
entonces.
Eliminó los ficheros cambiales del árbol de directorios /usr, permitiendo así que este se montara en
modo sólo lectura.
Hacia 1995, las limitaciones de FSSTHD se hicieron evidentes y se desarrolló un nuevo estándar: FHS
(File system hierarchy standard – Estándar de jerarquía del sistema de ficheros) que se basó en
FHS hace distinción entre ficheros compartibles y no compartibles. En el primer grupo encontramos
los ficheros de datos de los usuarios y los programas binarios, que se pueden compartir entre
ordenadores, algo que se realiza a través de un servidor NFS. Los ficheros no compartibles contienen
información específica del sistema, como los ficheros de configuración. Otra importante distinción
es la que se establece entre ficheros estáticos y ficheros variables: los primeros, normalmente, no
cambian, a no ser que intervenga directamente el administrador; los programas ejecutables son
ejemplos de ficheros estáticos. Los ficheros variables pueden ser cambiados por los usuarios; los
scripts automatizados, los servidores y similares, los directorios /home de los usuarios y las colas de
correo están compuestos por ficheros variables.
FHS define algunos directorios con mucha precisión. Los más comunes definidos por FHS, o
utilizados por convención, son los siguientes:
/: los sistemas de ficheros Linux tienen su raíz en un mismo directorio, conocido como sistema de
ficheros raíz o directorio raíz. Todos los demás directorios se ramifican desde este. Linux no utiliza
letras de unidad, sino que las particiones o discos extraibles se montan en un punto dentro del
sistema de ficheros raíz. Algunos directorios críticos deben residir siempre en la partición raíz, pero
otros pueden encontrarse en particiones independientes. No debemos confundir el directorio /root
con el directorio raíz.
/boot: contiene ficheros estáticos y no compartibles relacionados con el arranque del ordenador.
Algunos sistemas imponen limites particulares a /boot, por ejemplo, en BIOS antiguas y versiones
antiguas del LILO, pueden requerir que /boot se encuentre por debajo del cilindro 1024 del disco
duro. A veces, pero no siempre, puede que se requiera que /boot sea una partición independiente.
/bin: contiene algunos ficheros ejecutables, que son accesibles para todos los usuarios y constituyen
los comandos más importantes que pueden ejecutar los usuarios normales. Contiene ficheros
estáticos. Sus ficheros son compartibles, pero son tan importantes para el funcionamiento básico
del ordenador, que este directorio casi nunca se comparte. Cada cliente debe tener su directorio
/bin en local.
/sbin: es similar a /bin, pero contiene programas que sólo ejecuta el administrador. Es estático y, en
teoría, compartible, En la práctica, sin embargo, no tiene sentido compartirlo.
/lib: contiene bibliotecas de programa, que son código compartido por muchos programas y que se
almacenan en ficheros independientes, para ahorrar RAM y espacio en disco. /lib/modules contiene
módulos o drivers que se pueden cargar y descargar según necesitemos. Es estático y, teóricamente,
compartible, aunque en la práctica no se comparte.
/usr: aloja el grueso de los programas de un ordenador Linux. Tiene un contenido compartible y
estático, lo que permite montarlo en modo sólo lectura. Se puede compartir con otros sistemas
Linux; muchos administradores separan /usr en una partición independiente, aunque no es
necesario. Contiene algunos subdirectorios similares a los del directorio raíz como /usr/bin y
/usr/lib, que contienen programas y bibliotecas que no son totalmente críticos para el
funcionamiento del ordenador.
/usr/local: contiene subdirectorios que reflejan la organización de /usr. Aloja los ficheros que instala
localmente el administrador; es un área a salvo de las actualizaciones automáticas de todo el SO.
Después de la instalación de Linux, debería estar vacío, excepto para determinados subdirectorios
stub. Se suele separar en una partición para protegerlo de las reinstalaciones del SO.
/usr/X11R6: alberga los ficheros relacionados con el sistema X Window (entorno GUI). Contiene
subdirectorios similares a los de /usr, como /usr/X11R6/bin y /usr/X11R6/lib.
/opt: es similar a /usr/local, pero está pensado para los paquetes que no vienen con el SO, como los
procesadores de texto o juegos comerciales, que se guardan es sus propios subdirectorios. El
contenido de /opt es estático y compartible. Se suele separar en su propia partición para convertirlo
en un enlace simbólico a un subdirectorio de /usr/local.
/home: contiene los datos de los usuarios y es compartible y variable. Se considera opcional en FHS,
pero, en la práctica, lo opcional es el nombre. El directorio /home con mucha frecuencia reside en
su propia partición.
/root: es el directorio home del usuario root. Como la cuenta de root es tan crítica y específica del
sistema, este directorio variable no es realmente compartible.
/var: contiene ficheros efímeros de varios tipos, de registro del sistema, de cola de impresión, de
correo y news, etc. El contenido del directorio es variable, pues algunos subdirectorios son
compartibles y otros no. Se suele colocar /var en su propia partición, sobre todo si el sistema registra
una gran actividad en /var.
/tmp: es donde se crean los archivos temporales y variables que necesitan los programas. La
mayoría de las distribuciones limpian este directorio periódicamente en el inicio. Este directorio
raramente se comparte, pero se suele poner en una partición independiente, para que los procesos
no controlados no provoquen problemas en el sistema de ficheros al ocupar demasiado.
/mnt: la finalidad de este directorio es albergar el montaje de los dispositivos. En la estructura de
directorios, algunas distribuciones crean subdirectorios dentro de /mnt para que hagan de puntos
de montado; otras utilizan directamente /mnt o incluso puntos de montado independientes de
/mnt, como /floppy o /cdrom. FHS sólo menciona /mnt y no especifica cómo se ha de utilizar. Los
medios montados en esta partición pueden ser estáticos o variables y, por norma general, son
compartibles.
/media: es una parte opcional del FHS como /mnt, pero que podría contener subdirectorios para
tipos de medio específicos. Muchas distribuciones modernas utilizan subdirectorios /media como
punto de montado para los discos extraíbles e
/dev: Linux trata la mayoría de los dispositivos de hardware como si fueran ficheros, el SO debe
tener un lugar para estos en su sistema de ficheros. Ese sitio es el directorio /dev, que contiene un
gran número de ficheros que hacen de interfaces de hardware. Con los permisos apropiados,
podremos acceder al hardware del dispositivo leyendo y escribiendo en el fichero de dispositivo
asociado. El kernel permite que /dev, sea un sistema de ficheros virtual, creado automáticamente.
El kernel y las herramientas de soporte crean sobre la marcha entradas en /dev para adaptarse a las
necesidades de los drivers específicos. La mayoría de las distribuciones emplean este recurso.
/proc: es un directorio inusual, pues no corresponde a un directorio o partición normal, sino que se
trata de un sistema de ficheros virtual que proporciona acceso a ciertos tipos de información del
hardware dinámicamente. Esta información no se encuentra accesible a través de /dev.
Lo más habitual para localizar ficheros es hacerlo por su nombre, pero, a veces, se pueden seguir
otros criterios, como la fecha de modificación. Los comandos de localización de ficheros de Linux
pueden buscar en un árbol de directorios un fichero que coincida con el criterio especificado, incluso
podrían rastrear el sistema completo.
• El comando find
find implementa un sistema de fuerza bruta para localizar ficheros: realiza una búsqueda por todo
el árbol de directorios especificado para localizar los que satisfagan el criterio especificado. find
tiende a ser lento, pero es flexible y tiene una mayor probabilidad de éxito.
find [ruta…] [expresión…]
Se le pueden especificar una o más rutas para restringir sus operaciones. La expresión es un modo
de especificar lo que queremos buscar; las expresiones más comunes permiten buscar por varios
criterios:
Buscar por nombre de fichero: utilizando la expresión –nombre patrón, encontraremos los ficheros
que coincidan con el patrón especificado. Se pueden emplear comodines delimitando el patrón
entre comillas.
Buscar por el modo de permiso: la expresión –perm modo permite localizar ficheros que tengan
ciertos permisos. El modo se puede expresar simbólicamente o en modo octal si va precedido de un
mas (+). find localizará los ficheros en los que estén definidos todos los bits de permisos
especificados.
Buscar por el tamaño del fichero: se puede realizar una búsqueda de un fichero de un tamaño
determinado con la expresión –size n, donde “n” especifica en bloques de 512 bytes (se puede
modificar con una letra que sirva de código para el valor, por ejemplo, k para kilobytes).
Buscar por grupo: la expresión –gid GID, busca los ficheros cuya ID de grupo es GID. La opción –
group nombre localiza ficheros cuyo grupo tiene el nombre indicado. Esta última opción suele ser
más fácil de utilizar, pero la primera es útil en caso de que la GID se haya quedado huérfana y no
tenga nombre.
Buscar por ID de usuario: –uid UID busca los ficheros cuyo propietario tiene UID como ID de usuario.
–user nombre busca los ficheros cuyo propietario es nombre. Esta última opción suele ser más fácil
de utilizar, pero la primera es útil en caso de que la UID se haya quedado huérfana y no tenga
nombre.
• El comando locate
Esta utilidad funciona de forma similar a find, pero difiere en dos aspectos importantes:
Es mucho menos sofisticado en sus opciones de búsqueda; se utiliza para buscar por el nombre de
fichero, con lo que el programa devuelve todos los ficheros que contienen la cadena especificada.
Trabaja con una base de datos que se encarga de mantener. Normalmente, se incluye una tarea
cron que llama a locate para que actualice su base de datos periódicamente. El comando updatedb
sirve para actualizar la base de datos manualmente. Es importante que se mantenga actualizada, ya
que, en caso contrario, al realizar las búsquedas, puede que nos devuelva nombres de ficheros que
ya no existan o que no localice ficheros recientes.
Al trabajar con una base de datos, normalmente es más rápido que find, sobre todo en las
búsquedas por todo el sistema. También es probable que devuelva muchas falsas alarmas,
especialmente si deseamos localizar un fichero con un nombre corto. Algunas distribuciones utilizan
slocate en vez de locate, que incluye características de seguridad que impiden que los usuarios vean
los nombres de los ficheros o de los directorios a los que no tienen acceso. En la mayoría de los
sistemas con slocate, locate es un enlace a slocate. Algunas distribuciones no instalan locate ni
slocate.
• El comando whereis
• El comando which
Está considerado comando de búsqueda, pero es poco potente. Busca la ruta del comando escrito
y la lista completa, desde la primera coincidencia que encuentre. La opción -a permite buscar todas
las coincidencias.
Puede resultar útil, por ejemplo, para saber la ruta completa de un programa que se desee llamar
desde un script.
• El comando type
No es realmente un comando de búsqueda, sino que indica cómo será interpretado el comando que
escribamos: como un comando nativo, un comando externo, un alias, etc. Posee varias opciones
que modifican su comportamiento, por ejemplo, -t reduce la salida a los identificadores cortos,
builtin (nativo), file (fichero), alias u other (otro). -a devuelve una lista completa, mostrando, por
ejemplo, tanto la extensión del alias como la ubicación del ejecutable final, si le proporcionamos un
nombre de alias.