Найти файловую систему размонтированного раздела из скрипта

16

Я пишу пользовательскую автоматическую установку с использованием AIF (Arch Installation Framework), и мне нужно найти файловую систему в разделе, указанном в разделе.

Пока у меня есть это:

grok_partitions () {
    local partitions=
    for label in `ls /dev/disk/by-label | grep "Arch"`
    do
        if [ $label == "Arch" ]
        then
            mount_point="/"
        else
            IFS="-" read base mount <<< "${label}"
            mount_point="/${mount}"
        fi

        local partition=$(readlink -f /dev/disk/by-label/${label})
        local part_no=$(echo ${partition} | grep -Po '\d+')
        local fs=$(parted -mls | grep "^${part_no}" | cut -d: -f5)
        partitions+="${partition} raw ${label} ${fs};yes;${mount_point};target;no_opts;${label};no_params\n"
    done

    # do the swap
    if [ -e /dev/disk/by-label/swap ]
    then
        local partition=$(readlink -f /dev/disk/by-label/swap)
        partitions+="$partition raw swap swap;yes;no_mountpoint;target;no_opts;swap;no_params"
    else
        # if there's no labeled swap, use the first one we find
        local partition=$(fdisk -l | grep -m1 swap | awk '{ print $1 }')
        if [ ! -e $partition ]
        then
            echo "No swap detected. Giving up."
            exit 1
        fi
        partitions+="$partition raw no_label swap;yes;no_mountpoint;target;no_opts;no_label;no_params"
    fi

    echo -n ${partitions}
}

Это работало нормально на моей машине только с одним жестким диском, но не получилось (очевидно) при работе на моей виртуальной машине, работающей на LiveCD (LiveCD был выбран как другой диск, / dev / sr0).

Я подумал о паре хаков, которые я мог бы попробовать:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • использовать parted -mls, но вытащить раздел, который мне нужен с умным сценарием, а затем разобрать, как я уже делаю в scriptt

Есть ли лучший, более простой способ сделать это? У меня уже есть разделы, которые меня интересуют, и мне нужно только найти их файловые системы (а также найти доступный своп).

beatgammit
источник
3
@Mikel Нет, этот вопрос касается смонтированной файловой системы. Хотя вы можете смонтировать файловую систему, а затем посмотреть, к какому типу она подключена, она медленная, не надежная, не работает для подкачки, работает только для файловых систем, поддерживаемых работающим ядром ...
Жиль "ТАК - перестать быть злым"

Ответы:

16

Я думаю, что нашел ответ: blkid

Со страницы руководства:

Программа blkid - это интерфейс командной строки для работы с библиотекой libblkid (3). Он может определять тип контента (например, файловую систему или подкачку), который содержит блочное устройство, а также атрибуты (токены, NAME = пары значений) из метаданных контента (например, полей LABEL или UUID).

По-видимому, он печатает имя устройства вместе с типом файловой системы (вместе с некоторой другой полезной информацией). Чтобы получить список всех устройств с их типами:

blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

Чтобы найти все /dev/sd*/устройства, просто добавьте grep:

blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

Тогда просто cutили awkчтобы получить то, что вам нужно.

beatgammit
источник
11
blkid может самостоятельно отфильтровать то, что вам нужно - нет необходимости в магии sed / grep / awk:blkid -s TYPE -o value /dev/sda3
Петр Узел
@PetrUzel - Отлично! Это именно то, что я искал!
beatgammit
2
Не забудьте запустить с, sudoесли вы не root! Это поймало меня, потому blkidчто не печатает никаких сообщений об ошибках и выходит с кодом состояния 0, если не может получить доступ к блочным устройствам ...
Asfand Qazi
Там редко необходимость трубы grepк sed. grep foo | sed 's/pattern/repl/'более четко написаноsed '/foo/s/pattern/repl/'
Уильям Перселл
9

file -s /path/to/device идентифицирует файловую систему на диске / разделе / ​​слайсе.

А ля:

[root@node2 ~]# file -s /dev/mapper/VolGroup00-LogVol00
/dev/mapper/VolGroup00-LogVol00: Linux rev 1.0 ext3 filesystem data (needs journa recovery) (large files)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv1 
/dev/mapper/coraid--pool-coraid--lv1: Linux GFS2 Filesystem (blocksize 4096, lockproto lock_dlm)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv2 
/dev/mapper/coraid--pool-coraid--lv2: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)

по крайней мере, в Linux это так.

Тим Кеннеди
источник
Есть ли способ надежно отфильтровать тип файловой системы из скрипта?
Битгаммит
зависит от того, считаете ли вы полное имя файловой системы, отфильтрованной достаточно, как в | cut -d: -f2 | cut -d( -f1или что-то. Это не так красиво, как blkid, это точно. :)
Тим Кеннеди
2

Показывать только тег TYPE блочного устройства и выводить только его значение:

blkid -s TYPE -o value "$device"

Пример:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs
Том Хейл
источник
0

Вторым вариантом, который работает со многими файловыми системами и имеет преимущество работы даже с файловыми системами, которые имеют поврежденные структуры, является testdisk. (Вы можете запустить, sudo apt install testdiskчтобы установить его.)

Сценарий, чтобы вернуть только тип файловой системы, как это:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Восстановить Монику
источник