저는 임베디드 리눅스용으로 개발 중입니다. 파티션을 자동으로 복구하는 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
하고 존재하지 않으면 설치하지 않는 등의 작업을 수행할 수 있습니다 .