Понадобилось определять файловую систему еще не смонтированного раздела в 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