RのA様ありがとうございます.
LTOテープをLTFSにフォーマットしてデータを次々入れて、満タンになったのでテープを交換した.
そしたらそのLTOテープに入れていたデータが見えなくなった.....記録は確かにされていたのに
どうも取り出す際にejectコマンドを使ってLTOテープを吐き出していたのだが、ejectコマンドがLTFSのメタデータへの書き込みを完了する前にejectを実行してしまって
メタデータの内容が不良となって読めなくなるみたい. 幸い、メタデータ以降のデータパーティションは無事みたい.
まぁメタデータへの書き込みを十分待ってからejectすればいい話なのだが、いや、そもそも書き込み完了後にejectコマンドが働けよって思うが、、ejectが優先されるみたい.
っでそんなメタデータが破損したLTOテープからデータを取り出すお話.
LTFSはメタ領域とデータ領域の2つの領域、パーティションを持ってます。
mtコマンドは通常はこのパーティションを移動できなくて、下記コマンドを有効にする必要があります
mt -f /dev/nst0 stoptions can-partitions
あるいは
mt -f /dev/IBMtape0n stoptions can-partitions
パーティションを扱えるようになったmtコマンドでLTFSのデータ領域へ移動します
mt -f /dev/nst0 setpartition 1
mt -f /dev/IBMtape0n setpartition 1
まずこのLTFSなテープにどんなデータが入っているかを確認する。
そのデータはLTFSデータ領域の末尾にあるようで、mtコマンドを使って eod まで移る
mt -f /dev/nst0 eod
その後、最後のファイルの先頭に移動させる
mt -f /dev/nst0 bsfm 2
https://qiita.com/maya_shack/items/99b2e44705df79cce97d様の絵を拝借して
[<meta partition>][<--file 0-->|<--file 1-->|<--file 2-->|.......|<--file n -->|]
^
[<meta partition>][<--file 0-->|<--file 1-->|<--file 2-->|.......|<--file n -->|]
^--(mt -f /dev/nst0 setpartition 1)
[<meta partition>][<--file 0-->|<--file 1-->|<--file 2-->|.......|<--file n -->|]
^---(mt -f /dev/nst0 eod)
[<meta partition>][<--file 0-->|<--file 1-->|<--file 2-->|.......|<--file n -->|]
^---(mt -f /dev/nst0 bsfm 2)
この位置からddでデータを吸い上げる
dd if=/dev/nst0 of=/tmp/xml bs=524288
これで<--file n-->のデータが/tmp/xmlとしてサルベージされた.
っでこのxmlの中身ですが、まずテープ全体の部分が書かれてこんな感じ. 見やすいようにインデントを入れてます.
<?xml version="1.0" encoding="UTF-8"?>
<ltfsindex version="2.4.0">
<creator>IBM LTFS 2.4.3.1 (10461) - Linux - ltfs - Unmount</creator>
<volumeuuid>41c20e4b-b279-46a5-9ec0-11709cfff6a6</volumeuuid>
<generationnumber>56</generationnumber>
<updatetime>2021-05-18T09:19:09.772540875Z</updatetime>
<location>
<partition>b</partition>
<startblock>4288341</startblock>
</location>
<previousgenerationlocation>
<partition>b</partition>
<startblock>4287261</startblock>
</previousgenerationlocation>
<allowpolicyupdate>true</allowpolicyupdate>
<highestfileuid>5</highestfileuid>
<volumelockstate>unlocked</volumelockstate>
<directory>
<name>data6-21</name>
<readonly>false</readonly>
<creationtime>2021-05-18T03:55:22.627110842Z</creationtime>
<changetime>2021-05-18T09:18:36.673967707Z</changetime>
<modifytime>2021-05-18T09:18:36.673967707Z</modifytime>
<accesstime>2021-05-18T03:55:22.627110842Z</accesstime>
<backuptime>2021-05-18T03:55:22.627110842Z</backuptime>
<fileuid>1</fileuid>
<contents>
次にLTFSに書き込まれたファイル名とそのファイルを構成するセグメント(?)情報が記載されています
<file>
<name>data6.AAAAAAA.Arctica.SerialEM.data.180706.tar</name>
<length>1247920486400</length>
<readonly>false</readonly>
<creationtime>2021-05-18T03:59:29.395996320Z</creationtime>
<changetime>2021-05-18T06:37:00.692453018Z</changetime>
<modifytime>2021-05-18T06:37:00.692453018Z</modifytime>
<accesstime>2021-05-18T03:59:29.395996320Z</accesstime>
<backuptime>2021-05-18T03:59:29.395996320Z</backuptime>
<fileuid>2</fileuid>
<extentinfo>
<extent>
<fileoffset>0</fileoffset>
<partition>b</partition>
<startblock>7</startblock>
<byteoffset>0</byteoffset>
<bytecount>5450498048</bytecount>
</extent>
<extent>
<fileoffset>5450498048</fileoffset>
<partition>b</partition>
<startblock>10406</startblock>
<byteoffset>0</byteoffset>
<bytecount>9137291264</bytecount>
</extent>
<extent>
<fileoffset>14587789312</fileoffset>
<partition>b</partition>
<startblock>27837</startblock>
<byteoffset>0</byteoffset>
<bytecount>43149426688</bytecount>
</extent>
:
:
</extentinfo>
</file>
<file>
<name>00README.data6</name>
<length>12675</length>
<readonly>false</readonly>
<creationtime>2021-05-18T09:17:08.105078141Z</creationtime>
<changetime>2021-05-18T09:17:08.105317352Z</changetime>
<modifytime>2021-05-18T09:17:08.105317352Z</modifytime>
<accesstime>2021-05-18T09:17:08.105078141Z</accesstime>
<backuptime>2021-05-18T09:17:08.105078141Z</backuptime>
<fileuid>4</fileuid>
<extentinfo>
<extent>
<fileoffset>0</fileoffset>
<partition>b</partition>
<startblock>4287259</startblock>
<byteoffset>0</byteoffset>
<bytecount>12675</bytecount>
</extent>
</extentinfo>
</file>
<file>
<name>ls-lR.data6</name>
<length>564375329</length>
<readonly>true</readonly>
<creationtime>2021-05-18T09:18:36.673967707Z</creationtime>
<changetime>2021-05-18T09:18:48.882660370Z</changetime>
<modifytime>2021-05-18T09:18:48.882660370Z</modifytime>
<accesstime>2021-05-18T09:18:36.673967707Z</accesstime>
<backuptime>2021-05-18T09:18:36.673967707Z</backuptime>
<fileuid>5</fileuid>
<extentinfo>
<extent>
<fileoffset>0</fileoffset>
<partition>b</partition>
<startblock>4287263</startblock>
<byteoffset>0</byteoffset>
<bytecount>564375329</bytecount>
</extent>
</extentinfo>
</file>
</contents>
</directory>
</ltfsindex>
次に、実際にテープからデータを吸い出してみます. 「<extent>」部分がtarで言う所のファイル(正確には大本のファイルの断片)に該当します. ですが付随してxmlファイルも入っていて
テープの中身的には下記のようになっている.
[<meta partition>][<--file 0-->|<xml 0>|<--file 1-->|<xml 1>|<--file 2-->|<xml 2>|.......|<--file n -->|]
<file 0>の次には<xml 0>が入っている.
ひとつのファイルが全部入っているのではなく、断片として入って、その断片にxmlファイルが付随している状態.
断片をファイルに落として、そのファイルサイズから大本のファイルに必要な断片を見つけて「cat」コマンドで結合させオリジナルファイルにする必要があります
すっごい面倒だけど...
まず断片の数は「grep "<extent>" file-2 |wc -l」で得られます。その2倍の数のファイルをテープから引き出せばいいみたい
っで
先頭に移って
mt -f /dev/nst0 rewind
for i in $(seq 0 `grep "<extent>" /tmp/xml |wc -l`) ; do dd if=/dev/nst0 of=f$[i} bs=524288 ; dd if=/dev/nst0 of=x${i} bs=524288 ; done
これで各断片ファイル(f0,f1,f2,f3,....)が得られた.
各断片ファイルのサイズを見ると
[root@emfs lto_recover]# ls -l f0 f1 f2
-rw-r--r-- 1 root root 5450498048 Sep 28 14:39 f0
-rw-r--r-- 1 root root 9137291264 Sep 28 14:43 f1
-rw-r--r-- 1 root root 43149426688 Sep 28 15:23 f2
[root@emfs lto_recover]#
となる, これは冒頭のxmlファイルに記載した<bytecount>と一致します.
一致した断片ファイルを順番にcatで繋ぐと元のファイルになります
cat f0 f1 f2 f3 .... > data6.AAAAAAA.Arctica.SerialEM.data.180706.tar
得られた断片ファイルのサイズが、xmlに記載されたサイズより大きい時がある. 見たケースでは、大本ファイルの末端の断片ファイルでした(最後の断片ファイル).
その場合は、その断片ファイルからxmlに記載されたbyte分のファイルを作成して、削られたファイルをcatにくべるファイルにします
断片ファイル(f64)が サイズ「39797880832」byteでxml記載の値<bytecount> が「32076167168」なら
dd if=f64 of=f64-1 bs=524288 count=32076167168 iflag=count_bytes
としてf64-1(32076167168)のファイルを得る.
差し引かれた残りの部分は、次の大本のファイルにくべる.
その次のファイルにする部分の作成は下記のようにする
dd if=f64 of=f64-2 bs=524288 skip=32076167168 iflag=skip_bytes