Как я могу определить тип fs моего текущего рабочего каталога?

19

Мне нужен независимый от платформы и легкий способ определения типа крепления моего CWD. В частности, мне нужно определить, находится ли мой CWD в монтированном SSHFS, NFS, CIFS, SMB или локальном хранилище блоков.

Мне нужно сделать это на Mac OSX 10.6, 10.7 и RHEL5 (как минимум).

Существует возможность использования df, но df ведет себя совершенно по-разному на этих двух платформах. Кроме того, мне бы пришлось CLI очистить свой вывод с помощью awk, который, хотя и выполнимый, хрупок.

Эта информация должна быть доступна на каком-то уровне. Есть ли инструмент, о котором я не знаю, который мог бы предоставить мне эту информацию?

Крис Р
источник

Ответы:

17

Тип файловой системы - это не то, к чему вы можете легко получить доступ независимым от ОС способом. Имена типов файловых систем зависят от ОС, поэтому не было никаких стимулов для создания стандартного метода.

В не встроенных системах Linux stat -f -c %T .показывает тип файловой системы текущего каталога. statКоманда OSX не имеет ничего подобного.

Поскольку все, что вам нужно знать, это то, находится ли тип файловой системы в конечном списке, в Linux вы можете ограничить как набор путей для печати информации, так и набор типов файловых систем. Вы получите сообщение об ошибке («df: файловые системы не обработаны»), если тип файловой системы текущего каталога отсутствует в списке.

if df -t sshfs -t nfs -t cifs . >/dev/null 2>/dev/null; then …

Тот же синтаксис может или не может работать на OSX; если нет, попробуйте df -T sshfs,nfs,cifs ..

Жиль "ТАК - прекрати быть злым"
источник
Это именно то, что мне было нужно. Жиль, ты молодец!
ARX
7

Вы можете использовать GNU stat в Linux:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs
Eloff
источник
Это здорово, потому что работает на подкаталогах. Благодарность!
Авиндра Гулчаран
4

В Linux есть findmnt, доступный начиная с util-linux 2.18.

findmnt -n -o FSTYPE -T /home
nfs4
rudimeier
источник
Не работает для / home / subdir, поэтому это не поможет OP.
Eloff
Для меня это работает и для подкаталогов, используя findmount из util-linux 2.23.
rudimeier
3

Не проверял, но df -Pдолжен вести себя одинаково на большинстве платформ.

Это работает на Linux.

$ mount | grep "^$(df -Pk . | head -n 2 | tail -n 1 | cut -f 1 -d ' ') " | cut -f 5 -d ' '

Или разбивая его на многократно используемые функции:

# get_mount <directory>
get_mount() {
    df -Pk "$1" | head -n 2 | tail -n 1 | cut -f 1 -d ' '
}

# get_fs <mountpoint>
get_fs() {
    mount | grep "^$1 " | cut -f 5 -d ' '
}

И вызывая функцию:

get_fs $(get_mount .)

Может быть переписан, чтобы быть немного быстрее, используя sedили awk, но этот способ, вероятно, легче читать.

Если это не сработает, вы можете попробовать что-то похожее, но использовать /etc/mtabвместо вывода mount.

Mikel
источник
PВ df -Pдля POSIX, поэтому он должен вести себя таким же образом. Однако переход от пути к файловой системе до точки монтирования более сложен.
Жиль "ТАК - перестань быть злым"
1
Ваше решение не кажется безопасным, если каталог смонтирован с циклом -o. По крайней мере, в моей системе df показывает используемое устройство цикла, но mount показывает используемый файл образа. Я предполагаю, что может быть даже больше случаев, когда df не показывает такое же устройство, как mount. Обратите внимание на цитату из man-страницы mount: «Режим листинга поддерживается только для обратной совместимости. Для более надежного и определяемого вывода используйте findmnt (8), особенно в ваших скриптах».
rudimeier