Por que não consigo criar um link físico a partir do arquivo do dispositivo em outro diretório que não seja / dev?

11

Quando eu queria criar um link físico no meu /homediretório no modo raiz , o Linux mostrou a seguinte mensagem de erro:

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

A mensagem de erro acima é mostrada abaixo:

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

Mas eu só consegui criar um link físico no /devdiretório e isso não foi possível em outros diretórios.

Agora, quero saber como criar um link físico a partir de um arquivo de dispositivo existente (como sdb1) no /homediretório (ou em outros diretórios)?

Reza Harasani
fonte

Respostas:

21

Mas eu só consegui criar um link físico no diretório / dev e isso não foi possível em outros diretórios.

Como mostra a mensagem de erro, não é possível criar um link físico entre diferentes sistemas de arquivos; você pode criar apenas links suaves (simbólicos).

Por exemplo, se você /homeestiver em uma partição diferente da partição raiz, não poderá fazer o link direto /tmp/foopara /home/user/.

Agora, como @RichardNeumann apontou, /devgeralmente é montado como um sistema de arquivos devtmpfs. Veja este exemplo:

[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

Portanto, você só pode criar links físicos para arquivos no /devinterior /dev.

dr01
fonte
3
A partição não é o problema. É como você declarou a limitação do sistema de arquivos cruzados. /devgeralmente é montado como um devtmpfssistema de arquivos. Assim, você só pode criar hardlinks para arquivos /devdentro dele /dev. Por exemplo, você não pode nem criar hardlinks para /dev/nulldentro /dev/pts, porque ele é montado com devptsum sistema de arquivos diferente.
Richard Neumann
1
@RichardNeumann Good point. Corrigi minha resposta, que estava apenas parcialmente correta.
039:
11

Um link físico não pode ser usado para alcançar o que você deseja, porque os links físicos não funcionam entre sistemas de arquivos.

No entanto, você pode conseguir o que deseja com o mknodcomando

  1. Corra ls -l /dev/devicefile. Você deve ver uma saída como esta:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. Anote o número na coluna de tamanho ( 1, 9).
  3. Execute o comando mknod /path/to/destination c 1 9(substituindo os valores desejados).

Por que isso funciona?

Os arquivos do dispositivo são efetivamente links físicos para um arquivo abstrato implementado pelo kernel ou pelos drivers do kernel. Embora você não possa criar links físicos para objetos do sistema de arquivos de outro sistema de arquivos, eles não são objetos do sistema de arquivos e, portanto, conhecendo seus números de referência principais e secundários, é possível criar uma referência a eles a partir de qualquer sistema de arquivos.

wizzwizz4
fonte
2

Os links físicos apenas criam outra entrada em um diretório, apontando para um arquivo (em que arquivo é semelhante a um arquivo, como um diretório). Portanto, os links físicos não podem fazer referência a um arquivo em outro sistema de arquivos.

Soft-links você é amigo neste caso. Use ln -s. Os softlinks podem atravessar sistemas de arquivos e até apontar para algo que não existe.

ctrl-alt-delor
fonte