스크립트에서 마운트 해제된 파티션의 파일 시스템 찾기

스크립트에서 마운트 해제된 파티션의 파일 시스템 찾기

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

이것은 하드 드라이브가 하나만 있는 내 컴퓨터에서는 제대로 작동했지만 LiveCD에서 실행되는 VM에서 실행될 때 (분명히) 실패했습니다(LiveCD가 다른 드라이브, /dev/sr0으로 선택되었습니다).

저는 시도해 볼 수 있는 몇 가지 해킹 방법을 생각해 보았습니다.

  • mount $partition; grep $partition /etc/mtab | awk ...
  • 를 사용 parted -mls하고 영리한 스크립팅을 사용하여 관심 있는 파티션을 꺼낸 다음 스크립트에서 이미 수행한 대로 구문 분석합니다.

이 작업을 수행하는 더 좋고 간단한 방법이 있습니까? 관심 있는 파티션이 이미 있으므로 해당 파일 시스템(및 사용 가능한 스왑)만 찾으면 됩니다.

답변1

나는 답을 찾은 것 같아요:blkid

매뉴얼 페이지에서:

blkid 프로그램은 libblkid(3) 라이브러리 작업을 위한 명령줄 인터페이스입니다. 이는 블록 장치가 보유하는 콘텐츠 유형(예: 파일 시스템 또는 스왑)과 콘텐츠 메타데이터(예: LABEL 또는 UUID 필드)의 속성(토큰, NAME=값 쌍)을 결정할 수 있습니다.

분명히 파일 시스템 유형(다른 유용한 정보와 함께)과 함께 장치 이름을 인쇄합니다. 해당 유형과 함께 모든 장치 목록을 얻으려면 다음을 수행하십시오.

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

모든 장치를 찾으려면 /dev/sd*/grep에 추가하면 됩니다.

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

그런 다음 필요한 것을 얻으려면 cut또는 .awk

답변2

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)

적어도 Linux에서는 그렇습니다.

답변3

블록 장치의 TYPE 태그만 표시하고 해당 값만 출력합니다.

blkid -s TYPE -o value "$device"

예:

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

답변4

많은 파일 시스템에서 작동하고 구조가 손상된 파일 시스템에서도 작동할 수 있는 이점이 있는 보조 옵션은 입니다 testdisk. ( sudo apt install testdiskDebian 기반 시스템에서는 실행하여 설치할 수 있습니다.)

다음과 같이 파일 시스템 유형만 반환하도록 스크립트를 작성하세요.

$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'

관련 정보