स्क्रिप्ट से अनमाउंट किए गए विभाजन का फाइल सिस्टम खोजें


16

मैं एआईएफ (आर्क इंस्टॉलेशन फ्रेमवर्क) का उपयोग करके एक कस्टम स्वचालित इंस्टॉल लिख रहा हूं, और मुझे एक विभाजन दिए गए विभाजन पर फाइल सिस्टम खोजने की आवश्यकता है।

अब तक मेरे पास यह है:

grok_partitions () {
    local partitions=
    for label in `ls /dev/disk/by-label | grep "Arch"`
    do
        if [ $label == "Arch" ]
        then
            mount_point="/"
        else
            IFS="-" read base mount <<< "${label}"
            mount_point="/${mount}"
        fi

        local partition=$(readlink -f /dev/disk/by-label/${label})
        local part_no=$(echo ${partition} | grep -Po '\d+')
        local fs=$(parted -mls | grep "^${part_no}" | cut -d: -f5)
        partitions+="${partition} raw ${label} ${fs};yes;${mount_point};target;no_opts;${label};no_params\n"
    done

    # do the swap
    if [ -e /dev/disk/by-label/swap ]
    then
        local partition=$(readlink -f /dev/disk/by-label/swap)
        partitions+="$partition raw swap swap;yes;no_mountpoint;target;no_opts;swap;no_params"
    else
        # if there's no labeled swap, use the first one we find
        local partition=$(fdisk -l | grep -m1 swap | awk '{ print $1 }')
        if [ ! -e $partition ]
        then
            echo "No swap detected. Giving up."
            exit 1
        fi
        partitions+="$partition raw no_label swap;yes;no_mountpoint;target;no_opts;no_label;no_params"
    fi

    echo -n ${partitions}
}

यह केवल एक हार्ड ड्राइव के साथ मेरी मशीन पर ठीक काम करता था, लेकिन यह (जाहिर है) विफल रहा जब मेरे VM में एक LiveCD पर चल रहा था (LiveCD को दूसरी ड्राइव, / dev / sr0 के रूप में उठाया जा रहा था)।

मुझे लगता है मैं कोशिश कर सकता हैक के एक जोड़े के बारे में सोचा है:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • उपयोग करें parted -mls, लेकिन चतुर स्क्रिप्टिंग के साथ मेरे द्वारा किए गए विभाजन को बाहर खींचो, फिर मुझे पहले से ही स्क्रिप्ट में क्या करना है

क्या ऐसा करने का एक बेहतर, सरल तरीका है? मेरे पास पहले से ही मेरे द्वारा रुचि वाले विभाजन हैं, और मुझे केवल उनके फाइल सिस्टम (साथ ही उपलब्ध स्वैप) को खोजने की आवश्यकता है।


3
@ मिकेल नहीं, यह प्रश्न एक घुड़सवार फाइल सिस्टम पर दिखता है। जब आप फाइलसिस्टम को माउंट कर सकते हैं, तब देख सकते हैं कि यह किस प्रकार का है, यह धीमा है, मजबूत नहीं है, स्वैप के लिए काम नहीं करता है, केवल चल रहे कर्नेल द्वारा समर्थित फाइलसिस्टम के लिए काम करता है ...
गाइल्स का SO- स्टॉप बुराई होना '

जवाबों:


16

मुझे लगता है कि मुझे जवाब मिल गया: blkid

मैन पेज से:

ब्लेकिड प्रोग्राम लिब्बलकिड (3) लाइब्रेरी के साथ काम करने के लिए कमांड-लाइन इंटरफ़ेस है। यह सामग्री के प्रकार (जैसे कि फाइलसिस्टम या स्वैप) को निर्धारित कर सकता है जो एक ब्लॉक डिवाइस रखता है, और सामग्री मेटाडेटा (जैसे LABEL या UUID फ़ील्ड) से विशेषताओं (टोकन, NAME = मान जोड़े) को भी निर्धारित करता है।

जाहिरा तौर पर यह फ़ाइल नाम प्रकार (कुछ अन्य उपयोगी जानकारी के साथ) के साथ डिवाइस के नाम को प्रिंट करता है। अपने प्रकार के साथ सभी उपकरणों की सूची प्राप्त करने के लिए:

blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

सभी /dev/sd*/उपकरणों को खोजने के लिए , बस एक grep में जोड़ें:

blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

फिर बस cutया awkआपको जो चाहिए वो मिलेगा।


11
ब्लकिड फ़िल्टर कर सकता है जो आपको अपनी ज़रूरत है - sed / grep / awk जादू की कोई ज़रूरत नहीं:blkid -s TYPE -o value /dev/sda3
पेट्र उज़ेल

@PrrUzel - बहुत बढ़िया! बिलकुल वही, जिसकी मुझे तलाश थी!
बीटगैमिट

2
sudoयदि आप जड़ नहीं हैं तो साथ चलाना याद रखें ! इसने मुझे बाहर निकाल दिया क्योंकि blkidकोई त्रुटि संदेश नहीं छपता है और स्टेटस कोड 0 से बाहर निकलता है अगर यह ब्लॉक डिवाइसेस तक नहीं पहुँच सकता ...
Asfand Qazi

वहाँ शायद ही कभी पाइप grepकरने की आवश्यकता है sedgrep foo | sed 's/pattern/repl/'अधिक स्पष्ट रूप से लिखा हैsed '/foo/s/pattern/repl/'
विलियम पर्ससेल

9

file -s /path/to/device एक डिस्क / विभाजन / स्लाइस पर फाइल सिस्टम की पहचान करेगा।

एक ला:

[root@node2 ~]# file -s /dev/mapper/VolGroup00-LogVol00
/dev/mapper/VolGroup00-LogVol00: Linux rev 1.0 ext3 filesystem data (needs journa recovery) (large files)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv1 
/dev/mapper/coraid--pool-coraid--lv1: Linux GFS2 Filesystem (blocksize 4096, lockproto lock_dlm)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv2 
/dev/mapper/coraid--pool-coraid--lv2: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)

कम से कम, लिनक्स पर यह करता है।


क्या किसी स्क्रिप्ट से फ़ाइल सिस्टम प्रकार को विश्वसनीय रूप से फ़िल्टर करने का कोई तरीका है?

इस बात पर निर्भर करता है कि आप फाइल किए गए फ़ाइल सिस्टम के पूर्ण नाम पर विचार करते हैं, जैसे कि | cut -d: -f2 | cut -d( -f1या कुछ और। यह उतना सुंदर नहीं है blkid, यह पक्का है। :)
टिम कैनेडी

2

केवल ब्लॉक डिवाइस का TYPE टैग दिखाएं, और केवल इसका मूल्य आउटपुट करें:

blkid -s TYPE -o value "$device"

उदाहरण:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs

0

एक माध्यमिक विकल्प जो कई फाइल सिस्टम के साथ काम करता है और इसमें क्षतिग्रस्त सिस्टम को फाइल करने वाले सिस्टम के साथ भी काम करने का लाभ है testdisk। (आप sudo apt install testdiskइसे स्थापित करने के लिए चला सकते हैं ।)

स्क्रिप्ट को केवल इस तरह से फाइलसिस्टम वापस करने के लिए:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.