ラベル 圧縮 の投稿を表示しています。 すべての投稿を表示
ラベル 圧縮 の投稿を表示しています。 すべての投稿を表示

2022年1月22日土曜日

ZFSで沼にはまって、データ移行の際にデータをロスト仕掛けた話

こんにちは、白虎21です。

皆さんは ファイルサーバを立てているでしょうか?

ご自身の手でファイルサーバを建てるなら、OSの候補に上がるのがLinuxかBSDだと思います。

その中で私はdebianを選択しました。


1.ファイルシステムとRAIDシステムの選定

それではファイルシステム(FS)は何が良いでしょうか?

Linuxだとext2,3,4やXFS,BtrFS,etc...たくさんあります。

ファイルサーバとなるとRAID組みたくなりますよね?

ただ、RAIDと聞くと、私の中では、構築が難しそうだったり、復旧が難しそうだったりと思う点がありました。そして、システムに一貫性がないと感じました。

細かいRAIDの話はArchLinuxのwikiに任せるのが一番だと思いますので、おいておきます→RAID - ArchWiki


上の憂慮した点を解消してくれるのがBtrFSとZFSでした。

私がファイルサーバを構築した際にBtrFSは当時事情があり、

「ZFSはライセンスが扱いにくいが、個人が使う分には大きく気にしなくてもよいだろう、それよりもBtrFSの技術的に問題がある方が問題である」と感じ、ZFSを選定しました。

 

2.ZFSのメリット

ZFSは簡単にストレージ(?)を作れます。

ZFSではストレージプールといいます。

これは作るのが非常に簡単です。

例えばHDD1,HDD2をつないだとします。

そうすると、

sudo zpool create tank HDD1 HDD2

でRAID 0のプールが作成されます。

もしも、RAID 1で作成したいのであれば、

sudo zpool create tank mirror HDD1 HDD2

でRAID 1のプールが作成されます。

ただ、要注意すべき点として、 HDD1やHDD2の表記に/dev/sdaなどのSATA指した順で変わるような指定の仕方はマウントの失敗などを招くため推奨されません。

/dev/disk/by-id/ata-*などのデバイスIDでの指定をおすすめします。

その他知りたい情報があれば、ArchLinuxのwikiに任せるのが一番だと思いますので、おいておきます→ZFS -ArchWiki

 

また、snapshotを取ることができます。

その他のメリットとして、Oracleと富士通の資料が充実しています。普通に扱う分には困らないでしょう()→ OracleのZFSの資料

 

3.ZFSの落とし穴

ZFSをLinuxで使うにはzfs-fuseとzfsutils-linuxがあります。

ubuntuなどで後者を使いましょう。

zfs-fuseで書かれている資料を私は見た記憶がありません。

debianは安定性を重視するので、後述するOpenIndianaやubuntuにバージョンで遅れを取っています。

特にzfs-fuseは0.70と大きく遅れを取っています。

zfsutils-linuxはdebianでも最低限2.0になっています。

システム的に今後はzfsutils-linuxしか更新されないと思うので、こちらを今後は使うようにしましょう。

 

4.ZFSでのデータ移行の失敗

私は安直に既存のプールに新しいHDDをmirrorでattachしました。

これはRAID0に当たります。

私の環境下では、つけたものは外せません。

その次に、ゴニョゴニョいじって、新しいHDDだけにして、zpoolをcreateして、古いプールからimportしました。

もとのプールにはアクセスできなくなりました。古いHDDには前のzpoolの情報が残っています。

 

mirror -

    4TBのやつ

    4TBのやつ

mirror - 

    8TBのやつ

    8TBのやつ


という情報が。

このプールの状況が

mirror -     UNAVAIL

    4TBのやつ    ONLINE

    4TBのやつ    UNAVAIL

mirror -     UNAVAIL

    8TBのやつ    UNAVAIL

    8TBのやつ    UNAVAIL


でした。

debianの環境では詰みました。

高っかいリカバリソフトは諦めました。


5.どのように復旧したか

極論、ググりました。

このサイトを参考にしました→ Turbocharging ZFS Data Recovery

ググった結果、ZFSの大元であるOracleのSolarisのOSS版のOpenSolarisの後継のOpenIndianaを用いて、最新のZFSが使える環境にして、ZFSが読み込めるか確かめました。

以下のコマンドはubuntuでは不可能でした、OpenIndianaを用いました。

zdb -dep /files -G datapool

→このコマンドで最後が「LOADED」になればOKです。

zpool import -f -d /files -o readonly=on datapool

→このコマンドで読み取りのみが可能になります。

 

 6.ZFSの移行方法

私が次、HDDの増設に失敗しないためのメモです。

ドキュメントから生成されているので必ずしも成功するとは限りません。

バックアップは取っておきましょう。

今回はnewHDD1とnewHDD2のRAID1へ移行します。

まず、新しいプールを作成します。

