Masalah Asli
Saya punya file di satu sistem file: /data/src/file
dan saya ingin menghubungkannya dengan keras: /home/user/proj/src/file
tetapi /home
pada satu disk, dan /data
pada yang lain jadi saya mendapatkan kesalahan:
$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
Oke, jadi saya belajar bahwa saya tidak bisa menautkan keras lintas perangkat. Masuk akal.
Masalah yang dihadapi
Jadi saya pikir saya akan suka dan mengikat mount src
folder yang ada /data
di sistem file:
$ mkdir -p /data/other/src
$ cd /home/user/proj
$ sudo mount --bind /data/other/src src/
$ cd src
$ # (now we're technically on `/data`'s file system, right?)
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
Mengapa ini masih tidak berhasil?
Penanganan masalah
Saya tahu saya memiliki pengaturan ini dengan benar karena saya dapat membuat tautan keras selama saya berada di /data
direktori "asli" daripada yang terikat.
$ cd /data/other/src
$ ln /data/src/file .
$ # OK
$ cd /home/user/proj/src
$ ls -lh
total 35M
-rw------- 2 user user 35M Jul 17 22:22 file
$
Beberapa Info Sistem
$ uname -a
Linux <host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ findmnt
.
.
.
├─/home /dev/sdb8 ext4 rw,relatime,data=ordered
│ └─/home/usr/proj/src /dev/sda2[/other/src]
│ ext4 rw,relatime,data=ordered
└─/data /dev/sda2 ext4 rw,relatime,data=ordered
$ mountpoint -d /data
8:2
$ mountpoint -d /home/usr/proj/src/
8:2
Catatan : Saya secara manual mengubah nama file dan direktori untuk membuat situasi lebih jelas, sehingga mungkin ada salah ketik atau dua dalam pembacaan perintah.
mount
ln
bind-mount
jdk1.0
sumber
sumber
/data
saya dapat mengakses inode dari direktori bind mount, jadi bind mount harus berada di partisi yang sama dengan/data
, atau tautan keras bekerja di seluruh perangkat, yang seharusnya ilegal, tetapi tetap berfungsi. Apa yang saya lewatkan?Jawaban:
Ada kekurangan komentar yang mengecewakan dalam kode . Seolah-olah tidak ada yang pernah berpikir itu berguna, karena waktu bind mount diimplementasikan di v2.4. Tentunya yang perlu Anda lakukan adalah mengganti di
.mnt->mnt_sb
mana dikatakan.mnt
...- Al Viro
Ada contoh nyata lebih jauh ke bawah
sumber
Alasan Anda tidak dapat melakukan penautan lintas perangkat adalah karena Anda memperkenalkan ambiguitas. Entri direktori untuk file berisi (dalam sistem sederhana) nomor i-node untuk file yang bersangkutan. Tautan keras (hanya entri direktori lain) juga harus berisi nomor i-simpul yang sama. Ini baik-baik saja, tetapi angka-angka i-node hanya unik dalam satu sistem file (mereka biasanya satu set padat mulai dari 1).
Bind mount Anda tidak memperbaiki masalah itu. Ya, itu membangun semacam 'fiksi' dari struktur, tetapi yang tidak dilakukannya adalah menghitung ulang semua i-node pada satu sistem file untuk memastikan semuanya unik di kedua sistem file yang bersangkutan! Itu akan konyol.
Pembatasan ini selalu ada di sistem UNIX. Tautan simbolis diciptakan sebagian untuk menyelesaikan ini. Saya tahu mereka secara fungsional tidak persis sama, tetapi mereka biasanya OK.
Coba tautan simbolis? (
ln -s
)sumber
ls -l
. Agak konyol penalaran pada awalnya, tetapi kemudian mengarah ke lubang kelinci dan saya ingin tahu apa yang terjadi dengan tautan keras ...