104.7 Encontrar archivos del sistema y su ubicacion correcta - Teoria

1. FHS - Filesystem Hierarchy Standard

El FHS (Filesystem Hierarchy Standard) es un estandar que define la estructura de directorios y su contenido en sistemas Linux/Unix. Su objetivo es garantizar la interoperabilidad entre distribuciones.

1.1 Directorio raiz (/)

Todo parte del directorio raiz /. Todos los demas directorios son subdirectorios de este.

1.2 Directorios principales del FHS

Directorios esenciales del sistema

DirectorioContenidoNotas
/binBinarios esenciales del sistemaComandos basicos para todos los usuarios (ls, cp, cat, etc.)
/sbinBinarios esenciales de administracionComandos de administracion (fdisk, fsck, iptables, etc.)
/libBibliotecas compartidas esencialesLibrerias para binarios de /bin y /sbin
/lib64Bibliotecas de 64 bitsEn sistemas de 64 bits

UsrMerge: En distribuciones modernas (Fedora, Debian 12+, Ubuntu 22.04+, Arch), /bin, /sbin, /lib y /lib64 son enlaces simbolicos a sus equivalentes en /usr/. Es decir:

  • /bin -> /usr/bin
  • /sbin -> /usr/sbin
  • /lib -> /usr/lib
  • /lib64 -> /usr/lib64

Esto se conoce como UsrMerge y simplifica la estructura del sistema.

Directorio /usr (Unix System Resources)

DirectorioContenido
/usrJerarquia secundaria para datos de solo lectura del usuario
/usr/binBinarios de usuario no esenciales para el arranque
/usr/sbinBinarios de administracion no esenciales
/usr/libBibliotecas para /usr/bin y /usr/sbin
/usr/localJerarquia terciaria para software instalado localmente
/usr/local/binBinarios instalados localmente por el admin
/usr/local/sbinBinarios admin instalados localmente
/usr/local/libLibrerias instaladas localmente
/usr/shareDatos independientes de la arquitectura (man pages, iconos, etc.)
/usr/srcCodigo fuente (ej: headers del kernel)
/usr/includeHeaders para compilacion en C/C++

/usr/local es para software compilado e instalado manualmente por el administrador (no gestionado por el gestor de paquetes). Tiene su propia estructura bin/, sbin/, lib/, etc.

Directorio /etc (configuracion)

DirectorioContenido
/etcArchivos de configuracion del sistema y los servicios
/etc/passwdBase de datos de usuarios
/etc/shadowContrasenas cifradas
/etc/groupBase de datos de grupos
/etc/fstabTabla de montaje de sistemas de archivos
/etc/hostnameNombre del host
/etc/hostsResolucion estatica de nombres
/etc/resolv.confConfiguracion DNS
/etc/crontabTareas programadas del sistema
/etc/apt/Configuracion de APT (Debian/Ubuntu)
/etc/yum.repos.d/Repositorios de YUM/DNF (Red Hat/Fedora)

Clave: /etc contiene SOLO archivos de configuracion, NUNCA binarios ejecutables.

Directorio /var (datos variables)

DirectorioContenido
/varDatos variables que cambian durante la operacion normal
/var/logArchivos de log del sistema y servicios
/var/log/syslogLog general del sistema (Debian/Ubuntu)
/var/log/messagesLog general (Red Hat/CentOS)
/var/log/auth.logLog de autenticacion
/var/spoolColas de trabajos pendientes
/var/spool/mailBuzon de correo de usuarios
/var/spool/cronColas de cron
/var/spool/cupsCola de impresion
/var/tmpArchivos temporales que persisten entre reinicios
/var/cacheCache de aplicaciones
/var/libDatos de estado de aplicaciones
/var/runDatos de tiempo de ejecucion (PIDs, sockets) - a veces enlace a /run

Diferencia /tmp vs /var/tmp: /tmp se limpia al reiniciar. /var/tmp persiste entre reinicios.

Directorios temporales

DirectorioContenidoPersistencia
/tmpArchivos temporalesSe borra al reiniciar
/var/tmpArchivos temporales persistentesPersiste entre reinicios

Directorios de usuario

DirectorioContenido
/homeDirectorios personales de los usuarios
/home/sandraDirectorio personal del usuario sandra
/rootDirectorio personal del usuario root

