Получить UUID / файловой системы из сценария

Как я могу получить UUID тома, который содержит файловую систему /? Самое лучшее, что я нашел на сегодняшний день, - blkid -o list. Но этот вывод является понятным для человека и трудно разбираться. Может быть, есть лучший способ?

Мне нужно, чтобы параметризовать управление конфигурацией с помощью системных шаблонов.

ПРИМЕЧАНИЕ о blkid получено для тех, кто может повторно использовать результаты моего вопроса в будущем: blkid кэширует результаты предыдущих прогонов в /etc/blkid.tab. Это означает, что запуск blkid в качестве пользователя без полномочий root не приведет к возврату каких-либо данных. Кроме того, запуск blkid в качестве пользователя без полномочий root после запуска root приведет к возврату устаревших (возможно, неверных) данных.

10
задан 30 September 2017 в 21:22

15 ответов

Использовать 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.

21
ответ дан 22 May 2018 в 18:01
  • 1
    Это отлично работает 16.04. Он не функционировал для меня 14.04. Мне пришлось использовать этот подход для получения желаемых результатов по доверенности. – Elder Geek 21 October 2017 в 23:17

Другое решение:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
-n подавляет заголовок (в действительности не нужен, но безопаснее для синтаксического анализа) -r делает исходный вывод (делает его более безопасным для синтаксического анализа) -o UUID,MOUNTPOINT включает только необходимая информация
11
ответ дан 22 May 2018 в 18:01

Вы можете использовать команду lsblk для вывода UUID, но вам нужно имя устройства для раздела (например, / dev / sda2). Вы можете получить это, используя команду df и обрезая вывод. Используйте подстановку команд, чтобы присвоить имя устройства lsblk. Кажется, вам нужно sudo для доступа к UUID, хотя нормальный вывод lsblk не требует этого:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
5
ответ дан 22 May 2018 в 18:01
  • 1
    Это работает для меня без sudo 16.04. – Eliah Kagan 30 September 2017 в 05:57
  • 2
    только если вы (или какой-то скрипт) когда-либо запускали эту команду как root раньше. Кроме того, выход может быть устаревшим (из кеша) в этом случае – Dmitriusan 30 September 2017 в 21:15
  • 3
    @Dmitriusan Я запускал это в системе 14.04, у которой никогда не было lsblk или blkid, запускаемого root, и работала отлично. Вы знаете, почему с этой командой будет проблема кэширования, а не с версией, размещенной Rovo? Является ли сырой выход каким-то способом кэшированием? – Arronical 2 October 2017 в 13:42
  • 4
    Я думаю, что любая команда, которая обращается к UUID устройств, потребует root-доступа (включая версию, размещенную Rovo). Что касается lsblk, вот связанный с ним вопрос unix.stackexchange.com/questions/210889/… (см. Первый ответ) – Dmitriusan 2 October 2017 в 13:47
  • 5
    Я согласен, что sudo необходимо, но не может найти ничего, чтобы предположить, что lsblk полагается на кеширование. Даже если я запустил blkid в качестве пользователя root, создав файл кэша в /dev/.blkid.tab, использование sudo lsblk ничего не отобразит из столбца UUID. Я не думаю, что существует риск устаревания продукта. – Arronical 2 October 2017 в 14:05

Лучшее решение, которое мне удалось найти, это

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

Чувствует себя неоптимальным, но работает.

Примечание: [[: space:]] означает Space

4
ответ дан 22 May 2018 в 18:01

Измените значение mountpoint на текущую точку монтирования файловой системы:

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
4
ответ дан 22 May 2018 в 18:01

Вот что я использую:

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

tune2fs находится в пакете e2fsprogs, который я не могу вспомнить, если он установлен по умолчанию.

sudo apt install e2fsprogs

, если он не установлен.

1
ответ дан 22 May 2018 в 18:01
  • 1
    Я получаю awk: not an option: -e, я отредактировал ваш ответ, чтобы сделать его функциональным. Если я перешагнул, не стесняйтесь откатывать его. Ура! :-) – Elder Geek 21 October 2017 в 23:36
  • 2
    Странно, кажется, работает с или без -e для меня. -e документируется на странице man для awk. Я всегда использовал его в скриптах, и я был удивлен, что он отлично справился без него :) Я думаю, что это старая привычка UNIX. Но я должен был быть последовательным в моем использовании и использовать -e в обоих местах или ни в одном месте, чтобы не путать людей. – John 23 October 2017 в 01:04
  • 3
    Ах, я получаю тот же результат, что и у вас под 14.04, который использует gawk. Я получаю ошибку, указанную в 16.04, которая, как представляется, использует mawk. – Elder Geek 23 October 2017 в 17:06
  • 4
    Это одна из тех / etc / альтернатив. / etc / alternatives / awk - & gt; / usr / bin / gawk для меня на моем 16.04. Mawk установлен, но не активен в / etc / alternatives. На моем 17.04 гном он указывает на awk. На моей новой установке 17.10 это mawk. После установки gawk ссылка указывает на gawk, удаление gawk возвращает его для mawk. – John 24 October 2017 в 18:17
  • 5
    :-) Именно эти незначительные различия между предположительно подобными программами, которые, вероятно, привели к таким заявлениям, как «Less is more». – Elder Geek 24 October 2017 в 18:47

Протестировано для работы с 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 вернет пустую строку, если вы не используют переменную.

