ルックアップテーブルまたはデータ構造を作成してBashで繰り返す方法

ルックアップテーブルまたはデータ構造を作成してBashで繰り返す方法

私は組み込みLinux用に開発中です。パーティションを自動的に回復する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、存在しない場合はインストールしないなどの操作を実行できます。

関連情報