Perché non riesco a creare un collegamento reale dal file del dispositivo in un'altra directory / dev?


11

Quando volevo creare un collegamento reale nella mia /homedirectory in modalità root , Linux mostrava il seguente messaggio di errore:

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

Il messaggio di errore sopra è mostrato di seguito:

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

Ma potevo solo creare un collegamento reale nella /devdirectory, e non era possibile in altre directory.

Ora, voglio sapere come creare un collegamento reale da un file di dispositivo esistente (come sdb1) nella /homedirectory (o altre directory)?

Risposte:


21

Ma ho potuto solo creare un hard link nella directory / dev e non era possibile in altre directory.

Come mostrato dal messaggio di errore, non è possibile creare un collegamento reale tra diversi filesystem; puoi creare solo collegamenti soft (simbolici).

Per esempio, se il vostro /homeè in una partizione diversa da quella partizione di root, non sarà in grado di difficile collegamento /tmp/fooa /home/user/.

Ora, come ha sottolineato /dev@RichardNeumann , di solito è montato come filesystem devtmpfs. Vedi questo esempio:

[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

Pertanto è possibile creare solo collegamenti reali ai file /devall'interno /dev.


3
La partizione non è il problema. È, come hai affermato, la limitazione tra file system. /devdi solito è montato come devtmpfsfilesystem. In questo modo è possibile creare solo collegamenti fisici ai file /devall'interno /dev. Ad esempio, non è nemmeno possibile creare hardlink /dev/nullall'interno /dev/pts, poiché è montato con devptsun file system diverso.
Richard Neumann,

1
@RichardNeumann Ottimo punto. Ho corretto la mia risposta che era solo parzialmente corretta.
dr_

11

Un hard link non può essere utilizzato per ottenere ciò che desideri, poiché i hard link non funzionano tra i file system.

Tuttavia, puoi ottenere ciò che vuoi con il mknodcomando.

  1. Corri ls -l /dev/devicefile. Dovresti vedere un output come questo:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. Prendi nota del numero nella colonna delle dimensioni ( 1, 9).
  3. Esegui il comando mknod /path/to/destination c 1 9(sostituendo i valori desiderati).

Perché funziona?

I file di dispositivo sono effettivamente collegamenti reali a un file astratto implementato dal kernel o dai driver del kernel. Sebbene non sia possibile creare collegamenti fisici agli oggetti del file system da un altro file system, questi non sono oggetti del file system e quindi, conoscendo i loro numeri di riferimento principali e minori, è possibile creare un riferimento a essi da qualsiasi file system.



2

I collegamenti reali creano semplicemente un'altra voce in una directory, indicando un file (dove file è un file simile a una cosa, come una directory). Pertanto, i collegamenti reali non possono fare riferimento a un file in un altro file system.

I soft-link sono amici in questo caso. Usa ln -s. I softlink possono attraversare i filesystem e possono persino indicare qualcosa che non c'è.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.