5.4 Lección 1
Certificación: |
Linux Essentials |
---|---|
Versión: |
1.6 |
Tema: |
5 Seguridad y permisos de archivos |
Objetivo: |
5.4 Directorios y archivos especiales |
Lección: |
1 de 1 |
Introducción
En Linux, todo se trata como un archivo. Sin embargo, algunos archivos reciben un trato especial, ya sea por el lugar donde están almacenados, como los archivos temporales o la forma en que interactúan con el sistema de archivos, como los enlaces. En esta lección, aprenderemos dónde se encuentran dichos archivos, cómo funcionan y cómo administrarlos.
Archivos temporales
Los archivos temporales son archivos utilizados por los programas para almacenar datos que solo se necesitan por un corto tiempo. Estos pueden ser los datos de procesos en ejecución, registros de bloqueo, archivos de memoria virtual de un autoguardado, archivos intermedios utilizados durante una conversión de archivos, archivos de caché, etc.
Ubicación de los archivos temporales
La versión 3.0 del Filesystem Hierarchy Standard (FHS) define las ubicaciones estándar para los archivos temporales en los sistemas Linux. Cada ubicación tiene un propósito y comportamiento diferente, y se recomienda que los desarrolladores sigan las convenciones establecidas por el FHS cuando escriban datos temporales en el disco.
/tmp
-
Según el FHS, los programas no deben asumir que los archivos escritos se conservarán entre las invocaciones de un programa. La recomendación es que este directorio sea limpiado (todos los archivos borrados) durante el arranque del sistema, aunque esto es no es obligatorio.
/var/tmp
-
Otra ubicación para los archivos temporales, pero ésta no debe ser borrada durante el arranque del sistema, es decir, los archivos almacenados aquí normalmente persistirán entre los reinicios.
/run
-
Este directorio contiene datos variables en tiempo de ejecución utilizados por los procesos en ejecución, como los archivos de identificación de los procesos (
.pid
). Los programas que necesitan más de un archivo de tiempo de ejecución pueden crear subdirectorios aquí. Esta ubicación debe ser despejada durante el arranque del sistema. El propósito de este directorio fue una vez servido por/var/run
y en algunos sistemas/var/run
puede ser un enlace simbólico a/run
.
Tenga en cuenta que no hay nada que impida a un programa crear archivos temporales en otra parte del sistema, pero es una buena práctica respetar las convenciones establecidas por FHS.
Permisos en los archivos temporales
Disponer de directorios temporales en todo el sistema en un sistema multiusuario, presenta algunos problemas en lo que respecta a los permisos de acceso. Al principio se pensó que tales directorios serían “escritos por todo el mundo”, es decir, que cualquier usuario podría escribir o borrar datos en ellos. Pero si esto fuera cierto, ¿cómo podríamos evitar que un usuario borre o modifique los archivos creados por otro?
La solución es un permiso especial llamado sticky bit, que se aplica tanto a directorios como a archivos. Sin embargo, por razones de seguridad, el kernel de Linux ignora el bit fijo cuando se aplica a los archivos. Cuando este bit especial se establece para un directorio, evita que los usuarios eliminen o renombren un archivo dentro de ese directorio a menos que sean propietarios del archivo.
Los directorios con el sicky bit muestran una t
reemplazando la x
en el permiso para otros en la salida de ls -l
. Por ejemplo, revisemos los permisos de los directorios tmp
y var/tmp
:
$ ls -ldh /tmp/ /var/tmp/ drwxrwxrwt 25 root root 4,0K Jun 7 18:52 /tmp/ drwxrwxrwt 16 root root 4,0K Jun 7 09:15 /var/tmp/
Como puedes ver por la t
que reemplaza a la x
en el permiso para otros, ambos directorios tienen el sticky bit.
Para poner el sticky bit en un directorio usando chmod
en modo numérico, usa la notación de cuatro dígitos y 1
como primer dígito. Por ejemplo:
$ chmod 1755 temp
Pondrá el sticky bit para el directorio llamado temp
y los permisos como rwxr-xr-t
.
Cuando use el modo simbólico, use el parámetro t
. Entonces, +t
para establecer el sticky bit, y -t
para desactivarlo. Por ejemplo:
$ chmod +t temp
Comprendiendo los enlaces
Ya hemos dicho que en Linux, todo se trata como un archivo. Pero hay un tipo de archivo especial llamado link, y hay dos tipos de enlaces en un sistema Linux:
- Enlaces simbólicos
-
También llamados enlaces suaves (soft links), apuntan a la ruta de otro archivo. Si borras el archivo al que apunta el enlace (llamado target) el enlace seguirá existiendo, pero “dejará de funcionar”, ya que ahora apunta a “nada”.
- Enlaces duros
-
Piensa en un enlace duro como un segundo nombre para el archivo original. No son duplicados, sino una entrada adicional en el sistema de archivos que apunta al mismo lugar (inodo) en el disco.
Tip
|
Un inodo es una estructura de datos que almacena atributos para un objeto (como un archivo o directorio) en un sistema de archivos. Entre esos atributos están el nombre del archivo, los permisos, la propiedad y en qué bloques del disco se almacenan los datos para el objeto. Piensa en ello como una entrada en un índice, de ahí el nombre, que viene de “nodo de índice”. |
Trabajando con enlaces duros (Hard Links)
Creación de enlaces duros
El comando para crear un enlace duro en Linux es ln
. La sintaxis básica es:
$ ln TARGET LINK_NAME
El TARGET
debe existir (este es el archivo al que apuntará el enlace), y si el destino no está en el directorio actual, o si quieres crear el enlace en otro lugar, debes definir la ruta completa. Por ejemplo, el comando:
$ ln target.txt /home/carol/Documents/hardlink
Creará un archivo llamado hardlink
en el directorio /home/carol/Documents/
, enlazado al archivo target.txt
en el directorio actual.
Si se omite el último parámetro (LINK_NAME
), se creará un enlace con el mismo nombre del objetivo en el directorio actual.
Administrando los enlaces duros
Los enlaces duros son entradas en el sistema de archivos que tienen nombres diferentes, pero que apuntan a los mismos datos en el disco. Todos esos nombres son iguales y pueden ser usados para referirse a un archivo. Si se cambia el contenido de uno de los nombres, el contenido de todos los demás nombres que apuntan a ese archivo cambia, ya que todos estos nombres apuntan a los mismos datos. Si elimina uno de los nombres, los otros nombres seguirán funcionando.
Esto sucede porque cuando “borras” un archivo, los datos no se borran realmente del disco. El sistema simplemente borra la entrada en la tabla del sistema de archivos que apunta al inodo correspondiente a los datos del disco. Pero si tienes una segunda entrada que apunta al mismo inodo, todavía puedes llegar a los datos. Piensa en ello como dos caminos que convergen en el mismo punto. Incluso si bloqueas o redireccionas uno de los caminos, todavía puedes llegar al destino usando el otro.
Puedes comprobarlo usando el parámetro -i
de ls
. Considere los siguientes contenidos de un directorio:
$ ls -li total 224 3806696 -r--r--r-- 2 carol carol 111702 Jun 7 10:13 hardlink 3806696 -r--r--r-- 2 carol carol 111702 Jun 7 10:13 target.txt
El número que precede a los permisos es el número inode. ¿Ves que tanto el archivo hardlink
como el archivo target.txt
tienen el mismo número (3806696
)? Esto es porque uno es un enlace duro del otro.
Pero, ¿cuál es el original y cuál es el enlace? No se puede decir realmente, ya que para todos los propósitos prácticos son los mismos.
Los archivos temporales son archivos utilizados por los programas para almacenar datos que solo se necesitan por un corto tiempo. Estos pueden ser los datos de procesos en ejecución, registros de bloqueo, archivos de memoria virtual de un autoguardado, archivos intermedios utilizados durante una conversión de archivos, archivos de caché, etc.
A diferencia de los enlaces simbólicos, solo puede crear enlaces duros a los archivos, y tanto el enlace como el destino deben residir en el mismo sistema de archivos.
Mover y eliminar enlaces duros
Dado que los enlaces duros se tratan como archivos normales, pueden eliminarse con rm
y cambiarse de nombre o moverse por el sistema de archivos con mv
. Y dado que un enlace duro apunta al mismo inodo de destino (target), puede moverse libremente, sin temor a “romper” el enlace.
Enlaces simbólicos
Creando enlaces simbólicos
El comando utilizado para crear un enlace simbólico también es ln
, pero agregando el parámetro -s
. Al igual que:
$ ln -s target.txt /home/carol/Documents/softlink
Esto creará un archivo llamado softlink
en el directorio /home/carol/Documents/
, apuntando al archivo target.txt
en el directorio actual.
Al igual que con los enlaces duros, puede omitir el nombre del enlace para crear un enlace con el mismo nombre que el objetivo en el directorio actual.
Administrando los enlaces simbólicos
Los enlaces simbólicos apuntan a otra ruta en el sistema de archivos. Puede crear enlaces simbólicos a los archivos y directorios, incluso en diferentes particiones. Es bastante fácil detectar un enlace simbólico en la salida de ls
:
$ ls -lh total 112K -rw-r--r-- 1 carol carol 110K Jun 7 10:13 target.txt lrwxrwxrwx 1 carol carol 12 Jun 7 10:14 softlink -> target.txt
En el ejemplo anterior, el primer carácter en los permisos del archivo softlink
es l
, indicando un enlace simbólico. Además, justo después del nombre del archivo vemos el nombre del objetivo al que apunta el enlace, el archivo target.txt
.
Observe que en los listados de archivos y directorios, los enlaces suaves, siempre muestran los permisos rwx
para el usuario, el grupo y otros, pero en la práctica los permisos de acceso para ellos son los mismos que los del objetivo (target).
Mover y eliminar los enlaces simbólicos
Como los enlaces duros, los enlaces simbólicos pueden ser eliminados usando rm
y movidos o renombrados usando mv
. Sin embargo, se debe tener especial cuidado al crearlos, para evitar “romper” el enlace si se mueve de su ubicación original.
Cuando se crean enlaces simbólicos hay que tener en cuenta que, a menos que se especifique completamente un camino, la ubicación del objetivo se interpreta como relativa a la ubicación del enlace. Esto puede crear problemas si el enlace, o el archivo al que apunta, se mueve.
Esto es más fácil de entender con un ejemplo. Digamos que tenemos un archivo llamado original.txt
en el directorio actual, y queremos crear un enlace simbólico a él llamado softlink
. Podríamos usar:
$ ln -s original.txt softlink
Y aparentemente todo estaría bien. Comprobemos con ls
:
$ ls -lh total 112K -r--r--r-- 1 carol carol 110K Jun 7 10:13 original.txt lrwxrwxrwx 1 carol carol 12 Jun 7 19:23 softlink -> original.txt
Mira cómo se construye el enlace: softlink
apunta a (→
) original.txt
. Sin embargo, veamos qué sucede si movemos el enlace al directorio padre e intentamos mostrar su contenido usando el comando less
:
$ mv softlink ../ $ less ../softlink ../softlink: No such file or directory
Como no se especificó la ruta de acceso al original.txt
, el sistema asume que está en el mismo directorio que el enlace. Cuando esto deja de ser cierto, el enlace deja de funcionar.
La forma de evitarlo es especificar siempre el camino completo al objetivo al crear el enlace:
$ ln -s /home/carol/Documents/original.txt softlink
De esta manera, no importa dónde muevas el enlace, este seguirá funcionando, porque apunta a la ubicación absoluta del objetivo (target). Compruébalo con ls
:
$ ls -lh total 112K lrwxrwxrwx 1 carol carol 40 Jun 7 19:34 softlink -> /home/carol/Documents/original.txt
Ejercicios guiados
-
Imagina que un programa necesita crear un archivo temporal de un solo uso que no se volverá a necesitar después de que el programa se cierre. ¿Cuál sería el directorio correcto para crear este archivo?
-
¿Cuál es el directorio temporal que debe ser limpiado durante el proceso de arranque?
-
¿Cuál es el parámetro para
chmod
en modo simbólico para habilitar el sticky bit en un directorio? -
Imagina que hay un archivo llamado
documento.txt
en el directorio/home/carol/Documents
. ¿Cuál es el comando para crear un enlace simbólico a hacia al archivo llamadotext.txt
en el directorio actual? -
Explique la diferencia entre un enlace duro a un archivo y una copia de este archivo.
Ejercicios exploratorios
-
Imagina que dentro de un directorio creas un archivo llamado
recipes.txt
. Dentro de este directorio, también crearás un enlace duro a este archivo llamadoreceitas.txt
y un enlace simbólico (o soft) a este llamadorezepte.txt
.$ touch recipes.txt $ ln recipes.txt receitas.txt $ ln -s recipes.txt rezepte.txt
El contenido del directorio debería aparecer así:
$ ls -lhi total 160K 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 receitas.txt 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 24 10:12 rezepte.txt -> receitas.txt
Recuerde que, como un enlace duro,
receitas.txt
apunta al mismo inodo querecipes.txt
. ¿Qué pasaría con el enlace suaverezepte.txt
si se borra el nombrereceitas.txt
? ¿Por qué? -
Imagina que tienes una unidad flash conectada en tu sistema, y montada en
/media/tu usuario/FlashA
. Quieres crear en tu directorio principal un enlace llamadoschematics.pdf
, apuntando al archivoesquema.pdf
en el directorio raíz del pendrive. Entonces, escribes el comando:$ ln /media/youruser/FlashA/esquema.pdf ~/schematics.pdf
¿Qué pasaría? ¿Por qué?
-
Considere la siguiente salida de
ls -lah
:$ ls -lah total 3,1M drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
¿Cuántos enlaces apuntan al archivo
document.txt
? -
¿Son enlaces suaves o duros?
-
¿Qué parámetro debes pasar a
ls
para ver qué inodo ocupa cada archivo?
-
-
Imagina que tienes en tu directorio
~/Documentos
un archivo llamadoclients.txt
que contiene algunos nombres de clientes y un directorio llamadosomedir
. Dentro de esto hay un archivo diferente llamado tambiénclients.txt
con diferentes nombres. Para replicar esta estructura, usa los siguientes comandos.$ cd ~/Documents $ echo "John, Michael, Bob" > clients.txt $ mkdir somedir $ echo "Bill, Luke, Karl" > somedir/clients.txt
Luego creas un enlace dentro de
somedir
llamadopartners.txt
apuntando a este archivo, con los comandos:$ cd somedir/ $ ln -s clients.txt partners.txt
Entonces, la estructura del directorio es:
Documents |-- clients.txt `-- somedir |-- clients.txt `-- partners.txt -> clients.txt
Ahora, mueva
partners.txt
desomedir
a~/Documentos
y enumere su contenido.$ cd ~/Documents/ $ mv somedir/partners.txt . $ less partners.txt
¿Seguirá funcionando el enlace? Si es así, ¿qué archivo tendrá su contenido listado? ¿Por qué?
-
Considere los siguientes archivos:
-rw-r--r-- 1 carol carol 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 carol carol 11 Jun 24 11:13 partners.txt -> clients.txt
¿Cuáles son los permisos de acceso para "partners.txt"? ¿Por qué?
Resumen
En esta lección usted aprendió:
-
¿Donde se almacenan los archivos temporales?
-
¿Cuál es el permiso especial que se les aplica?
-
¿Qué son los enlaces?
-
La diferencia entre los enlaces simbólicos y los duros.
-
¿Cómo crear enlaces?
-
¿Cómo moverlos, renombrarlos o eliminarlos?
Los siguientes comandos se discutieron en esta lección:
-
ln
-
El parámetro
-i
als
Respuestas a los ejercicios guiados
-
Imagina que un programa necesita crear un archivo temporal de un solo uso que no se volverá a necesitar después de que el programa se cierre. ¿Cuál sería el directorio correcto para crear este archivo?
Como no nos importa el archivo después de que el programa termine de ejecutarse, el directorio correcto es
/tmp
. -
¿Cuál es el directorio temporal que debe ser limpiado durante el proceso de arranque?
El directorio es
run
o en algunos sistemas,/var/run
. -
¿Cuál es el parámetro para
chmod
en modo simbólico para habilitar el sticky bit en un directorio?El símbolo para el sticky bit en modo simbólico es
t
. Ya que queremos habilitar (agregar) este permiso al directorio, el parámetro debe ser+t
. -
Imagina que hay un archivo llamado
documento.txt
en el directorio/home/carol/Documents
. ¿Cuál es el comando para crear un enlace simbólico a hacia al archivo llamadotext.txt
en el directorio actual?ln -s
es el comando para crear un vínculo simbólico. Ya que debes especificar la ruta completa del archivo al que estás enlazando, el comando es:$ ln -s /home/carol/Documents/document.txt text.txt
-
Explique la diferencia entre un enlace duro a un archivo y una copia de este archivo.
Un enlace duro es sólo otro nombre para un archivo. Aunque parezca un duplicado del archivo original, a todos los efectos tanto el enlace como el original son iguales, ya que apuntan a los mismos datos en el disco. Los cambios realizados en el contenido del enlace se reflejarán en el original y viceversa. Una copia es una entidad completamente independiente, que ocupa un lugar diferente en el disco. Los cambios realizados en la copia no se reflejarán en el original y viceversa.
Respuestas a los ejercicios exploratorios
-
Imagina que dentro de un directorio creas un archivo llamado
recipes.txt
. Dentro de este directorio, también crearás un enlace duro a este archivo llamadoreceitas.txt
y un enlace simbólico (o soft) a este llamadorezepte.txt
.$ touch recipes.txt $ ln recipes.txt receitas.txt $ ln -s recipes.txt rezepte.txt
El contenido del directorio debería aparecer así:
$ ls -lhi total 160K 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 receitas.txt 5388833 -rw-r--r-- 4 carol carol 77K jun 17 17:25 recipes.txt 5388837 lrwxrwxrwx 1 carol carol 12 jun 24 10:12 rezepte.txt -> recipes.txt
Recuerde que, como un enlace duro,
receitas.txt
apunta al mismo inodo querecipes.txt
. ¿Qué pasaría con el enlace suaverezepte.txt
si se borra el nombrereceitas.txt
? ¿Por qué?El enlace blando
rezepte.txt
dejaría de funcionar. Esto se debe a que los enlaces suaves (soft links) apuntan a nombres, no a inodos, y el nombrereceitas.txt
ya no existe, incluso si los datos siguen en el disco bajo el nombrerecetas.txt
. -
Imagina que tienes una unidad flash conectada en tu sistema, y montada en
/media/tu usuario/FlashA
. Quieres crear en tu directorio principal un enlace llamadoschematics.pdf
, apuntando al archivoesquema.pdf
en el directorio raíz del pendrive. Entonces, escribes el comando:$ ln /media/youruser/FlashA/esquema.pdf ~/schematics.pdf
¿Qué pasaría? ¿Por qué?
El comando fallaría. El mensaje de error sería
Invalid cross-device link
, y deja clara la razón: los enlaces duros no pueden apuntar a un objetivo (target) en una partición o dispositivo diferente. La única manera de crear un enlace como este es usar un enlace simbólico o soft, añadiendo el parámetros
aln
. -
Considere la siguiente salida de
ls -lah
:$ ls -lah total 3,1M drwxr-xr-x 2 carol carol 4,0K jun 17 17:27 . drwxr-xr-x 5 carol carol 4,0K jun 17 17:29 .. -rw-rw-r-- 1 carol carol 2,8M jun 17 15:45 compressed.zip -rw-r--r-- 4 carol carol 77K jun 17 17:25 document.txt -rw-rw-r-- 1 carol carol 216K jun 17 17:25 image.png -rw-r--r-- 4 carol carol 77K jun 17 17:25 text.txt
-
¿Cuántos enlaces apuntan al archivo
document.txt
?Cada archivo comienza con un recuento de enlaces de
1
. Dado que el recuento de enlaces para el archivo es de4
, hay tres enlaces que apuntan a ese archivo. -
¿Son enlaces suaves o duros?
Son enlaces duros, ya que los enlaces suaves no aumentan el número de enlaces de un archivo.
-
¿Qué parámetro debes pasar a
ls
para ver qué inodo ocupa cada archivo?El parámetro es
-i
. El inode se mostrará como la primera columna en la salida dels
, como se ve observa a continuación:$ ls -lahi total 3,1M 5388773 drwxr-xr-x 2 rigues rigues 4,0K jun 17 17:27 . 5245554 drwxr-xr-x 5 rigues rigues 4,0K jun 17 17:29 .. 5388840 -rw-rw-r-- 1 rigues rigues 2,8M jun 17 15:45 compressed.zip 5388833 -rw-r--r-- 4 rigues rigues 77K jun 17 17:25 document.txt 5388837 -rw-rw-r-- 1 rigues rigues 216K jun 17 17:25 image.png 5388833 -rw-r--r-- 4 rigues rigues 77K jun 17 17:25 text.txt
-
-
Imagina que tienes en tu directorio
~/Documentos
un archivo llamadoclients.txt
que contiene algunos nombres de clientes y un directorio llamadosomedir
. Dentro de esto hay un archivo diferente llamado tambiénclients.txt
con diferentes nombres. Para replicar esta estructura, usa los siguientes comandos.$ cd ~/Documents $ echo "John, Michael, Bob" > clients.txt $ mkdir somedir $ echo "Bill, Luke, Karl" > somedir/clients.txt
Luego creas un enlace dentro de
somedir
llamadopartners.txt
apuntando a este archivo, con los comandos:$ cd somedir/ $ ln -s clients.txt partners.txt
Entonces, la estructura del directorio es:
Documents |-- clients.txt `-- somedir |-- clients.txt `-- partners.txt -> clients.txt
Ahora, mueva
partners.txt
desomedir
a~/Documentos
y enumere su contenido.$ cd ~/Documents/ $ mv somedir/partners.txt . $ less partners.txt
¿Seguirá funcionando el enlace? Si es así, ¿qué archivo tendrá su contenido listado? ¿Por qué?
Este es un “truco”, pero el enlace funcionará, y el archivo listado será el de
Documents
, que contiene los nombresJohn
,Michael
,Bob
.Recuerde que como no especificó la ruta completa al destino
clients.txt
al crear el enlace blandopartners.txt
, la ubicación del destino se interpretará como relativa a la ubicación del enlace, que en este caso es el directorio actual.Cuando el enlace fue movido de
~/Documentos/somedir
a~/Documents
, debería dejar de funcionar, ya que el objetivo ya no estaba en el mismo directorio que el enlace. Sin embargo, sucede que hay un archivo llamadoclients.txt
en~/Documentos
, por lo que el enlace apuntará a este archivo, en lugar del destino original dentro de~/somedir
.Para evitar esto, siempre especifica el camino completo al objetivo al crear un enlace simbólico.
-
Considere los siguientes archivos:
-rw-r--r-- 1 rigues rigues 19 Jun 24 11:12 clients.txt lrwxrwxrwx 1 rigues rigues 11 Jun 24 11:13 partners.txt -> clients.txt
¿Cuáles son los permisos de acceso para
partners.txt
? ¿Por qué?Los permisos de acceso para
partners.txt
sonrw-r—r--
, ya que los enlaces siempre heredan los mismos permisos de acceso que el objetivo.