
Ich schreibe eine benutzerdefinierte automatisierte Installation mit AIF (Arch Installation Framework) und muss das Dateisystem auf einer angegebenen Partition finden.
Bisher habe ich Folgendes:
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}
}
Auf meinem Rechner mit nur einer Festplatte funktionierte dies problemlos, schlug aber (offensichtlich) beim Ausführen in meiner VM auf einer LiveCD fehl (die LiveCD wurde als anderes Laufwerk ausgewählt, /dev/sr0).
Mir sind ein paar Hacks eingefallen, die ich ausprobieren könnte:
mount $partition; grep $partition /etc/mtab | awk ...
- benutze
parted -mls
, aber ziehe die Partition, die mir wichtig ist, mit cleverem Scripting heraus und analysiere sie dann, wie ich es bereits im Script mache.
Gibt es eine bessere, einfachere Möglichkeit, dies zu tun? Ich habe bereits die Partitionen, die mich interessieren, und muss nur ihre Dateisysteme finden (sowie den verfügbaren Swap).
Antwort1
Ich glaube, ich habe die Antwort gefunden:blkid
Aus der Manpage:
Das Programm blkid ist die Befehlszeilenschnittstelle für die Arbeit mit der Bibliothek libblkid(3). Es kann den Inhaltstyp (z. B. Dateisystem oder Swap) bestimmen, den ein Blockgerät enthält, sowie Attribute (Token, NAME=Wert-Paare) aus den Inhaltsmetadaten (z. B. LABEL- oder UUID-Felder).
Offenbar gibt es den Gerätenamen zusammen mit dem Dateisystemtyp aus (und einigen anderen nützlichen Informationen). So erhalten Sie eine Liste aller Geräte mit ihren Typen:
blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'
Um alle /dev/sd*/
Geräte zu finden, fügen Sie einfach ein grep hinzu:
blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'
Dann holen Sie sich einfach, was Sie brauchen cut
.awk
Antwort2
file -s /path/to/device
identifiziert das Dateisystem auf einer Festplatte/Partition/Slice.
A la:
[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)
zumindest unter Linux ist dies der Fall.
Antwort3
Zeigt nur das TYPE-Tag des Blockgeräts an und gibt nur seinen Wert aus:
blkid -s TYPE -o value "$device"
Beispiel:
$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home
btrfs
Antwort4
Eine zweite Option, die mit vielen Dateisystemen funktioniert und den Vorteil hat, dass sie sogar mit Dateisystemen funktioniert, deren Strukturen beschädigt sind, ist testdisk
. (Sie können es ausführen sudo apt install testdisk
, um es auf Debian-basierten Systemen zu installieren.)
Erstellen Sie ein Skript, um nur den Dateisystemtyp wie folgt zurückzugeben:
$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'