Отримайте UUID / fileystem із скрипту


11

Як я можу отримати UUID обсягу, який містить /файлову систему? Найкраще, що я знайшов на сьогоднішній день blkid -o list. Але цей результат є читабельним для людини і важко аналізувати. Може, є кращий спосіб?

Мені це потрібно, щоб параметризувати управління конфігурацією за допомогою шаблонів, характерних для системи.

ПРИМІТКА про blkidgotcha для тих, хто може повторно використовувати результати мого питання в майбутньому: blkidкешує результати попередніх запусків на /etc/blkid.tab. Це означає, що запустившись blkidяк некоріозний користувач перший раз, не поверне жодних даних. Крім того, запускаючи blkidяк некоріозний користувач після запуску root, повертає застарілі (можливо, неправильні) дані.


На своїх власних системах я присвоюю всім розділам унікальні мітки, прочитані людиною. Тоді я можу дізнатися про них майже все, використовуючи їх мітки і /dev/disk/by-label... Це також працює для розділів, які не змонтовані. Він має перевагу в тому, що він може писати сценарії, які роблять такі речі, як rsync від root до root-bak, що набагато менше схильності до помилок, ніж використання 2 UUIDS, які нічого не означають.
Джо

Відповіді:


25

Використання 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.


Це чудово працює 16.04. Він не працював для мене 14.04. Мені довелося скористатися таким підходом, щоб отримати бажані результати щодо надійності.
Старійшина Гейк

11

Ще одне рішення:

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

5

Ви можете скористатися lsblkкомандою для виведення UUID, але вам потрібна назва пристрою розділу (наприклад, / dev / sda2). Ви можете отримати це за допомогою dfкоманди та обрізання виводу. Використовуйте заміну команд, щоб надати ім'я пристрою lsblk. Здається, вам потрібен sudo для доступу до UUID, хоча нормальний вихід lsblk цього не вимагає:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"

2
Це працює для мене без sudo16.04.
Елія Каган

тільки якщо ви (або якийсь сценарій) раніше запускали цю команду як root. Також вихід може бути несвіжим (з кешу) у цьому випадку
Дмитріусан

@Dmitriusan Я запустив це за системою 14.04, яка ніколи не мала lsblkі не blkidпрацювала під коренем, і вона працювала чудово. Чи знаєте ви, чому з цією командою виникла б проблема кешування, а не з версією, опублікованою Rovo? Чи необмежений вихід обходить кешування?
Арронічний

Я думаю, що будь-яка команда, яка отримує доступ до UUID пристроїв, потребує кореневого доступу (включаючи версію, розміщену Rovo). Щодо lsblk, то тут пов’язане запитання unix.stackexchange.com/questions/210889/… (див. Першу відповідь)
Дмитріусан

Я погоджуюся, що судо необхідне, але не можу знайти нічого, що б підказати, що lsblk покладається на кешування. Навіть якщо я запускаю blkidяк root, створюючи кеш-файл у /dev/.blkid.tab, не-sudo використання lsblkне покаже нічого із стовпця UUID. Я не думаю, що існує ризик несвіжих результатів.
Арронічний

4

Найкраще рішення, яке мені вдалося придумати, - це

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

Відчуває себе неоптимальним, але працює.

Примітка: [[: space:]] означаєSpace


Це працює для мене, але з sudo.
pa4080

4

Відрегулюйте значення mountpointдо поточної точки монтування відповідної файлової системи:

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

1

Ось що я використовую:

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

tune2fs знаходиться в пакеті e2fsprogs, якого я не можу згадати, якщо він встановлений за замовчуванням.

sudo apt install e2fsprogs

якщо він не встановлений.


Я отримую, що awk: not an option: -eя відредагував вашу відповідь, щоб зробити її функціональною. Якщо я переступив, не соромтесь повернути його назад. Ура! :-)
Старійшина Гік

Як не дивно, здається, для мене працює або без -е. -e задокументовано на сторінці man для awk. Я завжди використовував це в сценаріях, і я був здивований, що він добре працював без нього :) Я думаю, що -e це стара звичка UNIX. Але я мав би бути послідовним у своєму використанні та вживати -e в обох місцях або в іншому місці, щоб не бентежити людей.
Джон

Ах, я отримую такий самий результат, що і ви, коли ви користуєтеся 14.04, який використовує gawk. Я отримую помилку, вказану в 16.04, яка, здається, використовує mawkзамість цього.
Старійшина Гік

Це одна з таких / тощо / альтернативних речей. / etc / alternative / awk -> / usr / bin / gawk для мене 16.04. Mawk встановлений, але не активний в / etc / alternative. На мій 17.04 gnome це вказує на awk. У моїй свіжій установці 17.10 це mawk. Після встановлення gawk посилання вказує на gawk, видалення gawk повертає його до mawk.
Джон

:-) Саме ці незначні відмінності між нібито подібними програмами, ймовірно, призвели до тверджень на кшталт "Менше більше"
Elder Geek

1

Тестували на роботу 14.04 та 16.04

Простий один вкладиш , який завжди повинен виробляти UUID з кореня /є

експортувати DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | вирізати -d '"' -f2`

Що ми робимо тут, - це прив'язування виводу mount, щоб відповідати символу кореня з пробілами з обох сторін, /щоб уникнути відповідності, коли /він використовується як символ розширення контуру, проклавши це через awk"on" як роздільник поля, щоб вивести тільки ім'я пристрою та присвоєння ТОЕ змінної середовища $ DRIVE, потім використання виводу по blkid $DRIVEтрубопроводу через розріз, використовуючи "як роздільник поля, і вибравши лише друге поле, яке викреслює все інше, залишаючи лише UUID.

Зауважте, що те, що належить після grep у наведеній вище команді, є насправді ' space/ space', а не '/', як показано.

Це має перевагу в тому, що він не вимагає, sudoі поверне відповідний результат незалежно від того, як встановлений привід.

Було б розумно переконатися, що ви не використовуєте змінну середовища $ DRIVE ні для чого іншого до спроби цього підходу echo $DRIVEповернути порожній рядок, якщо ви не використовуєте змінну.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.