私は組み込みLinux用に開発中です。パーティションを自動的に回復するbashスクリプトを作成したいと思います。
キーがマウントポイントであり、値がマウントされるデバイスである連想配列を宣言しました。
私の質問は、デバイスに異なるファイルシステムがある可能性があるため、fsck
正しいバージョンを選択する必要があることです。
各ファイルシステムには、fsck
などの独自のバリエーションがあります。fsck.vfat
fsck.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
ので、名前を変更しました。パーティションではなくマウントポイントです。)$mountpoint
part
mount -t "${type}"
文字列がある場合は文字列から型を抽出しfsck.TYPE
、存在しない場合はインストールしないなどの操作を実行できます。