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


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}
}

Це працювало чудово на моїй машині лише з одним жорстким диском, але це не вдалося (очевидно) під час роботи в моєму VM, що працює на LiveCD (LiveCD збирався як інший диск, / dev / sr0).

Я подумав про кілька хак, які я міг би спробувати:

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

Чи є кращий, простіший спосіб зробити це? У мене вже є розділи, які мене цікавлять, і мені потрібно лише знайти їх файлові системи (а також знайти доступний swap).


3
@Mikel Ні, це питання стосується змонтованої файлової системи. У той час як ви можете змонтувати файлову систему, тоді подивіться, для якого типу вона встановлена, це повільно, не надійно, не працює для підкачки, працює лише для файлових систем, підтримуваних запущеним ядром ...
Жил "SO - перестань бути злим"

Відповіді:


16

Я думаю, що знайшов відповідь: blkid

На чоловіковій сторінці:

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

Мабуть, він друкує назву пристрою разом із типом файлової системи (разом із деякою іншою корисною інформацією). Щоб отримати список усіх пристроїв із їх типами:

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

Щоб знайти усі /dev/sd*/пристрої, просто додайте зображення:

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

Тоді просто cutабо awkотримати те, що потрібно.


11
blkid може самостійно фільтрувати те, що вам потрібно - немає потреби в sed / grep / awk magic: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}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.