История изменений
Исправление 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/
Файлы тоже на месте.