Толик Панков
hex_laden
............ .................. ................

November 2020
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Толик Панков [userpic]
Определение файловой системы раздела диска в Linux.

Преамбула


Понадобилось определять файловую систему еще не смонтированного раздела в Linux, я написал скрипт, который мне самому казался громоздким и неудобным, так и оказалось. Но добрый аноним подсказал, в какую сторону копать, и действительно, нашлось хорошее универсальное решение.

Для экспериментов создал диск с разделами различных файловых систем:



Утилита lsblk


Показывает блочные устройства (диски, разделы, контейнеры, прикрученные к loop-устройствам, разделы, добавленные kpartx, исключая RAM-диски) по умолчанию в виде симпатичного дерева. Ключ -f заставляет утилиту вывести информацию о файловой системе на конкретном устройстве.

lsblk -f



Почти то, что нужно, но, к сожалению, есть эта утилита не везде, так что мне она не подошла.

Команда blkid


При запуске без параметров выводит кучу информации о блочных устройствах (опять же диски, разделы, контейнеры, прикрученные к loop-устройствам, разделы, добавленные kpartx) в виде строк, по одной на устройство, содержащих пары КЛЮЧ="ЗНАЧЕНИЕ":



Можно обратить внимание на ключ -o - он меняет формат вывода на экран, например, blkid -o list выводит информацию в виде таблицы.



Но, к сожалению, менять формат вывода умеют не все версии этой утилиты. Например, "версия", "встроенная" в BusyBox не умеет.

Да! Она есть даже в BusyBox! А значит, это, наверное, самое универсальное решение! А с форматированием вывода как-нибудь разберемся.



Запуск команды, как blkid <устройство>, например, blkid /dev/sda1, позволяет вывести информацию о конкретном устройстве.

Разные мелочи


- И у раздела FAT16, и у раздела FAT32 параметр TYPE будет равен vfat, чтобы их отличить друг от друга, надо смотреть в параметр SEC_TYPE, у раздела FAT32 его не будет вообще, а у раздела FAT16 SEC_TYPE="dos"

- Если вытащить значение поля TYPE в скрипте, его автоматически можно подставить в команду mount, во всяком случае для FAT16/32, NTFS, EXT2(3, 4) и BTRFS

Скрипт, выводящий устройство и его файловую систему.


С этой командой скрипт получился крохотным, даже с добавлением проверки кода возврата, задано определенное устройство, или надо вывести все, и проверки, есть ли у определенного устройства поле TYPE. Самое страшное в скрипте - несколько монструозное регулярное выражение для sed, чтобы вытащить имя устройства и его файловую систему.

Скрипт целиком:

#!/bin/bash

if [ -z "$1" ]; then
    blkid |sed -n 's/\(.*:\).* TYPE=\"\([^\"]*\)\".*/\1\2/p'
else
    RES=`blkid "$1"`
    RC=$?
    if [ $RC -ne 0 ];then
	echo "$1:Not found or not supported (code $RC)"
    else
	RES=`echo "$RES"|sed -n 's/\(.*:\).* TYPE=\"\([^\"]*\)\".*/\1\2/p'`
	if [ -n "$RES" ];then
	    echo "$RES"
	else
	    echo "$1: Not exist TYPE"
	fi
    fi
fi


Можете сравнить с тем монстром, который я набыдлокодил изначально. Оставлю, чтоб иногда самому ужасаться. :)

Скрипт (новый) на GitHub
Скрипт (новый) на PasteBin

Результат работы в нормальном окружении:



И в урезанном, с BusyBox'овой "версией" blkid



Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/03/26/opredelenie-fajlovoj-sistemy-razdela-diska-v-linux/

Tags: ,
Comments

Мы НЁХ, нам пох :)