web-dev-qa-db-fra.com

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

Quand je voulais créer un lien dur dans mon /home Répertoire dans Mode root , Linux a montré 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 /dev ré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 /home répertoire (ou autres répertoires)?

11
Reza Harasani

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

Comme indiqué par le message d'erreur, il n'est pas possible de créer une liaison matérielle dans différents systèmes de fichiers; Vous pouvez créer uniquement des liens doux (symboliques).

Par exemple, si votre /home est dans une partition différente de votre partition racine, vous ne pourrez pas connaître le lien dur /tmp/foo à /home/user/.

Maintenant, comme @RichardNeumann a souligné, /dev est 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 difficiles vers des fichiers dans /dev dans /dev.

21
dr_

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

Cependant, vous pouvez obtenir ce que vous voulez avec la commande mknod.

  1. Courir 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. Prenez note du numéro dans la colonne de taille (1, 9).
  3. Exécutez la commande mknod /path/to/destination c 1 9 (substituer les valeurs que vous voulez).

Pourquoi cela fonctionne-t-il?

Les fichiers de périphérique sont des liens effectivement durs vers un fichier abstrait mis en œuvre par les pilotes du noyau ou du noyau. Bien que vous ne puissiez pas créer de liens durs pour fichier des objets système à partir d'un autre système de fichiers, ceux-ci ne sont pas des objets de système de fichiers, ce qui ne correspond pas à leurs numéros de référence majeurs et mineurs, vous pouvez en créer une référence à partir de n'importe quel système de fichiers.

11
wizzwizz4

Liens durs Il suffit de créer une autre entrée dans un répertoire, pointant vers un fichier (où le fichier est un fichier comme une chose, telle qu'un répertoire). Par conséquent, les liens difficiles ne peuvent pas faire référence à un fichier dans un autre système de fichiers.

Les liens doux sont votre ami dans ce cas. Utilisation ln -s. Les softlinks peuvent passer à travers des systèmes de fichiers et peuvent même indiquer quelque chose qui n'est pas là.

2
ctrl-alt-delor