RのA様ありがとうございます.

LTOテープをLTFSにフォーマットしてデータを次々入れて、満タンになったのでテープを交換した.
そしたらそのLTOテープに入れていたデータが見えなくなった.....記録は確かにされていたのに

どうも取り出す際にejectコマンドを使ってLTOテープを吐き出していたのだが、ejectコマンドがLTFSのメタデータへの書き込みを完了する前にejectを実行してしまって
メタデータの内容が不良となって読めなくなるみたい. 幸い、メタデータ以降のデータパーティションは無事みたい.

まぁメタデータへの書き込みを十分待ってからejectすればいい話なのだが、いや、そもそも書き込み完了後にejectコマンドが働けよって思うが、、ejectが優先されるみたい.

っでそんなメタデータが破損したLTOテープからデータを取り出すお話.

mtコマンドにパーティション切り替えが出来るようにする

LTFSはメタ領域とデータ領域の2つの領域、パーティションを持ってます。
mtコマンドは通常はこのパーティションを移動できなくて、下記コマンドを有効にする必要があります

mt -f /dev/nst0 stoptions can-partitions
 
あるいは
mt -f /dev/IBMtape0n stoptions can-partitions

LTFSデータ領域へ移動

パーティションを扱えるようになった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
最新の60件
2024-09-16 2024-09-14 2024-09-12 2024-09-09 2024-09-08 2024-09-06 2024-09-05 2024-09-04 2024-09-02 2024-09-01 2024-08-31 2024-08-28 2024-08-21 2024-08-18 2024-08-17 2024-08-16 2024-08-15 2024-08-14 2024-08-11 2024-08-09 2024-08-01 2024-07-27 2024-07-26 2024-07-16 2024-07-15 2024-07-12 2024-07-07 2024-06-22 2024-06-21 2024-06-17 2024-06-14 2024-06-11 2024-06-10 2024-06-08 2024-06-07 2024-06-02 2024-06-01 2024-05-30 2024-05-16 2024-04-26 2024-04-15 2024-04-11

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-10-03 (火) 22:33:14