Nota: /root NO esta dentro de /home. Root tiene su propio directorio en la raiz.

Directorio /boot

DirectorioContenido
/bootArchivos necesarios para el arranque
/boot/vmlinuz-*Kernel de Linux comprimido
/boot/initrd.img-* o /boot/initramfs-*Imagen initramfs
/boot/grub/Configuracion del bootloader GRUB

Directorios de dispositivos y sistemas virtuales

DirectorioContenido
/devArchivos de dispositivo (discos, terminales, etc.)
/dev/sdaPrimer disco SATA
/dev/nullDescarta todo lo que se le envie
/dev/zeroFuente infinita de ceros
/dev/randomGenerador de numeros aleatorios
/procSistema de archivos virtual con info de procesos y kernel
/proc/cpuinfoInformacion de la CPU
/proc/meminfoInformacion de la memoria
/proc/PID/Informacion del proceso con ese PID
/sysSistema de archivos virtual con info de hardware y drivers
/runDatos de tiempo de ejecucion (desde el ultimo arranque)

/proc y /sys no existen en disco; son sistemas de archivos virtuales generados por el kernel en tiempo real.

Directorios de montaje

DirectorioUso
/mntPunto de montaje temporal para montajes manuales del administrador
/mediaPunto de montaje automatico para medios extraibles (USB, CD, etc.)
/media/sandra/USB_DRIVEMontaje automatico de un USB del usuario sandra

Otros directorios

DirectorioContenido
/optSoftware de terceros y paquetes adicionales
/srvDatos servidos por el sistema (web, FTP, etc.)

2. Comandos para encontrar archivos

2.1 find

find busca archivos en tiempo real recorriendo el arbol de directorios. Es el mas potente pero puede ser lento en grandes sistemas.

# Sintaxis general
find [ruta] [expresiones]

Busqueda por nombre

# Buscar por nombre exacto
find /etc -name "passwd"
 
# Buscar por nombre con comodines (case-sensitive)
find /home -name "*.txt"
 
# Buscar por nombre sin distinguir mayusculas (-iname)
find /var -iname "*.log"
 
# Buscar por nombre en el directorio actual
find . -name "config*"

Busqueda por tipo

# Buscar solo archivos regulares
find /etc -type f -name "*.conf"
 
# Buscar solo directorios
find /home -type d -name "proyecto"
 
# Buscar solo enlaces simbolicos
find /usr -type l

Tipos de archivo para find -type:

TipoDescripcion
fArchivo regular
dDirectorio
lEnlace simbolico
bDispositivo de bloque
cDispositivo de caracter
pPipe (FIFO)
sSocket

Busqueda por tamano

# Archivos mayores de 100 MB
find / -type f -size +100M
 
# Archivos menores de 1 KB
find /tmp -type f -size -1k
 
# Archivos de exactamente 0 bytes (vacios)
find /var -type f -size 0
# O equivalente:
find /var -type f -empty

Sufijos de tamano:

  • c = bytes
  • k = kilobytes
  • M = megabytes
  • G = gigabytes

Busqueda por tiempo

# Modificados en los ultimos 7 dias
find /var/log -mtime -7
 
# Modificados hace mas de 30 dias
find /tmp -mtime +30
 
# Accedidos en los ultimos 60 minutos
find /home -amin -60
 
# Modificados en los ultimos 60 minutos
find /var -mmin -60

Busqueda por permisos y propietario

# Archivos con permisos exactos 777
find / -perm 777
 
# Archivos con SUID activo
find / -perm -4000
 
# Archivos con SGID activo
find / -perm -2000
 
# Archivos de un usuario especifico
find /home -user sandra
 
# Archivos de un grupo especifico
find /var -group developers

Ejecutar acciones con -exec

# Eliminar archivos .tmp encontrados
find /tmp -name "*.tmp" -exec rm {} \;
 
# Cambiar permisos de todos los .sh encontrados
find /scripts -name "*.sh" -exec chmod 755 {} \;
 
# Listar en detalle los archivos encontrados
find /var/log -name "*.log" -exec ls -lh {} \;
 
# Buscar texto dentro de archivos encontrados
find /etc -name "*.conf" -exec grep -l "error" {} \;

Nota: {} se reemplaza por cada archivo encontrado. \; marca el fin del comando. Se puede usar + en lugar de \; para agrupar los archivos y ejecutar el comando una sola vez (mas eficiente).

