Kiểm tra xem thư mục có phải là một hệ thống tập tin từ xa được gắn kết không


44

Cách tốt nhất (đáng tin cậy, di động, v.v.) để kiểm tra xem một thư mục đã cho có nằm trong hệ thống tệp từ xa (nfs) được gắn trong tập lệnh shell không?

Tôi đang tìm kiếm một lệnh sẽ giống như:

chk-remote-mountpoint /my/path/to/folder 

Câu trả lời:


34

Như Stephane nói "không có câu trả lời Unix phổ quát cho điều đó".

Giải pháp tốt nhất tôi đã tìm thấy cho câu hỏi của mình:

df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'

sẽ trả về kiểu hệ thống tập tin, ví dụ: nfshoặc ext3.

Các -Ttùy chọn là không chuẩn , vì vậy nó không thể làm việc trên các hệ thống Unix / Linux khác ...

Theo nhận xét của Gilles bên dưới: "Điều này hoạt động trên mọi Linux không nhúng, nhưng không phải trên BusyBox, * BSD, v.v."


1
Điều này hoạt động trên mọi Linux không nhúng, nhưng không phải trên BusyBox, * BSD, v.v. Tùy bạn quyết định liệu điều đó có đủ tốt hay không.
Gilles 'SO- ngừng trở nên xấu xa'

Xem /etc/mtabhoặc kết quả mountthay vì sử dụng dfcó thể làm trong một số trường hợp hơn.
TNW

1
@TNW hoặc thậm chí/proc/mounts
laebshade

1
Rõ ràng, không mount, /etc/mtabthậm chí, thậm chí không phải /proc/mountslà tiêu chuẩn nên không có gì đảm bảo về những gì có thể tìm thấy ở đó ...
Totor

1
Điều này không hoạt động trên OSX 10.8 vì -Tcó một ý nghĩa khác ở đây
DavAlPi

13

Bạn có thể sử dụng GNU stat.

%m để tìm ra điểm gắn kết.

$ stat --format=%m /usr/src/linux
/usr/src

%T (ở chế độ hệ thống tệp) để tìm ra tên của hệ thống tệp.

$ stat --file-system --format=%T /usr/src/linux
reiserfs

Vì vậy, bạn biết rằng /usr/src/linux, trên hệ thống của tôi, được lưu trữ trong một hệ thống tệp được gắn trên /usr/srcvà có loại hệ thống tệp reiserfs.

Cũng tham khảo để man stattham khảo thêm. Đó là một lệnh rất linh hoạt, hầu như luôn hữu ích khi bạn cần thông tin về các tệp và không muốn quay trở lại grep | awktrạng thái phường.


Phiên bản của stattôi không có %mtùy chọn cho --format(sử dụng Debian Squeeze, coreutils 8.5). Vì vậy, tôi đoán giải pháp này không đáng tin cậy lắm.
Totor

