Temukan sistem file dari partisi yang tidak di-mount dari skrip

16

Saya sedang menulis instalasi otomatis khusus menggunakan AIF (Arch Installation Framework), dan saya perlu mencari sistem file pada partisi yang diberi partisi.

Sejauh ini saya punya ini:

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

Ini bekerja dengan baik pada mesin saya dengan hanya satu hard drive, tetapi gagal (jelas) ketika berjalan di VM saya berjalan pada LiveCD (LiveCD diambil sebagai drive lain, / dev / sr0).

Saya telah memikirkan beberapa peretasan yang dapat saya coba:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • gunakan parted -mls, tapi cabut partisi yang saya pedulikan dengan scripting yang pintar, lalu uraikan seperti yang sudah saya lakukan di script

Apakah ada cara yang lebih baik dan lebih sederhana untuk melakukan ini? Saya sudah memiliki partisi yang saya minati, dan saya hanya perlu menemukan filesystem mereka (dan juga menemukan swap yang tersedia).

hajar
sumber
3
@Mikel Tidak, pertanyaan itu terlihat pada sistem file yang di-mount. Meskipun Anda dapat me-mount filesystem kemudian melihat tipe apa itu di-mount, ini lambat, tidak kuat, tidak berfungsi untuk swap, hanya bekerja untuk filesystem yang didukung oleh kernel yang berjalan ...
Gilles 'SO-stop being evil'

Jawaban:

16

Saya pikir saya menemukan jawabannya: blkid

Dari halaman manual:

Program blkid adalah antarmuka baris perintah untuk bekerja dengan pustaka libblkid (3). Itu dapat menentukan jenis konten (misalnya sistem file atau swap) yang dimiliki oleh perangkat blok, dan juga atribut (token, NAME = pasangan nilai) dari metadata konten (misalnya bidang LABEL atau UUID).

Tampaknya ia mencetak nama perangkat bersama dengan tipe sistem file (bersama dengan beberapa informasi berguna lainnya). Untuk mendapatkan daftar semua perangkat dengan tipenya:

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

Untuk menemukan semua /dev/sd*/perangkat, cukup tambahkan grep:

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

Kemudian hanya cutatau awkuntuk mendapatkan apa yang Anda butuhkan.

hajar
sumber
11
blkid dapat memfilter apa yang Anda butuhkan sendiri - tidak perlu sihir sed / grep / awk:blkid -s TYPE -o value /dev/sda3
Petr Uzel
@PetrUzel - Luar Biasa! Itulah tepatnya yang saya cari!
beatgammit
2
Ingatlah untuk menjalankannya sudojika Anda tidak root! Yang ini menarik saya karena blkidtidak mencetak pesan kesalahan dan keluar dengan kode status 0 jika tidak dapat mengakses perangkat blok ...
Asfand Qazi
Jarang ada kebutuhan untuk pipa grepke sed. grep foo | sed 's/pattern/repl/'ditulis lebih rapised '/foo/s/pattern/repl/'
William Pursell
9

file -s /path/to/device akan mengidentifikasi sistem file pada disk / partisi / slice.

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)

setidaknya, di Linux itu.

Tim Kennedy
sumber
Apakah ada cara untuk menyaring tipe sistem file dari skrip secara andal?
beatgammit
tergantung pada apakah Anda menganggap nama lengkap sistem file yang cukup difilter, seperti dalam | cut -d: -f2 | cut -d( -f1atau sesuatu. Ini tidak secantik blkid, itu sudah pasti. :)
Tim Kennedy
2

Tampilkan hanya tag TYPE perangkat blok, dan hanya tampilkan nilainya:

blkid -s TYPE -o value "$device"

Contoh:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs
Tom Hale
sumber
0

Opsi sekunder yang bekerja dengan banyak filesystem dan memiliki manfaat bekerja bahkan dengan filesystem yang memiliki struktur yang rusak testdisk. (Anda dapat menjalankan sudo apt install testdiskuntuk menginstalnya.)

Script untuk mengembalikan hanya tipe sistem file seperti ini:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Pasang kembali Monica
sumber