2.2 locate / mlocate

locate busca archivos en una base de datos indexada, lo que lo hace mucho mas rapido que find. Sin embargo, la base de datos puede estar desactualizada.

# Buscar archivos
locate passwd
 
# Buscar sin distinguir mayusculas
locate -i readme
 
# Limitar el numero de resultados
locate -n 10 "*.conf"
 
# Contar resultados
locate -c "*.log"
 
# Buscar solo por el nombre base del archivo (sin la ruta)
locate -b "passwd"
# Solo encuentra archivos cuyo nombre base es "passwd"
# Sin -b, tambien encontraria /ruta/que/contiene/passwd/en/la/ruta
 
# Buscar exactamente el nombre base (con \)
locate -b '\passwd'
# Equivale a buscar archivos cuyo nombre es exactamente "passwd"
 
# Usar expresiones regulares
locate -r '/etc/.*\.conf$'

Para el examen: locate -b (basename) restringe la busqueda al nombre del archivo solamente, ignorando la ruta. Sin -b, locate passwd encontraria tanto /etc/passwd como /documentos/passwd_info/datos.txt (porque la ruta contiene “passwd”).

updatedb

# Actualizar la base de datos de locate (ejecutar como root)
sudo updatedb

La base de datos se almacena normalmente en /var/lib/mlocate/mlocate.db o /var/lib/plocate/plocate.db.

Actualizacion automatica con cron

En la mayoria de distribuciones, updatedb se ejecuta automaticamente mediante una tarea cron diaria (normalmente a las 4:00 AM o similar). Esta tarea se encuentra tipicamente en:

  • /etc/cron.daily/mlocate (o plocate)
  • O como un timer de systemd: plocate-updatedb.timer
