स्क्रिप्ट से UUID / फाइल सिस्टम प्राप्त करें


11

मैं उस वॉल्यूम का UUID कैसे प्राप्त कर सकता हूं जिसमें /फ़ाइल सिस्टम है? मुझे आज तक जो सबसे अच्छी चीज मिली है, वह है blkid -o list। लेकिन यह आउटपुट मानवीय पठनीय और कठिन है। शायद एक बेहतर तरीका है?

मुझे सिस्टम-विशिष्ट टेम्पलेट्स के साथ कॉन्फ़िगरेशन प्रबंधन को पैरामीटर करने की आवश्यकता है।

blkidउन लोगों के लिए गोच के बारे में ध्यान दें , जो भविष्य में मेरे प्रश्न के परिणामों का पुन: उपयोग कर सकते हैं: blkidपिछले रन के कैश परिणाम /etc/blkid.tab। इसका मतलब है कि blkidपहली बार गैर-रूट उपयोगकर्ता के रूप में चलने से कोई डेटा वापस नहीं आएगा। साथ ही, blkidरूट रन के बाद गैर-रूट उपयोगकर्ता के रूप में चल रहा है बासी (संभवतः गलत) डेटा लौटाएगा।


अपने स्वयं के सिस्टम पर, मैं सभी विभाजन के लिए मानव पठनीय, अद्वितीय लेबल प्रदान करता हूं। फिर मैं उनके लेबल का उपयोग करके उनके बारे में लगभग कुछ भी पता लगा सकता हूं और /dev/disk/by-label... यह उन विभाजनों के लिए भी काम करता है जो घुड़सवार नहीं हैं। यह स्क्रिप्ट लिखने में सक्षम होने का लाभ है जो rsync जैसे रूट से रूट-बाक जैसी चीजें करते हैं जो 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

आप lsblkUUID को आउटपुट करने के लिए कमांड का उपयोग कर सकते हैं , लेकिन आपको विभाजन के डिवाइस नाम (जैसे / dev / sda2) की आवश्यकता है। आप इसे dfकमांड का उपयोग करके और आउटपुट को ट्रिम करके प्राप्त कर सकते हैं । डिवाइस को नाम देने के लिए कमांड प्रतिस्थापन का उपयोग करें lsblk। ऐसा प्रतीत होता है कि आपको UUID का उपयोग करने के लिए sudo की आवश्यकता है, हालाँकि lsblk के सामान्य आउटपुट को इसकी आवश्यकता नहीं है:

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

2
यह मेरे लिए sudo16.04 पर काम करता है ।
एलिया कागन

केवल यदि आप (या कुछ स्क्रिप्ट) ने इस कमांड को पहले रूट के रूप में चलाया है। इसके अलावा, ouput इस मामले में बासी (कैश से) हो सकता है
दिमित्रिअसन

@Dmitriusan मैंने इसे एक 14.04 सिस्टम पर चलाया, जो रूट द्वारा कभी भी नहीं चला lsblkया नहीं blkidचला और इसने पूरी तरह से काम किया। क्या आप जानते हैं कि इस आदेश के साथ कैशिंग मुद्दा क्यों होगा और रोवो द्वारा पोस्ट किए गए संस्करण के साथ नहीं? क्या कच्चा आउटपुट किसी तरह कैचिंग को दरकिनार करता है?
आर्कटिक

मुझे लगता है कि उपकरणों की यूयूआईडी तक पहुंचने वाली किसी भी कमांड को रूट एक्सेस (रोवो द्वारा पोस्ट किए गए संस्करण सहित) की आवश्यकता होगी। Lsblk के बारे में, यहाँ एक संबंधित सवाल यह है कि unix.stackexchange.com/questions/210889/... (पहले उत्तर देखें)
Dmitriusan

मैं मानता हूं कि सूडो आवश्यक है, लेकिन यह बताने के लिए कुछ भी नहीं मिल सकता है कि lsblk कैशिंग पर निर्भर करता है। यहां तक ​​कि अगर मैं blkidरूट के रूप में चलाता हूं , तो कैश फ़ाइल को बनाने पर /dev/.blkid.tab, गैर-सूडो उपयोग lsblkयूयूआईडी कॉलम से कुछ भी नहीं दिखाएगा। मुझे नहीं लगता कि बासी उत्पादन का कोई खतरा है।
आर्कटिक

