2014-09-18 16 views
5

Nello scripting bash, come posso controllare elegantemente se una posizione specifica è un sottovolume btrfs?Come verificare se la posizione è un sottovolume btrfs?

NON voglio sapere se la posizione indicata è in un file system btrfs (o sottovolume). Voglio sapere se la posizione indicata è la testa di un sottovolume.

Idealmente, la soluzione potrebbe essere scritto in una funzione bash così ho potuto scrivere: soluzione

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

Un 'elegante' sarebbe leggibile, piccola nel codice, di piccole consumo di risorse.

risposta

3

Soluzione1: Uso suggerimenti @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: Quello che ho usato prima (una sola chiamata, ma probabilmente fragile):

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

EDIT: corretto e sostituito list per show in quanto il comportamento di list non risponderebbe corrispond solo su una normale directory btrfs.

EDIT2: come @kdave non ha inviare una versione completa della sua risposta superiore, ho aggiunto alla mia risposta.

+1

Questa funzione non è lavorato. Per il mio caso, $ 1 è una directory esistente in una partizione btrfs, restituirà sempre tutta la lista dei sottovolumi in questa partizione, anche se $ 1 è solo una directory normale. se la directory corrente è un sottovolume, questa directory verrà elencata come ultima riga di lista, altrimenti no. Non so come minimizzare la risposta ... – zw963

+0

Oh, sì, buona cattura. Spiacente, ho sostituito "lista" con "mostra". Funziona come dovrebbe ora? – vaab

+0

Dovresti eseguire lo script come root. – ceremcem

9

Il volume secondario è identificato dal numero di inode 256, in modo da poter controllare semplicemente

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

C'è anche un cosiddetto vuoto-sottovolume, cioè. se un sottovolume nidificato viene istantaneamente catturato, questa entità esiste al posto del sottovolume originale. Suo numero di inode è 2.

Per un controllo generalmente affidabile wheter qualsiasi directory è un volume secondario, il tipo di file system deve essere verificata così

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

Tutto ciò sembra eccessivamente complicato rispetto alla soluzione fornita attualmente, e fragile se viene utilizzato un nuovo numero di inode, vero? Ad ogni modo, mi piacciono le informazioni aggiuntive sulla periferica che hai fornito, potrebbe esserci in realtà una buona soluzione che non si è ancora conclusa. – vaab

+2

Il comando "elenco sottovolume btrfs" richiede i privilegi di root poiché utilizza un ioctl privilegiato per leggere le informazioni sui sottovolumi, non era menzionato nella risposta originale. Il test basato sul numero di inode non ha questa limitazione. Inoltre, non capisco cosa intendi per "fragile se viene usato un nuovo numero di inode". Ogni sottovolume ha inode numero 256, questo non cambierà. File e directory regolari in un sottovolume hanno inode numero 257 e versioni successive. – kdave

+0

Hai ragione. La tua risposta è carina e manca solo l'implementazione della funzione bash (che era stata originariamente richiesta) e sarebbe anche un bel riepilogo TLDR del test. – vaab

Problemi correlati