Comment obtenir l'UUID d'un volume contenant 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 qu'il y a un meilleur moyen?
J'ai besoin de cela pour paramétrer la gestion de la configuration avec des modèles spécifiques au système.
NOTE à propos de blkid
gotcha pour ceux qui peuvent réutiliser les résultats de ma question à l’avenir: blkid
met en cache les résultats des exécutions précédentes sur /etc/blkid.tab
. Cela signifie que l’exécution de blkid
en tant qu’utilisateur non root pour la première fois ne renverra aucune donnée. blkid
en tant qu'utilisateur non root après l'exécution de la racine retournera des données périmées (éventuellement incorrectes).
Utilisez 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 propose également plusieurs options pour contrôler la manière dont les informations sont trouvées et présentées (y compris la sortie JSON!). Cela fait partie du paquetage mount
, donc disponible sur n'importe quelle installation Ubuntu.
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
crée une sortie brute (rend l'analyse plus sûre)-o UUID,MOUNTPOINT
inclure uniquement les informations nécessairesVous pouvez utiliser la commande lsblk
pour générer 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 commande df
et en tronquant la sortie. Utilisez la substitution de commande pour attribuer le nom de 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)"
Ajustez la valeur de mountpoint
au 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'
La meilleure solution que j'ai réussi à trouver est
blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4
On se sent comme non optimal, mais ça marche.
Note: [[: espace:]] signifie Space
Testé pour fonctionner les 14.04 et 16.04
Une ligne simple qui devrait toujours produire l’UUID de la racine /
est
export DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | cut -d '"' -f2`
Ce que nous faisons ici c’est grepping la sortie de mount pour faire correspondre le symbole racine avec des espaces de part et d’autre /
pour éviter la correspondance lorsque /
est utilisé comme symbole d’extension de chemin, en passant par awk
en utilisant "on" comme séparateur de champ afin de affiche uniquement le nom du périphérique et attribue à la variable d'environnement $ DRIVE l'attribution de THAT, puis à l'aide de la sortie de blkid $DRIVE
transmise par couper en utilisant le "
comme séparateur de champ et en sélectionnant uniquement le deuxième champ qui supprime tout le reste, en laissant uniquement l'UUID.
Note que ce qui appartient après grep dans la commande ci-dessus est en réalité 'space/space'et non'/'tel qu'il apparaît.
Cela présente l'avantage de ne pas nécessiter Sudo
et renvoie le résultat approprié, quel que soit le mode de montage du lecteur.
Il serait sage de vous assurer que vous n'utilisez pas la variable d'environnement $ DRIVE avant d'essayer cette approche. echo $DRIVE
renverra une ligne vide si vous n'utilisez pas la variable.
Voici ce que j'utilise:
Sudo tune2fs -l $(df / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'
tune2fs est dans le paquet e2fsprogs, dont je ne me souviens plus s’il est installé par défaut.
Sudo apt install e2fsprogs
si ce n'est pas installé.