hack のためのネタ帳, etc,,,

まとめ

btrfs が破損して mount 出来ず check --repair や rescue しても直らない場合でも、
mount -o recovery で mount 出来る場合がある。
ただし、checksum 破損してる状況だとデータ死んでるかも。

状況

VirtualBox に btrfs root で Ubuntu 20.04 LTS を入れてるのだが、
error: file `/@/boot/grub/i386-pc/normal.mod` not found.
Entering rescue mode...
grub rescue>
みたいに表示されて boot 出来ない。
/@/boot/grub 以下にアクセスできないようなので stage 2 が起動出来てない関係か、
grub rescue では history さえも機能しない。

Ubuntu Desktop 22.04.1 LTS の ISO から起動して確認してみると以下のような状況。
$ sudo parted /dev/sda u s p
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start  End        Size       Type     File system  Flags
 1      2048s  41940991s  41938944s  primary  btrfs
$ sudo btrfs check /dev/sda1
Opening filesystem to check...
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
bad tree block 6748028928, bytenr mismatch, want=6748028928, have=0
ERROR: could not setup csum tree
ERROR: cannot open file system
$ sudo mount -t btrfs /dev/sda1 /mnt
mount: /mnt: wrong fs type, bad option, bad superblock on /dev/sda1, missing codepage or helper program, or other error.
$ sudo dmesg | tail
...
[ 2845.726578] BTRFS info (device sda1): flagging fs with big metadata feature
[ 2845.726581] BTRFS info (device sda1): disk space caching is enabled
[ 2845.726582] BTRFS info (device sda1): has skinny extents
[ 2845.730399] BTRFS error (device sda1): bad tree block start, want 6748028928 have 0
[ 2845.730646] BTRFS warning (device sda1): failed to read root (objectid=7): -5
[ 2845.732122] BTRFS error (device sda1): open_ctree failed

btrfs rescue や btrfs check を一通り試してみるが以下のような感じで改善出来ない。
$ sudo btrfs rescue chunk-recover /dev/sda1
Scanning: DONE in dev0                       
Check chunks successfully with no orphans
Chunk tree recovered successfully
$ sudo btrfs rescue super-recover /dev/sda1
All supers are valid, no need to recover
$ sudo btrfs check --repair /dev/sda1
enabling repair mode
WARNING:

	Do not use --repair unless you are advised to do so by a developer
	or an experienced user, and then only after having accepted that no
	fsck can successfully repair all types of filesystem corruption. Eg.
	some software or hardware bugs can fatally damage a volume.
	The operation will start in 10 seconds.
	Use Ctrl-C to stop it.
10 9 8 7 6 5 4 3 2 1
Starting repair.
Opening filesystem to check...
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
bad tree block 6748028928, bytenr mismatch, want=6748028928, have=0
WARNING: could not setup csum tree, skipping it
Checking filesystem on /dev/sda1
UUID: 3d1784f5-18d7-4ef9-956b-728ef061a317
ERROR: chritical: global root [7 0] not uptodate, unable to check the file system
$ sudo btrfs check --repair --init-csum-tree --force /dev/sda1
enabling repair mode
Creating a new CRC tree
Opening filesystem to check...
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
bad tree block 6748028928, bytenr mismatch, want=6748028928, have=0
WARNING: could not setup csum tree, skipping it
Checking filesystem on /dev/sda1
UUID: 3d1784f5-18d7-4ef9-956b-728ef061a317
Reinitialize checksum tree
checksum verify failed on 6743769088 wanted 0x00000000 found 0xb6bde3e4
checksum verify failed on 6743769088 wanted 0x00000000 found 0xb6bde3e4
bad tree block 6743769088, bytenr mismatch, want=6743769088, have=0
ERROR: checksum tree refilling failed: -5
$ sudo btrfs check --repair --init-extent-tree --force /dev/sda1
enabling repair mode
Opening filesystem to check...
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
bad tree block 6748028928, bytenr mismatch, want=6748028928, have=0
WARNING: could not setup csum tree, skipping it
Checking filesystem on /dev/sda1
UUID: 3d1784f5-18d7-4ef9-956b-728ef061a317
Creating a new extent tree
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
bad tree block 6748028928, bytenr mismatch, want=6748028928, have=0
Error reading root block
error pinning down used bytes
ERROR: commit_root already set when starting transaction
extent buffer leak: start 6752075776 len 16384

btrfs checksum verify failed」でググって見つけた 参考にしたところ
mount 時に -o recovery 付けると mount 可能だった。

せめて、btrfs device add して balance 出来ないかと思い
一旦 VM 落として Utuntu.vdi と同サイズで Ubuntu_1.vdi 追加して、再度 ISO から起動してみたのだが
# parted /dev/sdb mklabel gpt mkpart btrfs 2048s 41940991s u s p
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End        Size       File system  Name   Flags
 1      2048s  41940991s  41938944s               btrfs

Information: You may need to update /etc/fstab.
# mount -t btrfs -o recovery /dev/sda1 /mnt
# btrfs f show
Label: none  uuid: 3d1784f5-18d7-4ef9-956b-728ef061a317
	Total devices 1 FS bytes used 18.26GiB
	devid    1 size 20.00GiB used 20.00GiB path /dev/sda1
# mount
...
/dev/sda1 on /mnt type btrfs (rw,relatime,ssd,space_cache,subvolid=5,subvol=/)

