Как я могу получить UUID тома, который содержит файловую систему /? Самое лучшее, что я нашел на сегодняшний день, - blkid -o list. Но этот вывод является понятным для человека и трудно разбираться. Может быть, есть лучший способ?
Мне нужно, чтобы параметризовать управление конфигурацией с помощью системных шаблонов.
ПРИМЕЧАНИЕ о blkid получено для тех, кто может повторно использовать результаты моего вопроса в будущем: blkid кэширует результаты предыдущих прогонов в /etc/blkid.tab. Это означает, что запуск blkid в качестве пользователя без полномочий root не приведет к возврату каких-либо данных. Кроме того, запуск blkid в качестве пользователя без полномочий root после запуска root приведет к возврату устаревших (возможно, неверных) данных.
Использовать 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
Он также имеет несколько опций для управления тем, как он ищет информацию и как она ее представляет (включая вывод JSON!). Это часть пакета mount, доступная на любой установке Ubuntu.
Другое решение:
lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
-n подавляет заголовок (в действительности не нужен, но безопаснее для синтаксического анализа) -r делает исходный вывод (делает его более безопасным для синтаксического анализа) -o UUID,MOUNTPOINT включает только необходимая информация Вы можете использовать команду lsblk для вывода UUID, но вам нужно имя устройства для раздела (например, / dev / sda2). Вы можете получить это, используя команду df и обрезая вывод. Используйте подстановку команд, чтобы присвоить имя устройства lsblk. Кажется, вам нужно sudo для доступа к UUID, хотя нормальный вывод lsblk не требует этого:
sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Лучшее решение, которое мне удалось найти, это
blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4
Чувствует себя неоптимальным, но работает.
Примечание: [[: space:]] означает Space
Измените значение mountpoint на текущую точку монтирования файловой системы:
dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
Вот что я использую:
sudo tune2fs -l $(df / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'
tune2fs находится в пакете e2fsprogs, который я не могу вспомнить, если он установлен по умолчанию.
sudo apt install e2fsprogs
, если он не установлен.
Протестировано для работы с 14.04 и 16.04
Простой однострочный, который всегда должен генерировать UUID корня /, является
export DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | cut -d '' '-f2 `Что мы здесь делаем, это grepping вывод mount для соответствия корневому символу пробелам с каждой стороны /, чтобы избежать совпадения, когда / используется как символ расширения пути, который через awk использует «on» в качестве разделителя полей, чтобы выводить только имя устройства и присваивать THAT переменной среды $ DRIVE, затем используя вывод blkid $DRIVE, пропущенный через разрез, используя " в качестве разделителя полей и выбора только второго поля, которое удаляет все остальное, оставляя только UUID.
Протестировано для работы с 14.04 и 16.04 , что то, что принадлежит после grep в приведенной выше команде на самом деле «космос / пространство», а не «/», как он появляется.
Это имеет преимущество не требовать sudo и возвращает соответствующий результат независимо от того, как установлен диск .
Было бы разумно гарантировать, что вы не используете переменную среды $ DRIVE для чего-либо еще до попытки этого подхода. echo $DRIVE вернет пустую строку, если вы не используют переменную.
Вы можете использовать команду lsblk для вывода UUID, но вам нужно имя устройства для раздела (например, / dev / sda2). Вы можете получить это, используя команду df и обрезая вывод. Используйте подстановку команд, чтобы присвоить имя устройства lsblk. Кажется, вам нужно sudo для доступа к UUID, хотя нормальный вывод lsblk не требует этого:
sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Измените значение mountpoint на текущую точку монтирования файловой системы:
dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
Протестировано для работы с 14.04 и 16.04
Простой однострочный, который всегда должен генерировать UUID корня /, является
export DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | cut -d '' '-f2 `Что мы здесь делаем, это grepping вывод mount для соответствия корневому символу пробелам с каждой стороны /, чтобы избежать совпадения, когда / используется как символ расширения пути, который через awk использует «on» в качестве разделителя полей, чтобы выводить только имя устройства и присваивать THAT переменной среды $ DRIVE, затем используя вывод blkid $DRIVE, пропущенный через разрез, используя " в качестве разделителя полей и выбора только второго поля, которое удаляет все остальное, оставляя только UUID.
Протестировано для работы с 14.04 и 16.04 , что то, что принадлежит после grep в приведенной выше команде на самом деле «космос / пространство», а не «/», как он появляется.
Это имеет преимущество не требовать sudo и возвращает соответствующий результат независимо от того, как установлен диск .
Было бы разумно гарантировать, что вы не используете переменную среды $ DRIVE для чего-либо еще до попытки этого подхода. echo $DRIVE вернет пустую строку, если вы не используют переменную.
Другое решение:
lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
-n подавляет заголовок (в действительности не нужен, но безопаснее для синтаксического анализа) -r делает исходный вывод (делает его более безопасным для синтаксического анализа) -o UUID,MOUNTPOINT включает только необходимая информация Вы можете использовать команду lsblk для вывода UUID, но вам нужно имя устройства для раздела (например, / dev / sda2). Вы можете получить это, используя команду df и обрезая вывод. Используйте подстановку команд, чтобы присвоить имя устройства lsblk. Кажется, вам нужно sudo для доступа к UUID, хотя нормальный вывод lsblk не требует этого:
sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Измените значение mountpoint на текущую точку монтирования файловой системы:
dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
Протестировано для работы с 14.04 и 16.04
Простой однострочный, который всегда должен генерировать UUID корня /, является
export DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | cut -d '' '-f2 `Что мы здесь делаем, это grepping вывод mount для соответствия корневому символу пробелам с каждой стороны /, чтобы избежать совпадения, когда / используется как символ расширения пути, который через awk использует «on» в качестве разделителя полей, чтобы выводить только имя устройства и присваивать THAT переменной среды $ DRIVE, затем используя вывод blkid $DRIVE, пропущенный через разрез, используя " в качестве разделителя полей и выбора только второго поля, которое удаляет все остальное, оставляя только UUID.
Протестировано для работы с 14.04 и 16.04 , что то, что принадлежит после grep в приведенной выше команде на самом деле «космос / пространство», а не «/», как он появляется.
Это имеет преимущество не требовать sudo и возвращает соответствующий результат независимо от того, как установлен диск .
Было бы разумно гарантировать, что вы не используете переменную среды $ DRIVE для чего-либо еще до попытки этого подхода. echo $DRIVE вернет пустую строку, если вы не используют переменную.
Другое решение:
lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
-n подавляет заголовок (в действительности не нужен, но безопаснее для синтаксического анализа) -r делает исходный вывод (делает его более безопасным для синтаксического анализа) -o UUID,MOUNTPOINT включает только необходимая информация