zpool create New_Pool mirror newHDD1 newHDD2

その後、そのプールにsend&receiveします。

zfs send Old_Pool|zfs recv New_Pool

その後、古いプールをepoxrtし、新しいものを好きな名前に変えます。

zpool export Old_Pool

zfs rename New_Pool What_You_Like_Name_Pool

 

7.その他参考資料

https://chibiegg.gitbooks.io/how-to-zfs/content/

https://ostanin.org/2013/06/14/importing-a-freebsd-zfs-pool-in-illumos/ 

2021年8月22日日曜日

ZIPで圧縮した画像をZIPで圧縮したまま、画像のリサイズするスクリプトを書きました

みなさん、お久しぶりです。白虎21です。

皆さんは「P1×1v Faиb0×」や「Faиt1a」、「Patre0и」などをご活用されていますでしょうか?

絵師さんをサポートしている場合、画像を見返りとして受け取ることが多いかと思います。

その場合、 画像をZIPで圧縮されたデータとして受け取ることがあるかと思います。

その圧縮されたデータをスマホで見ることがあるかと思いますが、画像サイズが大きくて読み込みに時間がかかったりすることがあるのではないかと思います。

そもそもにスマホでは画素数が多すぎても意味がないと思うところがあります。

そのため、ZIPで圧縮された画像を新たなファイルなどを生成することなく、画像のリサイズを行うことができるスクリプトを書きました。

https://github.com/WhiteTiger-21/python_resize_zip_images

このサイトの「zip.py」が上記の内容が可能なスクリプトです。

他のファイルは開発段階の副産物です。

 

利用方法は該当のZipファイルが存在するところでPowerShellやターミナルを開いて、pythonを実行できる状態にしてください。

そして、次のようなコマンドを入力します。

python zip.py 「任意のファイル」

 

具体例として、「Sample.zip」のイメージをリサイズしたい場合は、次のようになります。

python zip.py Sample.zip


ただし、このスクリプトが利用するにはいくつかの条件があります。

  1. 第一に実行環境である「python」と開発するにあたって使用したパッケージファイルが入っていること。
    pythonが入っていなければ、pythonをインストールする必要がありますが、ただ単にこのスクリプトをダウンロードして、実行したいだけであれば、マイクロソフトの「ストア」アプリから「python」をダウンロードしてください。
    マイクロソフトストアのPythonのダウンロードサイト

  2. MITライセンスに同意する。
    端的に言うと何が起こっても一切の責任を負いません。
    必ずバックアップを取ってください。
    そもそもスマホ向けに画像を圧縮するようなツールなので、劣化なしの元のデータをしっかり取っておいてください。

  3. gifファイルが含まれていないこと。
    gifファイルは連番によりアニメーションのようになっているものがあります。
    それに対する対処を行っていないためです。

  4. ディレクトリが入れ子構造になっていないこと。
    具体的には以下のようなディレクトリ構造となっていることが好ましいです。
        
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    `-- 09.png
     
    入れ子であったとしても、二分木などではなく、完全なる入れ子、マトリョーシカ状態になっていれば、一番階層の深いところから、一番上に来るだけです。

    具体例として問題のない例は、以下のように、完全なマトリョーシカ状態。

    他、二分木の状態になっていても、ファイル名が異なる状態。
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    |-- 09.png
    `-- Inside01
        |-- INSIDE_01.png
        |-- INSIDE_02.png
        |-- INSIDE_03.png
        |-- INSIDE_04.png
        |-- INSIDE_05.png
        |-- INSIDE_06.png
        |-- INSIDE_07.png
        |-- INSIDE_08.png
        `-- INSIDE_09.png
     
    上記の2つ所状態に値するものは問題ありません。
    しかし、以下のように、二分木状態であり、なおかつ、ファイル名が同じ場合、ファイルの上書きがされ、Inside03の中身のみが残ります。
        
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    |-- 09.png
    |-- Inside01
    |   |-- 01.png
    |   |-- 02.png
    |   |-- 03.png
    |   |-- 04.png
    |   |-- 05.png
    |   |-- 06.png
    |   |-- 07.png
    |   |-- 08.png
    |   `-- 09.png
    |-- Inside02
    |   |-- 01.png
    |   |-- 02.png
    |   |-- 03.png
    |   |-- 04.png
    |   |-- 05.png
    |   |-- 06.png
    |   |-- 07.png
    |   |-- 08.png
    |   `-- 09.png
    `-- Inside03
        |-- 01.png
        |-- 02.png
        |-- 03.png
        |-- 04.png
        |-- 05.png
        |-- 06.png
        |-- 07.png
        |-- 08.png
        `-- 09.png
    
    
  5.  

以上が利用するにあたっての利用条件です。

 

今回の記事は以上となります。

皆さんのお役に立つスクリプトとなれば幸いです。

また、改善点がございましたら、githubのREADME.mdにも記載している通り、Twitterにまでご連絡ください。