# btrfs dev add /dev/sdb1 /mnt
ERROR: error adding device '/dev/sdb1': Input/output error
# btrfs f show
Label: none  uuid: 3d1784f5-18d7-4ef9-956b-728ef061a317
	Total devices 2 FS bytes used 18.26GiB
	devid    1 size 20.00GiB used 20.00GiB path /dev/sda1
	devid    2 size 20.00GiB used 0.00B path /dev/sdb1
# mount
/dev/sda1 on /mnt type btrfs (ro,relatime,ssd,space_cache,subvolid=5,subvol=/)
みたいになり I/O error のせいで ro になってしまう。

仕方ないので を参考に
# unmount /mnt
# mkdir /mnt/sdb1
# mkfs.btrfs /dev/sdb1
btrfs-progs v5.16.2
See http://btrfs.wiki.kernel.org for more information.

NOTE: several default settings have changed in version 5.15, please make sure
      this does not affect your deployments:
      - DUP for metadata (-m dup)
      - enabled no-holes (-O no-holes)
      - enabled free-space-tree (-R free-space-tree)

Label:              (null)
UUID:               d5af5351-3141-4535-acca-311ba56b212a
Node size:          16384
Sector size:        4096
Filesystem size:    20.00GiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP             256.00MiB
  System:           DUP               8.00MiB
SSD detected:       yes
Zoned device:       no
Incompat features:  extref, skinny-metadata, no-holes
Runtime features:   free-space-tree
Checksum:           crc32c
Number of devices:  1
Devices:
   ID        SIZE  PATH
    1    20.00GiB  /dev/sdb1

# mount -t btrfs /dev/sdb1 /mnt/sdb1
# btrfs sub cre /mnt/sdb1/@
Create subvolume '/mnt/sdb1/@'
 btrfs sub cre /mnt/sdb1/@home
Create subvolume '/mnt/sdb1/@home'
してから btrfs restore 試してみたが、
# btrfs restore /dev/sda1 /mnt/sdb1
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
checksum verify failed on 6748028928 wanted 0x00000000 found 0xb6bde3e4
bad tree block 6748028928, bytenr mismatch, want=6748028928, have=0
WARNING: could not setup csum tree, skipping it
checksum verify failed on 6743703552 wanted 0x00000000 found 0xb6bde3e4
checksum verify failed on 6743703552 wanted 0x00000000 found 0xb6bde3e4
bad tree block 6743703552, bytenr mismatch, want=6743703552, have=0
ERROR: reading subvolume /mnt/sdb1/@ failed: 18446744073709551611
みたいな感じで、やはり bad tree block 6743703552 が原因で読めない。

結局、
# mount -t btrfs -o recovery /dev/sda1 /mnt/sda1
# rsync -PSauv --info=progress2 /mnt/sda1/ /mnt/sdb1/
みたいにしてみたところ、なんか読める範囲では読んでくれてるみたいなので、とりあえず rsync 終わるまでしばらく放置してみる。

結果
# btrfs fi show
Label: none  uuid: 3d1784f5-18d7-4ef9-956b-728ef061a317
	Total devices 1 FS bytes used 18.26GiB
	devid    1 size 20.00GiB used 20.00GiB path /dev/sda1

Label: none  uuid: d5af5351-3141-4535-acca-311ba56b212a
	Total devices 1 FS bytes used 16.57GiB
	devid    1 size 20.00GiB used 18.02GiB path /dev/sdb1

# rsync -PSauv --info=progress2 /mnt/sda1/ /mnt/sdb1/
sending incremental file list
              0   0%    0.00kB/s    0:00:00 (xfr#0, to-chk=0/323315)    

sent 9,121,565 bytes  received 45,634 bytes  797,147.74 bytes/sec
total size is 48,110,642,009  speedup is 5,248.13
# rsync -PSacv --info=progress2 /mnt/sda1/ /mnt/sdb1/
sending incremental file list
              0   0%    0.00kB/s    0:00:00 (xfr#0, ir-chk=1224/1253)
@/bin/btrfs-convert
        466,464   0%  413.60MB/s    0:00:00 (xfr#1, ir-chk=1220/1253)
rsync: [sender] read errors mapping "/mnt/sda1/@/bin/btrfs-convert": Input/output error (5)
@/bin/btrfs-find-root
WARNING: @/bin/btrfs-convert failed verification -- update discarded (will try again).
        900,224   0%  413.64MB/s    0:00:00 (xfr#2, ir-chk=1219/1253)
rsync: [sender] read errors mapping "/mnt/sda1/@/bin/btrfs-find-root": Input/output error (5)
@/bin/btrfs-image
WARNING: @/bin/btrfs-find-root failed verification -- update discarded (will try again).
      1,362,592   0%  422.74MB/s    0:00:00 (xfr#3, ir-chk=1218/1253)
rsync: [sender] read errors mapping "/mnt/sda1/@/bin/btrfs-image": Input/output error (5)
@/bin/bunzip2
      1,401,736   0%  326.39MB/s    0:00:00 (xfr#4, ir-chk=1213/1253)
rsync: [sender] read errors mapping "/mnt/sda1/@/bin/bunzip2": Input/output error (5)
@/bin/bzcat
WARNING: @/bin/btrfs-image failed verification -- update discarded (will try again).
      1,440,880   0%  335.72MB/s    0:00:00 (xfr#5, ir-chk=1211/1253)
rsync: [sender] read errors mapping "/mnt/sda1/@/bin/bzcat": Input/output error (5)
@/bin/bzdiff
...
みたいな感じで I/O error でコピーできんファイル多数。

このファイル引き継いでもあまり幸せになれそうにないので、捨てて Ubuntu 22.04.1 LTS 入れ直すことに。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます