LINUX.ORG.RU

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

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

Скажите, они 100% рабочие? У вас они работают?

Смотрите сами, сверяйте начальные номера секторов разделов, смотрите вывод fdisk (первый блок кода) и номера сектора, на которых останавливается скрипт (монтируется файловая система). Начальные номера секторов, с которых скрипт начинает «поиск», указаны не далеко от границ разделов (файловых систем). После результатов работы скрипта приведён вывод 'losetup -a' с выборкой информации по конкретному устройству, в котором видно, что создано loop устройство, которому сопоставлена область на жёстком диске с некоторым смещением, можете сравнить со смещением, найденным в скрипте. Ну и далее выборка из списка смонтированных файловых систем.

fdisk  -l /dev/sdb

Disk /dev/sdb: 320.1 GB, 320072933376 bytes, 625142448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf74ef74e

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sdb1   *        2048      206847      102400    7  HPFS/NTFS/exFAT
/dev/sdb2          206848   163846143    81819648    7  HPFS/NTFS/exFAT
/dev/sdb3       163846935   625137344   230645205    5  Расширенный
/dev/sdb5       163846998   625137344   230645173+   7  HPFS/NTFS/exFAT
Ищем первую файловую систему:
#!/bin/sh
for ((sector=2047; sector<=625142448 ; sector++))
do
   offset=$(($sector*512))
   cmd="mount -t ntfs-3g /dev/sdb /mnt/tmp/ -o ro,offset=$offset"
   echo "sector: $sector offset: $offset";
   $cmd 2>/dev/null && echo "partition found @ offset $offset!" && break
done
# /tmp/script.sh
sector: 2047 offset: 1048064
sector: 2048 offset: 1048576
partition found @ offset 1048576!
losetup -a | grep sdb 
/dev/loop4: [0005]:7288 (/dev/sdb), offset 1048576
mount | grep mnt\/tmp
/dev/sdb on /mnt/tmp type fuseblk (ro,nosuid,nodev,allow_other,blksize=4096)
umount /mnt/tmp

Ищем вторую файловую систему

for ((sector=206840; sector<=625142448 ; sector++))

sector: 206840 offset: 105902080
sector: 206841 offset: 105902592
sector: 206842 offset: 105903104
sector: 206843 offset: 105903616
sector: 206844 offset: 105904128
sector: 206845 offset: 105904640
sector: 206846 offset: 105905152
sector: 206847 offset: 105905664
sector: 206848 offset: 105906176
partition found @ offset 105906176!
losetup -a | grep sdb 
/dev/loop4: [0005]:7288 (/dev/sdb), offset 105906176
mount | grep mnt\/tmp
/dev/sdb on /mnt/tmp type fuseblk (ro,nosuid,nodev,allow_other,blksize=4096)

Ищем третью файловую систему:

for ((sector=163846995; sector<=625142448 ; sector++))

sector: 163846995 offset: 83889661440
sector: 163846996 offset: 83889661952
sector: 163846997 offset: 83889662464
sector: 163846998 offset: 83889662976
partition found @ offset 83889662976!
losetup -a | grep sdb 
/dev/loop7: [0005]:7288 (/dev/sdb), offset 83889662976
mount | grep mnt\/tmp
/dev/sdb on /mnt/tmp type fuseblk (ro,nosuid,nodev,allow_other,blksize=4096)

Можно ли сейчас попробовать отредактировать таблицу разделов с помощью fdisk?

Попробовать можно, но смысла в этом будет не много. Скрипт нужен для того, что бы найти сектор на диске, с которого начинается суперблок файловой системы, т.е. с которого начиналась граница раздела.

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

Скажите, они 100% рабочие? У вас они работают?

Смотрите сами, сверяйте начальные номера секторов разделов, смотрите вывод fdisk (первый блок кода) и номера сектора, на которых останавливается скрипт (монтируется файловая система). Начальные номера секторов, с которых скрипт начинает «поиск», указаны не далеко от границ разделов (файловых систем).

fdisk  -l /dev/sdb

Disk /dev/sdb: 320.1 GB, 320072933376 bytes, 625142448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf74ef74e

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sdb1   *        2048      206847      102400    7  HPFS/NTFS/exFAT
/dev/sdb2          206848   163846143    81819648    7  HPFS/NTFS/exFAT
/dev/sdb3       163846935   625137344   230645205    5  Расширенный
/dev/sdb5       163846998   625137344   230645173+   7  HPFS/NTFS/exFAT
Ищем первую файловую систему:
#!/bin/sh
for ((sector=2047; sector<=625142448 ; sector++))
do
   offset=$(($sector*512))
   cmd="mount -t ntfs-3g /dev/sdb /mnt/tmp/ -o ro,offset=$offset"
   echo "sector: $sector offset: $offset";
   $cmd 2>/dev/null && echo "partition found @ offset $offset!" && break
done
# /tmp/script.sh
sector: 2047 offset: 1048064
sector: 2048 offset: 1048576
partition found @ offset 1048576!
losetup -a | grep sdb 
/dev/loop4: [0005]:7288 (/dev/sdb), offset 1048576
mount | grep mnt\/tmp
/dev/sdb on /mnt/tmp type fuseblk (ro,nosuid,nodev,allow_other,blksize=4096)
umount /mnt/tmp

Ищем вторую файловую систему

for ((sector=206840; sector<=625142448 ; sector++))

sector: 206840 offset: 105902080
sector: 206841 offset: 105902592
sector: 206842 offset: 105903104
sector: 206843 offset: 105903616
sector: 206844 offset: 105904128
sector: 206845 offset: 105904640
sector: 206846 offset: 105905152
sector: 206847 offset: 105905664
sector: 206848 offset: 105906176
partition found @ offset 105906176!
losetup -a | grep sdb 
/dev/loop4: [0005]:7288 (/dev/sdb), offset 105906176
mount | grep mnt\/tmp
/dev/sdb on /mnt/tmp type fuseblk (ro,nosuid,nodev,allow_other,blksize=4096)

Ищем третью файловую систему:

for ((sector=163846995; sector<=625142448 ; sector++))

sector: 163846995 offset: 83889661440
sector: 163846996 offset: 83889661952
sector: 163846997 offset: 83889662464
sector: 163846998 offset: 83889662976
partition found @ offset 83889662976!
losetup -a | grep sdb 
/dev/loop7: [0005]:7288 (/dev/sdb), offset 83889662976
mount | grep mnt\/tmp
/dev/sdb on /mnt/tmp type fuseblk (ro,nosuid,nodev,allow_other,blksize=4096)

Можно ли сейчас попробовать отредактировать таблицу разделов с помощью fdisk?

Попробовать можно, но смысла в этом будет не много. Скрипт нужен для того, что бы найти сектор на диске, с которого начинается суперблок файловой системы, т.е. с которого начиналась граница раздела.