조회 테이블 또는 데이터 구조를 생성하고 Bash에서 반복하는 방법

조회 테이블 또는 데이터 구조를 생성하고 Bash에서 반복하는 방법

저는 임베디드 리눅스용으로 개발 중입니다. 파티션을 자동으로 복구하는 bash 스크립트를 작성하고 싶습니다.

키가 마운트 지점이고 값이 마운트할 장치인 연관 배열을 선언했습니다.

이제 내 질문은 장치에 다른 파일 시스템이 있을 수 있으므로 fsck올바른 버전을 선택해야 한다는 것입니다.

각 파일 시스템에는 및 fsck와 같은 고유한 변형이 있습니다 .fsck.vfatfsck.ext4

올바른 변형이 호출되도록 어떻게든 이것을 루프로 가져와야 합니다. 불행하게도 주요 변종은 fsck내 구성에서 파일 시스템의 자동 복구 또는 감지 기능을 제공하지 않습니다.

그래서 진짜 질문은 여기서 조회 테이블을 갖는 방법입니다.

declare -A arrPartitionsToCheck=(
[/run/media/my-backup]="/dev/sda1" # vfat
[/run/media/my-data]="/dev/sdb1"   # ext4
)

for part in "${!arrPartitionsToCheck[@]}"; do

    # Unmount
    # umount /dev/sda1
    umount "${arrPartitionsToCheck[$part]}"

    # Select the right variant of FSCK and repair automatically
    fsck.vfat -a "${arrPartitionsToCheck[$part]}"

    # Mont Again! For example
    # mount /dev/sda1 /run/media/my-backups
    mount "${arrPartitionsToCheck[$part]}" "$part"    

done

답변1

에서 파일 시스템 유형을 얻을 수 있습니다 lsblk. 예를 들어 내 컴퓨터에서는 다음과 같습니다.

$ lsblk -o PATH,FSTYPE
PATH             FSTYPE
/dev/mapper/home ext4
/dev/nvme0n1     
/dev/nvme0n1p1   vfat
/dev/nvme0n1p2   
/dev/nvme0n1p3   BitLocker
/dev/nvme0n1p4   ntfs
/dev/nvme0n1p5   ext4
/dev/nvme0n1p6   crypto_LUKS
/dev/nvme0n1p7   swap

따라서 이를 염두에 두고 다음과 같은 작업을 수행할 수 있습니다(데이터를 올바르게 가져올 값이 없는 경우 값을 추가하기 위해 후처리를 수행해야 했습니다).

#!/bin/bash

declare -A arrPartitionsToCheck=(
  [/run/media/my-backup]="/dev/sda1" # vfat
  [/run/media/my-data]="/dev/sdb1"   # ext4
)

## store the file system types
declare -A fileSystems="( $(lsblk -o PATH,FSTYPE | awk 'NF==1{$2="."}1' ) )"

for part in "${!arrPartitionsToCheck[@]}"; do

  device=${arrPartitionsToCheck[$part]}
  fstype=${fileSystems[$device]}

  # Unmount
  # umount /dev/sda1
  umount "${arrPartitionsToCheck[$part]}"
  
  # Select the right variant of FSCK and repair automatically
  fsck."$fstype" -a "${arrPartitionsToCheck[$part]}"
  
  # Mont Again! For example
  # mount /dev/sda1 /run/media/my-backups
  mount "${arrPartitionsToCheck[$part]}" "$part"    

done

답변2

Bash는 파일 시스템 유형을 추측할 수 없습니다. 그리고 마운트 자체에 대해서는 실제로 질문할 수 없습니다. 검사의 전체 목적에는 상황이 약간 손상되고 파일 시스템이 자동으로 마운트되지 않는 상황도 포함되어 있다고 생각하기 때문입니다.

fsck따라서 파일 시스템 자체(또는 자체 사용/남용)를 감지할 수 있는 본격적인 파일 시스템을 설치하지 않고 file이 정보를 직접 입력해야 합니다. 블록 장치와 해당 마운트 지점을 수동으로 정의했으므로 이는 실제로 문제가 되지 않습니다. (왜 단순히 의존 /etc/fstab하고 달리지 않는지 궁금합니다 fsck -A.)

파일 시스템에 대한 지식을 연관 배열에 통합할 수 있습니다.

declare -A arrPartitionsToCheck=(
[/run/media/my-backup]="fsck.vfat:/dev/sda1"
[/run/media/my-data]="fsck.ext4:/dev/sdb1"
[swap]="true:/dev/sdb9" #swap, don't check
)

반복해서 추출합니다.

for mountpoint in "${!arrPartitionsToCheck[@]}"; do
    spec="${arrPartitionsToCheck[$mountpoint]}"
    tool="${spec%:*}"
    device="${spec#*:}"
    # Unmount
    # umount /dev/sda1
    umount "${device}"

    # Select the right variant of FSCK and repair automatically
    "${tool}" -a "${device}"

    # Mount Again! For example
    # mount /dev/sda1 /run/media/my-backups
    mount "${device}" "${mountpoint}"
done

(정말 오해의 소지 가 있기 $part때문에 이름을 바꿨습니다 . 파티션이 아니라 마운트 지점입니다.)$mountpointpart

mount -t "${type}"문자열이 있으면 문자열에서 유형을 추출 fsck.TYPE하고 존재하지 않으면 설치하지 않는 등의 작업을 수행할 수 있습니다 .

관련 정보