<<< Headline | Index | http | bash | basics | x11 | net | vpn | humor | sles | cXX | php | db | perl | soft | unsorted | hw | ppp | tips | linux | fbsd | mail
[Timeline] [View Photos] [rtfm] [Search] [Index by Title] [Index by Date]
fbsd => fdisk-recovery: == post:fbsd/posts/fdisk-recovery

*Проблема*
Утеря-порча данных на /dev/da0s2. Причем раздел в таблице разделов отсутствует, файлы устройств отсутствуют.

*Решение*
Для начала требуем дополнительный диск такой же геометрии подключаем порченный как *da1* и чистый *da2*

da0 at mpt0 bus 0 target 1 lun 0 da0: <ATA ST3250620NS E> Fixed Direct Access SCSI-5 device da0: 300.000MB/s transfers, Tagged Queueing Enabled da0: 238475MB (488397168 512 byte sectors: 255H 63S/T 30401C) da1 at mpt0 bus 0 target 2 lun 0 da1: <ATA WDC WD2500JS-00M 1C03> Fixed Direct Access SCSI-5 device da1: 300.000MB/s transfers, Tagged Queueing Enabled da1: 238475MB (488397168 512 byte sectors: 255H 63S/T 30401C) da2 at mpt0 bus 0 target 3 lun 0 da2: <ATA WDC WD2500JS-00M 2E02> Fixed Direct Access SCSI-5 device da2: 300.000MB/s transfers, Tagged Queueing Enabled da2: 238475MB (488397168 512 byte sectors: 255H 63S/T 30401C) GEOM_MIRROR: Kernel module is too old to handle metadata from da0. GEOM_MIRROR: Device gm0: provider da1 detected.
Убираем geom:
   34  gmirror forget gm0
   35  gmirror list
   36  gmirror stop gm0
   37  gmirror list
   38  gmirror unload
Теперь заливаем данные на da2:
dd if=/dev/da1 of=/dev/da2 bs=8k conv=noerror,sync
Работаем только с этим диском!

*ПРОБУЕМ ВОССТАНОВИТЬ BSD-СЛАЙС ЧЕРЕЗ FDISK*
[root@dsX ~]# fdisk -i da2
******* Working on device /dev/da2 *******
parameters extracted from in-core disklabel are:
cylinders=30401 heads=255 sectors/track=63 (16065 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=30401 heads=255 sectors/track=63 (16065 blks/cyl)

Do you want to change our idea of what BIOS thinks ? [n] 
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 63, size 18860247 (9209 Meg), flag 80 (active)
        beg: cyl 0/ head 1/ sector 1;
        end: cyl 1023/ head 9/ sector 63
Do you want to change it? [n] 
The data for partition 2 is:
<UNUSED>
Do you want to change it? [n] y
Supply a decimal value for "sysid (165=FreeBSD)" [0] 165 
Supply a decimal value for "start" [0] 18860310
                                        ^^^^^^^^^
                                        определяем смещение : 63+18860247

Supply a decimal value for "size" [0] 488392064
                                       ^^^^^^^^
                                       размер берем из утилит testdisk, gpart, sysinstall или scan_ffs 
fdisk: WARNING: partition does not end on a cylinder boundary
fdisk: WARNING: this may confuse the BIOS or some operating systems
Correct this automatically? [n] y
fdisk: WARNING: adjusting size of partition to 488376000
Explicitly specify beg/end address ? [n] 
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 18860310, size 488376000 (238464 Meg), flag 0
        beg: cyl 150/ head 0/ sector 1;
        end: cyl 853/ head 254/ sector 63
Are we happy with this entry? [n] y
The data for partition 3 is:
<UNUSED>
Do you want to change it? [n] n
The data for partition 4 is:
<UNUSED>
Do you want to change it? [n] n
Partition 1 is marked active
Do you want to change the active partition? [n] 

We haven't changed the partition table yet.  This is your last chance.
parameters extracted from in-core disklabel are:
cylinders=30401 heads=255 sectors/track=63 (16065 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=30401 heads=255 sectors/track=63 (16065 blks/cyl)

Information from DOS bootblock is:
1: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 63, size 18860247 (9209 Meg), flag 80 (active)
        beg: cyl 0/ head 1/ sector 1;
        end: cyl 1023/ head 9/ sector 63
2: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 18860310, size 488376000 (238464 Meg), flag 0
        beg: cyl 150/ head 0/ sector 1;
        end: cyl 853/ head 254/ sector 63
3: <UNUSED>
4: <UNUSED>
Should we write new partition table? [n] y

[root@dsX ~]# ls -la /dev/da2s*  
crw-r-----  1 root  operator    0, 125 Oct 14 13:37 /dev/da2s1
crw-r-----  1 root  operator    0, 129 Oct 14 13:37 /dev/da2s1a
crw-r-----  1 root  operator    0, 130 Oct 14 13:37 /dev/da2s1b
crw-r-----  1 root  operator    0, 131 Oct 14 13:37 /dev/da2s1c
crw-r-----  1 root  operator    0, 133 Oct 14 13:37 /dev/da2s1d
crw-r-----  1 root  operator    0, 134 Oct 14 13:37 /dev/da2s1e
crw-r-----  1 root  operator    0,  97 Oct 14 13:37 /dev/da2s1f
crw-r-----  1 root  operator    0,  98 Oct 14 13:37 /dev/da2s2
crw-r-----  1 root  operator    0,  99 Oct 14 13:37 /dev/da2s2c
crw-r-----  1 root  operator    0, 100 Oct 14 13:37 /dev/da2s2d
crw-r-----  1 root  operator    0, 118 Oct 14 13:37 /dev/da2s2e
crw-r-----  1 root  operator    0, 119 Oct 14 13:37 /dev/da2s2f
Видим, что файлы устройств /dev/da2s2* появились
[root@dsX ~]# bsdlabel /dev/da2s2 
# /dev/da2s2:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  c: 461370735        0    unused        0     0         # "raw" part, don't edit
  d: 83886080        0    4.2BSD     2048 16384 28552 
  e: 41943040 83886080    4.2BSD     2048 16384 28552 
  f: 335541615 125829120    4.2BSD     2048 16384 28552 
bsdlabel: partition c doesn't cover the whole unit!
bsdlabel: An incorrect partition c may cause problems for standard system utilities
пытаемся примонтировать диски:
[root@dsX ~]# mount /dev/da2s2e /mnt/disk/
mount: /dev/da2s2e: Operation not permitted
[root@dsX ~]# mount /dev/da2s2f /mnt/disk/
mount: /dev/da2s2f: Operation not permitted
[root@dsX ~]# mount /dev/da2s2d /mnt/disk/
mount: /dev/da2s2d: Operation not permitted
[root@dsX ~]# tail -f /var/log/messages 
Oct 14 18:47:21 dsX kernel: WARNING: Expected rawoffset 0, found 63
Oct 14 18:47:25 dsX mountd[785]: bad exports list line /opt/logs
Oct 14 18:53:32 dsX kernel: WARNING: Expected rawoffset 0, found 63
Oct 14 18:55:55 dsX kernel: WARNING: Expected rawoffset 0, found 60803366
Oct 14 18:56:25 dsX mountd[785]: bad exports list line /opt/logs
Oct 15 11:52:03 dsX mountd[785]: can't delete exports for /mnt/disk: Invalid argument
Oct 15 11:52:03 dsX mountd[785]: bad exports list line /opt/logs
Oct 15 13:55:12 dsX kernel: WARNING: R/W mount of /db denied.  Filesystem is not clean - run fsck
Oct 15 13:55:17 dsX kernel: WARNING: R/W mount of /home denied.  Filesystem is not clean - run fsck
Oct 15 13:55:20 dsX kernel: WARNING: R/W mount of /opt denied.  Filesystem is not clean - run fsck
^C
чекаем разделы
[root@dsX ~]# fsck /dev/da2s2e
** /dev/da2s2e
** Last Mounted on /db
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
152 files, 2223 used, 10151976 free (168 frags, 1268976 blocks, 0.0% fragmentation)

***** FILE SYSTEM MARKED CLEAN *****

[root@dsX ~]# fsck -y /dev/da2s2f   
** /dev/da2s2f
** Last Mounted on /home
** Phase 1 - Check Blocks and Sizes
INCORRECT BLOCK COUNT I=8597789 (4 should be 0)
CORRECT? yes

** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
UNREF FILE I=8574008  OWNER=9881 MODE=100644
SIZE=0 MTIME=Oct 12 22:05 2009 
CLEAR? yes

UNREF FILE  I=8574059  OWNER=9881 MODE=100644
SIZE=0 MTIME=Oct 12 22:05 2009 
RECONNECT? yes

NO lost+found DIRECTORY
CREATE? yes

UNREF FILE I=8597789  OWNER=9881 MODE=100644
SIZE=0 MTIME=Oct 12 22:05 2009 
CLEAR? yes

** Phase 5 - Check Cyl groups
FREE BLK COUNT(S) WRONG IN SUPERBLK
SALVAGE? yes

SUMMARY INFORMATION BAD
SALVAGE? yes

BLK(S) MISSING IN BIT MAPS
SALVAGE? yes

50298 files, 769007 used, 80476029 free (82885 frags, 10049143 blocks, 0.1% fragmentation)

***** FILE SYSTEM MARKED CLEAN *****

***** FILE SYSTEM WAS MODIFIED *****
[root@dsX ~]# fsck -y /dev/da2s2f
** /dev/da2s2f
** Last Mounted on /home
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
50298 files, 769007 used, 80476029 free (82885 frags, 10049143 blocks, 0.1% fragmentation)
[root@dsX ~]# fsck -y /dev/da2s2d
** /dev/da2s2d
** Last Mounted on /opt
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
SUMMARY INFORMATION BAD
SALVAGE? yes

BLK(S) MISSING IN BIT MAPS
SALVAGE? yes

FREE BLK COUNT(S) WRONG IN SUPERBLK
SALVAGE? yes

23391 files, 3557988 used, 16753410 free (4562 frags, 2093606 blocks, 0.0% fragmentation)

***** FILE SYSTEM MARKED CLEAN *****

***** FILE SYSTEM WAS MODIFIED *****
[root@dsX ~]# fsck -y /dev/da2s2d
** /dev/da2s2d
** Last Mounted on /opt
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cyl groups
23391 files, 3557988 used, 16753410 free (4562 frags, 2093606 blocks, 0.0% fragmentation)
[root@dsX ~]# mount /dev/da2s2d /mnt/disk/
[root@dsX ~]# ls -la /mnt/disk/
total 36
drwxr-xr-x  8 root       wheel     512 Oct  7  2008 .
drwxr-xr-x  3 root       wheel     512 Oct 14 18:19 ..
-rw-r--r--  1 root       wheel      33 Oct  7  2008 .amanda.excludes
drwxrwxr-x  2 root       operator  512 Oct  7  2008 .snap
drwxr-xr-x  3 root       wheel     512 Oct  7  2008 cache
drwxr-xr-x  9 root       wheel     512 Oct 11  2008 logs
drwxr-xr-x  4 root       wheel     512 Oct  7  2008 mail
drwxr-x---  3 root       wheel     512 Oct  7  2008 mysql_backup
drwxr-x---  3 wwwserver  www       512 Oct  7  2008 squirrel
Все...


  Дополнения

ЕСли не помогло - вероятно, проблема не в слайсах, а в BSD-partitions

Пробуем проанализировать ситуацию с помощью утилит восстановления диска. Опять же работаем только копией поврежденного диска!

Устанавливаем полезные утилиты: *gpart*,*testdisk*,*scan_ffs*..
   89  export PACKAGESITE=http://ftp.ua.freebsd.org/pub/FreeBSD/ports/i386/packages-6.3-release/Latest/
[root@dsX ~]# env
SHELL=/usr/local/bin/bash
TERM=xterm
PACKAGESITE=http://ftp.ua.freebsd.org/pub/FreeBSD/ports/i386/packages-6.3-release/Latest/
USER=root
SUDO_USER=john
SUDO_UID=1154
USERNAME=root
MAIL=/var/mail/john
PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/home/john/bin
PWD=/usr/home/john
LANG=ru_RU.KOI8-R
SHLVL=1
SUDO_COMMAND=/usr/local/bin/bash
HOME=/usr/home/john
LOGNAME=root
SUDO_GID=1154
LC_TIME=C
_=/usr/bin/env

   80  pkg_add -r testdisk
   90  pkg_add -r scan_ffs
   91  pkg_add -r gpart
  100  pkg_add -r magicrescue
после того как данные залились на da2 смотрим информацию о разделах:
[root@dsX ~]# bsdlabel /dev/da2s1 
# /dev/da2s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:  2097152        0    4.2BSD     2048 16384 28552 
  b:  4194304  2097152      swap                    
  c: 18860247        0    unused        0     0         # "raw" part, don't edit
  d:  2097152  6291456    4.2BSD     2048 16384 28552 
  e:  6291456  8388608    4.2BSD     2048 16384 28552 
  f:  4180182 14680064    4.2BSD     2048 16384 28552 
Сохраняем ее в файле, в случае чего можем восстановить.
[root@dsX ~]# cat correct_bsdlabel_da2s1 >bsdlabel_da2s1 
[root@dsX ~]# bsdlabel -R -m i386 /dev/da2s1 bsdlabel_da2s1 
Для *da2s2* нет файла устройства, поэтому посмотреть инфо мы не можем.

Интересная утилитка scan_ffs помогает нам частично увидеть таблицу разделов:
scan_ffs -l /dev/da2 > /tmp/da2label
[root@dsX ~]# cat /tmp/da2label 
X: 2097152 63 4.2BSD 2048 16384 0 # /
X: 2097152 6291519 4.2BSD 2048 16384 0 # /tmp
X: 6291456 8388671 4.2BSD 2048 16384 0 # /var
X: 4180180 14680127 4.2BSD 2048 16384 0 # /usr
X: 20971520 60803366 4.2BSD 2048 16384 0 # 
X: 406617176 81774886 4.2BSD 2048 16384 0 # 
X: 41943040 102746390 4.2BSD 2048 16384 0 # /db
X: 314572800 123717910 4.2BSD 2048 16384 0 # /tmp/setup.741/home
X: 335541612 144689430 4.2BSD 2048 16384 0 # /home
X: 50101352 438290710 4.2BSD 2048 16384 0 # /tmp/setup.741/opt
Но здесь нет информации о разделе c:unused, который является обязательным при создании slice.

Кроме того, слайсов у нас два.

утилита *testdisk* подходит в случае повреждения информации о слайсах.
You should choose Intel, but testdisk repairs/recreates missing/corrupted MBRs (BIOS partitions/BSD slices), so it won't fix your problem (BSD partitions). And AFAIK, it's file recovery doesn't understand UFS.
Но прогнав ее видим, что тесты проходят успешно, и разделы недоступны для редактирования. gpart показывает много полезной информации, но опять же только о слайсах.
[root@dsX ~]# gpart /dev/da2

Begin scan...
Possible partition(*BSD disklabel), size(9209mb), offset(0mb)
Possible partition(*BSD disklabel), size(225278mb), offset(9209mb)

* Warning: short read near sector(488396979), 64512 bytes instead of 66048. Skipping...
End scan.

Checking partitions...
Partition(FreeBSD/NetBSD/386BSD): primary 
Partition(FreeBSD/NetBSD/386BSD): primary 
Ok.

Guessed primary partition table:
Primary partition(1)
   type: 165(0xA5)(FreeBSD/NetBSD/386BSD)
   size: 9209mb #s(18860247) s(63-18860309)
   chs:  (0/1/1)-(1023/254/63)d (0/1/1)-(1173/254/63)r

Primary partition(2)
   type: 165(0xA5)(FreeBSD/NetBSD/386BSD)
   size: 225278mb #s(461370735) s(18860310-480231044)
   chs:  (1023/254/63)-(1023/254/63)d (1174/0/1)-(29892/254/63)r

Primary partition(3)
   type: 000(0x00)(unused)
   size: 0mb #s(0) s(0-0)
   chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

Primary partition(4)
   type: 000(0x00)(unused)
   size: 0mb #s(0) s(0-0)
   chs:  (0/0/0)-(0/0/0)d (0/0/0)-(0/0/0)r

fbsd/posts/fdisk-recovery -- Last updated 2010-04-27 Tuesday 14:50:26 Edit

© copyright 2010
Design by: lev