Récupère l'UUID de / filesystem à partir du script

11

Comment puis-je obtenir l'UUID d'un volume qui contient le /système de fichiers? La meilleure chose que j'ai trouvée à ce jour est blkid -o list. Mais cette sortie est lisible par l'homme et difficile à analyser. Peut-être y a-t-il une meilleure façon?

J'en ai besoin pour paramétrer la gestion de la configuration avec des modèles spécifiques au système.

REMARQUE à propos de blkidgotcha pour ceux qui pourraient réutiliser les résultats de ma question à l'avenir: blkidmet en cache les résultats des exécutions précédentes sur /etc/blkid.tab. Cela signifie que la première exécution en blkidtant qu'utilisateur non root ne renverra aucune donnée. En outre, l'exécution en blkidtant qu'utilisateur non root après l'exécution de root retournera des données périmées (éventuellement incorrectes).

Dmitriusan
la source
Sur mes propres systèmes, j'attribue des étiquettes uniques lisibles par l'homme à toutes les partitions. Ensuite, je peux trouver presque n'importe quoi à leur sujet en utilisant leurs étiquettes et /dev/disk/by-label... Cela fonctionne également pour les partitions qui ne sont pas montées. Il a l'avantage de pouvoir écrire des scripts qui font des choses comme rsync de root à root-bak qui est beaucoup moins sujet aux erreurs que d'utiliser 2 UUIDS qui ne "signifient" rien.
Joe

Réponses:

25

Utilisation findmnt:

$ findmnt /        
TARGET SOURCE       FSTYPE OPTIONS
/      /dev/md127p1 ext4   rw,relatime,stripe=256,data=ordered
$ findmnt / -o UUID
UUID
046a554b-d9f5-4b23-82e6-ffaeb98284aa
$ findmnt / -o UUID -n
046a554b-d9f5-4b23-82e6-ffaeb98284aa

Il dispose également de plusieurs options pour contrôler la façon dont il recherche les informations et la façon dont elles les présentent (y compris la sortie JSON!). Cela fait partie du mountpackage, donc disponible sur toute installation Ubuntu.

muru
la source
Cela fonctionne très bien le 16.04. Il n'a pas fonctionné pour moi le 14.04. J'ai dû utiliser cette approche pour obtenir les résultats souhaités sur fidèle.
Elder Geek
11

