Link Command Question [дубликат]

Вам понадобятся номера всех обнаруженных сбойных блоков (ddrescue должен был предоставить вам список, надеюсь, вы его сохранили), а затем вам понадобятся чтобы узнать, какие файлы используют эти блоки (см., например, здесь). Вы можете захотеть написать это, если есть много плохих блоков.

e2fsck не помогает, он просто проверяет непротиворечивость самой файловой системы, поэтому он будет действовать только в отношении плохих блоков, содержащих «административную» информацию о файловой системе.

Плохие блоки в файлах будут просто пустыми.

Редактировать

Хорошо, давайте разберемся с размером блока. Давайте создадим пробную файловую систему с 512-байтовыми блоками устройств:

$ dd if=/dev/zero of=fs bs=512 count=200
$ /sbin/mke2fs fs

$ ll fs
-rw-r--r-- 1 dirk dirk 102400 Apr 27 10:03 fs

$ /sbin/tune2fs -l fs
...
Block count:              100
...
Block size:               1024
Fragment size:            1024
Blocks per group:         8192
Fragments per group:      8192

Итак, размер блока файловой системы равен 1024, и у нас есть 100 таких блоков файловой системы (и 200 512-байтовых блоков устройств). Спасите это:

$ ddrescue -b512 fs fs.new fs.log
GNU ddrescue 1.19
Press Ctrl-C to interrupt
rescued:    102400 B,  errsize:       0 B,  current rate:     102 kB/s
   ipos:     65536 B,   errors:       0,    average rate:     102 kB/s
   opos:     65536 B, run time:       1 s,  successful read:       0 s ago
Finished                                     

$ cat fs.log
# Rescue Logfile. Created by GNU ddrescue version 1.19
# Command line: ddrescue fs fs.new fs.log
# Start time:   2017-04-27 10:04:03
# Current time: 2017-04-27 10:04:03
# Finished
# current_pos  current_status
0x00010000     +
#      pos        size  status
0x00000000  0x00019000  +

$ printf "%i\n" 0x00019000
102400

Итак, шестнадцатеричные единицы ddrescue представлены в байтах, а не в блоках. Наконец, давайте посмотрим, что использует debugfs. Сначала создайте файл и найдите его содержимое:

$ sudo mount -o loop fs /mnt/tmp
$ sudo chmod go+rwx /mnt/tmp/
$ echo 'abcdefghijk' > /mnt/tmp/foo
$ sudo umount /mnt/tmp

$ hexdump -C fs
...
00005400  61 62 63 64 65 66 67 68  69 6a 6b 0a 00 00 00 00  |abcdefghijk.....|
00005410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

Таким образом, байтовый адрес данных равен 0x5400.Преобразуйте это в 1024-байтовые блоки файловой системы:

$ printf "%i\n" 0x5400
21504
$ expr 21504 / 1024
21

и давайте также попробуем диапазон блоков, пока мы это делаем:

$ /sbin/debugfs fs
debugfs 1.43.3 (04-Sep-2016)
debugfs:  testb 0
testb: Invalid block number 0
debugfs:  testb 1
Block 1 marked in use
debugfs:  testb 99
Block 99 not in use
debugfs:  testb 100
Illegal block number passed to ext2fs_test_block_bitmap #100 for block bitmap for fs
Block 100 not in use
debugfs:  testb 21
Block 21 marked in use
debugfs:  icheck 21
Block   Inode number
21      12
debugfs:  ncheck 12
Inode   Pathname
12      //foo

Итак, это работает, как и ожидалось, за исключением того, что блок 0 недействителен, вероятно, потому, что там есть метаданные файловой системы. Итак, для вашего байтового адреса 0x30F8A71000 из ddrescue, предполагая, что вы работали со всем диском, а не с разделом, вычитаем байтовый адрес начала раздела

210330128384 - 7815168 * 512 = 206328762368

Разделите это число на размер блока tune2fs, чтобы получить блок файловой системы (обратите внимание, что, поскольку несколько физических, возможно поврежденных, блоков составляют блок файловой системы, числа не обязательно должны быть кратными):

206328762368 / 4096 = 50373233.0

и это блок, который вы должны протестировать с помощью debugfs.

1
14.04.2019, 10:45
1 ответ

Использовать канал для команды подсчета слов с параметром строки:

$ find /etc/file/magic -name "pa*" |wc -l
0
28.01.2020, 00:26

Теги

Похожие вопросы