ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
Main Menu
Tweet
Facebook
Line
:-?
メイン >   >  談話室 >  ALIENWARE
フラット表示 前のトピック | 次のトピック
投稿者 スレッド
webadm
投稿日時: 2011-9-11 19:45
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3086
増設ドライブも復活できた
パーティションテーブルが完全にrapeされて情報が失われていた増設ドライブの方も下記の手順で復活できた

(1)温存されているNTFSパーティションからボリュームサイズを知る
増設ドライブの先頭からhdでダンプするとNTFSボリュームの先頭にある'NTFS'の文字列が識別できることから、NTFSパーティションの内容は温存されていることを確認。あとはそのボリュームのサイズがわかればパーティションテーブルをそれに基づいて作り直せばよいことになる。

Googleでntfs.hを検索して、NTFSボリュームヘッダの構造を調べた

#define NTFS_BBID "NTFS "
#define NTFS_BBIDLEN 8
struct bootfile {
u_int8_t reserved1[3]; /* asm jmp near ... */
u_int8_t bf_sysid[8]; /* 'NTFS ' */
u_int16_t bf_bps; /* bytes per sector */
u_int8_t bf_spc; /* sectors per cluster */
u_int8_t reserved2[7]; /* unused (zeroed) */
u_int8_t bf_media; /* media desc. (0xF8) */
u_int8_t reserved3[2];
u_int16_t bf_spt; /* sectors per track */
u_int16_t bf_heads; /* number of heads */
u_int8_t reserver4[12];
u_int64_t bf_spv; /* sectors per volume */
cn_t bf_mftcn; /* $MFT cluster number */
cn_t bf_mftmirrcn; /* $MFTMirr cn */
u_int8_t bf_mftrecsz; /* MFT record size (clust) */
/* 0xF6 inducates 1/4 */
u_int32_t bf_ibsz; /* index buffer size */
u_int32_t bf_volsn; /* volume ser. num. */
};

上のsectors per voulmeフィールドの値からNTFSボリュームのサイズがわかる。

NTFSボリューム先頭セクタをダンプすると
root@lenny:~# hd /dev/sdb|more

00007e00 eb 52 90 4e 54 46 53 20 20 20 20 00 02 08 00 00 |.R.NTFS .....|
00007e10 00 00 00 00 00 f8 00 00 3f 00 ff 00 3f 00 00 00 |........?...?...|
00007e20 00 00 00 00 80 00 80 00 81 6e 85 4a 00 00 00 00 |.........n.J....|
00007e30 00 00 0c 00 00 00 00 00 e8 56 a8 04 00 00 00 00 |.........V......|
00007e40 f6 00 00 00 01 00 00 00 85 81 1a 3c aa 1a 3c 9a |...........<..<.|
00007e50 00 00 00 00 fa 33 c0 8e d0 bc 00 7c fb b8 c0 07 |.....3.....|....|

上の3行目にある 81 6e 85 4a 00 00 00 00 が64bitのNTFSボリュームサイズ(セクタ数)である。little endianなので16進数に直すと4a856e81ということになる。これを10進数に変換すると、1250258561ということでこれを憶えておく。

(2)壊れたパーティションテーブルを作り直す
変なエラーメッセージテキストで上書きされてしまったパーティションテーブルの内容はもう使い物にならないので、消して新しくNTFSパーティションだけを復活させるためのテーブルをfdiskで作成する。

root@lenny:~# fdisk /dev/sdb

Command (m for help): u
Changing display/entry units to sectors

Command (m for help): o
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First sector (63-1250263727, default 63):
Using default value 63
Last sector or +size or +sizeM or +sizeK (63-1250263727, default 1250263727):
Using default value 1250263727

なんとさっき調べたNTFボリュームサイズはぼぼ全体と同じサイズだった。全部使ってたのね。これはデフォルトの全部使うでよしとしよう。

Command (m for help): p

Disk /dev/sdb: 640.1 GB, 640135028736 bytes
255 heads, 63 sectors/track, 77825 cylinders, total 1250263728 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0xe9a1e50b

Device Boot Start End Blocks Id System
/dev/sdb1 63 1250263727 625131832+ 83 Linux

linux上で新しいパーティションを作るとtypeがLinuxになってしまう。NTFSに変える。

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 7
Changed system type of partition 1 to 7 (HPFS/NTFS)

Command (m for help): p

Disk /dev/sdb: 640.1 GB, 640135028736 bytes
255 heads, 63 sectors/track, 77825 cylinders, total 1250263728 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0xe9a1e50b

Device Boot Start End Blocks Id System
/dev/sdb1 63 1250263727 625131832+ 7 HPFS/NTFS

これであとはパーティションテーブルを書き込むだけ。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

変更されたパーティションが反映されているはずなので確認すると

root@lenny:~# cat /proc/partitions
major minor #blocks name

8 0 488386584 sda
8 1 134206978 sda1
8 2 80469585 sda2
8 3 273709956 sda3
8 16 625131864 sdb
8 17 625131832 sdb1

OKぽ

試しにlinux上からNTFSパーティションをmountしてみる

root@lenny:~# mount /dev/sdb1 /mnt

できたじゃないか。ほんとうかどうか確かめる

root@lenny:~# mount
/dev/sda2 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
nfsd on /proc/fs/nfsd type nfsd (rw)
/dev/sdb1 on /mnt type ntfs (rw)

ちゃんとntfsでmountされている。復活ぽ。

実はその前にbootドライブの第3パーティションが怪しいので、調べたところ、拡張パーティションらしく、パーティション先頭セクタにパーティションテーブルがあるのを確認。ならばパーティションタイプを拡張パーティション(05)に変更すればいいのではと思ってやってみたら、怒られた。linuxパーティションタイプをExtendedタイプには変更できないらしい。パーティションタイプだけ変更したいだけなのに。そうおもって、一度Linux Extended(85)に変更する方法があることを知ってやってみたら、パーティション先頭にあったはずの拡張パーティションテーブルが初期化されて消えていたorz

ということでメモってなかったので拡張パーティション情報は失われた模様。まあ、確かUbuntuしか入れてなかったし、使ってなかったから第3パーティションは更地に戻すことに決定。

とりあえずNTFSボリュームが二つとも温存されていて復活できたのが幸い。それに新しいHDDを買う費用も節約できたのでよかった。
フラット表示 前のトピック | 次のトピック

題名 投稿者 日時
   ALIENWARE webadm 2011-2-6 5:02
     メインのデスクトップPCも壊れた webadm 2011-9-10 17:51
       なんとかbootドライブから起動できるようになった webadm 2011-9-11 17:56
       » 増設ドライブも復活できた webadm 2011-9-11 19:45
           まだ伏兵がいた webadm 2011-9-11 21:09
             最近のLenovoのThinkpad webadm 2012-9-2 21:33
               Re: 最近のLenovoのThinkpad webadm 2015-5-26 18:14

投稿するにはまず登録を
 
ページ変換(Google Translation)
サイト内検索