
Я пишу пользовательскую автоматическую установку с использованием 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}'