Ich schreibe eine benutzerdefinierte automatische Installation mit AIF (Arch Installation Framework) und muss das Dateisystem auf einer Partition finden, die einer Partition zugeordnet ist.
Bisher habe ich das:
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}
}
Dies funktionierte auf meinem Computer mit nur einer Festplatte einwandfrei, schlug jedoch (offensichtlich) fehl, wenn ich meine VM auf einer LiveCD laufen ließ (die LiveCD wurde als ein anderes Laufwerk aufgenommen, / dev / sr0).
Ich habe mir ein paar Hacks ausgedacht, 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 scriptt getan habe
Gibt es einen besseren, einfacheren Weg, dies zu tun? Ich habe bereits die Partitionen, an denen ich interessiert bin, und ich muss nur deren Dateisysteme finden (sowie den verfügbaren Swap finden).
command-line
filesystems
system-installation
block-device
Beatgammit
quelle
quelle
Antworten:
Ich glaube, ich habe die Antwort gefunden:
blkid
Von der Manpage:
Anscheinend gibt es den Gerätenamen zusammen mit dem Dateisystemtyp (zusammen mit einigen anderen nützlichen Informationen) aus. So rufen Sie eine Liste aller Geräte mit ihren Typen ab:
Um alle
/dev/sd*/
Geräte zu finden , fügen Sie einfach ein grep hinzu:Dann einfach
cut
oder umawk
zu bekommen, was Sie brauchen.quelle
blkid -s TYPE -o value /dev/sda3
sudo
wenn Sie nicht root sind! Dieser hat mich erwischt, weil erblkid
keine Fehlermeldungen druckt und mit Statuscode 0 beendet wird, wenn er nicht auf Blockgeräte zugreifen kann ...grep
zused
.grep foo | sed 's/pattern/repl/'
ist sauberer geschriebensed '/foo/s/pattern/repl/'
file -s /path/to/device
wird das Dateisystem auf einer Festplatte / Partition / Slice identifizieren.A la:
Zumindest unter Linux.
quelle
| cut -d: -f2 | cut -d( -f1
oder so. Es ist nicht so hübschblkid
, das ist sicher. :)Nur das TYPE-Tag des Blockgeräts anzeigen und nur dessen Wert ausgeben:
Beispiel:
quelle
Eine sekundäre Option, die mit vielen Dateisystemen funktioniert und den Vorteil hat, auch mit Dateisystemen zu arbeiten, die beschädigte Strukturen haben, ist
testdisk
. (Sie können laufen ,sudo apt install testdisk
es zu installieren.)Erstellen Sie ein Skript, um nur den folgenden Dateisystemtyp zurückzugeben:
quelle