Fuente: vídeo de DorianDotSlash y documentación de FHS.
El sistema de archivos de Linux es diferente a Windows, y seguramente este sea uno de los temas más fundamentales que un usuario experto debería conocer.
Antes de Windows, Linux y los otros sistemas modernos que se conocen hoy en día; existía DOS (Disk Operating System). Era únicamente CLI, sin GUIs. Sin embargo, era posible instalar Windows por encima de DOS.
Para las unidades de memoria se utilizan:
A
yB
para los floppy disks,C
para el disco duro,- y etc, dependiendo de cuantas unidades estén instaladas en el equipo.
En DOS podías instalar tus programas donde al usuario le pareciese. Windows, sin
embargo, se instalaba en su propia carpeta: Windows
. Con el paso del tiempo,
Windows se independizó de DOS y la estructura de archivos se mantuvo más o menos
igual.
En cambio, Linux es diferente. Por ejemplo, puedes tener múltiples archivos cuya única diferencia sea una letra mayúscula o minúscula: **
Archivo
archivo
ARCHIVO
ArChIVo
Esto está permitido en Linux, pero no en Windows. De la misma forma, los usuarios de Apple se sentirán más cómodos con la estructura de archivos de Linux, ya que evolucionaron desde el mismo lugar: Unix.
Por cierto, esta estructura se encuentra recogida en el FHS (Filesystem Hierarchy Standard).
Otra nota, no todas las distribuciones Linux siguen este patrón, pueden haber pequeñas variaciones. Pero por lo general, esto se cumple.
Resumen
bin -> /usr/bin Binarios esenciales: ls, cat, uname
sbin -> /usr/sbin Binarios del sistema esenciales (solo root)
lib -> /usr/lib Librerías esenciales y módulos del kernel
libXX -> /usr/libXX Otros formatos de librerías esenciales
usr
|-> bin, sbin, lib, libXX
|-> local Datos no esenciales y programas compilados localmente
| | sin el package manager
| |-> bin Binarios instalados localmente
| |-> sbin Binarios del sistema instalados localmente
| |-> lib Librerías locales
| |-> etc Configuración de programas locales
| |-> games Archivos de videojuegos locales
| |-> include Archivos de cabecera locales
| |-> man Documentación del programa man
| |-> share Datos independientes de la plataforma
| |-> src Código fuente local
|-> share Datos independientes de la plataforma, datos de
| | aplicaciones, etc.
| |-> misc Archivos únicos de aplicaciones
|-> games Archivos de videojuegos
|-> include Archivos de cabecera (.h .hpp) para compilar
|-> src Código de fuente por referencia
------------------------------------------------------------------
etc Configuración del sistema
opt Paquetes de software adicionales o instalado manualmente
------------------------------------------------------------------
boot Archivos estáticos del boot loader (NO TOCAR)
mnt Punto de montaje para sistemas de archivos (manual)
media Punto de montaje para unidades externas
dev Device files
run Datos relevantes de procesos en ejecución
srv Datos de servicios de este sistema
tmp Archivos temporales
var Datos variables
svr Datos para servidores
------------------------------------------------------------------
root Carpeta personal del usuario root
home Carpetas personales de los usuarios (~)
|-> .cache $XDG_CACHE_HOME Datos no esenciales
|-> .config $XDG_CONFIG_HOME Configuración del usuario
|-> .local
|-> bin Ejecutables del usuario (en PATH)
|-> share $XDG_DATA_HOME Datos del usuario
|-> state $XDG_STATE_HOME Logs, historiales, archivos recientes...
|-> Desktop $XDG_DESKTOP_DIR Archivos que aparecen en el escritorio
|-> Downloads $XDG_DOWNLOAD_DIR Descargas de navegadores
|-> Templates $XDG_TEMPLATES_DIR Plantillas para crear nuevos archivos
|-> Public $XDG_PUBLICSHARE_DIR Documentos públicos
|-> Documents $XDG_DOCUMENTS_DIR Documentos personales
|-> Music $XDG_MUSIC_DIR Música
|-> Pictures $XDG_PICTURES_DIR Fotografías
|-> Videos $XDG_VIDEOS_DIR Vídeos
El sistema de archivos
Se pueden distinguir dos tipos:
shareable vs unshareable: un archivo shareable se puede guardar en un ordenador y utilizar en otros1. Por ejemplo, los archivos de usuario y configuración son shareables, pero device lock files no.
variable vs estático: un archivo estático son aquellos que no cambian sin intervención del administrador del sistema1, como binarios, librerías, documentación, etc.
Shareable | Unshareable | |
---|---|---|
Estático | /usr | /etc |
/opt | /boot | |
Variable | /var/mail | /var/run |
Usuarios
/home
Nota: para escribir más rápido la carpeta del usuario
/home/magno
(por ejemplo) usa~
.
Aquí dentro cada usuario tiene su propia carpeta. Allí puede guardar sus documentos y otros, como la carpeta personal de Windows.
Puede que sea una buena idea también colocar esta carpeta en una nueva partición de disco, por si ocurre algo con el sistema principal, tus documentos importantes estén seguros. De la misma forma, puede ser buena idea montar un sistema de copias de seguridad.
$HOME/.config
, $HOME/.local
, etc
freedesktop.org (antes llamados Cross Desktop Group, XDG) es un proyecto que trabaja en en la tecnología base que comparten los entornos de escritorio gratuitor para el X Window System (X11) y Wayland en Linux y otros sistemas basados en Unix2. Tienen muchas especificaciones y utilidades intentando estandarizar la experiencia de usuario dentro de un entorno de escritorio, en concreto la especificación XDG Base Directory describe la estructura de la carpeta del usuario.
Para ello, se crean algunas variables de entorno donde se espera que los datos del usuario se encuentren, para que las aplicaciones sepan donde están los documentos y donde pueden guardar la configuración específica del usuario.
Conceptos básicos:
$XDG_DATA_HOME
: Único directorio para escribir datos del usuario. Por defecto es~/.local/share
.$XDG_CONFIG_HOME
: Único directorio para almacenar configuración del usuario (análogo a/etc
). Por defecto es~/.config
.$XDG_STATE_HOME
: Único directorio para almacenar estados del usuario como logs, historiales, archivos recientes, etc. Por defecto es~/.local/state
.$XDG_CACHE_HOME
: Único directorio para almacenar datos no esenciales (caché) del usuario (análogo a/var/cache
). Por defecto es~/.cache
.$XDG_RUNTIME_DIR
: Único directorio para almacenar archivos runtime y otro tipo de objetos.
- Hay un único directorio para almacenar ejecutables del usuario, por defecto en
~/.local/bin
. La distribución se debe asegurar que estos directorios esten enPATH
. Hay que tener cuidado cuando/home
se comparta entre varios sistemas, es posible que los ejecutables no funcionen allí.
$XDG_DATA_DIRS
: conjunto de directorios de datos ordenados de mayor a menor preferencia en los que buscar, siendo$XDG_DATA_HOME
la primera localización donde se mire. Por defecto es/usr/local/share/:/usr/share/
.$XDG_CONFIG_DIRS
: conjunto de directorios de configuración ordenados de mayor a menor preferencia en los que buscar, siendo$XDG_CONFIG_HOME
la primera localización donde se mire. Por defecto es/etc/xdg
.
Por defecto, solo XDG_RUNTIME_DIR
tiene un valor debido a pam_systemd(8)
;
para el resto es responsabilidad del usuario definirlas según la especificación3.
Sin embargo, si no están definidas, se toma el valor por defecto; por tanto,
solo es útil definir las variables si se decide cambiar lo predeterminado.
No todos los programas siguen la especificación, de hecho, solo unos pocos. Este
problema da lugar al dotfile madness, donde el usuario tiene los archivos de
configuración de programas por todas partes. No es para tanto, dado que la
mayoría simplemente se almacenan en ~/.<programa>
.
En la Arch Wiki hay una lista de programas, indicando cuáles siguen el estándar y cuáles no.
$HOME/Downloads
, $HOME/Templates
, $HOME/Documents
…
Además de estos archivos, la gente de FreeDesktop.org provee de la utilidad
xdg-user-dirs
, que ayuda a manejar los conocidos directorios del usuario:
- Desktop
- Downloads
- Templates
- Public
- Documents
- Music
- Pictures
- Videos
Los nombres describen bastante bien el significado del directorio, excepto
Templates
y Public
, que pueden ser un poco confusos.
Si guardas archivos en
Templates
, en la mayoría de entornos de escritorio, el explorador de archivos permitirá hacer copias de esas plantillas personalizadas para que puedas trabajar más rápidamente.Public
se utiliza para compartir archivos públicamente, de forma que el resto de tus archivos no se expongan. Por defecto no se comparte, pero si alguna vez utilizas un servicio para compartir archivos, lo ideal es hacerlo aquí.
En KDE con Dolphin, la creación de plantillas es algo más complicado. En la
carpeta ~/.local/share/templates
crea un archivo .desktop
por cada plantilla
de la siguiente forma:
Esta utilidad lee el archivo de configuración $XDG_CONFIG_HOME/user-dirs.dirs
,
que permite al usuario cambiar estos últimos. Simplemente edita este archivo con
el nuevo valor que se desee, como traducir los títulos. Este es mi el mio:
1XDG_DESKTOP_DIR="$HOME"
2XDG_DOWNLOAD_DIR="$HOME/Downloads"
3XDG_TEMPLATES_DIR="$HOME/Templates"
4XDG_PUBLICSHARE_DIR="$HOME/Public"
5XDG_DOCUMENTS_DIR="$HOME/Files"
6XDG_MUSIC_DIR="$HOME/Music"
7XDG_PICTURES_DIR="$HOME/Images"
8XDG_VIDEOS_DIR="$HOME/Videos"
De esta forma, desde la terminal, puedo escribir una letra en la terminal y usar tabulador para moverme rápidamente entre mis archivos.
Si deseas recuperar los valores por defecto, estos están en
/etc/xdg/user-dirs.defaults
. Además, si deseas eliminar un directorio, no
borres o comentes la línea, simplemente déjalo a $HOME
.
Ojo, el comando xdg-user-dirs-update
no crea las carpetas, simplemente
verifica que el archivo de configuración es correcto y está actualizado.
Todo este sistema puede ser útil para algunas aplicaciones, que consulten el
user-dirs.dirs
para ver donde colocar los archivos. Repito, esto solo es un
estándar y puede que algunos programas no lo usen.
/root
Esta es la carpeta personal del usuario root. Puedes guardar archivos sin
ningún problema, mientras seas el usuario root: sudo su
.
/usr
En versiones de Unix anteriores aquí se almacenaban las carpetas de los usuarios,
al igual que ahora sucede con home
. Pero actualmente su uso ha disminuido a
solamente «programas que puede usar el usuario y otros datos»: contiene binarios
del sistema, documentación, librerías, archivos de cabecera…
Según el estándar, los tipos de archivos que contiene se catalogan como shareables y de solo lectura.
En esta carpeta se almacena la mayoría del contenido, por lo tanto es una de las más importantes. En su interior podemos encontrar los sub-directorios obligatorios de los apartados siguientes.
/usr/bin
Ver también
/bin
bin
es la forma corta de binaries, que quiere decir archivos binarios o
programas. Contiene los comandos que puede usar tanto el administrador del
sistema como los distintos usuarios.
Además, si un programa se instala con el package manager de tu distro (pacman
,
apt
, etc), también acabará aquí.
No debe haber subdirectorios en /usr/bin
.
Son obligatorios los siguientes comandos:
cat Contatenar archivos con stdout
chgrp Cambiar el dueño del grupo del archivo
chmod Cambiar los permisos de un archivo
chown Cambiar el dueño y grupo de un archivo
cp Copiar archivos y directorios
date Mostrar y configurar la fecha del sistema
dd Copiar y convertir un archivo
df Uso de espacio en disco
dmesg Mostrar o controlar el buffer de mensajes del kernel
echo Mostrar una línea de texto
false Hacer nada en fracaso
hostname Mostrar o configurar el nombre del host del sistema
kill Enviar señales a procesos
ln Crear enlaces simbólicos entre archivos
login Iniciar una sesión en el sistema
ls Listar contenidos de los directorios
mkdir Crear directorios
mknod Crear bloques u otros archivos especiales
more Paginar texto
mount Montar sistemas de archivos
mv Mover o renombrar archivos
ps Mostrar procesos y su estado
pwd Mostrar la carpeta de trabajo
rm Borrar archivos o directorios
rmdir Borrar directorios vacíos
sed Editor de stream
sh Shell de comandos compatible con POSIX
stty Configurar la terminal
su Cambiar el ID de usuario
sync Flush los buffers del sistema de archivos
true Hacer nada en éxito
umount Desmontar sistemas de archivos
uname Mostrar información del sistema
Y entre otros muchos, los siguientes opcionales:
ed Editor ed
tar Crear archivos tar
gzip Comprimir archivos
gunzip Descomprimir archivos
zcat Descomprimir archivos
netstat Mostrar estadísticas de red
ping Probar ICMP
/usr/sbin
Por otro lado, sbin
también almacena programas, pero estos son mucho más
sensibles, ya que se tratan de los ejecutables del administrador
(system admin). Estos archivos están restringidos al super-usuario y no pueden
ser utilizados por otros.
Estos binarios son esenciales para iniciar, recuperar y/o reparar el sistema;
como por ejemplo shutdown
, fdisk
, getty
, ifconfig
y mkfs
. Más ejemplos
aquí.
El único requerimiento del estándar es que no existan subdirectorios dentro de esta carpeta.
Nótese que los programas de este tipo localmente instalados deben ir en
/usr/local/sbin
.
PATH
guarda alguna de estas direcciones para saber donde buscar los programas del terminal. Usawhich
para conocer su carpeta concreta de un comando.
/usr/lib
Finalmente; lib
, lib32
, lib64
y otras variantes son directorios en los que
se almacenan las librerías de determinados programas. Estos son otros archivos
binarios que añaden funcionalidad a algunas aplicaciones.
Estas carpetas también suelen estar en la PATH
para poder compilar de forma
sencilla:
1gcc -o exe main.c -llibreria
Y la librería en cuestión está en /usr/lib/liblibreria.so
.
/usr/local
El motivo de hacer esta separación es el de tener otro directorio usr
que se
pueda montar en solo lectura en algún otro lugar. Sin embargo, hoy en día, solo
se usa para guardar programas de terceros o autocompilados.
Es utilizado por el administrador del sistema para instalar software localmente, de esta forma está seguro de sobreescrituras cuando los programas de sistema se actualizan.
Este incluye (y ninguno más):
bin
,sbin
,lib
man
(que suele ser un enlace a/usr/share/man
)share
etc
games
include
src
Tienen el mismo uso que los que ya se describieron
Tras una instalación limpia, estas carpetas deben estar vacías.
/usr/share
Esta carpeta contiene archivos de solo lectura que se pueden compartir y archivos independientes de la arquitectura de software: documentación, iconos, fuentes, imágenes de fondo… Sin embargo, no está pensada para compartir con otros sistemas operativos.
Cualquier programa o paquete que contenga o necesite datos que no tengan que
ser modificados también se pueden guardar aquí (o en /usr/local/share
).
Se recomienda que se cree un subdirectorio para los datos correspondientes, y si
la aplicación solo guarda un único archivo, debe guardare en /usr/share/misc
.
Algunas subcarpetas importantes:
/usr/share/games
: datos estáticos de videojuegos/usr/share/doc
: documentación de algunos programas/usr/share/man
: documentación para el programa man/usr/share/info
: más documentación (hoy no se usa tanto)
Y más como:
color
, dict
, locale
, nls
…
Otros
/usr/games
: archivos de videojuegos/usr/include
: archivos de cabecera necesarios para compilar (.h
,.hpp
)/usr/src
:/usr/src/linux
:los archivos de código fuente de Linux/usr/src/Documentation
: documentación/usr/src/.config
: configuración
Binarios y configuración
/bin
, /sbin
y /libXX
Estas carpetas se conservan por algunos programas que todavía utilizan estas
direcciones, por eso en distribuciones actuales de Linux, son solamente enlaces
simbólicos a /usr/bin
, /usr/sbin
y /usr/libXX
; cuyo propósito es el mismo.
Esto hace que el sistema sea más compatible con Unix y se simplifica la jerarquía de carpetas: anteriormente era necesario diferenciar los programas a nivel de equipo o usuario y esencial o no esencial.
/etc
Finalmente se ha confirmado que el nombre de esta carpeta quiere decir etcétera. Aquí es donde se guardas todas las configuraciones de programas a nivel de todo el sistema, no de un solo usuario.
Requerimientos del estándar4:
- No debe haber ningún ejecutable en este directorio.
- Debe existir una carpeta de configuración
/etc/opt
de los programas instalados en/opt
. - Se recomienda que dichas configuraciones estén dentro de sus propias carpetas,
no directamente en
/etc
.
Por ejemplo, allí podrás encontrar información sobre el package manager apt
:
en esta carpeta se guarda la lista de los repositorios, paquetes instalados y
sus archivos de configuración.
Otros ejemplos de archivos aquí.
/opt
Significa opcional. Aquí es donde se instala software manualmente e incluso los programas que has hecho tú mismo.
Cada paquete debe ir en /opt/<paquete>
o /opt/proveedor
.
Los directorios
/opt/bin
/opt/doc
/opt/include
/opt/info
/opt/lib
/opt/man
están reservados para el uso del administrador, dado que los programas que ejecute
el usuario deben seguir el patrón de /opt/<paquete>
.
Tras una instalación limpia esta carpeta debería estar vacía.
Sistema
/boot
Aquí se guardan los archivos que necesita el sistema operativo para encenderse (boot), en otras palabras, aquí están los ejecutables del bootloader. Por este motivo, no es recomendable toquetear los archivos de este directorio. Normalmente es una partición separada.
/dev
Quiere decir devices o dispositivos. En Linux (y también en Unix), todo es un archivo: desde un archivo de texto en el que guardas las contraseñas de tus redes sociales, USBs, teclados, discos duros, etc.
Los drivers, el kernel y determinadas aplicaciones acuden a este directorio para
saber con qué dispositivos cuenta tu ordenador. Por ejemplo, un disco sería
sda
y una partición sda1
, sda2
…
/media
y /mnt
Media y mount son los directorios en donde el sistema coloca los dispositivos como USBs, floppy disks, discos duros externos, CDs y demás. Las distribuciones actuales de Linux los montan automáticamente en la carpeta de media.
Por lo tanto, el USB que insertes estará en
/media/<usuario>/<nombre del dispositivo>
. Pero Si quieres montar algo
manualmente con el comando mount
, déjalo en /mnt/
/var
Este es el directorio variable, contiene carpetas y archivos dedicados a guardar datos que suelen aumentar en tamaño, como logs de sistema, caché y demás.
/tmp
Este es el sitio donde las aplicaciones guardan datos temporalmente durante una sesión. Por ejemplo, si estás escribiendo un archivo en un programa de ofimática, es posible que el programa guarde copias de seguridad regularmente, por si ocurre un error, se va la luz u otros inconvenientes. Luego podrás recuperar esos datos.
/proc
proc
de procedures. Contiene información de todos los procesos que se están
ejecutando en el momento, que principalmente son pseudo-archivos (no son
archivos del disco realmente, el kernel los traduce a archivos). Cada uno de
estos procesos tendrá un sub-directorio con el nombre del identificador del
proceso (ID).
Paralelamente puedes encontrar información sobre el CPU (/proc/cpuinfo
) u
otras utilidades (/proc/uptime
).
/run
Funciona en RAM, lo que significa que todo se borrará al apagar el ordenador. Aunque diferentes distribuciones lo utilizan de formas un poco diferentes, generalmente sirve para guardar datos al iniciar la máquina, usuarios conectados, y deamons en ejecución.
/sys
Es la carpeta para interactuar con el kernel, y es similar al directorio /run
.
/svr
Datos específicos que utilizados por servidores que se entén ejecutando en el sistema.
Comparación con Windows
En Windows, cada dispositivo conectado es una unidad de ficheros diferente,
empezando por la letra C
, que es donde está Windows instalado.
En C:
PerfLogs
: logs de performance, pero vacío por defectoProgram Files
: carpeta de instalación de programasProgram Files (x86)
: carpeta de instalación de programas de 32 bitsProgram Data
: configuración y datos de los programas a nivel de sistemaWindows
: lugar de instalación de WindowsSystem
System32
SysWOW64
: guardan los DLL de Windows APIWinSxS
: Windows component store
Users
: carpetas de los usuarios. Además de esas existenDefault
(escondido),Public
,Default User
(puntero aDefault
),All Users
(puntero aProgram Data
)Public
: espacio para que los usuarios del sistema compartan archivos suyos, no programas. (opción en el Explorador de Archivos: Compartir con). Tambien se abre en la red local. <usuario>/AppData
%appdata%
: configuración de aplicaciones por usuario.Local
LocalLow
Roaming
: se utiliza para networking based logins for roaming profiles. Los datos se sincronizarán por red.