Warum kann ich keinen festen Link aus einer Gerätedatei in einem anderen Verzeichnis als / dev erstellen?

11

Als ich /homeim Root- Modus einen festen Link in meinem Verzeichnis erstellen wollte , zeigte Linux die folgende Fehlermeldung an:

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

Die obige Fehlermeldung wird unten angezeigt:

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

Ich konnte jedoch nur einen festen Link im /devVerzeichnis erstellen , was in anderen Verzeichnissen nicht möglich war.

Jetzt möchte ich wissen, wie man einen festen Link aus einer vorhandenen Gerätedatei (wie sdb1) im /homeVerzeichnis (oder anderen Verzeichnissen) erstellt.

Reza Harasani
quelle

Antworten:

21

Aber ich konnte nur einen festen Link im Verzeichnis / dev erstellen und es war in anderen Verzeichnissen nicht möglich.

Wie die Fehlermeldung zeigt, ist es nicht möglich, eine feste Verbindung zwischen verschiedenen Dateisystemen herzustellen. Sie können nur weiche (symbolische) Links erstellen.

Zum Beispiel, wenn Ihr /homein einer anderen Partition als Root - Partition ist, werden Sie nicht zu hart Link der Lage sein , /tmp/foozu /home/user/.

Jetzt wird, wie @RichardNeumann hervorhob, /devnormalerweise als devtmpfs-Dateisystem gemountet. Siehe dieses Beispiel:

[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

Daher können Sie nur feste Links zu Dateien /devinnerhalb von erstellen /dev.

dr01
quelle
3
Die Partition ist nicht das Problem. Es ist, wie Sie angegeben haben, die dateisystemübergreifende Einschränkung. /devwird normalerweise als devtmpfsDateisystem gemountet . Daher können Sie nur Hardlinks zu Dateien /devinnerhalb von erstellen /dev. Sie können zB nicht einmal Hardlinks nach /dev/nullinnen erstellen /dev/pts, da es devptsals anderes Dateisystem bereitgestellt wird.
Richard Neumann
1
@ RichardNeumann Guter Punkt. Ich habe meine Antwort korrigiert, die nur teilweise richtig war.
Dr01
11

Ein fester Link kann nicht verwendet werden, um das zu erreichen, was Sie möchten, da harte Links zwischen Dateisystemen nicht funktionieren.

Mit dem mknodBefehl können Sie jedoch erreichen, was Sie wollen .

  1. Ausführen ls -l /dev/devicefile. Sie sollten eine Ausgabe wie diese sehen:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. Notieren Sie sich die Nummer in der Größenspalte ( 1, 9).
  3. Führen Sie den Befehl aus mknod /path/to/destination c 1 9(ersetzen Sie die gewünschten Werte).

Warum funktioniert das?

Gerätedateien sind effektiv feste Links zu einer abstrakten Datei, die vom Kernel oder den Kerneltreibern implementiert wird. Sie können zwar keine festen Links zu Dateisystemobjekten aus einem anderen Dateisystem erstellen, diese sind jedoch keine Dateisystemobjekte. Wenn Sie also ihre Haupt- und Nebenreferenznummern kennen, können Sie aus jedem Dateisystem einen Verweis darauf erstellen.

wizzwizz4
quelle
2

Harte Links erstellen einfach einen weiteren Eintrag in einem Verzeichnis, der auf eine Datei verweist (wobei Datei eine Datei wie ein Verzeichnis ist). Daher können Hardlinks nicht auf eine Datei in einem anderen Dateisystem verweisen.

Softlinks sind in diesem Fall dein Freund. Verwenden Sie ln -s. Softlinks können sich über Dateisysteme erstrecken und sogar auf etwas verweisen, das nicht vorhanden ist.

Strg-Alt-Delor
quelle