Dlaczego nie mogę utworzyć twardego łącza z pliku urządzenia w katalogu innym niż / dev?


11

Kiedy chciałem utworzyć twardy link w moim /homekatalogu w trybie root , Linux wyświetlił następujący komunikat o błędzie:

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

Powyższy komunikat o błędzie pokazano poniżej:

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

Ale mogłem utworzyć tylko twardy link w /devkatalogu i nie było to możliwe w innych katalogach.

Teraz chcę wiedzieć, jak utworzyć twardy link z istniejącego pliku urządzenia (np. sdb1) W /homekatalogu (lub innych katalogach)?

Odpowiedzi:


21

Ale mogłem tylko utworzyć twardy link w katalogu / dev i nie było to możliwe w innych katalogach.

Jak pokazuje komunikat o błędzie, nie można utworzyć twardego łącza między różnymi systemami plików; możesz tworzyć tylko miękkie (symboliczne) linki.

Na przykład, jeśli twoja /homepartycja znajduje się na innej partycji niż partycja root, nie będziesz mógł połączyć się z nią /tmp/foona stałe /home/user/.

Teraz, jak wskazał @RichardNeumann, /devjest zwykle montowany jako system plików devtmpfs. Zobacz ten przykład:

[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

Dlatego możesz tworzyć tylko twarde linki do plików /devwewnątrz /dev.


3
Partycja nie jest problemem. Jest tak, jak powiedziałeś, ograniczenie między systemami plików. /devjest zwykle montowany jako devtmpfssystem plików. W ten sposób można tworzyć tylko dowiązania twarde do plików /devwewnątrz /dev. Nie możesz np. Nawet utworzyć dowiązań twardych do /dev/nullwewnątrz /dev/pts, ponieważ jest on montowany devptsjako inny system plików.
Richard Neumann

1
@RichardNeumann Dobra uwaga. Poprawiłem swoją odpowiedź, która była tylko częściowo poprawna.
dr_

11

Nie można użyć twardego łącza do osiągnięcia tego, co chcesz, ponieważ twarde łącza nie działają między systemami plików.

Możesz jednak osiągnąć to, co chcesz za pomocą mknodpolecenia.

  1. Uruchom ls -l /dev/devicefile. Powinieneś zobaczyć takie wyjście:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. Zanotuj liczbę w kolumnie rozmiaru ( 1, 9).
  3. Uruchom polecenie mknod /path/to/destination c 1 9(zastępując żądane wartości).

Dlaczego to działa?

Pliki urządzeń są faktycznie twardymi dowiązaniami do pliku abstrakcyjnego zaimplementowanego przez jądro lub sterowniki jądra. Chociaż nie można tworzyć twardych łączy do obiektów systemu plików z innego systemu plików, nie są to obiekty systemu plików, a zatem znając ich główne i drobne numery referencyjne, można utworzyć odwołanie do nich z dowolnego systemu plików.



2

Twarde linki po prostu tworzą kolejną pozycję w katalogu, wskazując na plik (gdzie plik jest czymś podobnym do pliku, takim jak katalog). Dlatego twarde łącza nie mogą odwoływać się do pliku w innym systemie plików.

W tym przypadku jesteś przyjacielem. Zastosowanie ln -s. Miękkie linki mogą przechodzić między systemami plików, a nawet wskazywać na coś, czego nie ma.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.