Перевірте, чи папка - це змонтована віддалена файлова система


44

Який найкращий спосіб (надійний, портативний і т. Д.) Перевірити, чи вказана папка знаходиться в змонтованій віддаленій (nfs) файловій системі в сценарії оболонки?

Я шукаю команду, яка виглядатиме так:

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

Відповіді:


34

Як каже Стефан, "у цьому немає універсальної відповіді Unix".

Я найкраще вирішив своє питання:

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

поверне тип файлової системи, наприклад: nfsабо ext3.

Цей -Tпараметр не стандартний , тому він може не працювати в інших системах Unix / Linux ...

Відповідно до коментаря Жиля нижче: "Це працює на будь-якому невбудованому Linux, але не на BusyBox, * BSD тощо".


1
Це працює на будь-якому невбудованому Linux, але не на BusyBox, * BSD тощо. Ви вирішуєте, чи це досить добре.
Жил "ТАК - перестань бути злим"

Перегляд /etc/mtabчи результати mountзамість використання dfможе зробитись у деяких інших випадках.
TNW

1
@TNW або навіть/proc/mounts
маяк

1
Мабуть, ні mount, ні /etc/mtab, навіть не /proc/mountsє стандартними, тому немає гарантії того, що там може бути знайдено ...
Totor

1
Це не працює на OSX 10.8, оскільки -Tтут є інше значення
DavAlPi

13

Ви можете використовувати GNU stat.

%m щоб дізнатися точку кріплення.

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

%T (у режимі файлової системи), щоб дізнатись назву файлової системи.

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

Таким чином, ви знаєте, що /usr/src/linuxв моїй системі зберігається у файловій системі, яка встановлена /usr/srcі має тип файлової системи reiserfs.

Також зверніться до man statподальшої довідки. Це дуже універсальна команда, яка корисна майже завжди, коли вам потрібна інформація про файли і не хочете повертатися в grep | awkохорону.


Моя версія statне має %mможливості для --format(використання Debian Squeeze, coreutils 8.5). Отже, я думаю, що це рішення не дуже надійне.
Тотор

Я не вірив, але різниця між coreutils 8.5 і 8.13 (debian wheezy) говорить, що ти маєш рацію. Вважайте мене дуже здивованим :)
Вичавити

1
від Coreutils змін: 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Це майже 3 роки тому. Дивно, що у Debian досі цього немає.
frostschutz

Навіть якщо Debian Squeeze був випущений в 2011-02-06, він був заморожений 2010-08-06, перш ніж змінити ці основні технології ... Я скоріше шукаю "стандартного" рішення, якщо це можливо.
Тотор

Ну, ви можете просто скористатися командою файлової системи% T, якщо це працює в старій статистиці. Якщо це не працює, і ваша версія stat не надає потрібну інформацію, поверніться до незручних рішень.
frostschutz

4

mount -lі використовувати grep, sedабо awkзнайти рядок, що посилається на відповідний каталог.


Дуже складно зрозуміти, що /my/path/to/the/directoryнасправді є щось з точки моменту /my/pathз вашою відповіддю. Може бути , ви можете дати деякі додаткові деталі про grep, sed, awkкоманду ви пропонуєте (повну відповідь)?.
Тотор

mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'має надати вам список усіх nfs точок кріплення в системі.
Енді Шульман

