Tìm hệ thống tập tin của một phân vùng chưa được đếm từ tập lệnh


16

Tôi đang viết một cài đặt tự động tùy chỉnh bằng AIF (Khung cài đặt Arch) và tôi cần tìm hệ thống tệp trên một phân vùng được cung cấp một phân vùng.

Cho đến nay tôi có điều này:

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

Điều này hoạt động tốt trên máy của tôi chỉ với một ổ cứng, nhưng nó đã thất bại (rõ ràng) khi chạy trong VM của tôi chạy trên LiveCD (LiveCD đang được chọn là một ổ đĩa khác, / dev / sr0).

Tôi đã nghĩ về một vài hack tôi có thể thử:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • sử dụng parted -mls, nhưng rút ra phân vùng tôi quan tâm với kịch bản thông minh, sau đó phân tích cú pháp như tôi đã làm trong scriptt

Có cách nào tốt hơn, đơn giản hơn để làm điều này? Tôi đã có các phân vùng mà tôi quan tâm và tôi chỉ cần tìm hệ thống tập tin của họ (cũng như tìm kiếm trao đổi có sẵn).


3
@Mikel Không, câu hỏi đó nhìn vào một hệ thống tập tin được gắn kết. Mặc dù bạn có thể gắn kết hệ thống tệp sau đó xem loại được gắn kết là gì, nhưng nó chậm, không mạnh mẽ, không hoạt động để trao đổi, chỉ hoạt động đối với các hệ thống tệp được hỗ trợ bởi hạt nhân đang chạy ...
Gilles 'ngừng trở nên xấu xa'

Câu trả lời:


16

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời: blkid

Từ trang người đàn ông:

Chương trình blkid là giao diện dòng lệnh để làm việc với thư viện libblkid (3). Nó có thể xác định loại nội dung (ví dụ: hệ thống tệp hoặc trao đổi) mà một thiết bị khối giữ và cả các thuộc tính (mã thông báo, cặp NAME = giá trị) từ siêu dữ liệu nội dung (ví dụ: trường LABEL hoặc UUID).

Rõ ràng nó in tên thiết bị cùng với loại hệ thống tập tin (cùng với một số thông tin hữu ích khác). Để có danh sách tất cả các thiết bị với các loại của chúng:

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

Để tìm tất cả các /dev/sd*/thiết bị, chỉ cần thêm một grep:

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

Sau đó, chỉ cuthoặc awkđể có được những gì bạn cần.


11
blkid có thể tự lọc những gì bạn cần - không cần phép thuật sed / grep / awk:blkid -s TYPE -o value /dev/sda3
Petr Uzel

@PetrUzel - Tuyệt vời! Đó chính xác là những gì tôi đang tìm kiếm!
beatgammit

2
Hãy nhớ chạy với sudonếu bạn không root! Cái này khiến tôi phát hiện ra vì blkidkhông in bất kỳ thông báo lỗi nào và thoát với mã trạng thái 0 nếu nó không thể truy cập các thiết bị chặn ...
Asfand Qazi

Ít khi có nhu cầu dẫn grepđến sed. grep foo | sed 's/pattern/repl/'được viết sạch sẽ hơnsed '/foo/s/pattern/repl/'
William Pursell

9

file -s /path/to/device sẽ xác định hệ thống tập tin trên đĩa / phân vùng / lát.

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)

ít nhất, trên Linux nó làm.


Có cách nào để lọc loại hệ thống tập tin khỏi tập lệnh một cách đáng tin cậy không?
beatgammit

phụ thuộc vào việc bạn xem xét tên đầy đủ của hệ thống tập tin được lọc đủ, như trong | cut -d: -f2 | cut -d( -f1hoặc một cái gì đó. Nó không đẹp như blkid, chắc chắn là vậy. :)
Tim Kennedy

2

Chỉ hiển thị thẻ TYPE của thiết bị khối và chỉ xuất giá trị của nó:

blkid -s TYPE -o value "$device"

Thí dụ:

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

0

Một tùy chọn thứ cấp hoạt động với nhiều hệ thống tệp và có lợi ích làm việc ngay cả với các hệ thống tệp có cấu trúc bị hỏng là testdisk. (Bạn có thể chạy sudo apt install testdiskđể cài đặt nó.)

Script nó chỉ trả về kiểu hệ thống tập tin như thế này:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.