Une autre solution:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n supprime l'en-tête (pas vraiment nécessaire, mais plus sûr pour l'analyse)
  • -r rend la sortie brute (rend l'analyse plus sûre)
  • -o UUID,MOUNTPOINT inclure uniquement les informations nécessaires
pLumo
la source
5

Vous pouvez utiliser la lsblkcommande pour sortir l'UUID, mais vous avez besoin du nom de périphérique de la partition (tel que / dev / sda2). Vous pouvez l'obtenir en utilisant la dfcommande et en découpant la sortie. Utilisez la substitution de commandes pour donner le nom du périphérique à lsblk. Il semble que vous ayez besoin de sudo pour accéder à l'UUID, bien que la sortie normale de lsblk ne l'exige pas:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Arronical
la source
2
Cela fonctionne pour moi sans sudole 16.04.
Eliah Kagan
uniquement si vous (ou un script) avez déjà exécuté cette commande en tant que root auparavant. En outre, la sortie peut être périmée (à partir du cache) dans ce cas
Dmitriusan
@Dmitriusan J'ai exécuté ceci sur un système 14.04 qui n'a jamais eu lsblkni blkidexécuté par root et cela a parfaitement fonctionné. Savez-vous pourquoi il y aurait un problème de mise en cache avec cette commande et non avec la version publiée par Rovo? La sortie brute contourne-t-elle la mise en cache d'une certaine manière?
Arronical
Je pense que toute commande qui accède à l'UUID des appareils nécessiterait un accès root (y compris la version publiée par Rovo). Concernant lsblk, voici une question connexe unix.stackexchange.com/questions/210889/… (voir la première réponse)
Dmitriusan
Je suis d'accord que sudo est nécessaire, mais je ne trouve rien qui suggère que lsblk s'appuie sur la mise en cache. Même si je lance en blkidtant que root, la création du fichier cache sur /dev/.blkid.tab, l'utilisation non-sudo de lsblkne montrera rien de la colonne UUID. Je ne pense pas qu'il y ait un risque de sortie périmée.
Arronical
4

La meilleure solution que j'ai réussi à trouver est

blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4

Se sent non optimal, mais fonctionne.

Remarque: [[: espace:]] signifieSpace

Dmitriusan
la source
Cela fonctionne pour moi mais avec sudo.
pa4080 du
4

Ajustez la valeur de mountpointau point de montage actuel du système de fichiers en question:

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
David Foerster
la source
1

Voici ce que j'utilise:

sudo tune2fs -l $(df  / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'

tune2fs est dans le package e2fsprogs, dont je ne me souviens pas s'il est installé par défaut.

sudo apt install e2fsprogs

s'il n'est pas installé.

John
la source
Je reçois awk: not an option: -ej'ai édité votre réponse pour la rendre fonctionnelle. Si j'ai outrepassé, n'hésitez pas à le faire reculer. À votre santé! :-)
Elder Geek
Étrange, il semble fonctionner avec ou sans le -e pour moi. -e est documenté dans la page de manuel pour awk. Je l'ai toujours utilisé dans les scripts et j'ai été surpris que ça marche bien sans ça :) Je pense que -e est une vieille habitude UNIX. Mais, j'aurais dû être cohérent dans mon utilisation et utilisé -e dans les deux endroits ou dans aucun endroit afin de ne pas confondre les gens.
John
Ah, j'obtiens le même résultat que vous sous 14.04 qui utilise gawk. J'obtiens l'erreur spécifiée sous 16.04 qui semble utiliser à la mawkplace.
Elder Geek
C'est une de ces choses / etc / alternatives. / etc / alternatives / awk -> / usr / bin / gawk pour moi sur mon 16.04. Mawk est installé, mais n'est pas actif dans / etc / alternatives. Sur mon gnome 17.04, il pointe vers awk. Sur ma nouvelle installation 17.10, c'est mawk. Après avoir installé gawk, le lien pointe vers gawk, la désinstallation de gawk le renvoie à mawk.
John
:-) Ce sont ces différences mineures entre des programmes prétendument similaires qui ont probablement conduit à des déclarations comme «Moins c'est plus»
Elder Geek
1

Testé pour fonctionner les 14.04 et 16.04

Un simple doublure qui devrait toujours produire l'UUID d'une racine /est

export DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | cut -d '"' -f2`

Ce que nous faisons ici est de saluer la sortie de mount pour faire correspondre le symbole racine avec des espaces de chaque côté /pour éviter de faire correspondre quand /est utilisé comme symbole d'extension de chemin, en awkutilisant cela en utilisant "on" comme séparateur de champ afin de sortir uniquement le nom du périphérique et affectation de cela à la variable d'environnement $ DRIVE, puis en utilisant la sortie de blkid $DRIVEcoupe par canalisation en utilisant le "comme séparateur de champ et en sélectionnant uniquement le deuxième champ qui supprime tout le reste, ne laissant que l'UUID.

Notez que ce qui appartient après grep dans la commande ci-dessus est en fait ' space/ space' et non '/' tel qu'il apparaît.

Cela a l'avantage de ne pas nécessiter sudoet retournera le résultat approprié quelle que soit la façon dont le lecteur est monté.

Il serait sage de s'assurer que vous n'utilisez pas la variable d'environnement $ DRIVE pour autre chose avant d'essayer cette approche echo $DRIVEretournera une ligne vide si vous n'utilisez pas la variable.

Elder Geek
la source