¿Por qué no puedo crear un enlace duro desde el archivo del dispositivo en otro directorio que no sea / dev?

11

Cuando quería crear un enlace duro en mi /homedirectorio en modo raíz , Linux mostró el siguiente mensaje de error:

ln: failed to create hard link ‘my_sdb’ => ‘/dev/sda1’: Invalid cross-device link

El mensaje de error anterior se muestra a continuación:

# cd /home/user/
# ln /dev/sda1 my_sdb

Pero solo pude crear un enlace duro en el /devdirectorio, y no fue posible en otros directorios.

Ahora, quiero saber cómo crear un enlace duro desde un archivo de dispositivo existente (como sdb1) en el /homedirectorio (u otros directorios).

Reza Harasani
fuente

Respuestas:

21

Pero solo pude crear un enlace duro en el directorio / dev y no fue posible en otros directorios.

Como se muestra en el mensaje de error, no es posible crear un enlace rígido en diferentes sistemas de archivos; solo puede crear enlaces blandos (simbólicos).

Por ejemplo, si tu /homeestá en una partición diferente de la partición raíz, usted no será capaz de enlace duro /tmp/fooa /home/user/.

Ahora, como señaló @RichardNeumann, /devgeneralmente se monta como un sistema de archivos devtmpfs. Ver este ejemplo:

[dr01@centos7 ~]$ df
Filesystem                      1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos_centos7-root  46110724 3792836  42317888   9% /
devtmpfs                          4063180       0   4063180   0% /dev
tmpfs                             4078924       0   4078924   0% /dev/shm
tmpfs                             4078924    9148   4069776   1% /run
tmpfs                             4078924       0   4078924   0% /sys/fs/cgroup
/dev/sda1                         1038336  202684    835652  20% /boot
tmpfs                              815788      28    815760   1% /run/user/1000

Por lo tanto, solo puede crear enlaces duros a archivos /devdentro /dev.

Dr_
fuente
3
La partición no es el problema. Es, como usted dijo, la limitación del sistema de archivos cruzados. /devgeneralmente se monta como un devtmpfssistema de archivos. Por lo tanto, solo puede crear enlaces duros a archivos /devdentro /dev. Por ejemplo, ni siquiera puede crear enlaces /dev/nullinternos /dev/pts, ya que está montado devptscomo un sistema de archivos diferente.
Richard Neumann
1
@RichardNeumann Buen punto. Corregí mi respuesta, que era solo parcialmente correcta.
dr_
11

Un enlace duro no se puede usar para lograr lo que desea, porque los enlaces duros no funcionan entre sistemas de archivos.

Sin embargo, puede lograr lo que desea con el mknodcomando.

  1. Ejecutar ls -l /dev/devicefile. Debería ver una salida como esta:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. Tome nota del número en la columna de tamaño ( 1, 9).
  3. Ejecute el comando mknod /path/to/destination c 1 9(sustituyendo los valores que desee).

¿Por qué funciona esto?

Los archivos de dispositivo son efectivamente enlaces duros a un archivo abstracto implementado por el núcleo o los controladores del núcleo. Si bien no puede crear enlaces duros a objetos del sistema de archivos desde otro sistema de archivos, estos no son objetos del sistema de archivos y, por lo tanto, al conocer sus números de referencia mayores y menores, puede crear una referencia a ellos desde cualquier sistema de archivos.

wizzwizz4
fuente
2

Los enlaces duros simplemente crean otra entrada en un directorio, apuntando a un archivo (donde el archivo es similar a un archivo, como un directorio). Por lo tanto, los enlaces duros no pueden hacer referencia a un archivo en otro sistema de archivos.

Soft-links eres tu amigo en este caso. Uso ln -s. Los enlaces suaves pueden atravesar sistemas de archivos e incluso pueden apuntar a algo que no está allí.

ctrl-alt-delor
fuente