Bir komut dosyasından sökülmemiş bölümün dosya sistemini bulma


16

AIF (Arch Installation Framework) kullanarak özel bir otomatik yükleme yazıyorum ve bölüm verilen bir bölümdeki dosya sistemini bulmam gerekiyor.

Şimdiye kadar bu var:

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}
}

Bu, tek bir sabit sürücüyle makinemde iyi çalıştı, ancak LiveCD üzerinde çalışan VM'imde çalışırken (açıkça) başarısız oldu (LiveCD başka bir sürücü olarak alındı, / dev / sr0).

Deneyebileceğim birkaç hack düşündüm:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • kullanın parted -mls, ancak akıllı komut dosyalarıyla önem verdiğim bölümü çekin, sonra zaten komut dosyasında yaptığım gibi ayrıştırın

Bunu yapmanın daha iyi ve daha basit bir yolu var mı? Zaten ilgilendiğim bölümler var ve sadece dosya sistemlerini bulmam gerekiyor (ayrıca kullanılabilir takas bul).


3
@Mikel Hayır, bu soru bağlı bir dosya sistemine bakar. Dosya sistemini bağlayabildiğiniz halde ne tür monte edildiğini görebilirsiniz, bu yavaş, sağlam değil, takas için çalışmıyor, sadece çalışan çekirdek tarafından desteklenen dosya sistemleri için çalışıyor ...
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


16

Sanırım cevabı buldum: blkid

Man sayfasından:

Blkid programı, libblkid (3) kitaplığıyla çalışmak için komut satırı arabirimidir. Bir blok aygıtının sahip olduğu içeriğin türünü (örneğin dosya sistemi veya takas) ve içerik meta verilerinden (ör. LABEL veya UUID alanları) ilişkilendirir (belirteçler, NAME = değer çiftleri).

Görünüşe göre, dosya adını dosya sistemi türüyle birlikte (diğer bazı yararlı bilgilerle birlikte) yazdırır. Türlerine sahip tüm cihazların bir listesini almak için:

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

Tüm /dev/sd*/cihazları bulmak için bir grep ekleyin:

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

O zaman sadece cutveya awkihtiyacınız olanı elde etmek için.


11
blkid ihtiyacınız olanı kendi başına filtreleyebilir - sed / grep / awk magic'e gerek yok:blkid -s TYPE -o value /dev/sda3
Petr Uzel

@PetrUzel - Harika! Tam da aradığım şey buydu!
Temmuz'da beatgammit

2
İle koşmayı unutma sudoKök değilseniz ! Bu beni yakaladı çünkü blkidherhangi bir hata mesajı yazdırmıyor ve blok cihazlara erişemiyorsa durum kodu 0 ile çıkıyor ...
Asfand Qazi

Nadiren boruya ihtiyaç var grep etmek sed. grep foo | sed 's/pattern/repl/'daha temiz yazılmışsed '/foo/s/pattern/repl/'
William Pursell

9

file -s /path/to/device disk / bölüm / dilimdeki dosya sistemini tanımlar.

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)

en azından Linux'ta öyle.


Dosya sistemi türünü bir komut dosyasından güvenilir bir şekilde filtrelemenin bir yolu var mı?
beatgammit

dosya sisteminin tam adının, olduğu gibi bir | cut -d: -f2 | cut -d( -f1şey gibi yeterince filtrelenip değerlendirilmediğine bağlıdır . O kadar güzel değil blkid, kesin. :)
Tim Kennedy

2

Yalnızca blok cihazın TYPE etiketini gösterin ve yalnızca değerini girin:

blkid -s TYPE -o value "$device"

Misal:

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

0

Birçok dosya sistemiyle çalışan ve yapıları hasar görmüş dosya sistemlerinde bile çalışma avantajına sahip ikincil bir seçenek testdisk . (Yüklemek için çalıştırabilirsiniz sudo apt install testdisk.)

Yalnızca şu şekilde dosya sistemi türünü döndürmek için komut dosyasını yazın:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.