ค้นหาระบบไฟล์ของพาร์ติชันที่ไม่ได้ต่อเชื่อมจากสคริปต์


16

ฉันกำลังเขียนการติดตั้งอัตโนมัติแบบกำหนดเองโดยใช้ AIF (Arch Installation Framework) และฉันต้องการค้นหาระบบไฟล์บนพาร์ติชันที่กำหนดพาร์ติชัน

จนถึงตอนนี้ฉันมีสิ่งนี้:

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แต่ดึงพาร์ติชันที่ฉันสนใจด้วยการเขียนสคริปต์ที่ฉลาดแล้วแยกวิเคราะห์ตามที่ฉันทำในสคริปต์แล้ว

มีวิธีที่ดีกว่าง่ายกว่านี้หรือไม่? ฉันมีพาร์ติชั่นที่ฉันสนใจอยู่แล้วและฉันต้องการค้นหาระบบไฟล์ของพวกเขาเท่านั้น (รวมถึงค้นหา swap ที่มี)


3
@ Mikel ไม่คำถามนั้นดูที่ระบบไฟล์ที่ติดตั้ง ในขณะที่คุณสามารถเมานต์ระบบไฟล์จากนั้นดูว่ามันติดตั้งแบบไหนช้าช้าไม่แข็งแกร่งไม่ทำงานเพื่อการสลับ แต่ใช้งานได้กับระบบไฟล์ที่เคอร์เนลกำลังทำงาน ...
Gilles 'หยุดชั่วร้าย'

คำตอบ:


16

ฉันคิดว่าฉันพบคำตอบ: blkid

จากหน้าคน:

โปรแกรม blkid เป็นอินเตอร์เฟสบรรทัดคำสั่งเพื่อทำงานกับไลบรารี libblkid (3) สามารถกำหนดประเภทของเนื้อหา (เช่นระบบไฟล์หรือสลับ) ที่อุปกรณ์บล็อกเก็บไว้และยังมีแอตทริบิวต์ (โทเค็น, NAME = ค่าคู่) จากเมทาดาทาเนื้อหา (เช่นฟิลด์ LABEL หรือ UUID)

เห็นได้ชัดว่ามันพิมพ์ชื่ออุปกรณ์พร้อมกับประเภทของระบบไฟล์ (พร้อมกับข้อมูลที่เป็นประโยชน์อื่น ๆ ) ในการรับรายการอุปกรณ์ทั้งหมดที่มีประเภท:

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

หากต้องการค้นหา/dev/sd*/อุปกรณ์ทั้งหมดเพียงเพิ่มใน grep:

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

จากนั้นเพียงแค่cutหรือawkรับสิ่งที่คุณต้องการ


11
blkid สามารถกรองสิ่งที่คุณต้องการได้ด้วยตัวเอง - ไม่จำเป็นต้องใช้เวทมนตร์ / grep / awk เวทมนตร์:blkid -s TYPE -o value /dev/sda3
Petr Uzel

@PetrUzel - ยอดเยี่ยม! นั่นคือสิ่งที่ฉันกำลังมองหา!
beatgammit

2
อย่าลืมวิ่งด้วยsudoถ้าคุณไม่รูท! อันนี้จับฉันออกเพราะblkidไม่พิมพ์ข้อความแสดงข้อผิดพลาดและออกด้วยรหัสสถานะ 0 หากไม่สามารถเข้าถึงอุปกรณ์บล็อก ...
Asfand Qazi

นอกจากนี้ไม่ค่อยจำเป็นต้องท่อไป grep เขียนได้อย่างหมดจดยิ่งขึ้นsedgrep foo | sed 's/pattern/repl/'sed '/foo/s/pattern/repl/'
William Pursell

9

file -s /path/to/device จะระบุระบบไฟล์บนดิสก์ / พาร์ติชัน / ชิ้น

A la:

[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)

อย่างน้อยบน Linux ก็ทำ


มีวิธีการที่เชื่อถือได้กรองประเภทระบบแฟ้มจากสคริปต์หรือไม่
beatgammit

ขึ้นอยู่กับว่าคุณจะพิจารณาชื่อเต็มของระบบไฟล์ที่กรองเพียงพอ| cut -d: -f2 | cut -d( -f1หรือไม่ มันไม่ได้สวยเหมือนblkidที่แน่นอน :)
Tim Kennedy

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}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.