1
ответ дан 22 May 2018 в 18:01

Вы можете использовать команду lsblk для вывода UUID, но вам нужно имя устройства для раздела (например, / dev / sda2). Вы можете получить это, используя команду df и обрезая вывод. Используйте подстановку команд, чтобы присвоить имя устройства lsblk. Кажется, вам нужно sudo для доступа к UUID, хотя нормальный вывод lsblk не требует этого:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
5
ответ дан 18 July 2018 в 06:02

Измените значение mountpoint на текущую точку монтирования файловой системы:

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" && sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
4
ответ дан 18 July 2018 в 06:02

Протестировано для работы с 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 вернет пустую строку, если вы не используют переменную.

1
ответ дан 18 July 2018 в 06:02

Другое решение:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)' -n подавляет заголовок (в действительности не нужен, но безопаснее для синтаксического анализа) -r делает исходный вывод (делает его более безопасным для синтаксического анализа) -o UUID,MOUNTPOINT включает только необходимая информация
11
ответ дан 18 July 2018 в 06:02

Вы можете использовать команду lsblk для вывода UUID, но вам нужно имя устройства для раздела (например, / dev / sda2). Вы можете получить это, используя команду df и обрезая вывод. Используйте подстановку команд, чтобы присвоить имя устройства lsblk. Кажется, вам нужно sudo для доступа к UUID, хотя нормальный вывод lsblk не требует этого:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
5
ответ дан 24 July 2018 в 18:30
  • 1
    Это работает для меня без sudo 16.04. – Eliah Kagan 30 September 2017 в 05:57
  • 2
    только если вы (или какой-то скрипт) когда-либо запускали эту команду как root раньше. Кроме того, выход может быть устаревшим (из кеша) в этом случае – Dmitriusan 30 September 2017 в 21:15
  • 3
    @Dmitriusan Я запускал это в системе 14.04, у которой никогда не было lsblk или blkid, запускаемого root, и работала отлично. Вы знаете, почему с этой командой будет проблема кэширования, а не с версией, размещенной Rovo? Является ли сырой выход каким-то способом кэшированием? – Arronical 2 October 2017 в 13:42
  • 4
    Я думаю, что любая команда, которая обращается к UUID устройств, потребует root-доступа (включая версию, размещенную Rovo). Что касается lsblk, вот связанный с ним вопрос unix.stackexchange.com/questions/210889/… (см. Первый ответ) – Dmitriusan 2 October 2017 в 13:47
  • 5
    Я согласен, что sudo необходимо, но не может найти ничего, чтобы предположить, что lsblk полагается на кеширование. Даже если я запустил blkid в качестве пользователя root, создав файл кэша в /dev/.blkid.tab, использование sudo lsblk ничего не отобразит из столбца UUID. Я не думаю, что существует риск устаревания продукта. – Arronical 2 October 2017 в 14:05

Измените значение mountpoint на текущую точку монтирования файловой системы:

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" && sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
4
ответ дан 24 July 2018 в 18:30

Протестировано для работы с 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 вернет пустую строку, если вы не используют переменную.

1
ответ дан 24 July 2018 в 18:30
  • 1
    Это работает для меня, но с sudo. – pa4080 4 October 2017 в 02:00
  • 2
    Я получаю awk: not an option: -e, я отредактировал ваш ответ, чтобы сделать его функциональным. Если я перешагнул, не стесняйтесь откатывать его. Ура! :-) – Elder Geek 21 October 2017 в 23:36
  • 3
    Странно, кажется, работает с или без -e для меня. -e документируется на странице man для awk. Я всегда использовал его в скриптах, и я был удивлен, что он отлично справился без него :) Я думаю, что это старая привычка UNIX. Но я должен был быть последовательным в моем использовании и использовать -e в обоих местах или ни в одном месте, чтобы не путать людей. – John 23 October 2017 в 01:04
  • 4
    Ах, я получаю тот же результат, что и у вас под 14.04, который использует gawk. Я получаю ошибку, указанную в 16.04, которая, как представляется, использует mawk. – Elder Geek 23 October 2017 в 17:06
  • 5
    Это одна из тех / etc / альтернатив. / etc / alternatives / awk - & gt; / usr / bin / gawk для меня на моем 16.04. Mawk установлен, но не активен в / etc / alternatives. На моем 17.04 гном он указывает на awk. На моей новой установке 17.10 это mawk. После установки gawk ссылка указывает на gawk, удаление gawk возвращает его для mawk. – John 24 October 2017 в 18:17
  • 6
    :-) Именно эти незначительные различия между предположительно подобными программами, которые, вероятно, привели к таким заявлениям, как «Less is more». – Elder Geek 24 October 2017 в 18:47

Другое решение:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)' -n подавляет заголовок (в действительности не нужен, но безопаснее для синтаксического анализа) -r делает исходный вывод (делает его более безопасным для синтаксического анализа) -o UUID,MOUNTPOINT включает только необходимая информация
11
ответ дан 24 July 2018 в 18:30
  • 1
    отлично, спасибо! – Dmitriusan 29 September 2017 в 15:36
  • 2
    Это отлично работает 16.04. Он не функционировал для меня 14.04. Мне пришлось использовать этот подход для получения желаемых результатов по доверенности. – Elder Geek 21 October 2017 в 23:17

Другие вопросы по тегам:

Похожие вопросы: