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

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

Я пишу пользовательскую автоматическую установку с использованием 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, но вытащить раздел, который мне интересен, с помощью умного скрипта, а затем проанализировать, как я уже делаю в скрипте

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

решение1

Думаю, я нашел ответ:blkid

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

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

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

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

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

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

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

решение2

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 это так.

решение3

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

blkid -s TYPE -o value "$device"

Пример:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs

решение4

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

Напишите скрипт, который будет возвращать только тип файловой системы, например:

$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'

Связанный контент