Problema original
Tengo un archivo en un sistema de archivos: /data/src/file
y quiero vincularlo a: /home/user/proj/src/file
pero /home
está en un disco y /data
está en otro, así que recibo un error:
$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
Bien, entonces aprendí que no puedo vincular a través de dispositivos. Tiene sentido.
Problema a mano
Así que pensé en ponerme elegante y montar una src
carpeta que está en /data
el sistema de archivos:
$ mkdir -p /data/other/src
$ cd /home/user/proj
$ sudo mount --bind /data/other/src src/
$ cd src
$ # (now we're technically on `/data`'s file system, right?)
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
¿Por qué esto todavía no funciona?
Solución alterna
Sé que tengo esta configuración correcta porque puedo hacer el enlace duro siempre que esté en el /data
directorio "real" en lugar del enlazado.
$ cd /data/other/src
$ ln /data/src/file .
$ # OK
$ cd /home/user/proj/src
$ ls -lh
total 35M
-rw------- 2 user user 35M Jul 17 22:22 file
$
Alguna información del sistema
$ uname -a
Linux <host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ findmnt
.
.
.
├─/home /dev/sdb8 ext4 rw,relatime,data=ordered
│ └─/home/usr/proj/src /dev/sda2[/other/src]
│ ext4 rw,relatime,data=ordered
└─/data /dev/sda2 ext4 rw,relatime,data=ordered
$ mountpoint -d /data
8:2
$ mountpoint -d /home/usr/proj/src/
8:2
Nota : Cambié manualmente los nombres de archivo y directorio para aclarar la situación, por lo que puede haber un error tipográfico o dos en las lecturas de comandos.
mount
ln
bind-mount
jdk1.0
fuente
fuente
/data
puedo acceder al inodo desde el directorio de montaje de enlace, por lo que el montaje de enlace debe estar en la misma partición/data
o el enlace duro funciona en todos los dispositivos, lo que debería ser ilegal, pero funciona de todos modos. ¿Qué me estoy perdiendo?Respuestas:
Hay una falta decepcionante de comentarios en el código . Es como si a nadie le hubiera parecido útil, ya que los montajes de enlace de tiempo se implementaron en v2.4. Seguramente todo lo que necesita hacer es sustituir
.mnt->mnt_sb
donde dice.mnt
...- Al Viro
Hay un ejemplo concreto más abajo en el hilo
fuente
La razón por la que no puede hacer enlaces entre dispositivos es porque introduce ambigüedades. La entrada de directorio para el archivo contiene (en sistemas simples) el número de i-nodo para el archivo en cuestión. Un enlace rígido (solo otra entrada de directorio) también debe contener el mismo número de i-nodo. Esto está bien, pero los números de i-node solo son únicos dentro de un solo sistema de archivos (generalmente son un conjunto denso que comienza en 1).
Su montaje de enlace no soluciona ese problema. Sí, construye una especie de 'ficción' de la estructura, pero lo que no hace es volver a numerar todos los nodos-i en un sistema de archivos para asegurarse de que sean únicos en los dos sistemas de archivos en cuestión. Eso sería una tontería.
Esta restricción siempre ha estado presente en los sistemas UNIX. El enlace simbólico fue inventado en parte para resolver esto. Sé que no son funcionalmente iguales, pero generalmente están bien.
Prueba un enlace simbólico? (
ln -s
)fuente
ls -l
. Razonamiento tonto un poco al principio, pero luego se conduce a un agujero de conejo y me dio curiosidad sobre lo que estaba pasando con los enlaces duros ...