LINUX.ORG.RU

История изменений

Исправление Xenius, (текущая версия) :

Попробовал сделать на виртуалке. С ddrescue почему-то не получилось. Задача была сдвинуть раздел 64M с данными вперёд на 32 мегабайта, для этого я его пересоздал с размером 96 мегабайт вместо 64, затем попробовал такую команду:

root@slackware:/# ddrescue --same-file -R -v -u -c 2048 -y -o 32M -f /dev/sda1 /dev/sda1 ddresc.map
GNU ddrescue 1.27
About to copy 100663 kBytes from '/dev/sda1' to '/dev/sda1'
    Starting positions: infile = 0 B,  outfile = 32000 kB
    Copy block size: 2048 sectors       Initial skip size: 128 sectors
Sector size: 512 Bytes

Press Ctrl-C to interrupt
Initial status (read from mapfile)
rescued: 0 B, tried: 0 B, bad-sector: 0 B, bad areas: 0

Current status
     ipos:   99614 kB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:  131614 kB, non-scraped:        0 B,  average rate:       0 B/s
non-tried:  100663 kB,  bad-sector:        0 B,    error rate:       0 B/s
  rescued:        0 B,   bad areas:        0,        run time:          0s
pct rescued:    0.00%, read errors:        0,  remaining time:         n/a
                              time since last successful read:         n/a
Copying non-tried blocks... Pass 1 (backwards)
ddrescue: /dev/sda1: Write error: Invalid argument

Да и размер 32000kB явно неправильный.

Вторая попытка с dd, вроде всё получилось, хотя надо было использовать ключи status=noxfer и echo offset: $i, но в целом не критично. В случае ТС блоки по гигабайту подойдут. Ну и командой tee можно сохранять лог, чтобы продолжить с того места, где копирование прервалось, если что:

for i in {63..0}; do dd if=/dev/sda1 of=/dev/sda1 bs=1M skip="$i" seek="$[i+32]" count=1; done
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.149179 s, 7.0 MB/s
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.192866 s, 5.4 MB/s
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.139224 s, 7.5 MB/s
...

Теперь с помощью fdisk я создал два раздела на месте sda1, а именно sda1 на 32M и sda2 сразу после него на 64M, если всё правильно сделано, то второй раздел должен быть копией первого. Проверяем вначале через fsck:

root@slackware:/# fsck -f /dev/sda2 
fsck from util-linux 2.39.2
e2fsck 1.47.0 (5-Feb-2023)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure                                           
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts                                              
Pass 5: Checking group summary information
/dev/sda2: 36/16384 files (16.7% non-contiguous), 27914/65536 blocks

Затем пробуем смонтировать и посмотреть файлы:

root@slackware:/# mount /dev/sda2 /mnt/       
root@slackware:/# ls /mnt/
bin/  boot/  dev/  etc/  lib64/  lost+found/  proc/  syslinux/
root@slackware:/# umount  /mnt/

Файлы тоже на месте. После переустановки lilo система загружается. То есть способ рабочий.

Исходная версия Xenius, :

Попробовал сделать на виртуалке. С ddrescue почему-то не получилось. Задача была сдвинуть раздел 64M с данными вперёд на 32 мегабайта, для этого я его пересоздал с размером 96 мегабайт вместо 64, затем попробовал такую команду:

root@slackware:/# ddrescue --same-file -R -v -u -c 2048 -y -o 32M -f /dev/sda1 /dev/sda1 ddresc.map
GNU ddrescue 1.27
About to copy 100663 kBytes from '/dev/sda1' to '/dev/sda1'
    Starting positions: infile = 0 B,  outfile = 32000 kB
    Copy block size: 2048 sectors       Initial skip size: 128 sectors
Sector size: 512 Bytes

Press Ctrl-C to interrupt
Initial status (read from mapfile)
rescued: 0 B, tried: 0 B, bad-sector: 0 B, bad areas: 0

Current status
     ipos:   99614 kB, non-trimmed:        0 B,  current rate:       0 B/s
     opos:  131614 kB, non-scraped:        0 B,  average rate:       0 B/s
non-tried:  100663 kB,  bad-sector:        0 B,    error rate:       0 B/s
  rescued:        0 B,   bad areas:        0,        run time:          0s
pct rescued:    0.00%, read errors:        0,  remaining time:         n/a
                              time since last successful read:         n/a
Copying non-tried blocks... Pass 1 (backwards)
ddrescue: /dev/sda1: Write error: Invalid argument

Да и размер 32000kB явно неправильный.

Вторая попытка с dd, вроде всё получилось, хотя надо было использовать ключи status=noxfer и echo offset: $i, но в целом не критично. В случае ТС блоки по гигабайту подойдут. Ну и командой tee можно сохранять лог, чтобы продолжить с того места, где копирование прервалось, если что:

for i in {63..0}; do dd if=/dev/sda1 of=/dev/sda1 bs=1M skip="$i" seek="$[i+32]" count=1; done
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.149179 s, 7.0 MB/s
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.192866 s, 5.4 MB/s
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.139224 s, 7.5 MB/s
...

Теперь с помощью fdisk я создал два раздела на месте sda1, а именно sda1 на 32M и sda2 сразу после него на 64M, если всё правильно сделано, то второй раздел должен быть копией первого. Проверяем вначале через fsck:

root@slackware:/# fsck -f /dev/sda2 
fsck from util-linux 2.39.2
e2fsck 1.47.0 (5-Feb-2023)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure                                           
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts                                              
Pass 5: Checking group summary information
/dev/sda2: 36/16384 files (16.7% non-contiguous), 27914/65536 blocks

Затем пробуем смонтировать и посмотреть файлы:

root@slackware:/# mount /dev/sda2 /mnt/       
root@slackware:/# ls /mnt/
bin/  boot/  dev/  etc/  lib64/  lost+found/  proc/  syslinux/
root@slackware:/# umount  /mnt/

Файлы тоже на месте.