BASH: Partition von der Diskussil-Ausgabe finden

928
juliushibert

Ich versuche, die Ausgabe eines Befehls zu suchen, der lokale Laufwerke auflistet, um eine Partition namens EFI auf der Boot-Festplatte zu finden.

Ich habe einen wirklich dreckigen Oneliner geschrieben, da ich scheinbar nicht herausfinden kann, wie man die Haupt-HDD (vermutlich immer Macintosh HD) effektiv findet und dann herausfindet, was die EFI-Partition auf dem gleichen Laufwerk ist, und von dort aus die disk # s # IDENTIFIER für die EFI-Partition auf dem Macintosh HD-Laufwerk.

Die Standardausgabe von diskutil listist ungefähr so

$ diskutil list /dev/disk0 #:                       TYPE NAME                    SIZE       IDENTIFIER 0:      GUID_partition_scheme                        *500.1 GB   disk0 1:                        EFI EFI                     209.7 MB   disk0s1 2:                  Apple_HFS Macintosh HD            499.1 GB   disk0s2 3:                 Apple_Boot Recovery HD             784.2 MB   disk0s3  /dev/disk1 #:                       TYPE NAME                    SIZE       IDENTIFIER 0:      GUID_partition_scheme                        *1.5 TB     disk1 1:                        EFI EFI                     209.7 MB   disk1s1 2:                  Apple_HFS Data                    1.5 TB     disk1s2 

Also hier ist der schmutzige Liner, den ich benutzt habe. Gibt es eine bessere Möglichkeit, dies zu tun? 

diskutil mount $(diskutil list | grep -i 'Macintosh\ HD' | awk '' | grep -i 'disk0s')

1

3 Antworten auf die Frage

0
Yaron

Sie können versuchen, das Hauptblockgerät zu ermitteln, indem Sie Folgendes verwenden:

mount | awk '/on \/ / '

Ich kann anscheinend keine Möglichkeit finden, mein Hauptvolumen zu erkennen, da meine Ausgabe sie nicht auflistet. Ich kann nur das Hauptblockgerät und eine Beschreibung des Inhalts sehen:

/dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *251.0 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_CoreStorage 250.1 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 #: TYPE NAME SIZE IDENTIFIER 0: Apple_HFS Macintosh HD *249.8 GB disk1 Logical Volume on disk0s2 XXXXXXXX-XXXX-XXXX-XXXX-7C6C089FXXXX Unencrypted 

In meinem Fall kann ich leicht verwenden, awk '/Logical Volume/ 'aber ein robusteres Skript berücksichtigt die Mac-Version, um alle möglichen Fälle zu prüfen.

Übrigens, ich verwende Yosemite 10.10.4 auf MBP 15 "Mitte 2014.

0
TheCommoner282

Okay, das ist nicht vollständig, aber ich hatte keine Zeit mehr.

Ich benutze also den Befehl df, weil ich weiß, dass am Ende der Mount-Punkt vorhanden ist. Dann grep ich es mit einem Slash-Newline-Muster. Und dann wollte ich nach dem ersten Leerzeichen alles abschneiden. Aber das Ausschneiden funktioniert momentan nicht. Ich weiß nicht wirklich, was ich falsch mache und ich muss jetzt anfangen, für meinen Job zu arbeiten, aber vielleicht können Sie das Ausschneiden der Bash-Funktion verbessern. Entschuldigung, keine Zeit, das Handbuch nachzuschlagen, um meinen Fehler zu finden. Aber wir sind fast da:

Korrigiert:

foo=$(df -h | grep -e ' /$'); loo=$; echo $loo 

Jetzt gehts. Versuch es :)

EDIT: Oh, ich habe gerade gemerkt, dass ich ein LVG verwende, daher werden disk0s [0-4] in disk1 übersetzt. Also, testen Sie es und sagen Sie mir, ob dies die richtige Festplatte richtig anzeigt, wenn Sie kein LVG verwenden.

BEARBEITEN 2: Funktioniert immer noch nicht für eine verschlüsselte logische Datenträgergruppe, aber wenn Sie diese ohne FileVault testen könnten, sollte dies funktionieren

foo=$(mount | grep -e ' / '); foo=$; diskutil list | grep "[0-99]:" | grep $ | grep EFI) 

Dies würde nach einer EFI auf der Platte suchen, auf der als root angemeldet ist, also normalerweise MacintoshHD

