Làm thế nào là findmnt có thể liệt kê gắn kết liên kết?


11

Nhiều người cứ nói rằng Linux không giữ thông tin về các liên kết gắn kết, vì vậy không có cách nào để có được danh sách về chúng và các nguồn của chúng. Dưới đây là một số ví dụ:

  • từ một trong những ý kiến ​​ở đây :

    IIRC thông tin này không được lưu giữ ở bất cứ đâu: sau đó mount --bind, hai bản sao tương đương nhau, không có bản nào có nhiều bản gốc của bản gốc hơn bản kia. Rốt cuộc, không thể có bản gốc nếu bạn đã không đếm được /mnt.

  • từ một câu trả lời trên trang web này :

    Vì vậy, cách duy nhất để nhớ những gì mount là mount mount là nhật ký của các lệnh mount còn lại /etc/mtab. Một hoạt động gắn kết liên kết được chỉ định bởi tùy chọn gắn kết liên kết (làm cho loại hệ thống tập tin bị bỏ qua). Nhưng mount không có tùy chọn để liệt kê chỉ các hệ thống tập tin được gắn với một bộ tùy chọn cụ thể.

  • từ báo cáo lỗi Debian :

    Đây là cố ý. Cả hai điểm gắn kết hoàn toàn bằng nhau theo mọi cách để hạt nhân không giữ bất kỳ cờ nào để phân biệt chúng.

Trên đây là vô nghĩa. Công cụ findmntcó thể liệt kê các đường dẫn nguồn của các liên kết gắn kết (ở dạng device[source-path]; tôi cũng đang cố gắng để nó liệt kê chỉ đường dẫn nguồn chứ không phải thiết bị). Nếu hạt nhân Linux là để duy trì một liên kết gắn kết, thì thông tin đó phải được lưu trữ ở đâu đó , nếu không thì không thể biết đó /homelà ràng buộc /users. Vậy dữ liệu này ở đâu? Có phải nó được lưu trữ trong một số vùng tối nghĩa trong RAM? Có findmntnhìn vào /procđâu đó không?


Phiên bản findmntnào bạn đang chạy và bạn đang cung cấp tùy chọn nào? Của tôi không in nó ra như thế và nhìn vào mã nguồn mà nó dường như đang sử dụng _PATH_PROC_MOUNTINFOmà dường /proc/self/mountinfonhư không có thông tin này trong đó.
Bratchley

OK tôi đoán /proc/self/mountinfotương đối gần đây đã được cơ cấu lại. Tôi đã sử dụng máy RHEL6 trước đó nhưng không có thông tin đường dẫn nhưng máy RHEL7 của tôi thì có và như được đề cập trong liên kết của bạn Wheezy cũng vậy.
Bratchley

Nó không phải là vô nghĩa: nó đúng với các hạt nhân cũ hơn, nhưng các hạt nhân mới hơn theo dõi thông tin.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Sau đó, làm thế nào một liên kết gắn kết có thể tồn tại nếu thông tin mà một thư mục được gắn kết ở một thư mục khác không được theo dõi?
Melab

@Melab Trên thực tế, việc gắn kết liên kết sẽ dễ dàng hơn nếu bạn không theo dõi đó là liên kết gắn kết. Khi /dev/Ađược gắn vào /Bvà bạn làm mount --bind /B /C, các hạt nhân cũ chỉ nhớ /B → /dev/A/C → /dev/A, họ không nhớ bất kỳ mối quan hệ nào giữa /B/C. Vì vậy, unmounting /Btự nhiên không có hiệu lực trên /C. Các hạt nhân mới hơn nhớ rằng đó /Clà một liên kết gắn kết /B, nhưng theo cách không ngăn cản việc /Ctiếp tục hoạt động nếu /Bkhông được kết nối, tôi không biết chính xác làm thế nào.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


12

Bạn đã hiểu lầm một chút; hai điểm gắn kết bằng nhau về quyền, cờ, v.v. vì liên kết chuyển hướng hiệu quả truy cập từ đường này sang đường khác. Nhưng họ vẫn khác biệt .

Nếu bạn nhìn vào, /proc/self/mountinfobạn sẽ thấy chế độ xem hạt nhân của thế giới gắn kết cho quá trình này (không gian tên làm cho mọi thứ phức tạp hơn; không chỉ có một chế độ xem của bảng gắn kết).

