Pourquoi je ne peux pas créer un lien dur à partir du fichier de périphérique dans un répertoire autre que / dev?

11

Lorsque je voulais créer un lien dur dans mon /homerépertoire en mode racine , Linux a affiché le message d'erreur suivant:

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

Le message d'erreur ci-dessus est affiché ci-dessous:

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

Mais je ne pouvais créer qu'un lien dur dans le /devrépertoire, et ce n'était pas possible dans d'autres répertoires.

Maintenant, je veux savoir comment créer un lien dur à partir d'un fichier de périphérique existant (comme sdb1) dans le /homerépertoire (ou d'autres répertoires)?

Reza Harasani
la source

Réponses:

21

Mais je ne pouvais créer qu'un lien dur dans le répertoire / dev et ce n'était pas possible dans d'autres répertoires.

Comme le montre le message d'erreur, il n'est pas possible de créer un lien dur entre différents systèmes de fichiers; vous ne pouvez créer que des liens souples (symboliques).

Par exemple, si votre se /hometrouve dans une partition différente de votre partition racine, vous ne pourrez pas établir de lien dur /tmp/foovers /home/user/.

Maintenant, comme l'a souligné @RichardNeumann, il /devest généralement monté en tant que système de fichiers devtmpfs. Voir cet exemple:

[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

Par conséquent, vous ne pouvez créer que des liens physiques vers des fichiers /devinternes /dev.

dr_
la source
3
La partition n'est pas le problème. Il s'agit, comme vous l'avez indiqué, de la limitation du système de fichiers croisé. /devest généralement monté en tant que devtmpfssystème de fichiers. Ainsi, vous ne pouvez créer que des liens physiques vers des fichiers /devinternes /dev. Par exemple, vous ne pouvez même pas créer de liens physiques vers l' /dev/nullintérieur /dev/pts, car il est monté avec devptsun système de fichiers différent.
Richard Neumann
1
@RichardNeumann Bon point. J'ai corrigé ma réponse qui n'était que partiellement correcte.
dr_
11

Un lien dur ne peut pas être utilisé pour obtenir ce que vous voulez, car les liens durs ne fonctionnent pas entre les systèmes de fichiers.

Cependant, vous pouvez réaliser ce que vous voulez avec la mknodcommande.

  1. Courez ls -l /dev/devicefile. Vous devriez voir une sortie comme celle-ci:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. Notez le nombre dans la colonne de taille ( 1, 9).
  3. Exécutez la commande mknod /path/to/destination c 1 9(en remplaçant les valeurs souhaitées).

Pourquoi ça marche?

Les fichiers de périphérique sont en fait des liens durs vers un fichier abstrait implémenté par le noyau ou les pilotes du noyau. Bien que vous ne puissiez pas créer de liens physiques vers des objets du système de fichiers à partir d'un autre système de fichiers, ce ne sont pas des objets du système de fichiers et donc, en connaissant leurs numéros de référence majeurs et mineurs, vous pouvez créer une référence à eux à partir de n'importe quel système de fichiers.

wizzwizz4
la source
2

Les liens matériels créent simplement une autre entrée dans un répertoire, pointant vers un fichier (où fichier est un fichier semblable à un fichier, tel qu'un répertoire). Les liens physiques ne peuvent donc pas référencer un fichier dans un autre système de fichiers.

Les liens logiciels sont vos amis dans ce cas. Utilisez ln -s. Les liens logiciels peuvent traverser les systèmes de fichiers et peuvent même pointer vers quelque chose qui n'est pas là.

ctrl-alt-delor
la source