EDIT 3: Das ist wirklich großartig, um die Zeit bei der Arbeit zu töten. Okay, ich denke, das sollte Ihnen die richtige Antwort geben. Dies ist auch möglich, wenn FileVault verschlüsselt ist.

#!/bin/bash  maindrive=$(mount | grep -e " / ") maindrive_exact=$ maindrive_reduced=$  if [ "$(diskutil list | grep Unlocked)" = "" ] then diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI) diskline_cut1=$ diskline_cut2=$ echo "/dev/$diskline_cut2"  else alldisk=$(diskutil list) alldisk_cut1=$} alldisk_cut2=$ alldisk_cut3=$ echo /dev/$alldisk_cut3 fi 

Auf diese Weise sollten Sie also die EFI-Partition auf derselben Festplatte wie Ihren Stammordner MacintoshHD verwenden.

EDIT 4 (hoffentlich endgültige Version)

#!/bin/bash  maindrive=$(mount | grep -e " / ") maindrive_exact=$ maindrive_reduced=$    function getdisknumber { diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI) diskline_cut1=$ diskline_cut2=$ echo "/dev/$diskline_cut2" }  if [ "$(diskutil list | grep Unlocked)" = "" ]  then  getdisknumber  else  alldisk=$(diskutil list) alldisk_cut=$} alldisk_cut=$ alldisk_cut=$ alldisk_cut=$ maindrive_reduced=$alldisk_cut getdisknumber fi 

Und hier ist die Erklärung

Okay, as ask in the comment, the explanation what %%,%,##,# means.  All those symbols cut out information of a string. %%pattern cuts out the biggest pattern matching part to the right. %pattern cuts out the smallest pattern matching part to the right. ##pattern cuts out the biggest pattern matching part to the left #pattern cuts out the smallest pattern matching part to the left 

Der else-Teil des Skripts versucht nun, die richtige Festplatte zu finden, wenn er mit einem von FileVault erstellten verschlüsselten Volume konfrontiert wird. Die Funktion reduziert dann diese Festplatte auf die Festplatteninformationen auf dieser Festplatte und sucht nach EFI als Schlüsselwort.

Hier ist ein Link zu Strings in bash Schneiden Schneiden Saiten

EDIT 5: Alles klar. Eine weitere Iteration dieses Skripts. Sehr, sehr grundlegend.

#!/bin/bash  ## Find the main hard drive  maindrive=$(mount | grep -e " / ") maindrive=$ maindrive=$   ## Checking for FileVault  if [ "" != "$(diskutil list /dev/disk1 | grep "Unlocked Encrypted")" ] then maindrive=$(diskutil list | grep "Logical Volume on") maindrive=$ maindrive=$ fi   ## Checking for EFI  EFI_DRIVE=$(diskutil list /dev/$maindrive | grep EFI) EFI_DRIVE=$ echo "/dev/$EFI_DRIVE" 

Nur um das zu vervollständigen, das ist meine Diskussionsliste:

/dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *250.1 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_CoreStorage 249.2 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 #: TYPE NAME SIZE IDENTIFIER 0: Apple_HFS Macintosh HD *248.8 GB disk1 Logical Volume on disk0s2 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Unlocked Encrypted 

Und das passiert, wenn ich das Skript starte:

Joes-MacBook-Pro:EFI_Script joe$ chmod +x EFI_Script Joes-MacBook-Pro:EFI_Script joe$ ./EFI_Script /dev/disk0s1 Joes-MacBook-Pro:EFI_Script joe$ 

Ich habe darüber nachgedacht, warum es bisher für Sie nicht funktioniert hat. Wenn das auch nicht funktioniert, brauche ich zwei Informationen von Ihnen. Zuerst muss ich Ihre Ausgabe für den Befehl 'mount' kennen. Meines sieht so aus:

Joes-MacBook-Pro:EFI_Script joe$ mount /dev/disk1 on / (hfs, local, journaled) devfs on /dev (devfs, local, nobrowse) map -hosts on /net (autofs, nosuid, automounted, nobrowse) map auto_home on /home (autofs, automounted, nobrowse) 

