Mengapa saya tidak dapat membuat tautan keras dari file perangkat selain dari direktori / dev?

11

Ketika saya ingin membuat tautan keras di /homedirektori saya dalam mode root , Linux menunjukkan pesan kesalahan berikut:

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

Pesan kesalahan di atas ditunjukkan di bawah ini:

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

Tapi saya hanya bisa membuat tautan keras di /devdirektori, dan itu tidak mungkin di direktori lain.

Sekarang, saya ingin tahu cara membuat tautan keras dari file perangkat yang ada (seperti sdb1) di /homedirektori (atau direktori lain)?

Reza Harasani
sumber

Jawaban:

21

Tapi saya hanya bisa membuat tautan keras di direktori / dev dan itu tidak mungkin di direktori lain.

Seperti yang ditunjukkan oleh pesan kesalahan, tidak mungkin membuat tautan keras di berbagai sistem file; Anda hanya dapat membuat tautan lunak (simbolis).

Misalnya, jika Anda /homeberada dalam partisi yang berbeda dari partisi root Anda, Anda tidak akan dapat link keras /tmp/foountuk /home/user/.

Sekarang, seperti yang ditunjukkan oleh @RichardNeumann, /devbiasanya dipasang sebagai sistem file devtmpfs. Lihat contoh ini:

[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

Karena itu Anda hanya dapat membuat tautan keras ke file di /devdalam /dev.

dr_
sumber
3
Partisi bukanlah masalahnya. Yaitu, seperti yang Anda sebutkan batasan cross-filesystem. /devbiasanya dipasang sebagai devtmpfssistem file. Dengan demikian Anda hanya dapat membuat tautan ke file di /devdalamnya /dev. Misalnya Anda tidak dapat membuat tautan keras ke /dev/nulldalam /dev/pts, karena dipasang dengan devptssistem file yang berbeda.
Richard Neumann
1
@RichardNeumann Poin bagus. Saya mengoreksi jawaban saya yang hanya sebagian benar.
dr_
11

Tautan keras tidak dapat digunakan untuk mencapai apa yang Anda inginkan, karena tautan keras tidak berfungsi di antara sistem file.

Namun, Anda dapat mencapai apa yang Anda inginkan dengan mknodperintah tersebut.

  1. Lari ls -l /dev/devicefile. Anda akan melihat output seperti ini:

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. Perhatikan nomor di kolom ukuran ( 1, 9).
  3. Jalankan perintah mknod /path/to/destination c 1 9(mengganti nilai yang Anda inginkan).

Mengapa ini bekerja?

File perangkat adalah tautan keras yang efektif ke file abstrak yang diimplementasikan oleh kernel atau driver kernel. Meskipun Anda tidak dapat membuat tautan keras ke objek sistem file dari sistem file lain, ini bukan objek sistem file dan karenanya, dengan mengetahui nomor referensi utama dan minornya, Anda dapat membuat referensi untuk mereka dari sistem file apa pun.

wizzwizz4
sumber
2

Tautan keras hanya membuat entri lain dalam direktori, menunjuk ke sebuah file (di mana file adalah file seperti benda, seperti direktori). Oleh karena itu hard-link tidak dapat mereferensikan file di sistem file lain.

Soft-link adalah teman Anda dalam hal ini. Gunakan ln -s. Softlink dapat melintasi filesystem, dan bahkan dapat menunjuk ke sesuatu yang tidak ada.

ctrl-alt-delor
sumber