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

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하지만 영리한 스크립팅으로 관심있는 파티션을 가져온 다음 이미 scriptt에서와 같이 구문 분석하십시오.

더 좋고 간단한 방법이 있습니까? 이미 관심있는 파티션이 있으며 파일 시스템 (및 사용 가능한 스왑 찾기) 만 찾으면됩니다.



답변

나는 대답을 찾았다 고 생각한다. 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필요한 것을 얻으십시오.


답변

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)

적어도 리눅스에서는 그렇지 않습니다.


답변

블록 장치의 TYPE 태그 만 표시하고 해당 값만 출력하십시오.

blkid -s TYPE -o value "$device"

예:

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


답변

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

다음과 같이 파일 시스템 유형 만 리턴하도록 스크립트하십시오.

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


답변