Tôi đã không tin điều đó, nhưng khác biệt giữa coreutils 8.5 và 8.13 (whianzy wheezy) nói rằng bạn đúng, mặc dù. Hãy xem tôi rất ngạc nhiên :) vắt quá cũ :( err, quá ổn định
frostschutz

1
từ lõi thay đổi : 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Đó là gần 3 năm trước. Thật ngạc nhiên khi Debian vẫn không có thứ này.
frostschutz

Ngay cả khi Debian Squeeze được phát hành vào ngày 2011 / 02-06, nó đã bị đóng băng vào ngày 2010-08-06, trước khi lõi này thay đổi ... Tôi muốn tìm một giải pháp "chuẩn" hơn nếu có thể.
Totor

Chà, bạn chỉ có thể sử dụng lệnh% T của hệ thống tệp, nếu nó hoạt động trong trạng thái cũ. Nếu điều đó không hoạt động hoặc phiên bản stat của bạn không cung cấp thông tin bạn cần, hãy quay lại các giải pháp khó xử.
frostschutz

4

mount -lvà sử dụng grep, sedhoặc awkđể tìm dòng đề cập đến thư mục đang đề cập.


Có vẻ phức tạp để tìm ra rằng đó /my/path/to/the/directorythực sự là một cái gì đó từ đỉnh núi /my/pathvới câu trả lời của bạn. Có lẽ bạn có thể cho một số chi tiết về grep, sed, awklệnh bạn đề nghị (một câu trả lời đầy đủ) ?.
Totor

mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'sẽ cung cấp cho bạn một danh sách tất cả các điểm gắn kết nfs trên hệ thống.
Andy Shulman

Điều này có thể được kết hợp với mount | fgrep "`stat --printf=" on %m type" /var/log/`". The lệnh stat: mount` sẽ in tất cả các điểm gắn kết, ở <device> on <mountpoint> type <type>định dạng. Để grep này, tôi đã stat --printftạo ra on <mountpoint> typemột phần.
MSalters

có nhiều kiểu gắn kết hệ thống tập tin cục bộ và từ xa. có một bản đồ của tất cả chúng có thể là thách thức. (ví dụ là drvfs địa phương hoặc từ xa?)
Erik Aronesty

Có, nhưng câu hỏi đặc biệt hỏi về nfs: "hệ thống tập tin từ xa (nfs) được gắn"
jayhendren

2

Thật không may, không có câu trả lời Unix phổ quát cho điều đó.

Một điều bạn có thể làm, đối với một tệp đã cho /a/b/c/dlà đi theo đường dẫn:

  • / a / b / c /.
  • / a / b / c / ..
  • /a/b/c/../ ..
  • ...

... và làm một stat(2)ở mỗi cấp độ, cho đến khi st_devthay đổi. Sau đó, bạn sẽ biết điểm gắn kết ở đâu. Sau đó, bạn có thể tra cứu đường dẫn chính tắc của điểm gắn kết đó trong /etc/mtabhoặc trong đầu ra của mountđể tìm ra loại hệ thống tệp. Sau đó, tìm ra những gì là từ xa và những gì không phải là sẽ khó khăn đặc biệt là đối với những loại cầu chì. Ví dụ, nfs, cifs, fuse.sshfs, fuse.davfslà hiển nhiên, nhưng những gì về ví dụ fuse.gvfs-fuse-daemonhoặc fuse.avfsdcó thể có cả hai tập tin mạng và ngoài mạng lưới?


Vâng, tôi đang sử dụng nfs ở đây (chỉnh sửa câu hỏi của tôi). Đối với stat(2), tôi nghĩ rằng bạn đang giới thiệu chức năng C, nhưng tôi đang sử dụng shell. Tuy nhiên, st_devđề cập đến ID thiết bị chính và phụ (có phải là Linux cụ thể không?) Và lệnh shell stat(1)có (không chuẩn) %t%Tvới các --formattùy chọn cho các số chính và phụ tương ứng, nhưng nó luôn trả về "0" (cục bộ và nfs ). Tôi đã thử trên Debian Squeeze và Lenny.
Totor

Bạn đang thử điều này có hoặc không có --file-systemtùy chọn?
frostschutz

@frostschutz Nếu không có. Nó có một ý nghĩa khác nếu được sử dụng với --file-system.
Totor

2

"-L" đến df (1) sẽ không thành công với lỗi trên các hệ thống tệp không cục bộ, vì vậy bạn có thể sử dụng hành vi này để biết hệ thống tệp có ở xa không:

df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
   echo "local mount, do stuff"
fi

Tuy nhiên, -ltùy chọn không chuẩn .


Đây không phải là một câu trả lời
Totor

@Tại sao không? Cấp, có tất cả các loại lý do khác tại sao dfsẽ thất bại và điều đó một mình làm cho đây là một câu trả lời không hay, nhưng nó đang cố gắng trả lời câu hỏi vì vậy tôi không hiểu tại sao bạn gọi nó là "không phải là một câu trả lời".
terdon

@terdon Tôi đồng ý. Tôi đã không đọc đủ cẩn thận. Cám ơn bạn vì đã chỉ ra điều này. Tôi sẽ chỉnh sửa và bỏ phiếu. :)
Toto

Đây về cơ bản là cái duy nhất hoạt động đáng tin cậy trên linux.
Erik Aronesty

1

df /pathsẽ cho bạn biết đó /pathlà điểm gắn kết nếu nó nói rằng điểm gắn kết không /.


1
Câu hỏi đề cập đến một điểm gắn kết từ xa .
Totor

1

Cứ làm đi

df /me/path/to/folder

Nếu trường đầu tiên (Hệ thống tập tin) ở định dạng máy chủ: / path thì bạn biết đó là NFS


0

Bạn có thể sử dụng df -ttrên Linux và df -Ttrên các hệ thống BSD.

Từ người đàn ông df :

-t, --type = LOẠI

giới hạn danh sách cho các hệ thống tệp loại TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi

Khá đẹp. Tuy nhiên, và thật không may, -ttùy chọn này có ý nghĩa khác trong POSIX / SUS. Vì vậy, sử dụng tùy chọn này có thể cung cấp kết quả không nhất quán trong các phiên bản khác nhau trên công cụ / UNIX.
Totor

-2

Cá nhân tôi sẽ sử dụng mountpoint(rất di động trên Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

hoặc showmountđược yêu cầu khá nhiều để cài đặt trên bất kỳ hệ thống nào thực sự gắn kết NFScổ phần (một phần của nfs-commongói):

NAME
       showmount - show mount information for an NFS server

SYNOPSIS
       showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

Một lựa chọn khác sẽ đôi khi như:

$ mount -l -t nfs | grep 'my mount point'

1
Các mountpointtiện ích không cho bạn biết nếu điểm gắn kết là từ xa. Hơn nữa, các hệ thống tập tin từ xa không bị giới hạn trong các hệ thống tập tin NFS. Cuối cùng, mountpointkhông phải là tiêu chuẩn (không có trong danh sách này ).
Totor

bạn đặc biệt yêu cầu một công cụ trên linux và NFS, mountpointlà tiêu chuẩn trong trường hợp này.
malat

Điều này không trả lời điểm đầu tiên của tôi nào.
Totor

-3
find . -type d -name nfs -exec mountpoint {} \; | grep not

sẽ kiểm tra tất cả các thư mục có tên 'nfs' nếu chúng được gắn kết


OP không tìm kiếm các thư mục có tên nfs.
codeforester
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.