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


16

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에서와 같이 구문 분석하십시오.

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


3
@Mikel 아니요.이 질문은 마운트 된 파일 시스템을 살펴 봅니다. 당신은 파일 시스템을 마운트 할 수 있지만를 입력 한 다음 그것의이 같은 장착을 확인,이 강력하지, 느린 만 ... 실행중인 커널에서 지원하는 파일 시스템 작동, 스왑 작동하지 않습니다
질 'SO-정지되는 악'

답변:


16

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


11
blkid는 sed / grep / awk 마술이 필요없이 독자적으로 필요한 것을 필터링 할 수 있습니다 :blkid -s TYPE -o value /dev/sda3
Petr Uzel

@PetrUzel-굉장합니다! 바로 내가 찾던 것입니다!
beatgammit

2
sudo당신이 뿌리가 아닌 경우 에 실행하는 것을 잊지 마십시오! blkid블록 장치에 액세스 할 수없는 경우 오류 메시지를 인쇄하지 않고 상태 코드 0으로 종료 되기 때문에이 문제 가 발생했습니다.
Asfand Qazi

에 파이프 grep할 필요는 거의 없습니다 sed. grep foo | sed 's/pattern/repl/'더 명확하게 작성sed '/foo/s/pattern/repl/'
윌리엄 Pursell에게

9

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)

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


스크립트에서 파일 시스템 유형을 안정적으로 필터링하는 방법이 있습니까?
beatgammit

파일 시스템의 전체 이름을 필터링 한 것으로 간주하는지 여부에 따라 달라집니다 | cut -d: -f2 | cut -d( -f1. 별로 예쁘지 않습니다 blkid. :)
팀 케네디

2

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

blkid -s TYPE -o value "$device"

예:

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

0

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

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

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.