Почему я не могу создать жесткую ссылку из файла устройства, кроме каталога / dev?

11

Когда я хотел создать жесткую ссылку в своем /homeкаталоге в корневом режиме, Linux показывал следующее сообщение об ошибке:

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

Вышеуказанное сообщение об ошибке показано ниже:

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

Но я мог создать только жесткую ссылку в /devкаталоге, а в других каталогах это было невозможно.

Теперь я хочу знать, как создать жесткую ссылку из существующего файла устройства (например sdb1) в /homeкаталоге (или других каталогах)?

Реза Харасани
источник

Ответы:

21

Но я мог создать жесткую ссылку только в каталоге / dev, а в других каталогах это было невозможно.

Как видно из сообщения об ошибке, невозможно создать жесткую ссылку на разные файловые системы; Вы можете создавать только мягкие (символические) ссылки.

Например, если вы /homeнаходитесь в другом разделе, чем ваш корневой раздел, вы не сможете жесткую ссылку /tmp/fooна /home/user/.

Теперь, как указал @RichardNeumann, /devобычно монтируется как файловая система devtmpfs. Смотрите этот пример:

[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

Поэтому вы можете создавать только жесткие ссылки на файлы /devвнутри /dev.

dr_
источник
3
Раздел не проблема. Это, как вы заявили, ограничение кросс-файловой системы. /devобычно монтируется как devtmpfsфайловая система. Таким образом, вы можете создавать жесткие ссылки только на файлы /devвнутри /dev. Например, вы не можете даже создать жесткие ссылки /dev/nullвнутри /dev/pts, потому что он монтируется devptsкак другая файловая система.
Ричард Нойманн
1
@RichardNeumann Хорошая мысль. Я исправил свой ответ, который был только отчасти правильным.
Dr_
11

Жесткая ссылка не может быть использована для достижения того, чего вы хотите, потому что жесткие ссылки не работают между файловыми системами.

Тем не менее, вы можете достичь того, что вы хотите с помощью mknodкоманды.

  1. Беги ls -l /dev/devicefile. Вы должны увидеть результат вроде этого:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. Обратите внимание на число в столбце размера ( 1, 9).
  3. Запустите команду mknod /path/to/destination c 1 9(подставив нужные значения).

Почему это работает?

Файлы устройств - это жесткие ссылки на абстрактный файл, реализованный ядром или драйверами ядра. Хотя вы не можете создавать жесткие ссылки на объекты файловой системы из другой файловой системы, это не объекты файловой системы, поэтому, зная их основные и второстепенные ссылочные номера, вы можете создать ссылку на них из любой файловой системы.

wizzwizz4
источник
2

Жесткие ссылки просто создают другую запись в каталоге, указывающую на файл (где файл - это файл, подобный файлу, например каталогу). Поэтому жесткие ссылки не могут ссылаться на файл в другой файловой системе.

Софт-ссылки в этом случае вы друг. Использование ln -s. Мягкие ссылки могут проходить через файловые системы и даже могут указывать на то, чего там нет.

Ctrl-Alt-Делор
источник