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

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

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

적어도 리눅스에서는요.

답변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}'

관련 정보