Wie Sie sehen, gibt es mir den Mountpoint '/' auf 'disk1'. Ich habe einfach angenommen, wenn FileVault deaktiviert ist, würden Sie Ihren Mountpoint auf Disk0 angeben. Aber vielleicht irre ich mich und ich habe kein System, auf dem FileVault ausgeschaltet ist. Sollte sich Ihr Mountpoint auch auf disk1 befinden, während EFI sich auf disk0 befindet, sollte er leer oder nur mit / dev / zurückgegeben werden, da ich dies manuell hinzugefügt habe. Wenn ich mich recht erinnere, hatten Sie auf EF1 auch eine EFI-Partition.

Die zweite Sache, die ich brauche, wäre, dass Sie dieses Skript mit dem Befehl 'bash -x script' ausführen, damit es zeigt, was es während der Ausführung tut. Auf diese Weise konnten wir sehen, was schief geht.

Wie auch immer, ich hoffe es funktioniert einfach und wir müssen nicht auf diese Länge gehen. Wenn nicht, müssen wir einen anderen Weg finden, um die Hauptfestplatte zu finden.

Testen Sie es trotzdem. Prost!

Wow @ TheCommoner282 Du bist in die Stadt gefahren. `foo = $ (df -h | grep -e '/ $'); loo = $ ; echo $ loo` und `erzeugt die falsche Laufwerks-ID,` foo = $ (mount | grep -e '/'); foo = $ ; diskutil list | grep "[0-99]:" | grep $ | grep EFI; echo $ foo` beide erzeugen / dev / disk0s2 anstelle von / dev / disk0s1. Ich werde morgen dein längeres Skript testen. Aus Interesse können Sie erklären, was Ihre Verwendung der Zeichen %% und ## tut, da ich keine Dokumentation online finden kann. Dh in $ }? Ich möchte gerne lernen. juliushibert vor 9 Jahren 0
Ich werde eine Erklärung bearbeiten. Außerdem habe ich einen Fehler in meinem Skript gefunden und werde ihn korrigieren TheCommoner282 vor 9 Jahren 0
Oh mein Gott, du hast recht. Ich habe mir gerade die zweite Zeile angesehen. Das ist nur Müll. Ich 'echo $ foo', was im zweiten Schritt nicht geändert wird. Und die vorherige "Diskussil-Liste" wird wahrscheinlich leer sein. Nun, ein schlechter Anfang. Aber hoffen wir, dass die vierte Iteration funktioniert TheCommoner282 vor 9 Jahren 0
Entschuldigung, es hat eine Weile gedauert, bis ich Ihren letzten Vorschlag getestet habe. @ TheCommoner282 Ungewollt gibt das Skript nur `/ dev /` aus. Danke für die Untersuchung zum Schneiden in BASH. Wirklich gute Infos zu wissen. juliushibert vor 9 Jahren 0
Wie seltsam. Ich denke, es muss einen Unterschied zwischen unseren diskutil-Ergebnissen geben, die ich nicht berücksichtigt habe. Ich werde das Skript neu schreiben und versuchen, es zu berücksichtigen. Außerdem werde ich versuchen, die von Ihnen gepostete Ausgabe zu Testzwecken hinzuzufügen. Ich habe eine oder zwei Ideen, wie man dies auf weniger Informationen einschränken kann, weniger Einschnitte und damit weniger Fehler oder Möglichkeiten. Sie können diese neue Version bis morgen erwarten. Ich mache es heute Abend (basierend auf Europa, GMT + 1) TheCommoner282 vor 9 Jahren 0
@juliushibert, ich habe eine andere Version hinzugefügt. Und ich habe ein paar Anleitungen hinzugefügt, wie man das Problem finden kann, falls es nicht wieder funktioniert. Wie auch immer, nur hier kommentieren, damit Sie eine Benachrichtigung erhalten. Ich hoffe es funktioniert jetzt. Prost. TheCommoner282 vor 9 Jahren 0
0
madeddie

Ich würde davon ausgehen, dass / dev / disk0 immer die "Haupt" -Festplatte ist, oder? Wenn nicht und Sie wirklich die EFI-Partition auf der Festplatte mit dem Namen "Macintosh HD" finden möchten, ist Ihr Oneliner fast korrekt.

Für mich gibt $ 6 'GB' zurück und ich gehe auch davon aus, dass die EFI-Partition immer die erste dieser Festplatte ist.

diskutil list | grep 'Macintosh HD' | awk '' | sed 's/s[0-9]/s1/' 

oder noch etwas mehr Trickerei (für ein gutes Maß):

diskutil list | awk '/Macintosh HD/ { sub(/s[0-9]/, "s1", $(NF)); print $(NF) }'