man 5 procsẽ giải thích định dạng của tệp này, nhưng bạn có thể thấy hệ thống phân cấp cây và nơi gắn kết liên kết có "cha mẹ" của chúng. Đây là tập tin findmntphân tích cú pháp.


9

Linux không lưu giữ thông tin về mount nào là mount mount . Nó không giữ thông tin về tất cả các mount bao gồm cả mount mount .

Nó khá giống với các liên kết cứng. Gắn kết liên kết đến các hệ thống tập tin như tên tệp liên kết đến các nút. Sự khác biệt duy nhất là các mount cũng có các cờ per-mountpoint và có thể đề cập đến một thư mục con của hệ thống tệp đích thay vì gốc hệ thống tệp.

Khi bạn tạo một liên kết cứng, hệ thống tệp không lưu tên tệp nào là tên gốc và đó là liên kết cứng. Cả hai chỉ đơn giản đề cập đến cùng một inode. Nếu bạn hủy liên kết tệp gốc, tình huống sẽ không thể phân biệt được nếu bạn trực tiếp tạo tệp có tên tệp thứ hai.

Quay lại các liên kết gắn kết: Hạt nhân giữ một bảng chứa hệ thống tệp (được xác định bởi một cặp số chính: số phụ), điểm gắn kết, đường dẫn liên quan đến gốc hệ thống tệp và một số cờ. Bạn có thể truy cập danh sách này bằng cách nhìn vào /proc/self/mountinfo. (Nó trở nên phức tạp hơn khi các không gian tên có liên quan, như @ stephen-harris đã đề cập). findmntphân tích danh sách này.

Nếu gốc của bạn là /dev/sda1chính: phụ 8:1và bạn chạy mount --bind /a /b /proc/self/mountinfosẽ chứa các dòng tương tự như sau:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro

Nếu bạn /home/dev/sda2với chính: nhỏ 8:2và bạn chạy mount --bind /home /usersnó sẽ giống như thế này:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:2 / /home rw - ext4 /dev/sda2 rw
3 1 8:2 / /users rw - ext4 /dev/sda2 rw

Các cột có liên quan cho câu hỏi của bạn là cột thứ ba, thứ tư và thứ năm. Đây là id hệ thống tệp (đối với hệ thống tệp thực, nó giống với thiết bị chính: thứ yếu; đối với hệ thống tệp ảo như tmpfs it [0: counter ]), đường dẫn liên quan đến gốc hệ thống tệp được liên kết với điểm gắn kết (thường / cho bình thường gắn kết, có thể là bất cứ điều gì cho gắn kết liên kết) và điểm gắn kết.
Để biết ý nghĩa của các cột còn lại, xem tài liệu nhân Linux .

findmntgọi đường dẫn nguồn liên quan đến gốc hệ thống tập tin "FSROOT". Bạn có thể sử dụng findmnt -o TARGET,FSROOTđể có được nó. Nếu bạn muốn đường dẫn nguồn tuyệt đối, có lẽ bạn cần phải tự phân tích cú pháp /proc/self/mountinfovà kết hợp thông tin về các giá trị gắn kết cho cùng một hệ thống tệp.

Để biết thêm thông tin, xem câu trả lời của tôi cho "Danh sách chỉ gắn kết gắn kết" .


Nếu /proc/self/mountinfocó thể chứa các dòng như 2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro, thì Linux chắc chắn sẽ giữ một số thông tin về các liên kết gắn kết.
Melab

Không. Hãy nhìn vào ví dụ thứ hai của tôi. Nó giữ thông tin hệ thống tập tin nào được gắn kết và đường dẫn nào liên quan đến gốc hệ thống tập tin được gắn kết . Vì vậy, cho mount --bind /home/melab /mntcác vòng dây có thể trông giống như bất kỳ những điều sau đây tùy thuộc vào số /home/home/melablà một mountpoint: 3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw, 3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
cg909

Đúng là một cái gì đó khác với /cột thứ tư thường chỉ ra một liên kết gắn kết. Nhưng nó cũng có thể là một subvolume Btrfs.
cg909

Được /dev/sda3cho là được gắn tại /home/melab?
Melab

Đúng. Trong ví dụ của tôi, tôi sử dụng /dev/sda1như /, /dev/sda2như /home/dev/sda3như/home/melab
cg909
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.