HDD を消去しかけて復元させた話
2021年12月03日 金曜日
【IIJ 2021 TECHアドベントカレンダー 12/3(金)の記事です】
ことの顛末
- 週末に古い HDD を捨てようと思ってデータ消去のため shred していた。
- 消去対象の /dev/sdc を指定するところ、うっかり引数の history にあった /dev/sda を消去対象に指定してしまった。
- すぐに [Ctrl] + [C] した。
/dev/sda OS 起動・データ保存、/dev/sdb と Linux の Software RAID1 WDC WD3000F9YZ-0 /dev/sdb OS 起動・データ保存、/dev/sda と Linux の Software RAID1 ST2000DM001-1CH1 /dev/sdc USB で接続したデータ消去対象の HDD HDT725050VLAT80
まず落ち着く
- 先頭のデータは消えてしまったが、後半のデータは残っている。
- RAID を組んでいるし、重要な /home はルートと分けているから安泰なはず。
- とりあえず、関係ない /dev/sdc を外す。
復旧ログ
オペミス直後のターミナルログ
# fdisk -l /dev/sdc Disk /dev/sdc: 465.8 GiB, 500107862016 bytes, 976773168 sectors Disk model: HDT725050VLAT80 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes # time shred -z -v /dev/sda shred: /dev/sda: pass 1/4 (random)... ^C real 0m0.980s user 0m0.040s sys 0m0.005s
間違って起動ドライブを指定しないように、わざわざ fdisk -l /dev/sdc で確認しているのに、直後で /dev/sda を指定してしまい、米国国防総省準拠方式で消去が始まっている。我ながらアホである。
祈りながらパーティションテーブルを見るも、無残にもランダムな値で上書きされている。当たり前だ。
# fdisk -l /dev/sda Disk /dev/sda: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors Disk model: WDC WD3000F9YZ-0 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes # dd if=/dev/sda count=1 | hexdump -C 1+0 records in 1+0 records out 512 bytes copied, 0.000480006 s, 1.1 MB/s 00000000 a8 bd a8 5b 32 51 21 dc bc 76 ac a6 90 a1 7a ce |...[2Q!..v....z.| 00000010 d4 e6 dc 37 9d e4 17 d3 9e 38 de 81 c7 75 b2 f6 |...7.....8...u..| 00000020 a3 ce b7 17 b8 fd dd 44 87 9d 20 3a e7 27 0a 84 |.......D.. :.'..| 00000030 e4 63 6b 63 f7 c2 8e 76 ff b5 3f 62 d5 8f 9b b9 |.ckc...v..?b....| 00000040 d3 af 49 c3 dc fc 4c f8 f0 b6 c6 1d 97 4f 7e bb |..I...L......O~.| 00000050 7d 45 e6 e3 8d 44 50 6a d9 49 e6 fe f2 a3 3c fc |}E...DPj.I....<.| 00000060 51 e7 f3 ec 64 bb ac 7a bf e0 ed 82 d3 1e e4 f4 |Q...d..z........| 00000070 cb 17 ea 00 53 f5 2a f1 eb 44 7a 59 57 d9 8b 59 |....S.*..DzYW..Y| 00000080 0d 78 37 8c ee 4c 6e ec c6 4e d2 7f 6b 25 9d 3c |.x7..Ln..N..k%.<| 00000090 77 8a d0 8e 7d 4d 5e 64 56 50 b0 09 d6 c4 82 db |w...}M^dVP......| 000000a0 f9 6d 65 cb 0e d5 9e 03 c8 73 f4 e7 ec f1 b9 5c |.me......s.....\| 000000b0 e8 71 f5 b8 d0 68 f1 c3 26 fe e3 5e 49 50 88 7c |.q...h..&..^IP.|| 000000c0 7c e1 79 42 fc d1 1e 4e d1 5e 75 16 fc bf 58 46 ||.yB...N.^u...XF| 000000d0 40 9c 7a 24 34 91 b5 a9 37 9a fa fb 11 cb 32 b1 |@.z$4...7.....2.| 000000e0 53 cd 22 49 b2 d1 6e 0d a5 01 c7 44 24 87 d6 1b |S."I..n....D$...| 000000f0 a0 d3 9b a7 6d 30 47 50 15 9a bd f1 e6 3d ea f4 |....m0GP.....=..| 00000100 1c 83 68 b1 d6 31 3f dc 00 36 aa be 50 72 f5 a8 |..h..1?..6..Pr..|
OS は、そんなことも知らず正常稼働しているように見えている。(Kernel がメモリ上に保持しているから)
# cat /proc/mdstat Personalities : [raid1] md3 : active raid1 sda3[3] sdb3[2] 1838156608 blocks super 1.0 [2/2] [UU] bitmap: 7/14 pages [28KB], 65536KB chunk md2 : active raid1 sda2[3] sdb2[2] 52428672 blocks super 1.0 [2/2] [UU] bitmap: 0/1 pages [0KB], 65536KB chunk md1 : active raid1 sdb1[2] sda1[3] 52434816 blocks super 1.0 [2/2] [UU] bitmap: 1/1 pages [4KB], 65536KB chunk unused devices: <none> # mdadm --detail /dev/md1 /dev/md1: Version : 1.0 Creation Time : Sun Jul 7 15:28:59 2013 Raid Level : raid1 Array Size : 52434816 (50.01 GiB 53.69 GB) Used Dev Size : 52434816 (50.01 GiB 53.69 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Sun Feb 7 09:58:06 2021 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Consistency Policy : bitmap Name : linux:1 UUID : e15c3ef9:cce21e93:56a3c807:9db9fc4e Events : 168980 Number Major Minor RaidDevice State 3 8 1 0 active sync /dev/sda1 2 8 17 1 active sync /dev/sdb1 # mdadm --detail /dev/md2 /dev/md2: Version : 1.0 Creation Time : Sun Jul 7 15:28:59 2013 Raid Level : raid1 Array Size : 52428672 (50.00 GiB 53.69 GB) Used Dev Size : 52428672 (50.00 GiB 53.69 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Tue Oct 6 21:34:41 2020 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Consistency Policy : bitmap Name : linux:2 UUID : 670d0c37:6af73494:cd79ecfb:7df8759a Events : 9314 Number Major Minor RaidDevice State 3 8 2 0 active sync /dev/sda2 2 8 18 1 active sync /dev/sdb2 # mdadm --detail /dev/md3 /dev/md3: Version : 1.0 Creation Time : Sun Jul 7 15:29:00 2013 Raid Level : raid1 Array Size : 1838156608 (1753.00 GiB 1882.27 GB) Used Dev Size : 1838156608 (1753.00 GiB 1882.27 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Sun Feb 7 10:19:42 2021 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Consistency Policy : bitmap Name : linux:3 UUID : 3059cb0b:e04c1d35:d7ba2b87:76223746 Events : 292697 Number Major Minor RaidDevice State 3 8 3 0 active sync /dev/sda3 2 8 19 1 active sync /dev/sdb3 # df -hTl Filesystem Type Size Used Avail Use% Mounted on /dev/md1 ext4 50G 39G 9.7G 80% / /dev/md3 ext4 1.7T 1.6T 78G 96% /home
先頭を消去してしまった /dev/sda はデータに一貫性がなくなってしまっているので、一旦 RAID から外す。
––fail マークを付けるだけでは戻せないので、一旦 ––remove する。
# mdadm --manage /dev/md1 --fail /dev/sda1 mdadm: set /dev/sda1 faulty in /dev/md1 # mdadm --manage /dev/md1 --remove /dev/sda1 # mdadm --manage /dev/md2 --fail /dev/sda2 mdadm: set /dev/sda2 faulty in /dev/md2 # mdadm --manage /dev/md2 --remove /dev/sda2 # mdadm --manage /dev/md3 --fail /dev/sda3 mdadm: set /dev/sda3 faulty in /dev/md3 # mdadm --manage /dev/md3 --remove /dev/sda3 Feb 07 10:09:28 kernel: md/raid1:md1: Disk failure on sda1, disabling device. md/raid1:md1: Operation continuing on 1 devices. # mdadm --detail /dev/md1 /dev/md1: Version : 1.0 Creation Time : Sun Jul 7 15:28:59 2013 Raid Level : raid1 Array Size : 52434816 (50.01 GiB 53.69 GB) Used Dev Size : 52434816 (50.01 GiB 53.69 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Sun Feb 7 10:10:29 2021 State : clean, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 1 Spare Devices : 0 Consistency Policy : bitmap Name : linux:1 UUID : e15c3ef9:cce21e93:56a3c807:9db9fc4e Events : 169006 Number Major Minor RaidDevice State - 0 0 0 removed 2 8 17 1 active sync /dev/sdb1 3 8 1 - faulty /dev/sda1 # cat /proc/mdstat Personalities : [raid1] md3 : active raid1 sda3[3](F) sdb3[2] 1838156608 blocks super 1.0 [2/1] [_U] bitmap: 11/14 pages [44KB], 65536KB chunk md2 : active raid1 sda2[3](F) sdb2[2] 52428672 blocks super 1.0 [2/1] [_U] bitmap: 0/1 pages [0KB], 65536KB chunk md1 : active raid1 sdb1[2] sda1[3](F) 52434816 blocks super 1.0 [2/1] [_U] bitmap: 1/1 pages [4KB], 65536KB chunk
/dev/sda 側に (F) マークがついていることを確認。
まずはパーティションテーブルを復旧させる。反対側の /dev/sdb を見て、同じように切り直す。
/dev/sda と /dev/sdb の HDD のサイズが合っていないのは、以前 /dev/sda が壊れて交換したから。
# fdisk -l /dev/sdb Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors Disk model: ST2000DM001-1CH1 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: dos Disk identifier: 0x000e1d40 Device Boot Start End Sectors Size Id Type /dev/sdb1 * 2048 104871935 104869888 50G fd Linux raid autodetect /dev/sdb2 104871936 209729535 104857600 50G fd Linux raid autodetect /dev/sdb3 209729536 3886043135 3676313600 1.7T fd Linux raid autodetect /dev/sdb4 3886043136 3907008511 20965376 10G 82 Linux swap / Solaris # fdisk /dev/sda Welcome to fdisk (util-linux 2.33.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. The size of this disk is 2.7 TiB (3000592982016 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT). Created a new DOS disklabel with disk identifier 0x5185a17d. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): First sector (2048-4294967295, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-4294967294, default 4294967294): 104871935 Created a new partition 1 of type 'Linux' and of size 50 GiB. Partition #1 contains a linux_raid_member signature. Do you want to remove the signature? [Y]es/[N]o: N
お、何だかシグニチャが残っているらしいぞ。残しておこう。
Command (m for help): t Selected partition 1 Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect'. Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): First sector (104871936-4294967295, default 104871936): Last sector, +/-sectors or +/-size{K,M,G,T,P} (104871936-4294967294, default 4294967294): 209729535 Created a new partition 2 of type 'Linux' and of size 50 GiB. Partition #2 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: N Command (m for help): t Partition number (1,2, default 2): 2 Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect'. Command (m for help): n Partition type p primary (2 primary, 0 extended, 2 free) e extended (container for logical partitions) Select (default p): p Partition number (3,4, default 3): First sector (209729536-4294967295, default 209729536): Last sector, +/-sectors or +/-size{K,M,G,T,P} (209729536-4294967294, default 4294967294): 3886043135 Created a new partition 3 of type 'Linux' and of size 1.7 TiB. Command (m for help): t Partition number (1-3, default 3): 3 Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect'.
見かけ上の物理的な領域は復旧した。
Command (m for help): p Disk /dev/sda: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors Disk model: WDC WD3000F9YZ-0 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: dos Disk identifier: 0x5185a17d Device Boot Start End Sectors Size Id Type /dev/sda1 2048 104871935 104869888 50G fd Linux raid autodetect /dev/sda2 104871936 209729535 104857600 50G fd Linux raid autodetect /dev/sda3 209729536 3886043135 3676313600 1.7T fd Linux raid autodetect
忘れずに書き込む。
Command (m for help): w The partition table has been altered. Failed to add partition 1 to system: Device or resource busy Failed to add partition 2 to system: Device or resource busy Failed to add partition 3 to system: Device or resource busy The kernel still uses the old partitions. The new table will be used at the next reboot. Syncing disks.
Device or resource busy、そりゃそうだよな。
今作業している OS のディスクを消し飛ばしちゃったんだ。
/dev/sdb からも起動できるはずだが、/dev/sda にもブートローダ(grub)をインストールしておく。
# grub2-install /dev/sda Installing for i386-pc platform. grub2-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image.. Installation finished. No error reported. # dd if=/dev/sda count=1 | hexdump -C 1+0 records in 1+0 records out 512 bytes copied, 2.6132e-05 s, 19.6 MB/s 00000000 eb 63 90 00 00 00 00 00 00 00 00 00 00 00 00 00 |.c..............| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 |................| 00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |...........t...p| 00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......| 00000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 80 7d |. ..d|<.t...R..}| 00000090 e8 17 01 be 05 7c b4 41 bb aa 55 cd 13 5a 52 72 |.....|.A..U..ZRr| 000000a0 3d 81 fb 55 aa 75 37 83 e1 01 74 32 31 c0 89 44 |=..U.u7...t21..D| 000000b0 04 40 88 44 ff 89 44 02 c7 04 10 00 66 8b 1e 5c |.@.D..D.....f..\| 000000c0 7c 66 89 5c 08 66 8b 1e 60 7c 66 89 5c 0c c7 44 ||f.\.f..`|f.\..D| 000000d0 06 00 70 b4 42 cd 13 72 05 bb 00 70 eb 76 b4 08 |..p.B..r...p.v..| 000000e0 cd 13 73 0d 5a 84 d2 0f 83 d8 00 be 8b 7d e9 82 |..s.Z........}..| 000000f0 00 66 0f b6 c6 88 64 ff 40 66 89 44 04 0f b6 d1 |.f....d.@f.D....| 00000100 c1 e2 02 88 e8 88 f4 40 89 44 08 0f b6 c2 c0 e8 |.......@.D......| 00000110 02 66 89 04 66 a1 60 7c 66 09 c0 75 4e 66 a1 5c |.f..f.`|f..uNf.\| 00000120 7c 66 31 d2 66 f7 34 88 d1 31 d2 66 f7 74 04 3b ||f1.f.4..1.f.t.;| 00000130 44 08 7d 37 fe c1 88 c5 30 c0 c1 e8 02 08 c1 88 |D.}7....0.......| 00000140 d0 5a 88 c6 bb 00 70 8e c3 31 db b8 01 02 cd 13 |.Z....p..1......| 00000150 72 1e 8c c3 60 1e b9 00 01 8e db 31 f6 bf 00 80 |r...`......1....| 00000160 8e c6 fc f3 a5 1f 61 ff 26 5a 7c be 86 7d eb 03 |......a.&Z|..}..| 00000170 be 95 7d e8 34 00 be 9a 7d e8 2e 00 cd 18 eb fe |..}.4...}.......| 00000180 47 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64 20 |GRUB .Geom.Hard | 00000190 44 69 73 6b 00 52 65 61 64 00 20 45 72 72 6f 72 |Disk.Read. Error|
0xeb 0x63 0x90…うむ!! これは grub のシグニチャだな!
元の RAID に戻して rebuild する。
# mdadm --manage /dev/md1 --add /dev/sda1 mdadm: re-added /dev/sda1 # mdadm --detail /dev/md1 /dev/md1: Version : 1.0 Creation Time : Sun Jul 7 15:28:59 2013 Raid Level : raid1 Array Size : 52434816 (50.01 GiB 53.69 GB) Used Dev Size : 52434816 (50.01 GiB 53.69 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Sun Feb 7 10:33:57 2021 State : active, degraded, recovering Active Devices : 1 Working Devices : 2 Failed Devices : 0 Spare Devices : 1 Consistency Policy : bitmap Rebuild Status : 12% complete Name : linux:1 UUID : e15c3ef9:cce21e93:56a3c807:9db9fc4e Events : 169469 Number Major Minor RaidDevice State 3 8 1 0 spare rebuilding /dev/sda1 2 8 17 1 active sync /dev/sdb1 # cat /proc/mdstat md1 : active raid1 sda1[3] sdb1[2] 52434816 blocks super 1.0 [2/1] [_U] [=========>...........] recovery = 48.2% (25301056/52434816) finish=3.6min speed=124252K/sec bitmap: 1/1 pages [4KB], 65536KB chunk
良さそうだ。残りのパーティションも戻していこう。
# mdadm --manage /dev/md3 --add /dev/sda3 mdadm: re-added /dev/sda3 md3 : active raid1 sda3[3] sdb3[2] 1838156608 blocks super 1.0 [2/1] [_U] [=========>...........] recovery = 47.8% (880105408/1838156608) finish=130.8min speed=122039K/sec bitmap: 11/14 pages [44KB], 65536KB chunk
ここで祈りながら reboot する。
無事上がってきた
# df -hTl Filesystem Type Size Used Avail Use% Mounted on /dev/md1 ext4 50G 39G 9.7G 80% / /dev/md3 ext4 1.7T 1.6T 78G 96% /home # cat /proc/mdstat Personalities : [raid1] md3 : active raid1 sdb3[2] 1838156608 blocks super 1.0 [2/1] [_U] bitmap: 9/14 pages [36KB], 65536KB chunk md2 : active raid1 sdb2[2] 52428672 blocks super 1.0 [2/1] [_U] bitmap: 0/1 pages [0KB], 65536KB chunk md1 : active raid1 sdb1[2] sda1[3] 52434816 blocks super 1.0 [2/2] [UU] bitmap: 1/1 pages [4KB], 65536KB chunk
戻したはずの /dev/sdb3 が RAID から外れていた。焦らず ––add して、rebuild を走らせる。
# mdadm --manage /dev/md3 --add /dev/sda3 mdadm: added /dev/sda3 # mdadm --detail /dev/md3 /dev/md3: Version : 1.0 Creation Time : Sun Jul 7 15:29:00 2013 Raid Level : raid1 Array Size : 1838156608 (1753.00 GiB 1882.27 GB) Used Dev Size : 1838156608 (1753.00 GiB 1882.27 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Sun Feb 7 10:48:22 2021 State : clean, degraded, recovering Active Devices : 1 Working Devices : 2 Failed Devices : 0 Spare Devices : 1 Consistency Policy : bitmap Rebuild Status : 0% complete Name : linux:3 UUID : 3059cb0b:e04c1d35:d7ba2b87:76223746 Events : 293795 Number Major Minor RaidDevice State 3 8 3 0 spare rebuilding /dev/sda3 2 8 19 1 active sync /dev/sdb3 # cat /proc/mdstat Personalities : [raid1] md3 : active raid1 sda3[3] sdb3[2] 1838156608 blocks super 1.0 [2/1] [_U] [====>................] recovery = 23.4% (430663488/1838156608) finish=231.9min speed=101115K/sec bitmap: 8/14 pages [32KB], 65536KB chunk
よしよし
教訓
- データ消去を行うときは作業専用の PC を使う。(じつは前日まではそうしていたのだけど、この日に限って、何だか面倒になって手元の PC でやってしまった)
- ターミナルログを見ると、0.9 秒で Ctrl-C をしているのだから、3秒掛けてもう一度確認すれば気づけた可能性は高い。指差し確認大事。
- 万が一 RAID を組んでいなかったとしても、/home だけはパーティションを分けて物理的なアドレスを後半に位置しておくと、OS は消えても、データだけは助かる可能性が上がる。
- MBR と fdisk -l の出力は、どこかにバックアップしておくと良い。
ちなみに、この復旧方法が可能だったのは Linux の Software RAID だったから助かった可能性もある。ハードウエア RAID だったらダメだったかも。
本記事のような障害対応を見ていてワクワクしませんか!? しますよね!?
少しでもそう思ったら、ぜひ、募集要項もご覧ください!!
https://js01.jposting.net/iij/u/job.phtml?job_code=196 (でも本番環境でのオペミスだけは勘弁してください!)