Це можна поєднати з mount | fgrep "`stat --printf=" on %m type" /var/log/`". The командою stat: mount` надрукує всі точки монтажу у <device> on <mountpoint> type <type>форматі. Щоб визначити це, я stat --printfстворив on <mountpoint> typeдеталь.
MSalters

існує безліч локальних і віддалених типів кріплення файлової системи. мати карту всіх із них може бути складним завданням. (наприклад, drvfs місцевий або віддалений?)
Ерік Аронесті

Так, але питання спеціально задається про nfs: "змонтована віддалена (nfs) файлова система"
jayhendren

2

На жаль, немає універсальної відповіді на це Unix.

Одне, що можна зробити, для даного файлу /a/b/c/d- це пройти шлях:

  • / а / б / с /.
  • / а / б / с / ..
  • /a/b/c/../ ..
  • ...

... і робити а stat(2)на кожному рівні, до st_devзміни. Тоді ви дізнаєтесь, де знаходиться точка кріплення. Тоді ви можете шукати канонічний шлях до цієї точки монтування в /etc/mtabабо у виході, mountщоб дізнатися тип файлової системи. Тоді з'ясування того, що віддалено, а що ні, буде складним, особливо для запобіжників. Так , наприклад, nfs, cifs, fuse.sshfs, fuse.davfsочевидні, але як, наприклад , fuse.gvfs-fuse-daemonабо fuse.avfsdякі можуть мати як мережеві і не пов'язані з роботою файли?


Ну, я тут використовую nfs (відредагував моє запитання). Що стосується stat(2), я думаю, ви переробляєте функцію C, але я використовую shell. Однак, st_devпосилається на основний та другорядний ідентифікатор пристрою (це специфічний для Linux?), А команда оболонки stat(1)має (нестандартну) %tта %Tз --formatпараметрами відповідно основних та другорядних чисел, але вона завжди повертає "0" (локальні та nfs ). Я спробував Debian Squeeze та Lenny.
Тотор

Ви намагаєтесь це зробити з --file-systemваріантом чи без нього ?
frostschutz

@frostschutz Без. Він має інше значення, якщо використовується з --file-system.
Тотор

2

"-L" для df (1) не вдасться з помилкою в не локальних файлових системах, тому ви можете використовувати цю поведінку, щоб знати, чи файлова система віддалена:

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

Однак -lваріант не стандартний .


Це не відповідь
Тотор

@Totor чому б і ні? Зрозуміло, існують всілякі інші причини, чому dfне вдалося б, і саме по собі це не дуже гарна відповідь, але він намагається відповісти на питання, тому я не розумію, чому ви б назвали це "не відповіддю".
тердон

@terdon Я згоден. Я не читав достатньо уважно. Дякую, що вказали на це. Я відредагую і проголосую. :)
Тотор

Це в основному єдиний, який надійно працює в Linux.
Ерік Аронесті

1

df /pathскаже вам, що /pathце точка кріплення, якщо вона говорить, що точка монтажу не є /.


1
Питання стосується точки віддаленого кріплення.
Тотор

1

Просто роби

df /me/path/to/folder

Якщо перше поле (файлова система) знаходиться у форматі хост: / path, то ви знаєте, що це NFS


0

Ви можете використовувати в df -tLinux та df -Tна BSD системах.

Від man df :

-t, --type = ТИП

обмеження лістингу до файлових систем типу TYPE

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

Дуже приємно. Однак, на жаль, -tпараметр має інше значення в POSIX / SUS. Таким чином, використання цієї опції може забезпечити непослідовні результати в різних версіях на інструменті / UNIX.
Тотор

-2

Я особисто використовував mountpoint(дуже портативний на Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

або showmountяка в значній NFSмірі необхідна для встановлення в будь-якій системі, яка фактично монтує спільні папки (частина nfs-commonпакету):

NAME
       showmount - show mount information for an NFS server

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

Іншим варіантом буде щось таке:

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

1
mountpointУтиліта не скаже вам , якщо точка монтування є малоймовірною. Більше того, віддалені файлові системи не обмежуються файловими системами NFS. Нарешті, mountpointне є стандартним (немає в цьому списку ).
Тотор

Ви спеціально просили інструмент для Linux та NFS, mountpointє стандартним у цьому випадку.
малат

Це все одно не відповідає моєму першому моменту.
Тотор

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

перевірить усі папки з назвою 'nfs', якщо вони встановлені


OP не шукає папок з назвою nfs.
codeforester
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.