サーバのPHPのバージョンを推奨バージョンに戻す

WordPressの引っ越しを行った際に、PHPのVer7系だと記事が表示されない現象があり、Ver5系に変更したのですが、その後調べてみるとWordPress自体はPHPのVer7系に対応していることがわかりました。さらに調べていくと、テーマやプラグインがPHPのVer7系に対応していないケースで発生することがわかってきました。

セキュリティ面では最新のバージョンを使うに越したことはないので、なんとかならないか調べていたところ、PHP Compatibility ChekerというWordPressのプラグインを使うと問題点のチェックができることがわかったので、インストールして確認してみました。

その結果、やはりテーマやプラグインに問題があるものが見つかりました。プラグインの出力するレポートにどのファイルの何行目がNGが記載されていますので、これを順に見ていくことにします。

テーマについては、式の評価の部分がPHPのバージョンによって差があるところが検知されましたので、これをPHPのバージョンに関わらず同じ評価になるように{}を追加しました。具体的には、

$$foo['bar']['baz']

という記述をすると、PHP5では、

${$foo['bar']['baz']}

と解釈されるのですが、PHP7では、

 ($$foo)['bar']['baz']

と解釈されるようです。(参考:http://php.net/manual/en/migration70.incompatible.php)
そこで、この$$が2つ続く箇所については{}を追加して、常にPHP5と同じ解釈になるように修正しました。

他には、

  • Throws SPAM Awayというプラグイン
    セキュリティ上の課題で変更になった関数(spilt() ⇒ preg_split())の単純な置き換え
  • WP SyntaxHighlighterというプラグイン
    MySQLサーバのバージョン取得の関数(mysql_get_server_info() ⇒ mysqli_get_server_info())の単純な置き換え

を行いました。
また、使用していないプラグインについては停止・削除を行いました。

一通りの整理を行った後、再度チェックをかけるとエラーはなくなったので、PHPのバージョンをさくらのレンタルサーバで標準の7系にしたところ、それでもきちんと表示できるようになりました。

これとは別に、Crayon Syntax Highlighterというコードをきれいに表示してくれるプラグインが入っていたのですが、停止していました。その理由は、記号が化けてしまうからだったのですが、今回、ぐぐってみたところ、Crayon Syntax HighlighterのSettingの中のCodeのセクションにある「Decode HTML entities in code」にチェックを入れると治ったので、逆に有効化してあります。

linuxmint19にpreloadを入れてみた

linuxの高速化についてぐぐっていたら、たまたま見つけたのが preload。頻繁に使われるファイルを空き時間にメモリにロードしておいてくれるらしい。メモリいっぱいだけど遅い Athlon5350 マシンにはピッタリのように見えるので、試してみることにしました。

synapticでpreloadをインストールした後、

$ sudo systemctl start preload.service

で起動する。システム起動時に preload を起動するには、

$ sudo systemctl enable preload.service

としておく。

ちょっと使ってみたところ、ログイン後の挙動は確かに早くなっている気がする・・・・が、学習してなんぼのものみたいなので、しばらく様子見ですね。

LinuxMint19をAthlon5350マシンにインストール

日本時間で6/30にLinuxMint19がリリースされました。Ubuntu18.04LTSベースなので、長期サポートが期待されます。(Webサイト上でも2023年までサポートって書いてあります)

で、いつものMATE版を以前組んだAthlon5350マシン(メモリ8GB+SSD64GB)に入れてみます。このマシンはこれまでは32bit版を入れていたのですが、さすがに今回は64bit版をインストールします。

インストールはUSBイメージライタでISOイメージをUSBメモリに書き込んで、そこから起動します。割と短時間で終了します。

インストール完了後、再起動して、アップデートマネージャでアップデートを適用します。その後、言語設定で「言語のサポート」から一番下にある日本語を選んで、「言語パッケージのインストール」を行います。次に入力方法で言語サポートの中から日本語を選んで「インストール」を行います。入力方法はデフォルトのfcitxのままにしました。(fcitxだとメニューの中に簡体中国語の表示のままのツール〔fcitx-qimpanel-configtool〕が出てくるので、ちょっと嫌なところはあるのですが・・)

基本的にはこれでおしまいなのですが、途中でSystem Snapshotを設定しろと煩かった(まあ、無視してもいいんですが)ので、試しにやってみます。System Snapshotを起動すると、スナップショットのタイプとしてRSYNCとBTRFSを選択するよう表示されます。デフォルトの選択はBTRFSの方になっているのですが、よくみると、インストール時点でBTRFSパーティションでないとダメと書いてありましたので、RSYNCの方にしてみます。(BTRFSだとファイルシステム自体の機能により瞬時にスナップショットが取れて、瞬時に戻せるようです)スケジュールは毎週(Weekly)にしてみました。初期状態だと、スナップショットがないので、初回だけCreateを押して、スナップショットを取ってみることにしました・・・・が、途中でクラッシュしてしまいました・・・。ということでヤメヤメ^^;

・・・で、このPCはいろいろ調査(主にWeb上)する際に使っています。以前はLinuxMint17とかLinuxMint18(非力なのでいずれもMATE版)を使っていたのですが、メモリコントローラがシングルチャネルのせいなのか64bit版では重くて、32bit版を入れていました。今回はさすがに64bit版にしたのですが、以前ほど重い感じはなく、ずいぶんと軽快になった印象です。理由はよくわかりませんが、体が慣れたのか、ブラウザが軽くなっているのか、Xサーバーが改善されているのかそれともウインドウデザインがシンプルになっているからなのか・・・?

まあ、主にWebで使うだけとしては十分なパフォーマンスになったように思います。

WordPressの引っ越し&ドメイン変更作業

これまでドメインキングとさくらのVPSの組み合わせで運用してきた当ページですが、元々VPSの運用が面倒臭くなっていたし、CentOS6.5もサポート終了があと2年半くらいまで迫っていたのでどうしようかなー、と思っていたところにドメインキングの大幅値上げ(確か100円/月⇒500円/月)の話が来たので、この機に環境を一新することにしました。ドメインキングの値上げは Plesk の一方的な値上げという話だったと思いますが、さすがに5倍となると看過できません。12月の次回支払い時期の前に移行することにしました。

で、元の構成はドメインキングでドメイン(+Webサーバもあるけど使ってない)取得、サーバはさくらのVPS(1Gプラン)上にCentOS6.5という組み合わせでした。

移行後の構成は、新しいドメインを .tokyo ドメインで取得、サーバはアップデート管理の手間を省きたいので共用レンタルサーバ(さくらのレンタルサーバスタンダード)としました。まあ、CentOS6.5でも自動アップデートを有効にしていたので、それほど手間ではなかったのですが、移行後の構築の手間も考えるとレンタルサーバでいいか、ということにしました。

で、移行自体は半日くらいで終わったのですが、せっかくなので作業手順のメモを残しておきたいと思います。

1.Wordpressのデータバックアップ

旧サーバー(VPS)上でWordPressのデータのバックアップを取ります。

# cd public_html
# tar cvfz ../tomono.wordpress.tar.gz wordpress .htaccess favicon.ico index.html index.php

2.データベースのバックアップ

次に、phpMyAdminを使ってデータベースのバックアップを行います。バックアップの方法は『【WordPress】さくらインターネットに移転(引越し)する方法』を参考にさせていただきました。

3.さくらのレンタルサーバ(スタンダード)の契約

契約できたら、サーバパスワードの変更を行います。メールで仮パスワードが送られてくるので、これを変更。変更後は、初期ドメイン名でsshログインできるようになります。

4.お名前.com で新ドメインの契約

手順は・・・・省略。whois代行があるのがいいですよね。あと、インフレ気味ですが、いろんなドメインがあるとことか。

5.お名前.comで取得したドメインをさくらのレンタルサーバで使用する設定を行う

基本的な流れとしては、さくらのレンタルサーバのサーバコントロールパネルで、「新しいドメインの追加」を行い、新しいドメインとレンタルサーバ上のディレクトリとの紐付けを行います。紐付けるディレクトリは別途作成が必要です。
その後で、お名前.com側のドメインNaviで対象のドメインで使用するネームサーバーをさくらインターネット側で指定されたネームサーバに変更します。
実施にあたっては『お名前.comで取得したドメインをさくらサーバーで使用する』を参考にさせていただきました。

6.さくら上でデータベースの復元

データベースの復元はサーバにログインしてシェル上で行いました。シェルが使えるなら、その方がずっと楽で簡単で一瞬で終わります。

$ mysql -u データベースユーザ名 -pパスワード -h データベースサーバホスト名 データベース名 < バックアップしたファイル(xxxxx.sql)

方法は、『MySQL/MariaDB コマンドを使った復元』を参考にさせていただきました。

7.ドメイン変更に伴うデータベースの修正

今回はドメインの変更を伴っていますので、WordPressの中のデータも修正しないといけません。そのためのツールがあるようで、『WordPressのサーバー移行_ドメイン変更の手順』を参考に、Search and Replace for WordPress Databases を使って新サーバー上でURLの置き換えを行いました。

8.PHPのバージョンを5系に下げた

アクセスしてみると、記事の本文が表示されない現象に悩まされました。ぐぐってみると、PHPのバージョンによって起きることあるらしいことが判明。確かに旧サーバは5系、新サーバーはデフォルトでは7系になっていました。さくらのサーバコントロールパネルでバージョンを7系から5系に下げたところ、本文が表示されるようになり、一通りの問題は解決したようです。

9.バックアップ用のシェルスクリプトの作成

データとデータベースのバックアップをするスクリプトを書いておきました。時々走らせようと思います。

#!/bin/sh
cd ~/BACKUP
mysqldump --add-drop-table -u (ユーザー名) -p(パスワード) -h (データベースサーバ名) (データベース名) | gzip -c > database-backup-`date +%Y%m%d`.sql.gz
cd ~(WordPressディレクトリのあるディレクトリ)
tar cfz ~/BACKUP/directory-backup-`date +%Y%m%d`.tar.gz .htaccess * 
cd ~

10.旧サーバーからのリダイレクトの設定

旧サーバーはドメインキングのDNSサーバー設定でさくらのVPSのIPアドレスを返していました。
できれば、さっさとさくらのVPSは解約したいので、ドメインキングのサーバ上に .htaccess を置いて、リダイレクトさせることにしました。

<.htaccessの内容>

Redirect permanent / http://tomono.tokyo/

.htaccessを設置したら、DNSの設定を変更します。設定の中から

tomono.eleho.net IN A (旧サーバIPアドレス)

のレコードを削除します。

あとは、DNS情報が行き渡るのを待ちます。

Python2.7のプログラムをexe化する

次に、Python2.7で作ったプログラムを配布用にexe化してみます。
まず、仮想環境を作ります。

D:\virtual-python>py -2 -m virtualenv py2exe1 --system-site-packages
New python executable in D:\virtual-python\py2exe1\Scripts\python.exe
Installing setuptools, pip, wheel...done.
D:\virtual-python>cd py2exe1
D:\virtual-python\py2exe1>scripts\activate.bat
(py2exe1) D:\virtual-python\py2exe1>

次に、py2exeをインストールします。試しにpipでやってみると、

(py2exe1) D:\virtual-python\py2exe1>py -2 -m pip install py2exe
Collecting py2exe
Downloading https://files.pythonhosted.org/packages/e9/a9/040d38b60bca5b19ff5599a6cbe52b4b9a4fb27986a44fc35f72d9e729e6/py2exe-0.9.2.2.zip (129kB)
100% |################################| 133kB 2.3MB/s
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "c:\users\xxxxxxxx\appdata\local\temp\pip-install-xhrt4i\py2exe\setup.py", line 10, in <module>
raise RuntimeError("This package requires Python 3.3 or later")
RuntimeError: This package requires Python 3.3 or later

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in c:\users\xxxxxxxx\appdata\local\temp\pip-install-xhrt4i\py2exe\

(py2exe1) D:\virtual-python\py2exe1>

ということで、pipでインストールできるpy2exeはpython3.3以降が必要、ということでエラーになります。ですので、sourceforgeから2.7用のインストーラをダウンロードしてきて実行します。インストーラはexe形式のGUIになっていて、デフォルトでは大元のsite-packagesの下にインストールされるようです。

exeに変換するにはセットアップスクリプトが必要なようですので、まずは以下の内容で作成しました。

from distutils.core import setup
import py2exe
    
option = {
    'compressed' : 1,
    'optimize' : 2,
    'bundle_files' : 1,
}

setup(
    options = {
        'py2exe' : option ,
    },
    console = [
        {'script' : 'main.py'}
    ],
    zipfile = None,
)

今回は、メインのスクリプト(処理が始まるところ)は main.py なので、main.py を指定。bundle_filesに1を指定すると、生成したexeファイルにランタイムdllを含めてくれるので、配布が楽になります。(代わりにサイズが大きくなります)

自作のログ解析ツールをLOGというサブディレクトリにソースコードを一式置いてexe化してみました。

(py2exe1) D:\virtual-python\py2exe1>cd LOG
(py2exe1) D:\virtual-python\py2exe1\LOG>python setup.py py2exe
running py2exe
creating D:\virtual-python\py2exe1\LOG\build
 :
 :(途中略)
 :
copying C:\Python27\DLLs\unicodedata.pyd -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\collect-2.7
*** copy dlls ***
copying C:\WINDOWS\system32\CRYPT32.dll -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\collect-2.7
copying C:\WINDOWS\system32\python27.dll -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\bundle-2.7
setting sys.winver for 'D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\bundle-2.7\python27.dll' to 'py2exe'
copying C:\Python27\lib\site-packages\py2exe\run.exe -> D:\virtual-python\py2exe1\LOG\dist\main.exe
Adding python27.dll as resource to D:\virtual-python\py2exe1\LOG\dist\main.exe
The following modules appear to be missing
['ElementC14N', '_scproxy', 'cElementTree', 'distutils.command', 'distutils.command.build_ext', ... ]

*** binary dependencies ***
Your executable(s) also depend on these dlls which are not included,
you may or may not need to distribute them.

Make sure you have the license if you distribute any of them, and
make sure you don't distribute files belonging to the operating system.

   OLEAUT32.dll - C:\WINDOWS\system32\OLEAUT32.dll
   USER32.dll - C:\WINDOWS\system32\USER32.dll
   SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll
   ole32.dll - C:\WINDOWS\system32\ole32.dll
   ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll
   WS2_32.dll - C:\WINDOWS\system32\WS2_32.dll
   GDI32.dll - C:\WINDOWS\system32\GDI32.dll
   KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll

(py2exe1) D:\virtual-python\py2exe1\LOG>

それほど時間がかからずに処理が終わり、buildとdistというサブディレクトリができて、distの下にmain.exe という実行ファイルが作成されていました。今回の場合はサイズは6MBほど、できた実行ファイルを実行してみると、特に問題なく動作しました。

ということで、意外にあっさりexe化に成功しました。

Windows10にPython環境を構築

訳あって、Windows10(たまたま32bit版)上でPythonの環境を構築しています。
で、Python2.7系とPython3系を同時に使いたいのと、Pythonの仮想環境を利用したい(作ったスクリプトを他人に使わせるには必要なパッケージが明確になってないといけない)ので、いろいろ調べながらやってます。

1.Pythonのインストール

まず、Python3系をインストーラを使ってインストールします。インストール時には「Add Python to environment variables」のチェックは外しておきます。py.exeに起動するPythonを選ばせるためみたいです。

次に、Python2系をやはりインストーラを使ってインストールします。インストール時には「Register Extensions」を外します。

インストールできたかどうかは

C:\>py -2 -V
C:\>py -3 -V

としてそれぞれPython2系、Python3系が起動できているか確認します。

2.virtualenvのインストール

Python2系用の仮想環境を作成するvirtualenvをインストールします。

デフォルトの文字コードがasciiだと失敗するようなので、デフォルトの文字コードを変更します。C:\Python27\Lib\site-packages の下に、sitecustomize.py という名前で以下のファイルを作成します。

import sys
sys.setdefaultencoding('cp932')

作成したら、反映されていることを確認します。

c:\Python27>py -2
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'cp932'
>>>

次に、pipをバージョンアップします。

c:\Python27>py -2 -m pip install --upgrade pip
Collecting pip
Downloading https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
100% |################################| 1.3MB 451kB/s
Installing collected packages: pip
Found existing installation: pip 9.0.3
Uninstalling pip-9.0.3:
Successfully uninstalled pip-9.0.3
Successfully installed pip-10.0.1

c:\Python27>

次に、virtualenvをインストールします

c:\Python27>py -2 -m pip install virtualenv
Collecting virtualenv
Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
100% |################################| 1.9MB 2.2MB/s
Installing collected packages: virtualenv
The script virtualenv.exe is installed in 'C:\Python27\Scripts' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed virtualenv-16.0.0

c:\Python27>

3.virtualenvを使ってみる

早速Python2.7の仮想環境を作ってみます。

D:\>mkdir virtual-python
D:\>cd virtual-python
D:\virtual-python>py -2 -m virtualenv testenv
New python executable in D:\virtual-python\testenv\Scripts\python.exe
:
:(中略)
:
File "D:\virtual-python\testenv\lib\ntpath.py", line 85, in join
result_path = result_path + p_path
UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 7: ordinal not in range(128)
----------------------------------------
:
:(中略)
:
OSError: Command D:\virtual-python\testenv\Scripts\python.exe - setuptools pip wheel failed with error code 2
D:\virtual-python>

ということで、エラーになってしまいます。で、エラーの原因はまた「UnicodeDecodeError」です。
原因は、どっかにあるvirtualenv.pyの中で文字コードがascii決め打ちになっているsite.pyを仮想環境の中に展開して、それを使ってしまうために起きているように見えます。
いろいろやってみると、virtualenvを再実行しても一旦ディレクトリを消したりはしないようですので、これを逆手にとって、一度実行してエラーになってから、sitecustomize.py をコピーしてやるととりあえず最後まで処理が進むようです。
具体的には、上記の例の場合、エラーになってから、sitecustomize.py をコピーしてきてから再度 virtualenv を起動します。(注:そんなことをしなくてもいい方法がありました・・・後のほうに書いてあります

D:\virtual-python>copy C:\Python27\Lib\site-packages\sitecustomize.py d:\virtual-python\testenv\Lib\site-packages\.
1 個のファイルをコピーしました。
D:\virtual-python>py -2 -m virtualenv testenv
New python executable in D:\virtual-python\testenv\Scripts\python.exe
Installing setuptools, pip, wheel...done.

ということで、旨くいきました。仮想環境への移行も

D:\virtual-python>cd testenv
D:\virtual-python\testenv>Scripts\activate.bat
(testenv) D:\virtual-python\testenv>python -V
Python 2.7.15
(testenv) D:\virtual-python\testenv>

でうまくいくようです。
この上で、scriptsフォルダの下にあるactivate.batを動かして仮想環境に移行後、python2用に作成したスクリプトを動かしてみましたが、無事に動作しました。

直後に追記)
こんな回りくどいことをしなくても、–system-site-packages と付ければOKのようです。
(下記1行目がその例です)

D:\virtual-python>py -2 -m virtualenv testenv2 --system-site-packages
New python executable in D:\virtual-python\testenv2\Scripts\python.exe
Installing setuptools, pip, wheel...done.
D:\virtual-python>cd testenv2
D:\virtual-python\testenv2>Scripts\activate.bat
(testenv2) D:\virtual-python\testenv2>python -V
Python 2.7.15
(testenv2) D:\virtual-python\testenv2>python
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'cp932'
>>>

4.venvを使ってみる

Python3系用の仮想環境のvenvを使ってみます。こちらはpython3系には標準で入っているので簡単です。使い方はvirtualenvとほぼ同じ。

D:\>cd virtual-python
D:\virtual-python>py -3 -m venv testenv3
D:\virtual-python>cd testenv3
D:\virtual-python\testenv3>Scripts\activate.bat
(testenv3) D:\virtual-python\testenv3>python -V
Python 3.6.5
(testenv3) D:\virtual-python\testenv3>

でPython3系が動くことが確認できました。

MongoDBについて調べてみた

いろいろあって、MongoDBについて調べてます。

調べた結果をメモしておきます。

Windows10からLinuxMint上のHL2240Dに印刷する

自宅の環境の整理をしているのですが、これまで不便だったのがWindows10からプリンタ(ブラザーのHL2240D)に印刷する時でした。正直、なぜLAN内蔵モデルにしなかったんだろう、というのがこれまでの悩みでした。

が、今回、Windows10からLinuxMintに接続したHL2240DにLAN経由で印刷することができるようになりましたので、メモしておきます。

1.LinuxMint側で印刷できるようにする

これは以前の記事のブラザーのレーザープリンタ買いましたを見て下さい。インストールしたら、「システム管理」→「プリンタ」でHL2240Dを「共有する」にチェックを入れておきます。

2.名前解決できるようにする

LinuxMintのマシンはDHCPでアドレス設定しているので、名前解決できる必要があります。で、簡単なのはavahi(mDNS)なので、そちらの準備をします。
Linux側はavahi daemon(Mintは初めから入っているような気がする)を入れておきます。Windows側は、Appleのサイトから「Bonjour Print Services (Windows)」をダウンロードしてインストールして、Windowsファイアウォールで 5353/UDP を許可しておきます。インストールしたら、Windows10のコマンドプロンプト/Linuxのシェルから「ping 相手のホスト名.local」で応答が返ってくるのを確認します。

3.プリンタの追加

「Bonjour Print Services (Windows)」をインストールした時に追加された「Bonjour プリンターウィザード」を起動すると、勝手にLinuxMint上のプリンタを見つけてくれました。ウィザードに沿って操作していくのですが、Brotherのドライバが同名でたくさんあってよくわかりません。とりあえず、「Brother Laser Type2 Class Driver」の中の一番下のをインストールして、テスト印刷したらうまくテスト印刷できました。印刷結果ではドライバーの種類が「Type 4 – ユーザーモード」となっていました(よくわかりませんが)。

Raspberry Piをネットワークの試験に使う

ここのところ買い集めている小さなLinuxボードは結局はネットワークの試験のために購入したもので、元々はなるべく小さなtcpdumpが使えて動かしっぱなしで放置できるものを探していたものです。で、いろいろぐぐっていたら、linuxでEthernetインタフェースが2つある環境を使って、もっといろいろできることがわかってきました。具体的には、ブリッジとして動作させてた上で、遅延を挿入したりできるというものです。その環境もRaspberry PiにUSBイーサネットアダプタを追加してやれば、Raspberry Piでもできそうなことがわかったので、試してみました。

1.Raspbianのインストール

今回はGUIは不要なので、Raspbian Liteを適当なMicro SDに書き込んで、余っていたRaspberry Pi model B+に入れました。
起動して、User/Passwd=pi/raspberryでログインしたあと、コンソールから

$ sudo touch /boot/ssh
$ sudo reboot

として再起動。再起動後、linuxマシン側から

$ ssh pi@raspberrypi.local

としてsshでログイン、以降はリモートログインで作業します。リモートログインしたら、

pi@raspberrypi:~ $ sudo raspi-config

として、初期設定をします。今回は、

  • パスワード設定
  • ホスト名をraspinetに変更
  • ブートオプションをConsoleに設定
  • ローカライゼーションでLocaleにja_JP.UTF-8 UTF-8を追加、デフォルトはen_GB.UTF-8のまま。タイムゾーンはAsia/Tokyoを選択。
  • Advanced OptionでExpand Filesystemを選択、Memory Spiltは16MBに設定

で、設定後に再度、再起動。再起動後、Linuxマシン側から

$ ssh pi@raspinet.local

として再度ログインします。ログインしたら、

pi@raspinet:~ $ sudo apt-get update
pi@raspinet:~ $ sudo apt-get upgrade
pi@raspinet:~ $ sudo apt-get install tcpdump bridge-utils

として、アップデートを一通りかけた後、bridge-utilsとtcpdumpをインストールします。

2.スクリプトファイルを作成して起動時に実行させる

pi@raspinet:~ $ sudo vi /usr/local/bin/start-bridge

として、ブリッジを起動する以下の内容のスクリプトを作成しました。(実行タイミングをsleepで調整しているのでちょっと汚いですが・・・)

#!/bin/sh
# disable IPv6
sysctl -w net.ipv6.conf.all.disable_ipv6=1
# setup bridge
brctl addbr vbr0
brctl addif vbr0 eth0
brctl addif vbr0 eth1
sleep 5
# start interface
ifconfig eth0 0.0.0.0 up
ifconfig eth1 0.0.0.0 up
ifconfig vbr0 0.0.0.0 up
sleep 5
dhclient -r
dhclient vbr0
echo 0 > /sys/devices/virtual/net/vbr0/bridge/multicast_snooping

IPv6は今回禁止、IGMP snooping も禁止しました。作成後に、

pi@raspinet:~ $ sudo chmod a+x /usr/local/bin/start-bridge

として、実行権限を付与。起動時に実行させるため、/etc/rc.local を修正して、最後の exit 0 の前に以下の部分を追加しました。

if [ -e /usr/local/bin/start-bridge ]; then
  /usr/local/bin/start-bridge &
fi

これで、Raspberry Piを起動させると自動的にブリッジとして動作するようになります。

3.tcpdumpで通過パケットをモニタしてみる

Linuxホスト側から

$ ssh pi@raspinet.local

でブリッジに設定したRaspberry Piにログインします。その後、

pi@raspinet:~ $ sudo tcpdump -i vbr0 not port ssh

とか、

pi@raspinet:~ $ sudo tcpdump -i vbr0 not host `/sbin/ip -f inet -o addr show vbr0 | awk '( $2 == "vbr0" ) {print $4}' | cut -d/ -f 1`

で通過するパケットをモニタします。(後ろの方の長いのは vbr0 のIPアドレスを抽出しているだけです)
ポートやIPアドレスでRaspberry Piに接続しているsshのパケットを除外しています。除外しないと、表示した文字列をパケットキャプチャして、それを再度表示してしまいます。

4.参考情報