# Verificar si existe la tarea cron
ls /etc/cron.daily/*locate*
 
# Verificar el timer de systemd (distribuciones modernas)
systemctl list-timers | grep locate
 
# Ejecutar manualmente si se necesita una actualizacion inmediata
sudo updatedb

Para el examen: Es importante saber que updatedb se ejecuta automaticamente a traves de cron (generalmente a diario). Los archivos creados despues de la ultima ejecucion de updatedb no apareceran en los resultados de locate hasta la proxima actualizacion.

/etc/updatedb.conf

Configura que directorios y sistemas de archivos incluir/excluir:

# Ejemplo de /etc/updatedb.conf
PRUNE_BIND_MOUNTS="yes"
PRUNENAMES=".git .svn .hg"
PRUNEPATHS="/tmp /var/spool /media /mnt"
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre tmpfs usbfs udf"
VariableDescripcion
PRUNEPATHSDirectorios a excluir de la indexacion
PRUNEFSTipos de sistema de archivos a excluir
PRUNENAMESNombres de directorios a excluir
PRUNE_BIND_MOUNTSExcluir bind mounts

Clave para el examen: locate es rapido pero puede no encontrar archivos recien creados hasta que se ejecute updatedb. find siempre busca en tiempo real.

2.3 which

Muestra la ruta completa de un ejecutable que se encontraria en el PATH.

which ls
# /usr/bin/ls
 
which python3
# /usr/bin/python3
 
# No encuentra builtins del shell
which cd
# (sin resultado, cd es un builtin)
 
# Buscar todas las coincidencias
which -a python
# /usr/bin/python
# /usr/local/bin/python

Limitacion: which solo busca en los directorios del $PATH y solo encuentra ejecutables. No encuentra builtins del shell, funciones ni alias.

2.4 whereis

Localiza el binario, el codigo fuente y la pagina de manual de un comando.

whereis ls
# ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
 
whereis fdisk
# fdisk: /usr/sbin/fdisk /usr/share/man/man8/fdisk.8.gz
 
# Solo binario
whereis -b ls
 
# Solo manual
whereis -m ls
 
# Solo fuentes
whereis -s gcc

2.5 type

Identifica que es un comando: builtin, alias, funcion, archivo, etc. Es un builtin del shell.

type ls
# ls is aliased to 'ls --color=auto'
 
type cd
# cd is a shell builtin
 
type find
# find is /usr/bin/find
 
type if
# if is a shell keyword
 
# Mostrar todos los tipos (si hay multiples)
type -a ls
# ls is aliased to 'ls --color=auto'
# ls is /usr/bin/ls
 
# Solo mostrar el tipo (una palabra)
type -t ls
# alias
 
type -t cd
# builtin
 
type -t find
# file

Tipos que devuelve type -t:

TipoSignificado
aliasEs un alias
builtinComando integrado del shell
fileArchivo ejecutable en disco
functionFuncion del shell
keywordPalabra reservada del shell (if, for, while, etc.)

3. Resumen del FHS por categorias

Archivos estaticos vs dinamicos

CategoriaDirectoriosDescripcion
Estaticos/bin, /sbin, /usr, /lib, /boot, /etc, /optNo cambian durante la operacion normal
Dinamicos/var, /tmp, /run, /homeCambian frecuentemente

Compartibles vs no compartibles

CategoriaDirectoriosDescripcion
Compartibles/usr, /opt, /homeSe pueden compartir en red (NFS)
No compartibles/etc, /boot, /var/run, /var/lockEspecificos de cada maquina

4. Puntos clave para el examen

  1. /bin y /sbin contienen binarios esenciales. En distros modernas con UsrMerge, son enlaces simbolicos a /usr/bin y /usr/sbin.

  2. /usr/local es para software instalado manualmente por el administrador (compilado desde fuente).

  3. /etc solo contiene archivos de configuracion, nunca ejecutables.

  4. /var/log contiene los logs. /var/spool contiene colas de trabajos. /var/tmp persiste entre reinicios.

  5. /tmp se limpia al reiniciar; /var/tmp no.

  6. /opt es para software de terceros (paquetes autocontenidos).

  7. /proc y /sys son sistemas de archivos virtuales (no existen en disco).

  8. /mnt para montajes manuales temporales; /media para medios extraibles automaticos.

  9. find busca en tiempo real (lento pero siempre actualizado). locate usa base de datos (rapido pero puede estar desactualizado).

  10. updatedb actualiza la base de datos de locate. Se configura en /etc/updatedb.conf.

  11. which solo busca ejecutables en $PATH. type identifica builtins, alias, funciones y archivos. whereis busca binario, fuente y man page.

  12. /root es el home de root. NO esta dentro de /home.


Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • find busca en tiempo real; locate usa base de datosfind siempre da resultados actualizados pero es lento; locate es rapido pero puede estar desactualizado. El examen puede preguntar por que locate no encuentra un archivo recien creado (falta ejecutar updatedb).
  • which solo busca en $PATH; type identifica builtinswhich cd puede no devolver nada (cd es un builtin); type cd muestra “cd is a shell builtin”. El examen puede preguntar como determinar si un comando es un builtin.
  • whereis busca binario, fuente Y paginas man — A diferencia de which (solo ejecutable), whereis tambien localiza codigo fuente y documentacion. El examen puede preguntar que comando busca la pagina man de un programa.
  • /tmp se limpia al reiniciar; /var/tmp NO — Ambos son para archivos temporales, pero /var/tmp persiste entre reinicios. El examen puede preguntar donde guardar archivos temporales que deben sobrevivir un reinicio.
  • /opt es para software de terceros autocontenido — A diferencia de /usr/local (software compilado por el admin), /opt es para paquetes de software completos de terceros (e.g., /opt/google/chrome). El examen puede confundir /opt con /usr/local.
  • /etc NUNCA contiene ejecutables — Solo archivos de configuracion. Los ejecutables van en /bin, /sbin, /usr/bin, /usr/sbin. El examen puede ofrecer /etc como ubicacion de un script de sistema.
  • /proc y /sys son virtuales, NO existen en disco — Son sistemas de archivos generados por el kernel en memoria. df puede no mostrarlos como filesystem real. El examen puede preguntar que tipo de filesystem son.
  • UsrMerge: /bin -> /usr/bin — En distribuciones modernas, /bin, /sbin, /lib son enlaces simbolicos a sus equivalentes en /usr/. El examen puede preguntar donde esta realmente un binario en un sistema con UsrMerge.
  • updatedb se configura en /etc/updatedb.conf — Este archivo controla que directorios y filesystems incluir/excluir de la base de datos de locate. El examen puede preguntar como excluir ciertos directorios de locate.
  • /root NO esta dentro de /home — El directorio home de root es /root, no /home/root. El examen puede ofrecer /home/root como distractor.