2014-09-18 2 views
5

В сценариях bash, как я могу проверить элегантно, если конкретное местоположение является subvolume btrfs?Как проверить, является ли местоположение субблоком btrfs?

Я НЕ хочу знать, является ли данное местоположение в файловой системой btrfs (или subvolume). Я хочу знать, является ли данное местоположение голосом подвыполнением.

В идеале, решение может быть записано в виде функции Баша, так что я мог бы написать: «элегантное» решение

if is_btrfs_subvolume $LOCATION; then 
    # ... stuff ... 
fi 

An будет читаемым, малым в коде, мало в потреблении ресурсов.

ответ

3

Solution1: Использование @kdave предложения:

is_btrfs_subvolume() { 
    local dir=$1 
    [ "$(stat -f --format="%T" "$dir")" == "btrfs" ] || return 1 
    inode="$(stat --format="%i" "$dir")" 
    case "$inode" in 
     2|256) 
      return 0;; 
     *) 
      return 1;; 
    esac 
} 

Solution2: Что я раньше (только один вызов, но, вероятно, ломкие):

is_btrfs_subvolume() { 
    btrfs subvolume show "$1" >/dev/null 2>&1 
} 

EDIT: Исправленная и заменил list на show, так как поведение list не ответит на ctly на любом нормальном каталоге btrfs.

EDIT2: как @kdave не опубликовал полную версию своего превосходного ответа, я добавил его к своему ответу.

+1

Эта функция не работает. Для моего случая, $ 1 - любая директория существует в разделе btrfs, всегда будет возвращать весь список подвыборников в этом разделе, хотя 1 $ является обычным каталогом. если текущий каталог является субволием, этот каталог будет отображаться как последняя строка списка, в противном случае - нет. Я не знаю, как ответить ... – zw963

+0

О, да, хороший улов. Извините, я заменил «список» на «show». Он работает так, как сейчас? – vaab

+0

Вы должны запустить свой скрипт как root. – ceremcem

9

подтома идентифицируются инф.узлы номер 256, так что вы можете проверить это просто

if [ `stat --format=%i /path` -eq 256 ]; then ...; fi 

Там также так называемый пустым подт, то есть. если вложенные подвыборки будут сняты, этот объект будет существовать вместо исходного подвыбора. Его номер инода 2.

Для надежной проверки обычно Wheter любой каталог является подтом, тип файловой системы должны быть проверены, а

stat -f --format=%T /path 
+0

Все это кажется чрезмерно сложным по сравнению с текущим предоставленным решением и хрупким, если какой-либо новый номер inode используется, не так ли ?. В любом случае, мне нравится дополнительная информация о периферии, которую вы предоставили. – vaab

+2

Для команды "btrfs subvolume list" требуются привилегии root, поскольку она использует привилегированную ioctl для чтения информации о подвыборах, это не было указано в исходном ответе. Тест на основе номера inode не имеет такого ограничения. Далее, я не понимаю, что вы подразумеваете под «хрупкой, если какой-либо новый номер inode используется». Каждый subvolume имеет индекс inode 256, это не изменится. Обычные файлы и каталоги в подвыборке имеют индекс inode 257 и выше. – kdave

+0

Вы правы. Ваш ответ хорош и пропускает только реализацию функции bash (которая изначально была задана), и это также было бы хорошим обзором TLDR теста. – vaab

 Смежные вопросы

  • Нет связанных вопросов^_^