Tại sao tôi không thể tạo một 'liên kết cứng' đến một tệp từ thư mục núi mount --bind trên cùng một hệ thống tệp?


9

Vấn đề ban đầu

Tôi có một tệp trên một hệ thống tệp: /data/src/file

và tôi muốn liên kết nó với: /home/user/proj/src/file

nhưng /hometrên một đĩa và trên đĩa /datakhác nên tôi gặp lỗi:

$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link

Được rồi, vì vậy tôi đã học được rằng tôi không thể liên kết cứng trên các thiết bị. Có ý nghĩa.

Vấn đề trong tầm tay

Vì vậy, tôi nghĩ rằng tôi sẽ thích và gắn kết một srcthư mục trên /datahệ thống tệp của:

$ 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

Tại sao điều này vẫn không hoạt động?

Giải pháp thay thế

Tôi biết tôi có thiết lập này ngay vì tôi có thể tạo liên kết cứng miễn là tôi đang ở trong thư mục "thực" /datathay vì liên kết.

$ 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

$

Một số thông tin hệ thống

$ 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

Lưu ý : Tôi đã thay đổi thủ công tên tệp và thư mục để làm cho tình huống rõ ràng hơn, do đó có thể có một hoặc hai lỗi đánh máy trong phần đọc lệnh.


2
Không quan trọng bạn gắn thư mục ở đâu. Chúng là vật lý trên các phân vùng khác nhau. Mỗi phân vùng có bảng tệp riêng và liên kết cứng chỉ được ghi trong bảng này.
dùng996142

2
Vấn đề ở đây là các tệp KHÔNG nằm trên các phân vùng vật lý khác nhau. Đó là cùng một hệ thống tập tin từ cùng một phân vùng. Sự khác biệt là gắn kết liên kết.
roaima

Gắn kết gắn kết chỉ là một hư cấu. Nó không thay đổi cấu trúc dữ liệu trên các đĩa. Các hệ thống tập tin vẫn còn riêng biệt.
Bob Eager

Nhưng khi tôi tạo liên kết cứng trên /datatôi có thể truy cập vào nút từ thư mục gắn kết liên kết, do đó, liên kết gắn kết phải nằm trên cùng một phân vùng /data, hoặc liên kết cứng đang hoạt động trên các thiết bị, dù là bất hợp pháp, nhưng dù sao cũng hoạt động. Tôi đang thiếu gì?
jdk1.0

Câu trả lời:


6

Có một sự thiếu sót đáng thất vọng trong các . Như thể không ai từng nghĩ nó hữu ích, vì thời gian gắn kết thời gian được thực hiện trong phiên bản.4. Chắc chắn tất cả những gì bạn cần làm là thay thế .mnt->mnt_sbnơi nó nói .mnt...

Bởi vì nó cung cấp cho bạn một ranh giới bảo mật xung quanh một cây con.

PS: đã được thảo luận khá nhiều lần, nhưng để tránh các tìm kiếm: xem xét ví dụ mount --bind / tmp / tmp; bây giờ bạn đã có một tình huống khi người dùng không thể tạo liên kết đến nơi khác không có fs gốc, mặc dù họ có thể ghi / tmp cho họ. Kỹ thuật tương tự hoạt động cho các nhu cầu cách ly khác - về cơ bản, bạn có thể giới hạn việc đổi tên / liên kết thành cây con đã cho. IOW, đó là một tính năng có chủ ý. Lưu ý rằng bạn có thể liên kết một bó cây vào chroot và nhận được các hạn chế có thể dự đoán được bất kể công cụ có thể được sắp xếp lại một năm sau đó trong cây chính, v.v.

- Al Viro

Có một ví dụ cụ thể về chủ đề

Bất cứ khi nào chúng tôi có mount -r --bind hoạt động bình thường (mà tôi sử dụng để đặt các bản sao của các thư viện chia sẻ cần thiết bên trong các chroot trong khi cho phép chia sẻ bộ đệm trang), tính năng này sẽ phá vỡ bảo mật.

mkdir /usr/lib/libs.jail
for i in $LIST_OF_LIBRARIES; do
ln /usr/lib/$i /usr/lib/libs.jail/$i
done
mount -r /usr/lib/libs.jail /jail/lib
chown prisoner /usr/log/jail
mount /usr/log/jail /jail/usr/log
chrootuid /jail prisoner /bin/untrusted &

Mặc dù các biện pháp bảo vệ là đủ, nhưng tôi muốn tránh việc liên kết tù nhân /jail/lib/libfoo.so (viết trả lại EROFS) cho / jail / usr / log nơi nó có khả năng ghi.


-1

Lý do bạn không thể thực hiện liên kết thiết bị chéo là vì bạn đưa ra sự mơ hồ. Mục nhập thư mục cho tệp chứa (trong các hệ thống đơn giản) số nút i cho tệp có liên quan. Một liên kết cứng (chỉ là một mục nhập thư mục khác) cũng phải chứa cùng một số nút i. Điều này là tốt, nhưng số nút i chỉ là duy nhất trong một hệ thống tệp duy nhất (chúng thường là một tập hợp dày đặc bắt đầu từ 1).

Gắn kết liên kết của bạn không khắc phục vấn đề đó. Đúng, nó xây dựng một loại 'hư cấu' của cấu trúc, nhưng những gì nó không làm là đánh số lại tất cả các nút i trên một hệ thống tệp để đảm bảo tất cả chúng đều duy nhất trên cả hai hệ thống tệp có liên quan! Điều đó thật ngớ ngẩn.

Hạn chế này luôn có trên các hệ thống UNIX. Liên kết tượng trưng được phát minh một phần để giải quyết điều này. Tôi biết chúng không hoạt động khá giống nhau, nhưng chúng thường ổn.

Hãy thử một liên kết tượng trưng? ( ln -s)


Sẽ không có tên cho bất kỳ việc đánh số lại inode ở đây. Chỉ có một hệ thống tập tin cơ bản, với hai chế độ xem.
Gilles 'SO- ngừng trở nên xấu xa'

Một lý do tôi không muốn có một liên kết tượng trưng là vì đường dẫn của tôi dài và nó rất lộn xộn ls -l. Lúc đầu có lý do ngớ ngẩn, nhưng sau đó nó dẫn đến một cái hố thỏ và tôi đã tò mò về những gì đang xảy ra với các liên kết cứng ...
jdk1.0

@Gilles, đó là những gì tôi đã nói. Điểm tôi đang làm là việc đánh số lại inode sẽ là vô lý. Không có lý do tại sao một câu trả lời chính xác đã bị hạ cấp.
Bob Eager

Bạn nhận được kết luận đúng, nhưng lời giải thích của bạn sai ở rất nhiều nơi mà toàn bộ câu trả lời của bạn là rất sai lệch. Xem câu trả lời của sourcejedi's để được giải thích tốt.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi thấy không có lỗi gì cả, mặc dù tôi thừa nhận tôi có thể đã rõ ràng hơn.
Bob Eager
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.