Tôi có một hệ thống tập tin ext4 gần đây đã phát triển một số thành phần xấu. Chạy fsck.ext4 -c
tìm và nhớ các khối xấu. Làm cách nào tôi có thể tìm thấy tệp nào (nếu có) bao gồm các khối xấu này để tôi có thể khôi phục chúng từ bản sao lưu?
Tôi có một hệ thống tập tin ext4 gần đây đã phát triển một số thành phần xấu. Chạy fsck.ext4 -c
tìm và nhớ các khối xấu. Làm cách nào tôi có thể tìm thấy tệp nào (nếu có) bao gồm các khối xấu này để tôi có thể khôi phục chúng từ bản sao lưu?
Câu trả lời:
Với sự kết hợp của dumpe2fs
và debugfs
, được bao gồm trong e2fsprogs
gói cùngfsck.ext*
.
Bạn phải sử dụng đầu ra của một lệnh làm đối số của lệnh tiếp theo.
Các công cụ này tự động phát hiện kích thước khối hệ thống tập tin, vì vậy nó phù hợp và an toàn hơn so với badblocks
gọi trực tiếp .
In các khối xấu đã đăng ký của hệ thống tập tin:
# dumpe2fs -b DEVNAME
In các nút sử dụng danh sách khối đã cho:
# debugfs -R "icheck BLOCK ..." DEVNAME
In tên đường dẫn đến danh sách inode đã cho:
# debugfs -R "ncheck INODE ..." DEVNAME
debugfs
cũng có một vỏ tương tác và -f cmd_file
tùy chọn, nhưng chúng không mạnh mẽ hay hữu ích cho trường hợp này.
Tùy chọn -R cho phép nhiều tập lệnh tự động như thế này:
#!/bin/sh
# Finds files affected by bad blocks on ext* filesystems.
# Valid only for ext* filesystems with bad blocks registered with
# fsck -c [-c] [-k] or -l|-L options.
# Can be extremely slow on damaged storage (not just a corrupt filesystem).
DEVNAME="$1"
[ -b "$DEVNAME" ] || exit 1
BADBLOCKS="$(dumpe2fs -b "$DEVNAME" | tr '\n' ' ')"
[ -n "$BADBLOCKS" ] || exit 0
INODES="$(debugfs -R "icheck $BADBLOCKS" "$DEVNAME" | awk -F'\t' '
NR > 1 { bad_inodes[$2]++; }
END {
for (inode in bad_inodes) {
if (inode == "<block not found>") {
printf("%d unallocated bad blocks\n", bad_inodes[inode]) > "/dev/stderr";
continue;
}
printf inode OFS;
}
}
')"
[ -n "$INODES" ] || exit 0
debugfs -R "ncheck -c $INODES" "$DEVNAME"