差分FTPを考える(2

まずは以前作ったディレクトリFTPのPerlスクリプトです。

 

#!/usr/local/bin/perl

#use strict;
use Net::FTP;


# 引数を読み取る
if ($#ARGV ne 4 ){
    print "引数が誤っています。\n";
    print "$0 [hostname] [user] [password] [fromdir] [todir]\n";
    exit 1;
}

my $hostname=$ARGV[0];
my $user    =$ARGV[1];
my $password=$ARGV[2];
my $from    =$ARGV[3];
my $to      =$ARGV[4];

my $from_dir =`dirname $from`;
my $from_base=`basename $from`;

my $ret;

chomp $from_base;
chomp $from_dir;

my $ret=chdir("$from");
system("pwd");

# 接続
my $ftp= Net::FTP->new(qq($hostname), Debug => 0);
   $ftp->login($user , $password );
   $ftp->binary();
   $ret=$ftp->cwd($to );
   if($ret eq ''){
     print qq(cwd error \[$to\]\n);
     exit 1;
   }
print qq($ret : $from\n);

# ディレクトリをfindで検索してput先にmkdirする。
print qq(/usr/bin/find . -type d\n);
open (DIRNAME,qq(/usr/bin/find . -type d|));
while (){
  chomp;
  print qq($_\n) unless($_ eq '.');
  $ftp->mkdir($_);
}
close DIRNAME;

# ファイルをfindで検索してput先にputする。
open (FNAME,qq(/usr/bin/find . -type f|));
while (){
  chomp;
  print qq($_\n) unless($_ eq '.');
  my $dn=`dirname $_`;
  my $fn=`basename $_`;
  chomp($dn);
  chomp($fn);
 print qq(DIR $dn\nFILE $fn\n);
 $ftp->cwd($dn);
 if($ret eq ''){
   print qq(cwd error \[$dn\]\n);
   exit 1;
 }
 $ret=$ftp->put($_);
 if($ret eq ''){
   print qq(put error \[$_\]\n);
   exit 1;
 }
 $ftp->cwd($to);
}
close FNAME;

1;

perlスクリプトではありますが、
Linuxコマンドをいくつか使っているので、Windowsでは動作しません。
今見るとfindをフルパスで指定していたり、駄目ですね^^;
なぜわざわざfindを使っているかというと、ファイルのフルパスでの取得が綺麗にできるからです。
このスクリプトの欠点は、前にもいいましたが、すべてのファイルを転送してしまう点です。
これをファイルの変更がなかったら何も転送しないように修正していこうと思います。

続きます。

差分FTPを考える

WordPress(ワードプレス)のバックアップはデータベースのバックアップだけでは足りません。写真ファイルやプラグインもバックアップしたいところです。

さて、通常日次的なデータを他のサーバーにバックアップする場合、
tarでアーカイブして転送する、という方法が一般的です。

ところがこの方式はtarアーカイブするためのディスク容量とIOのリソースが必要です。
これが意外に馬鹿にならないです。

これを解決するためには、アーカイブせずにあるディレクトリ配下を全て転送することです。

しかしながらデフォルトのFTPコマンドでは*(アスタリスク)は使えませんし、ディレクトリの転送にも対応していません。

NCFTPコマンドを使えばディレクトリをそのまま転送することができます。

> put -R bar

試しにやってみましたが、とても便利だと感じました。

ところが、NCFTPで日次のバックアップをしようと考えた時、イマイチです。
なぜかといいますと、全てのファイルを転送してしまうからです。
出来たら、とあるディレクトリ配下のその日に更新されたファイルのみの転送をしたいところですよね。更新されたファイルがない日は何もしない、というのが理想です。

差分FTPを考える

実は昔一度作ったはずなのですが、紛失・・・。
というわけで作成したいと思います。

  1. 指定したディレクトリ配下のファイルリストを作る
  2. ファイルはcksumコマンドの実行結果を付与
  3. 前回のファイルリストと今回のフィアルリストを比べる
  4. ディレクトリリストを取得
  5. ディレクトリのみを送信先に作成する
  6. 変化のあるファイルのみを転送する

こんな動きでいいでしょう。

前回のファイルが存在しない場合は全てのファイルの転送となります。
また、日次実行前に削除されたファイルは転送先には残ってしまいます。が、これは仕様とします。

次回に続きます。

indiegalaの無料ゲームが何故かゲットできなかった件(Hrizon Shift)

indiegalaというサイトがあります。

https://www.indiegala.com
言わずと知れたsteamなどのゲームを安売りしているサイトです。鍵屋、とはちょっと違うようで、個人とのやり取りではありません。
ここで、たまにゲームが無料で配布されるのです。
と言うか知ってから毎日更新されています。もしかして毎日1つプレゼントされてるのでしょうか・・・?

今のところ3つもゲットしたのですが、一つゲットできませんでした。
どうも気になったのでこのことを書いておきます。

ライブラリに追加されない

9/17にHrizon Shiftというゲームが無料提供として公開されていました。

https://www.indiegala.com のストアの下の方に行くと
Mass GIVEWAY という表示があります。
そこのxボタンを押すと、Claim Free COPY というボタンが出てくるので、
これを押すと取得できるのです。

うまくいくとこんな画面が出ます。

ところがちっともライブラリに追加されません。
実はこの前にも他のゲームはゲットしているので間違いないはずです。
それでも何か間違っているのかと、3?4回は捜査をしたのですが、とうとう追加されず提供期限が終わってしまいました。

メール!

日本語対応はないでしょうが、少し気になったので、メールしてみました。返事は来るでしょうか ^^;

 

9月16日に[Hrizon Shift]が[Mass GIVEWAY]とあり
[Claim Free COPY]ボタンを押すと以下の表示が出ましたが、
待ってもライブラリに追加されませんでした。
[Please be patient, it may require up to 1 hour due to high traffic load.]
4?5回は試したのですが、駄目でした。
これはどういうことだったのでしょうか?

これを変換して、こんな感じで出してみました。

[Hrizon Shift]

Dear sales representative

[Hrizon Shift] is [Mass GIVEWAY] on September 16
When the [Claim Free COPY] button is pressed, the following display is displayed,
I did not add it to the library after waiting.

[Please be patient, it may require up to 1 hour due to high traffic load.]

I tried 4-5 times, but it was useless.

What was this like?

通じますかね 汗

何事も経験です!返事を待ちます!
——–
9/18 追記
返事が来ました。

Hi,

We are sorry but we have run out of keys for this giveaway.

Thank you.
こんにちは、

私たちは申し訳ありませんが、我々は、このプレゼントのためのキーが不足しています。

ありがとうございました。

ということでした。
期限内でもキーが尽きると上記のように画面が出てもキーが取得できないみたいです。
ま、無料なんだし文句言うなって感じかな・・・。

raspberrypi php7+NGinxでワードプレスを運用していたけどアップデートしたら動かなくなった

しばらく実行していなかったので、
raspbianのアップデートアップグレードを実行しました。

sudo apt update
sudo apt upgrade -y

すると、、、やってしまいました。WordPressが開けなくなりました。

Your PHP installation appears to be missing the MySQL extension which is required by WordPress.
あなたのPHPのインストールには、ワードプレスによって要求されたMySQLの拡張を利用できないようです。

MySQLの拡張?

php-mysqlというのが入っていないのでしょうか
今まで動いていたのに、おかしいですね・・・。

$ sudo apt-get install php-mysql
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
php-mysql はすでに最新版です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 1 個。

インストール済み・・・がっかり。

phpになんのモジュールが入っているかは-mでわかるそうです。

php -m|grep mysql

無い・・・mysqlのモジュールが入ってい無いと・・・?
php-mysqlはインストールされているのに、phpに入ってないということは、バージョン違い??

試しにさくらインターネット(ベーシック)にて試してみると・・・

$ php -m|grep mysql
mysqli
mysqlnd
pdo_mysql

ちゃんと入っていますね。

試しにphp関連のパッケージを確認してみます。

$ dpkg -l|grep php
ii dh-php 0.21~bpo8+1 all debhelper add-on to handle PHP PECL extensions
ii php-common 1:53+0~20170804100549.2+jessie~1.gbpa3f349 all Common files for PHP packages
ii php-mysql 1:7.1+53+0~20170804100549.2+jessie~1.gbpa3f349 all MySQL module for PHP [default]
ii php-pear 5.6.30+dfsg-0+deb8u1 all PEAR - PHP Extension and Application Repository
ii php5 5.6.30+dfsg-0+deb8u1 all server-side, HTML-embedded scripting language (metapackage)
ii php5-cgi 5.6.30+dfsg-0+deb8u1 armhf server-side, HTML-embedded scripting language (CGI binary)
ii php5-cli 5.6.30+dfsg-0+deb8u1 armhf command-line interpreter for the php5 scripting language
ii php5-common 5.6.30+dfsg-0+deb8u1 armhf Common files for packages built from the php5 source
ii php5-fpm 5.6.30+dfsg-0+deb8u1 armhf server-side, HTML-embedded scripting language (FPM-CGI binary)
ii php5-json 1.3.6-1 armhf JSON module for php5
ii php5-mysql 5.6.30+dfsg-0+deb8u1 armhf MySQL module for php5
ii php5-readline 5.6.30+dfsg-0+deb8u1 armhf Readline module for php5
ii php7.0 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 all server-side, HTML-embedded scripting language (metapackage)
ii php7.0-cli 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 armhf command-line interpreter for the PHP scripting language
ii php7.0-common 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 armhf documentation, examples and common module for PHP
ii php7.0-dev 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 armhf Files for PHP7.0 module development
ii php7.0-fpm 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 armhf server-side, HTML-embedded scripting language (FPM-CGI binary)
ii php7.0-json 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 armhf JSON module for PHP
rc php7.0-mysql 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 armhf MySQL module for PHP
ii php7.0-opcache 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 armhf Zend OpCache module for PHP
ii php7.0-readline 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 armhf readline module for PHP
ii php7.1-common 7.1.8-2+0~20170804100723.7+jessie~1.gbpae7f04 armhf documentation, examples and common module for PHP
ii php7.1-mysql 7.1.8-2+0~20170804100723.7+jessie~1.gbpae7f04 armhf MySQL module for PHP
ii pkg-php-tools 1.28 all various packaging tools and scripts for PHP packages

あれれ?なにかおかしいです。
まずphpのバージョンが7.0です。

$ php -v
PHP 7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206 (cli) (built: Aug 10 2017 14:34:58) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206, Copyright (c) 1999-2017, by Zend Technologies

それなのにいくつか7.1用のモジュールが入っていますね。
しかも、当該の「php7.0-mysql」は削除(rc)されてしまっています。
php7.1-mysqlがインストールされていますが、おそらくこれだとバージョン違いになってしまうのでしょう。

古いバージョンが入るかどうか不安ですがインストールしてみます。

$ sudo apt-get install php7.0-mysql
[sudo] password for mlin:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
php7.0-mysql
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 1 個。
105 kB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 432 kB のディスク容量が消費されます。
以前に未選択のパッケージ php7.0-mysql を選択しています。
(データベースを読み込んでいます ... 現在 118917 個のファイルとディレクトリがインストールされています。)
.../php7.0-mysql_7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206_armhf.deb を展開する準備をしています ...
php7.0-mysql (7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206) を展開しています...
php7.0-fpm (7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206) のトリガを処理しています ...
php7.0-mysql (7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206) を設定しています ...
php7.0-fpm (7.0.22-2+0~20170804100528.5+jessie~1.gbpdea206) のトリガを処理しています ...

入った!

そして、無事起動!!Wordpressが開きました!

モジュールさえ入ってしまえば再起動は不要なようでした。

あー、よかった 汗

[windows10]インターネットが繋がらなくなった時(3)

「エラー1608 依存関係サービスまたは、グループを起動できませんでした。」の
エラーが発生した場合は、socket接続をリセットすることによって改善することがあります。

socket接続をリセットする

上記エラーが出てNetWork List Serviceが起動できない時に有効と思われるコマンドがあります。

> netsh winsock reset

スタックしてしまったTCP/IPの接続をリセットするもので、セキュリティソフトなどによって強制的に外部との通信が遮断された場合などにスタックしてしまって復旧しないTCP/IP接続をリセットすることで正常に利用することが出来るようにする、Windows特有のコマンドです。

ということです。

ただ、私の拝見したPCでは改善しませんでした。

問題のトラブルシューティング

ネットワークと共有センターに「問題のトラブルシューティング」があります。

これさえ実行すれば問題が解決する・・・と良いのですが。
残念ながらほとんど解決しません。

誰か解決した人がいるのなら教えてほしいくらいです・・・。

サービスの起動

「エラー1608 依存関係サービスまたは、グループを起動できませんでした。」のエラーの件がありましたが、
このエラーだと、依存関係サービスがいったい何なのかわかりません。

そこで、とりあえずすべてのサービスを起動してみます。

コルタナで

msconfig

と入力すると”システム構成”が出てくるので起動します。

サービスタブで「すべて有効」をクリックして、再起動します。

これで、見事にネット接続が可能となりました。

どのサービスがネット接続に必要か

ネット接続に最低限必要なサービスは以下の2つです。

  1. NetWork Store Interface Service
  2. DHCP Client

(もしかしたらDHCPはプライベートIPを固定にするなら不要かも)

NetWork Store Interface Serviceを起動すると、
「IPドライバーにアクセスできません。一般エラーです。」のエラーが
「転送に失敗しました。一般エラーです。」に変化します。DHCPを起動するとこれも治ります。

なお、以下は勝手に起動します。

  • RPC Endpoint Mapper
  • Group Policy client

 

[windows10]インターネットが繋がらなくなった時(2)

次は不具合がある場合です。

pingでエラー

私が拝見したPCはこのような状況でした。

>ping 192.168.0.1

IPドライバーにアクセスできません。一般エラーです。

この様なエラーは見たことがなかったので、少し戸惑いました。

このエラーの内容から、
イーサネットアダプタが故障したか、ドライバが壊れたか、して認識していないのでしょうか?

ipconfigでエラー

エラーと書きましたが、私が拝見したPCではエラーも表示されませんでした。

>ipconfig

Windows IP 構成

このように「Windows IP 構成」とポツンと出るだけでした。

デバイスマネージャ

IPドライバーにアクセスできない、状態なので認識が出来ていないと思われます。
そこでデバイスマネージャを開きます。
しかし、このときはネットワークアダプタとして認識されていました。
デバイスの状態は
「このデバイスは正常に動作しています。」
となっています。
こういうときはデバイスを一度削除すると認識し直して動作することがあります。
そこで、右クリックから削除を行いましたが
削除後、更新するとたちまち認識されてしまう感じでした。
以前はハードウエアの更新をする必要があったのですけどね。

ネットワーク設定

ネットワーク設定を確認します。
[すべての設定]→[ネットワークとインターネット]→[ネットワークと共有センター]
で開きます。

コントロールパネルの場合は
[ネットワークとインターネット]→[ネットワークと共有センター]
です。

私が拝見したPCはここが異常状態でした。
単に「不明」と表示していました。
デバイスマネージャにはきっちり認識されているのに、どういうことなのでしょうか。

この設定画面には
「この状態を検出するサービスが無効になっています」
とあります。そこには「詳細情報」のリンクがあります。
これをクリックすると「NetWork List Serviceを有効にしますか」とでるので有効にしてみます。

「エラー1608 依存関係サービスまたは、グループを起動できませんでした。」
エラーが表示されます。

どうやらこの状態(不明状態)ではNetWork List Serviceとやらは起動できないようです。

 

続きます。

 

[windows10]インターネットが繋がらなくなった時(1)

以前「インターネットに繋がらなくなっちゃった」という依頼でなんとか繋がるところまで言ったのですが、ちょっと忘れかけていたのでメモしておきます。

意外と、ネットが急に繋がらなくなる、ってあるのですよね。

まずはモデム・ルーターを疑う

そもそもモデム・ルーターと言った機器が壊れていたら、ソフトでどうしようもありません。
今はパソコンだけじゃなくて、スマホが数台あったりするので、そもそもモデム・ルーターがまともに動いているかを、複数台で確認します。
どれかが繋がっていれば、モデム・ルーターは問題ないといえます。

ただし・・・。ルーターは結構調子が悪くなる機器で、使用不可能(再起動すれば復帰します)にする方法もあります。なので、今つながっていても、すぐ繋がらなくなるようだと、ルーターが壊れかけていることも結構あります。こういう場合は再起動直後には繋がったりするので、一度コンセントを抜いてみると良いと思います。やがて繋がらなくなるなら、買い替えを考えたほうが良いかもしれません。

手始めにはブラウザを起動してみる

もちろん、それができなくなったから、繋がらなくなったと思っているのですから
試し済みかと思います。
でも、起動してみて、どんなエラーかを確認しておきます。
また、出来たら、IE、Edge、以外のChromeやFirefoxでも試します。
これで繋がったら、ブラウザの設定がおかしくなっている可能性が高いです。
ネットがつながっていない状態だとインストール出来ませんね。
なので、壊れる前から、ChromeとFirefoxくらいはインストールしておくことを強くおすすめします。

コマンドプロンプトでチェック

コマンドプロンプトでルーターにpingを打ってみます。

> ping 192.168.0.1

以下のように出たら正常です。

192.168.0.1 に ping を送信しています 32 バイトのデータ:
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=255
192.168.0.1 からの応答: バイト数 =32 時間 =1ms TTL=255
192.168.0.1 からの応答: バイト数 =32 時間 =1ms TTL=255
192.168.0.1 からの応答: バイト数 =32 時間 =1ms TTL=255

192.168.0.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 1ms、平均 = 0ms

そしてネットワーク設定を確認します。

> ipconfig

正常ならこのように出ます。

Windows IP 構成
イーサネット アダプター イーサネット:

   接続固有の DNS サフィックス . . . . .:
   IPv6 アドレス . . . . . . . . . . . .: xxxx:x:xxx0:xxxx:xxxx:xxx:xxxx:xxxx
   一時 IPv6 アドレス. . . . . . . . . .: xxxx:x:xxx0:xxxx:xxxx:xxx:xxxx:xxxx
   リンクローカル IPv6 アドレス. . . . .: xxxx:x:xxx0:xxxx:xxxx:xxx:xxxx:xxxx
   IPv4 アドレス . . . . . . . . . . . .: 192.168.0.xx
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: xxxx:x:xxx0:xxxx:xxxx:xxx:xxxx:xxxx
                                          192.168.0.1

ネットに繋がらない場合はいろいろなエラーが出ます。

続きます。

extundeleteでファイル復旧にチャレンジ![raspberry Pi]

それほど重要なファイルというわけではないのですが、
はずみでrmして、うっかりファイルを消してしまいました。
たまにやってしまいますね 汗
こういうときのためにrmは使わないで、
要らないファイルはどこかにmvしておく形式にしたほうが良い、とは思っているものの
またやってしまいました。

そこで、試しに復旧方法を調べてみると、なかなか良さそうなものがありました。

extundeleteで簡単復旧?!

extundeleteというので簡単に復旧できるそうです。
てなわけで、実行してみたいわけですが、コンパイルしないといけません。
本当は復旧したいディスクはリードオンリーにして使わないことが鉄則ですが、
起動ドライブであるためそうは行かず、
それでも一応USBメモリをさして、そこでコンパイルすることにしました。

 

> wget https://sourceforge.net/projects/extundelete/files/extundelete/0.2.4/extundelete-0.2.4.tar.bz2/download
> tar -zxvf extundelete-0.2.4.tar.bz2
> cd extundelete-0.2.4
> sudo ./configure
Configuring extundelete 0.2.4
configure: error: Can't find ext2fs library

ext2fsがないのでインストールします。
(実際はこういうことを復旧したいドライブでやるのはNGです)

$ sudo apt-get install ext2fs-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
Note, selecting 'e2fslibs-dev' instead of 'ext2fs-dev'
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  dc libasn1-8-heimdal libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal
  libheimntlm0-heimdal libhx509-5-heimdal libkrb5-26-heimdal libroken18-heimdal libwind0-heimdal
  libxfce4ui-1-0 xfce-keyboard-shortcuts
これを削除するには 'apt-get autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  comerr-dev e2fslibs e2fsprogs libcomerr2
提案パッケージ:
  doc-base gpart e2fsck-static
以下のパッケージが新たにインストールされます:
  comerr-dev e2fslibs-dev
以下のパッケージはアップグレードされます:
  e2fslibs e2fsprogs libcomerr2
アップグレード: 3 個、新規インストール: 2 個、削除: 0 個、保留: 282 個。
1,190 kB のアーカイブを取得する必要があります。
この操作後に追加で 798 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main e2fslibs armhf 1.42.12-2 [173 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main e2fsprogs armhf 1.42.12-2 [728 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ jessie/main libcomerr2 armhf 1.42.12-2 [59.7 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ jessie/main comerr-dev armhf 2.1-1.42.12-2 [37.6 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ jessie/main e2fslibs-dev armhf 1.42.12-2 [192 kB]
1,190 kB を 2秒 で取得しました (435 kB/s)
(データベースを読み込んでいます ... 現在 125349 個のファイルとディレクトリがインストールされています。)
.../e2fslibs_1.42.12-2_armhf.deb を展開する準備をしています ...
e2fslibs:armhf (1.42.12-2) で (1.42.12-1.1 に) 上書き展開しています ...
e2fslibs:armhf (1.42.12-2) を設定しています ...
libc-bin (2.19-18+deb8u4) のトリガを処理しています ...
(データベースを読み込んでいます ... 現在 125349 個のファイルとディレクトリがインストールされています。)
.../e2fsprogs_1.42.12-2_armhf.deb を展開する準備をしています ...
e2fsprogs (1.42.12-2) で (1.42.12-1.1 に) 上書き展開しています ...
man-db (2.7.0.2-5) のトリガを処理しています ...
e2fsprogs (1.42.12-2) を設定しています ...
(データベースを読み込んでいます ... 現在 125349 個のファイルとディレクトリがインストールされています。)
.../libcomerr2_1.42.12-2_armhf.deb を展開する準備をしています ...
libcomerr2:armhf (1.42.12-2) で (1.42.12-1.1 に) 上書き展開しています ...
libcomerr2:armhf (1.42.12-2) を設定しています ...
libc-bin (2.19-18+deb8u4) のトリガを処理しています ...
以前に未選択のパッケージ comerr-dev を選択しています。
(データベースを読み込んでいます ... 現在 125349 個のファイルとディレクトリがインストールされています。)
.../comerr-dev_2.1-1.42.12-2_armhf.deb を展開する準備をしています ...
comerr-dev (2.1-1.42.12-2) を展開しています...
以前に未選択のパッケージ e2fslibs-dev を選択しています。
.../e2fslibs-dev_1.42.12-2_armhf.deb を展開する準備をしています ...
e2fslibs-dev (1.42.12-2) を展開しています...
man-db (2.7.0.2-5) のトリガを処理しています ...
install-info (5.2.0.dfsg.1-6) のトリガを処理しています ...
comerr-dev (2.1-1.42.12-2) を設定しています ...
e2fslibs-dev (1.42.12-2) を設定しています ...

リベンジ!
prefixでUSBドライブの中を指定しています。

$ sudo ./configure -prefix=/media/usb0/src/extundelete-0.2.4/src
Configuring extundelete 0.2.4
Writing generated files to disk

成功した・・・?!

$ sudo make
make -s all-recursive
Making all in src
extundelete.cc: In function ‘ext2_ino_t find_inode(ext2_filsys, ext2_filsys, ext2_inode*, std::string, int)’:
extundelete.cc:1272:29: warning: narrowing conversion of ‘search_flags’ from ‘int’ to ‘ext2_ino_t {aka unsigned int}’ inside { } [-Wnarrowing]
    buf, match_name2, priv, 0};
                             ^

成功したのでしょうか・・・?

$ sudo make install
Making install in src
  /usr/bin/install -c extundelete '/media/usb0/src/extundelete-0.2.4/src/bin'

指示の通り /media/usb0/src/extundelete-0.2.4/src/bin にちゃんとバイナリができてました。
なんとか成功したっぽいです。

2:30頃のエポック時間です。

$ date -d "14:30" +%s
1501997400

指定して実行してみました。

$ ./extundelete --after 1501997400 --restore-all /dev/root
Only show and process deleted entries if they are deleted on or after 1501997400 and before 2147483647.
./extundelete: No such file or directory  /dev/root
./extundelete: No such file or directory when trying to open filesystem /dev/root

ところが「/dev/rootなんかないよ」と言われてしまいます。
どうやら起動しているシステムドライブは対象にできないようです・・・?sudoしてみても同じでした。

試しに接続してるUSBドライブでやってみます。

$ sudo ./extundelete /dev/sda1 --restore-all
./extundelete: Bad magic number in super-block when trying to open filesystem /dev/sda1

FATではだめってことです・・・。

仕方ないので、一度rpi-cloneでクローンドライブを作って、そのドライブに対して実行してみます。

$ sudo ./extundelete --after 1500000400 --restore-all /dev/sdb2
Only show and process deleted entries if they are deleted on or after 1500000400 and before 2147483647.
NOTICE: Extended attributes are not restored.
WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set.
The partition should be unmounted to undelete any files without further data loss.
If the partition is not currently mounted, this message indicates
it was improperly unmounted, and you should run fsck before continuing.
If you decide to continue, extundelete may overwrite some of the deleted
files and make recovering those files impossible.  You should unmount the
file system and check it with fsck before using extundelete.
Would you like to continue? (y/n)
y
Loading filesystem metadata ... 476 groups loaded.
Loading journal descriptors ... 32574 descriptors loaded.
Searching for recoverable inodes in directory / ...
4 recoverable inodes found.
Looking through the directory structure for deleted files ...
4 recoverable inodes still lost.
Unable to restore inode 3612833 (file.3612833): No undeleted copies found in the journal.
Unable to restore inode 3620865 (file.3620865): No undeleted copies found in the journal.
Unable to restore inode 3620897 (file.3620897): No undeleted copies found in the journal.
Unable to restore inode 3620898 (file.3620898): No undeleted copies found in the journal.

 

実行したドライブにRECOVERED_FILESというフォルダが作られます。
で、その中にファイルが吐き出されるはずなのですが・・・。
残念なことに、復活ならずででした。フォルダは空っぽ・・・。

extundelete というコマンドの有効性については気になりますので、もう一度検証はしたいと思います。

raspberry pi に最適なメモリ容量

ラズパイのメモリはなるべく大きい方がいいと思ってきましたが、
今回のように壊れてみると、印象がガラッと変わります。
SDのカードは一部が壊れるということがなくて、一気にすべての領域へのアクセスが不可能となってしまいます。なので、システムに使うSDカードはなるべく小さいものにしておいて、
データ領域はUSBメモリか、別のSDをカードリーダに挿して使うようにしたほうが良さそうです。USBが4ポートもあるけど全て空いていますしね・・・。

価格調査をしてみる

楽天、アマゾンで調べると最安価格は以下のような感じでした。

8GB・・・600円程度
16GB・・・800円程度
32GB・・・1500円程度
64GB・・・2500円程度

1GBあたりの価格は64GBが最も安いです。
ところが64GBが一気にダメになるのは結構キツイです。
システムだけなら8GBでも行けそうですが、1GBあたり75円となって結構高いです。
また、8GBと16GBは200円しか違いません。

16GBと32GBでは、
16GB・・・1GBあたり50円
32GB・・・1GBあたり47円
であまり変わらないので、16GBという選択が現状は良さそうですね。

16GBだと容量的には心もとないのでUSBメモリを追加したいですけど、
USBメモリであれば、64GBで2000円を切るくらいであるようです。

とすると

16GBのmicroSD x2(1枚はバックアップ用)

64GBのUSBメモリ

という組み合わせが良いような気がしますね!

バックアップは絶対やったほうが良い

今までよくバックアップせずにきたな・・・と思いましたよ。
バックアップした直後に壊れるなんて恐ろしすぎました 汗
私はストレージ的にはラジコの録音が一番圧迫しています。
これをUSBメモリに移動するようにすると、急にシステムが壊れてもすぐにWinPCにて認識できるのが良いですね。
このUSBメモリの方は壊れないのか・・・?っていうのも気にはなりますね・・・。ストレージとして単純にデータを貯めていくだけなら大丈夫そうではありますが。
多分システムとして使ったばあいの読み書きが多いのが問題なんだろうと思います。
実はスワップもそのままで1年半くらいで壊れたことになるので、
スワップを削除して、RAMディスクに変更したので、もう少し寿命は伸びてくれるかな?と期待はしています。

nginxが起動しなくなった[raspberry pi]

突然RaspberryPiのNginxが起動しなくてかなり焦ったのでメモしておきます。

起動しない

再起動すると起動しなくなっていた。
自動起動がうまく行かなかったのかと、
sudo service nginx start
するも起動しません。

検証

エラーは以下のとおりです。

Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.

このメッセージは

‘systemctl status nginx.service’ と ‘journalctl -xn’ で詳細を調べろ!

ってことらしいです。

$ sudo systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: exit-code) since 水 2017-08-02 22:58:37 JST; 18s ago
  Process: 2756 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 654 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 2759 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
 Main PID: 657 (code=exited, status=0/SUCCESS)

 8月 02 22:58:37 raspberrypi nginx[2759]: nginx: [alert] could not open error log file: open(...ry)
 8月 02 22:58:37 raspberrypi nginx[2759]: 2017/08/02 22:58:37 [emerg] 2759#0: open() "/var/lo...ry)
 8月 02 22:58:37 raspberrypi nginx[2759]: nginx: configuration file /etc/nginx/nginx.conf tes...led
 8月 02 22:58:37 raspberrypi systemd[1]: nginx.service: control process exited, code=exited s...s=1
 8月 02 22:58:37 raspberrypi systemd[1]: Failed to start A high performance web server and a ...er.
 8月 02 22:58:37 raspberrypi systemd[1]: Unit nginx.service entered failed state.
Hint: Some lines were ellipsized, use -l to show in full.

途中、省略されちゃってます。

Hint: Some lines were ellipsized, use -l to show in full.
幾つかの行が省略されちゃってるから、-lを使えばいいじゃん?

てなわけで、リベンジ。

$ sudo systemctl -l status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: exit-code) since 水 2017-08-02 22:58:37 JST; 2min 10s ago
  Process: 2756 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 654 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 2759 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
 Main PID: 657 (code=exited, status=0/SUCCESS)

 8月 02 22:58:37 raspberrypi nginx[2759]: nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (2: No such file or directory)
 8月 02 22:58:37 raspberrypi nginx[2759]: 2017/08/02 22:58:37 [emerg] 2759#0: open() "/var/log/nginx/access.log" failed (2: No such file or directory)
 8月 02 22:58:37 raspberrypi nginx[2759]: nginx: configuration file /etc/nginx/nginx.conf test failed
 8月 02 22:58:37 raspberrypi systemd[1]: nginx.service: control process exited, code=exited status=1
 8月 02 22:58:37 raspberrypi systemd[1]: Failed to start A high performance web server and a reverse proxy server.
 8月 02 22:58:37 raspberrypi systemd[1]: Unit nginx.service entered failed state.

前半はよくわからない。
どんなサービスが動かなかったかの結論だけ言ってるみたいで、原因らしいものがないみたい。
後半の「could not open error log file: open() “/var/log/nginx/error.log” failed」がきになりました。
nginx.confのログファイルの場所はここじゃなくて別の場所に変更しているのに、なぜここが開かないというのかな・・・?
確かに、/var/log/nginx/のディレクトリはないけれど・・・。

そこで、ふには落ちないけど、mkdir -p?/var/log/nginx をしてから sudo service nginx start して起動してみました。やはりだめ?
ああ、パーミッションかな?ととりあえず chmod 777 でユルユルにしてもう一度起動すると・・・!起動したーー!
結局/var/log/nginx/error.logという0ファイルができました。どうやらここは設定ファイルで指定しなくても必要なようですね・・・?バグだと思うけどね。

 

こうなった原因

原因はswapをRamdiskに変えたことでした。

microSDの突然死がありましたので、以下を見つけて設定したのです。

Raspberry Pi、RAMディスクで micro SDを長寿命化

rc.localに更に以下を追加しました。

mkdir -p /var/log/nginx
chown root.www-data /var/log/nginx

これで、再起動してもちゃんと起動するようになりました。

今回はなんとかなりましたけど、やっぱり再起動する前にはバックアップしないと危険ですね。