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

10

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

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

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

    
задан Dmitriusan 29.09.2017 в 11:16
источник

7 ответов

22

Используйте 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.

    
ответ дан muru 29.09.2017 в 20:02
источник
11

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

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

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

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
    
ответ дан Arronical 29.09.2017 в 11:40
4

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

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

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

Примечание: [[: пробел:]] означает Пробел

    
ответ дан Dmitriusan 29.09.2017 в 11:36
4

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

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
    
ответ дан David Foerster 29.09.2017 в 16:54
1

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

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

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

sudo apt install e2fsprogs

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

    
ответ дан John 03.10.2017 в 22:52
1

Протестировано для работы с 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.

Обратите внимание , что то, что принадлежит grep в приведенной выше команде, фактически является « space / space », а не «/», как оно появляется.

Это может не потребовать sudo и вернет соответствующий результат независимо от того, как установлен диск.

Было бы разумным гарантировать, что вы не используете переменную среды $ DRIVE для чего-либо еще до попытки этого подхода. echo $DRIVE вернет пустую строку, если вы не используете переменную.

    
ответ дан Elder Geek 21.10.2017 в 20:00