Проверьте, является ли папка удаленной файловой системой

44

Каков наилучший способ (надежный, переносимый и т. Д.), Чтобы проверить, находится ли данная папка в смонтированной удаленной (nfs) файловой системе внутри сценария оболочки?

Я ищу команду, которая выглядела бы так:

chk-remote-mountpoint /my/path/to/folder 
Totor
источник

Ответы:

34

Как говорит Стефан, «нет универсального ответа Unix на это».

Лучшее решение, которое я нашел на мой вопрос:

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

вернет тип файловой системы, например: nfsили ext3.

Эта -Tопция не является стандартной , поэтому она может не работать на других системах Unix / Linux ...

Согласно приведенному ниже комментарию Жиля : «Это работает на любом не встроенном Linux, но не на BusyBox, * BSD и т. Д.»

Totor
источник
1
Это работает на любом не встроенном Linux, но не на BusyBox, * BSD и т. Д. Вам решать, достаточно ли это хорошо.
Жиль "ТАК - перестань быть злым"
Просмотр /etc/mtabили результаты mountвместо использования dfмогут сделать в некоторых других случаях.
TNW
1
@TNW или даже/proc/mounts
laebshade
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безопасности.

frostschutz
источник
Моя версия statне имеет %mопции для --format(используя Debian Squeeze, coreutils 8.5). Итак, я думаю, это решение не очень надежно.
Тотор
Я не поверил, но разница между coreutils 8.5 и 8.13 (debian wheezy) говорит, что вы правы. Считаю меня очень удивленным :) Сжатие просто слишком старое :( ошибаюсь, слишком стабильно
frostschutz
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, до того, как произойдет это изменение в coreutils ... Я, скорее всего, ищу «стандартное» решение, если это возможно.
Тотор
Ну, вы можете просто использовать команду% T файловой системы, если это работает в старой статистике. Если это тоже не сработает и ваша версия статистики не предоставляет нужную вам информацию, вернемся к неловким решениям.
frostschutz
4

mount -lи используйте grep, sedили, awkчтобы найти строку, которая относится к рассматриваемому каталогу.

jayhendren
источник
Сложно понять, что /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 локальный или удаленный?)
Erik Aronesty
Да, но вопрос конкретно спрашивает о nfs: «смонтированная удаленная (nfs) файловая система»
jayhendren
2

К сожалению, нет универсального ответа Unix на это.

Единственное, что вы можете сделать для данного файла, /a/b/c/dэто пройти путь:

  • / A / B / C /.
  • / A / B / C / ..
  • /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» (local и 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вариант не является стандартным .

rsone1
источник
Это не ответ
Totor
@ Тотор почему нет? Конечно, есть множество других причин, почему dfбы не получиться, и это само по себе делает это не очень хорошим ответом, но он пытается ответить на вопрос, поэтому я не понимаю, почему вы бы назвали это «не ответом».
Тердон
@terdon Я согласен. Я не читал достаточно внимательно. Спасибо за указание на это. Я отредактирую и проголосую. :)
Totor
Это в основном единственный, который надежно работает на Linux.
Эрик Аронесты
1

df /pathскажет вам, что /pathэто точка монтирования, если он говорит, что точка монтирования не является /.

Pgen
источник
1
Вопрос относится к удаленной точке монтирования.
Тотор
1

Просто сделать

df /me/path/to/folder

Если первое поле (файловая система) находится в формате host: / path, то вы знаете, что это NFS

Уди
источник
0

Вы можете использовать df -tна Linux и df -Tна системах BSD.

От человека Д.Ф . :

-t, --type = TYPE

ограничить перечисление файловыми системами типа TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
codeforester
источник
Довольно мило Однако, к сожалению, эта -tопция имеет другое значение в POSIX / SUS. Таким образом, использование этой опции может привести к противоречивым результатам в разных версиях инструмента / UNIX.
Totor
-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', если они смонтированы

Дмитрий Шерман
источник
ОП не ищет папки с именами nfs.
Codeforester