4

सबसे अच्छा समाधान मैं साथ आने में कामयाब रहा

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

गैर-इष्टतम जैसा लगता है, लेकिन काम करता है।

नोट: [[: अंतरिक्ष:]] का अर्थ हैSpace


यह मेरे लिए काम करता है लेकिन साथ sudo
2340 पर 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 के साथ या बिना काम करता है। -मैं जाग के लिए आदमी पृष्ठ में प्रलेखित है। मैंने हमेशा इसे स्क्रिप्ट में उपयोग किया है और मुझे आश्चर्य हुआ कि इसके बिना ठीक काम किया :) मुझे लगता है कि यह एक पुरानी यूनिक्स आदत है। लेकिन, मुझे अपने उपयोग और उपयोग में होना चाहिए था, दोनों ही जगहों पर या न तो जगह थी और न ही लोगों को भ्रमित करने के लिए।
जॉन

आह, मुझे वही परिणाम मिलता है जो 14.04 से कम है, जो उपयोग करता है gawk। मुझे 16.04 के तहत निर्दिष्ट त्रुटि मिलती है जो mawkइसके बजाय उपयोग करना प्रतीत होता है ।
एल्डर गीक

यह उन / आदि / वैकल्पिक चीजों में से एक है। / etc / विकल्प / awk -> / usr / bin / gawk मेरे लिए मेरे 16.04 पर। मॉक स्थापित है, लेकिन / etc / विकल्प में सक्रिय नहीं है। मेरे 17.04 ग्नोम पर यह जागने की ओर इशारा करता है। मेरी ताजा स्थापना पर 17.10 यह mawk है। Gawk के लिए लिंक पॉइंट्स को स्थापित करने के बाद, gawk को अनइंस्टॉल करके इसे mawk पर लौटा देता है।
जॉन

:-) यह कथित तौर पर समान कार्यक्रमों के बीच मामूली अंतर है जो संभवतः "कम है" जैसे बयानों का कारण बना है
एल्डर गीक

1

14.04 और 16.04 को काम करने के लिए परीक्षण किया गया

एक सरल एक लाइनर कि हमेशा एक रूट की UUID का उत्पादन करना चाहिए /है

निर्यात DRIVE = $ (आरोह (grep '/' | awk -F "पर" {{$ $ 1} '); blkid $ DRIVE) cut -d '' '-f2 `

हम यहाँ क्या कर रहे हैं, माउंट सिम्पल के आउटपुट को दोनों तरफ के स्थानों के साथ रूट सिंबल /से मिलान करने के लिए तैयार कर रहे हैं जब /एक पथ विस्तार प्रतीक के रूप में उपयोग करने से बचने के लिए , पाइपिंग के माध्यम से awk"ऑन" का उपयोग करके फ़ील्ड आउटपुट के रूप में केवल आउटपुट के लिए। उपकरण का नाम और पर्यावरण चर $ DRIVE को देने के लिए, फिर एक क्षेत्र विभाजक blkid $DRIVEके "रूप में कट के माध्यम से पाइप के आउटपुट का उपयोग करके और केवल दूसरे क्षेत्र का चयन करना जो बाकी सब कुछ छीनता है, केवल यूयूआईडी को छोड़कर।

ध्यान दें कि उपरोक्त कमांड में grep के बाद जो है वह वास्तव में ' space/ space' है और '/' के रूप में प्रकट नहीं होता है।

इसके लिए आवश्यकता है कि लाभ न हो sudoऔर ड्राइव कैसे चलाया जाता है, इसकी परवाह किए बिना उपयुक्त परिणाम लौटाएगा।

यह समझदारी होगी कि echo $DRIVEयदि आप वैरिएबल का उपयोग नहीं कर रहे हैं तो इस दृष्टिकोण का प्रयास करने से पहले आप $ DRIVE पर्यावरण चर का उपयोग नहीं कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.