2015年4月11日土曜日

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)

■Squid3のインストール


 現在のバージョンは3.1.20。
$ sudo apt-get install squid3

 初期設定を確認するなら
$ cat /etc/privoxy/config | grep -v ^#

 そして設定。
$ sudo nano /etc/squid3/squid.conf

 設定ファイルが超長い!!ので、公式のminimum settingを手直しして、ファイルを1から作ったほうがいいかも。
 ウチの設定はこんな感じ。
http_port [port of Squid3]
htcp_port 0
icp_port 0
cache_peer localhost parent [port of Ziproxy] 0 no-query no-digest no-netdb-exchange
cache_mem 64 MB
cache_dir ufs /var/spool/squid3 1024 16 256
maximum_object_size 32 MB
maximum_object_size_in_memory 64 KB
refresh_pattern ftp: 1440 20% 10080
refresh_pattern gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
hierarchy_stoplist cgi-bin ?
half_closed_clients off
negative_ttl 1 minutes
pipeline_prefetch on
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 192.168.x.0/24 # RFC 1918 possible internal network
acl to_ipv6 dst ipv6
acl winupdate dstdomain .microsoft.com .windowsupdate.com
acl manager url_regex -i ^cache_object:// +i ^https?://[^/]+/squid-internal-mgr/
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access deny to_ipv6 !all
http_access allow manager localhost
http_access deny manager
http_access allow winupdate
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow localnet
http_access deny all
tcp_outgoing_address [RPi2-IPAddr.] !to_ipv6
tcp_outgoing_address [RPi2-IPv6-Addr.] to_ipv6

 IPv6化のための設定をして、他に少し盛り込んである感じ。
 詳しいことは公式faqを参照。
 設定したら再起動。
$ sudo /etc/init.d/squid3 restart

■Privoxyのインストール


 現在のバージョンは3.0.19。
$ sudo apt-get install privoxy

 そして設定。
$ sudo nano /etc/privoxy/config
user-manual /usr/share/doc/privoxy/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
actionsfile user.action
filterfile default.filter
filterfile user.filter
logfile logfile
listen-address  :[port of Privoxy]
toggle 1
enable-remote-toggle 1
enable-remote-http-toggle 1
enable-edit-actions 1
enforce-blocks 0
permit-access 192.168.x.0/24
buffer-limit 8192
forward / localhost:[port of Squid3]
forwarded-connect-retries  0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
socket-timeout 300

 フィルタ内容は割と頻繁に変えると思うので、WebGUIは殺さずに残しておいた。
 フィルタ内容は「/etc/privoxy/user.action」を直接書いてもいいし、プロキシを通す設定をしたブラウザから「http://p.p/」で現れるPrivoxyのWebUIから設定しても良い。
$ sudo /etc/init.d/privoxy restart

 ウチの場合はWebGUIからmatch-all.actionを編集し、「Set to Cautious」で設定しておいた。
 GIF de-animation?NO!NO!NOooo!
 match-all.actionの設定についてはマニュアルを参照

 user.actionのフィルタは各自で適宜設定する。
 自分の場合は、Android上でFilterProxyを使っていたので、その設定を流用した。

■Muninのインストール


 RPi2を監視できるよう、ついにで入れておく。バージョンは2.0.6。
 以下のページを参考に、OwncloudPieでインストールされたnginxでMuninが参照できるように設定した。

- mk-mode BLOG
Debian 7 Wheezy - サーバ監視ツール munin 導入!

 ウチでは一週間使用して、500MB~700MBで安定して推移している。

■それ以外の設定


 カーネルパラメータの設定とかしてみるといいかもしれない。
 ネットワーク環境がジャンボフレームに対応してるなら、MTUを変えてみてもいいんじゃないだろうか。
(ウチはルータにヤマハのRTX810を使っているため、ジャンボフレーム化はしていない)

 せっかくdnsmasqで宅内DNSキャッシュサーバを立てたのに、IPv6優先設定をしたWindows機だと、先にIPv6を使って、IPv6のDHCP元のISPのDNSに問い合わせてしまって、宅内DNSを使ってくれないのが残念。
 まぁサーバ内部で使う機会が一番多いからいいんですけどね…。

■結果


 Squidのログを確認したところ、SquidからZiproxyに接続できない場合があるため、原因を調査したところ、ZiproxyはIPv6に対応していないことが判明。
 どうやらIPv6アドレスをリクエストした時にZiproxyに接続できず、Squidが直接リクエストを処理していたため気づかなかった模様。
 解決法は以下の2通り。

  1. Squid→Polipoにプロキシをバイパスする(Ziproxyを諦め、IPv6に対応する)
  2. 「/etc/modules」のIPv6モジュールを削除して、PolipoをIPv4対応に戻して不貞寝(IPv6を諦める)

さあ!不貞寝の時間だ!
(2.を選んだ模様)

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)

■Polipoのインストール


 現在のバージョンは1.0.4.1。
$ sudo apt-get install polipo

 そして設定。
$ sudo nano /etc/polipo/config

 のち再起動。
$ sudo /etc/init.d/polipo restart

 ウチの設定内容を晒しておくと…
proxyAddress = "::0"
proxyPort = [port of Polipo]
allowedClients = 127.0.0.1, 192.168.x.0/24
diskCacheRoot = ""
dnsQueryIPv6 = happily
dnsUseGethostbyname = true
pmmFirstSize = 65536
pmmSize = 32768
disableLocalInterface = true
relaxTransparency = maybe

 「relaxTransparency = maybe」は、パイプライン取得に対応していないサイトを表示した場合に502(実際には206)エラーとなるのを回避する。
 具体的にはZiproxyの公式ページから「Download」や「faq」に遷移した場合にエラーとなるのを回避している。

■Ziproxyのインストール


 現在のバージョンは3.2.0。
$ sudo apt-get install ziproxy

 そして設定。
$ sudo nano /etc/ziproxy/ziproxy.conf
Port = [port of Ziproxy]
OnlyFrom = "192.168.x.1-192.168.x.254"
NextProxy="[RPi2-IPAddr.]"
NextPort=[port of Polipo]
UseContentLength = false
ProcessGIF = false
ProcessHTML = false
ProcessCSS = false
ProcessJS = false
ImageQuality = {50,50,80,0}

 また、ownCloudでやりとりする画像まで圧縮しないように、「noprocess.list」に以下を追加。
$ sudo nano /etc/ziproxy/noprocess.list
http://192.168.x.*/*

 のち再起動
$ sudo /etc/init.d/ziproxy restart

 設定については、Ziproxyのソースを落としてREADMEに書いてあることを読んでおくことを推奨。
 元のziproxy.confには「Image quality is specified in integers between 100 (best) and 0 (worst).」と書いてあるけど、0を指定した場合、実際にはZiproxyは処理を行わずに画像をバイパスする。
 また、HTMLを圧縮する設定にしても、子プロキシがSquidの場合は圧縮したHTMLを渡さない、とも書いてある。
 実際に、IE11でF11キーを押して出てくるデバッグモードから確認すると、確かにSquidを通す場合と通さない場合でHTMLの受信サイズ(展開後のサイズではない)が違うので、ZiproxyをSquidの親として設定する場合は、不要な処理をしないように「ProcessHTML」等をfalseにしておくと良い。
 ProcessGIFは…GIFアニメーションが静止画になってしまうのでfalseに。

 自分の場合は、ある程度大きい画像はコンテンツの一部としてみなして圧縮せず、小さい画像はページの装飾物とみなし、画質をある程度落とす程度とした。
 サムネが多い画像掲示板やTumblr、また装飾物が多い楽天のショップ等は、これで結構軽くなった。


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(3)

■Dnsmasqのインストール

現在の(Raspbian-wheezyでの)バージョンは2.62。

$ sudo apt-get install dnsmasq
$ sudo nano /etc/resolv.conf
nameserver 127.0.0.1
nameserver [ISPのDNSサーバ]
 あとは「/etc/hosts」に好きに書いて、再起動すればいいじゃない。
$ sudo /etc/init.d/dnsmasq restart

■ownCloudのインストール


 面倒なのでOwncloudPieを使用。

- GitHub - petrockblog
OwncloudPie

 wheezyのphpバージョンは5.4だけど、php-apcまで導入済み。
 その上、nginxとvarnishまで入るので、既に最適化はされている模様。
 OwncloudPieでは、ownCloudのバージョンは最新版(latest)が入る。
$ sudo apt-get install -y git dialog
$ cd
$ git clone git://github.com/petrockblog/OwncloudPie.git
$ cd OwncloudPie
$ chmod +x owncloudpie_setup.sh
$ sudo ./owncloudpie_setup.sh

 オレオレ証明書の作成は適当に。入力しない項目は“.”を入力すること。

 ちなみに、Apache2版を入れた場合、現在のバージョンのownCloud8では「.htaccessに書かれてるバージョンが違う」と言われてハマる。特別な事情がない限り、素直にnginx版を入れたほうが無難。

 このままでもownCloudは使えるけども、DBにsqliteを使ってしまう。
 sqliteでは管理するファイルが増えてきた場合に遅くなってきてしまう。また、そうなってから別DBに移行しようとすると超絶面倒&失敗すると全てがパァなので、最初からMySQLを使うように設定しておく。
$ sudo apt-get install mysql-server

 インストール時にMySQLのパスワードを設定しておく。
$ sudo apt-get install php5-mysql
$ sudo mysql -u root -p

 ここでMySQLのパスワードを聞かれるため、インストール時に設定したパスワードを入力する。
mysql> create database owncloud default character set utf8;
mysql> show databases;
mysql> grant all on owncloud.* to owncloud@localhost identified by '[owncloud@localhostのパスワード]';
mysql> \q

 あとは「http://[RPi2-IPAddr.]/owncloud」で現れるowncloudの初期設定画面から、DBにMySQLを使うよう設定すればOK。

 TS-121のownCloud6より、ずっと早い!!
 Android機での同期速度は2MB/sくらい(FolderSyncを使用)ですが、実際にUp/Downを頻繁にするわけでもないので、まぁこれはこれで。

 2GB程度の同期チェックで1分程度なので、遅いと見るか早いと見るか…。
 物足りない人はBittorent Syncなんかを使うといいかも。


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)

■RaspbianをUSB-SSDから起動させる


 USBメディアから起動させる方法は、調べればチラチラ出てきます。
 無駄なくキチンとやりたい場合は、以下のようなページを参考にどうぞ。

- 屋根裏Linux
05 Raspberry PiファイルシステムHDD化 その1/3 (HDD接続~データ移行)

- 月と杜
Raspberry Pi USB HDD起動

 自分の場合は…面倒なので、以下の方法を取りました。
 富豪的アプローチで良ければこちらをどうそ。

  1. 4GB以上のmiscroSDカードにRaspbianを焼く
  2. そのままUSB-SSDにもRaspbianを焼く
  3. 1.で焼いたmicroSDカードのconfig.txtとcmdline.txtを書き換える
  4. GParted等のパーティション操作ツールでSSD上のext領域を拡張する

…というもの。SSDの先頭60MBくらいは無駄に空くけど、FATフォーマットして設定ファイルのバックアップ先として使ってもいいんじゃないの?(適当)

 1.と2.は…特に特殊なことはせず、3.ではUSBの電力アップと、起動先の変更のために以下を変更。

【config.txtに追記】

safe_mode_gpio=4
max_usb_current=1
gpu_mem=16

【cmdline.txtを変更】

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline rootwait

 microSDはFAT領域に書かれた内容(/boot)しか使わないので、容量が少ない別のmicroSDをFATフォーマットして、そっちに内容を移してもいい。自分は1GBのmicroSDに内容を移して使っている。

 4.も各自好きな方法で…LiveCDとかUSBからUbuntuとかのLinuxを立ち上げてGPartedを使ったり、PartitionMagicを使ったりとかで。
 自分の場合はEeePC901X上のLinuxBeanでGPartedを使って拡張した。
 ちなみに、raspi-configで4.をやろうとしても、「SDカードじゃないからできないよ」的なメッセージが出るので注意。

 sda2を最大拡張してもいいけど、inodeが気になる人は別パーティションを作って、SquidのキャッシュとかownCloudのデータをそっちに退避させると良いかも。

 ここまでで準備したmicroSDとUSB-SSDとUSB-GbEアダプタと、ひとまずHDMIとUSBキーボードもRPi2に繋いで、電源オン。

 raspi-configとかrpi-updateとかする前に、まずはUSB-GbEアダプタを使えるように設定。
$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth1
iface eth1 inet static
address [RPi2 IPAddress]
netmask 255.255.255.0
gateway [Gateway IPAddress]
broadcast [Broadcast IPAddress]
 broadcastは無くても良いが…。

■IPv6対応&ポート閉塞


 次に、IPv6対応させるための設定。(IPv6対応させない場合は飛ばして良い)
 ついでに、音なんて鳴らさないのでサウンドモジュールはコメントアウト。
$ sudo nano /etc/modules
#snd-bcm2835
ipv6
 後はraspi-configでお好きな初期設定を。
$ sudo raspi-config
一応、raspi-config自体をupdateして、

  • Xを起動しない
  • サーバ名変更
  • timezone変更
  • ja-JP.UTF-8とja-JP.EUCの追加(LANGはen-GB.UTF-8のまま)
  • enable SSH

をするくらいか。RPi2の場合はoverclockしなくてもよいかと。
 さらに、サーバとして使用するのに不要なパッケージを削除。
$ sudo aptitude

 出てくるメニューから、以下の項目を探して“_”→“g”→“g”でパッケージ削除。

  • X11
  • gnome

 さらにdbus関連と、何やら残るゴミも削除。
$ sudo apt-get remove dbus
$ sudo apt-get autoremove
$ sudo apt-get autoclean
$ rm -rf /home/pi/python_games/
$ sudo rmdir /usr/local/games/
$ sudo rmdir /usr/games/

 ここまでできたらようやく最新化。

$ sudo rpi-update
$ sudo apt-get update
$ sudo apt-get dist-upgrade
 IPv6の場合は、ルータのファイアウォールでは外部パケットが弾かれないため、外部から直接アクセスできてしまう。
そのため、iptablesを変更してRPi2へIPv6でアクセスすることを禁止する。
 自分の場合はufwで全ポートを閉じ、IPv4のみポートを開く設定とした。
$ sudo apt-get install ufw
$ sudo ufw enable
$ sudo ufw default DENY
$ sudo ufw allow from 192.168.x.0/24

 セグメントは適宜変えておくこと。
 ufwについてはUbuntu Weekly Recepi76回77回を参考にした。慣れてて良かったUbuntu。ありがとう技術評論社。

 ここまでしたら電源を落として、USB-GbEにLANケーブルを繋げて再起動。
 HDMIとUSBキーボードも不要の場合はここで外してしまって良い。
$ sudo halt

 続けて「shutdown -h now」しなくて良いなんて、いい時代になったなぁ…。
 もう本体自体は弄らないので、RPi2を設置場所へ持って行ったら電源投入して、あとはSSH接続で以下続行。

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する(3)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(1)

※このページは能書きのため、実際の設定は以下のページを参照。
※「IPv6対応」と謳いながら、ZiproxyはIPv6に対応できていない。詳細は「■結果」を参照。

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)
 ■RaspbianをUSB-SSDから起動させる
 ■IPv6対応&ポート閉塞

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(3)
 ■ownCloudのインストール
 ■Dnsmasqのインストール

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)
 ■Polipoのインストール
 ■Ziproxyのインストール

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)
 ■Squid3のインストール
 ■Privoxyのインストール
 ■Muninのインストール
 ■それ以外の設定
 ■結果

 2012~2013年は、新居の設計、引っ越し、転職…といろいろあったけど、それはそれとして一気に省略。
 2012年のおれに言いたいこととしては…
  • 全てのコンセントは3極にしておけ!
  • 壁面に埋め込まれるLANのケーブルは、黙ってカテゴリ7にしておけ!
という事くらい。あとは概ねいいチョイスだったぞ!過去のおれ!

■キャッシュサーバをCubox→TS-121→RaspberryPi2に移行するまで


 引っ越しの際、NASをQNAP TS-121に変更したため、Squid、PrivoxyはCuboxからこちらに移行。
 空いたCuboxにGeexboxを入れてUSB-DACに繋いで遊ぶか…と思い立ち、久々にCuboxを触ると、SolidRunのHPからCuboxのWikiが消えてしまい、ググっても出てくるのはCubox-iとHummingBoardの情報ばかり。
 Geexboxも、Cubox-Installerから入れられるのはarmhf版のNightlyBuildだけで、USB-DACを繋ぐとフリーズするので、公式ページを覗きに行くと、まさかのISISクラッキング。
 こりゃちょっと安心して遊べないぞ…ということで、代替わりしたRaspberryPi2(以下RPi2)でいろいろ遊んでいたところ、以下のページを発見。

- Midwestern Mac, LLC
Getting Gigabit Networking on a Raspberry Pi 2 and B+


 そういや、丁度手元にUSB3.0のUSB-GbEアダプタがあるな…とpingを使って簡単に計測すると、200Mbpsとまではいかないが、160Mbpsは出ている計算。

  60000(Bytes ping packet) * 2(Times[Up/Down]) * 8(byte to bit) / 0.006(sec) = 160Mbps
    ※玄人志向 GbE-USB3.0S2とサンワサプライ 400-HUB022で確認。どちらも同値。

 暗号化しないFTPでも150~200Mbpsは出ているので、これは案外使えるんじゃね?ということで、ついカッとなってRPi2をサーバに仕立てて遊んでみた。後悔はしていない。…多分。
(もうすぐDebian-jessieがリリースされるのにwheezyか…とかその辺は置いとく)
 初代RPi(メモリ256MB版)でも実測120Mbpsは出ているので、そちらでもメモリが許す限りの範囲でサーバ化は可能なんじゃないだろうか。
(512MBは実測前に友人に譲渡したので不明。B+、A+はそもそも持ってないので実測していない)

■RPi2をサーバ化してやってみたいこと

  • TS-121にownCloud6を入れて、あまりの遅さに使用を断念したので、RPi2上のownCloud8はどんなモンだか使ってみたい
  • 引っ越しに当たり、NGNのIPv6-IPoE環境に移行したので、入れるサーバもIPv6化しておきたい
  • Polipo+Ziproxy+Squid3+Privoxy+dnsmasqで「ぼくのかんがえたさいきょうのキャッシュサーバ」を作ってみたい
というわけで、Cuboxで使っていた64GB-SSDもSATA-USB変換をカマして接続し、本格的にサーバ化してみたのでした。
 ちなみに、構成としては以下の通り。

THE INTERNET !!
Polipo
Ziproxy
Squid3
Privoxy
Client(PC, Tablet, etc...)

Polipo:外部サーバとのアクセスをHTTP1.1化
Ziproxy:画像ファイルの画質をある程度犠牲にして再圧縮して省サイズ化
Squid3:ziproxyで圧縮した状態のファイルをキャッシュ
Privoxy:広告等の不要なリクエストをリジェクト

…という構成。IPv6対応させるためにSquidは2系じゃなく3系を使用。
 普段はPolipo+Squid3で、スマホやVPNの場合だけZiproxy+Privoxyを使う、という場合は、SquidとZiproxyを入れ替えてもいいかもしれない。
 また、Privoxyより上位のプロキシに直接接続できるよう、意図的に接続先を絞っていないので、プロキシ全体が安定してきたら、接続先を絞っておくと良い。

 「IPv6-IPoEならPPPoEの速度制限を受けないから、キャッシュ要らなくね?」という問いには聞こえないフリをしますよ?


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)に続く...

2013年1月16日水曜日

RaspberryPiでMusicPlayerDaemonサーバを構築する


【2013/3/27 修正】

  • 日本語ロケール化をしないよう修正
  • PulseAudioのインストール手順が抜けていたのを修正
  • mount.cifsのマウントオプション「codepage」が指定できなくなっていることに対応



自宅で使っているミニコンポでネットワーク上の音楽を手軽に聴くため、RaspberryPi(RAM512MB版)のRaspbian"Wheezy"上にMusicPlayerDaemon(MPD)を入れてみたので、その時のメモをまとめておく。
主に参考にしたサイトはこちら。

■n-mmra.net Web Site
Raspberry Piのいたずら
Raspberry Pi+MPDの設定

RaspberryPiでMPDサーバを立てよう!と考えている人は多く、どのページも上手にまとめられているが、上記のページは特に丁寧にまとめられているので、詳しく知りたい方はこちらを参照した方が良いだろう。
先人の方々、ホントにありがとうございます…m(__)m


【前提】
RaspberryPiの内部音源のみでMPDを構築しようとした場合、

  1. 内臓音源の起動/停止時(電源ON/OFF時)
  2. 演奏の開始/停止時(音源サスペンドON/OFF時)
に発生するポップノイズが大きな障害となる。
ここでは2.のポップノイズに対処する方法と、RaspberryPi+USB-DACで運用する方法の2通りを紹介する。
※1.のポップノイズはソフトウェアでの対応は難しいため断念した。

  • SSH接続で運用するため、GUIは使わない。
  • USB-DACを使用する場合はALSA経由で接続する。
  • USB-DACを使用せず内臓音源を使用する場合はPulseAudio経由で接続し、RaspberryPiを常時稼働させる。
  • MPDの操作はスマートデバイス(Android端末)上で行う。

【物理的に準備するもの】

  • RaspberryPi(USB-DACを使用する場合は512版を推奨)
  • RaspberryPi用の電源(5V700mAが必要だが、USB-DACを利用したり、USBメモリを抜き差しするなら1A以上推奨)
  • SDカード(RaspberryPiとの相性は事前に調べておくと良い)
  • USBキーボード
  • HDMI入力かRCA映像入力(懐かしの黄色いビデオ端子)を持つディスプレイ
  • 母艦(Windows)


【下準備】
RaspberryPiにディスプレイとキーボードをつないでおく


■Raspbianのインストール
Windows母艦でRaspbianのイメージをSDカードに書き込む。
公式ページではWin32DiskImagerでRaspbianのイメージをSDに書き込め、と書いてあるので、それをそのまま実行。
現在のRaspbian配布イメージだと、何もしなくても512MBのRAMを認識してくれるので、ファームウェア更新等の必要は無し。
raspi-configでSDカードの領域拡張した後は、以下の項目を設定しておく。


  • change_locale:"en_GB.UTF-8 UTF-8","en_US.UTF-8 UTF-8","ja_JP.UTF-8 UTF-8"(default_locale:"en_US.UTF-8")
  • change_timezone:"Asia - Tokyo"
  • memory_split:"16MB"
  • ssh:"enable"
  • boot_behaviour:"no"


overclockはお好みで。とはいえ、700MHz動作でも、MPDだけならCPU負荷は20%程度(PulseAudioの場合は25%程度)なので、他に何もさせない場合は安定性の面から"none"を推奨。
SDカードの領域拡張処理は再起動後に行われるため、再起動に時間がかかる。


■利用ユーザの追加
初期ユーザ"pi"、パスワード"raspberry"でログイン後、新しいユーザを追加する。
$ sudo adduser [UserName]
$ sudo visudo
新しいユーザでsudoが利用できるよう、以下の行を追加。
[UserName] ALL=(ALL) ALL


■SDカードの領域をjournal_data_writeback modeにする
SDカードの領域はext4でフォーマットされているので、Cubox同様にjournal_data_writeback modeにしておく。
$ sudo tune2fs -c 0 -o journal_data_writeback /dev/root


■初期ユーザの停止
ログアウト後、追加したユーザでログインし、sudoが使えることを確認がてら、初期ユーザ"pi"を削除する。
$ sudo userdel -r pi


■日本語対応
日本語表示と日本語入力に対応させておく。
SSH接続がメインになるので、不要かもしれないが…将来のメンテナンス用に。
$ sudo apt-get install fonts-ipafont ttf-vlgothic xfonts-intl-japanese xfonts-intl-japanese-big
$ sudo apt-get install ibus-anthy
$ sudo dpkg-reconfigure locales
$ echo "export LANG=ja_JP.UTF-8" >>~/.profile


■ホスト名変更
固定IPで運用する場合は/etc/network/interfacesに設定を行う。

$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet static
address [RPi-StaticIP]
netmask 255.255.255.0
broadcast 192.168.XXX.255
gateway [DefaultGatewayIP]
dns-nameservers [DNSServerIP]
以下のファイルにホスト名を設定しておく。

$ sudo nano /etc/hostname
[HostName]
$ sudo nano /etc/hosts
127.0.1.1 [HostName]
また、再起動後、ifconfigで現在のIPアドレスを確認しておくと、ここから先の作業はSSH経由で可能となる。
$ ifconfig eth0
他の端末からホスト名でアクセスしたい場合はSambaを入れておく。
$ sudo apt-get install samba


■MPDのインストール
MPDと、MPDを操作するためのクライアント(MPC)をインストールする。
$ sudo apt-get install mpd mpc
$ sudo apt-get install alsa-utils


■USB-DACの設定
USB-DACを使用する場合は、ここでDACを接続して認識されることを確認しておく。
ウチの場合(LXU-OT2)は以下のように認識された
--------------------------------------------------
$ dmesg
[  647.493275] usb 1-1.3: new full-speed USB device number 4 using dwc_otg
[  647.596953] usb 1-1.3: New USB device found, idVendor=08bb, idProduct=2704
[  647.596984] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  647.597001] usb 1-1.3: Product: LUXMAN LXU-OT2
[  647.597013] usb 1-1.3: Manufacturer: LUXMAN LXU-OT2
[  647.608224] input: LUXMAN LXU-OT2                   LUXMAN LXU-OT2   as /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.2/input/input0
[  647.608337] generic-usb 0003:08BB:2704.0001: input: USB HID v1.00 Device [LUXMAN LXU-OT2                   LUXMAN LXU-OT2  ] on usb-bcm2708_usb-1.3/input2
[  647.839017] usbcore: registered new interface driver snd-usb-audio
$ cat /proc/asound/cards
 0 [ALSA           ]: BRCM bcm2835 ALSbcm2835 ALSA - bcm2835 ALSA
                      bcm2835 ALSA
 1 [LXUOT2         ]: USB-Audio - LUXMAN LXU-OT2
                      LUXMAN LXU-OT2 LUXMAN LXU-OT2 at usb-bcm2708_usb-1.3, full speed
--------------------------------------------------
このままではALSAによって内臓音源が優先して利用されてしまうため、ALSAの設定を変更する。
$ sudo nano /etc/modprobe.d/alsa-base.conf
以下の行をコメントアウト
#options snd-usb-audio index=-2


■内臓音源の設定
内臓音源をそのまま使用した場合、演奏の開始/停止時(音源サスペンドON/OFF時)に、割と大きなポップノイズが出てしまうため、PulseAudioを使用し、内臓音源をサスペンドさせないようにすることで対処する。
$ sudo apt-get install pulseaudio
$ sudo nano /etc/pulse/default.pa
以下の行をコメントアウトする。
#load-module module-suspend-on-idle
設定変更後にPulseAudioを再起動する。(ポップノイズが出ます)
$ sudo /etc/init.d/pulseaudio restart


■MPDの設定
MPDの設定を変更する。
$ sudo nano /etc/mpd.conf
以下の行をコメントアウト。
#bind_to_address "localhost"
USB-DACを使用する場合は、audio_outputの設定を以下のように変更する。(コメントアウトされているものを解除する)
audio_output {
type "alsa"
name "My ALSA Device"
device "hw:0,0" # optional
}
内臓音源を使用する場合は、audio_outputの設定を以下のように変更する。(コメントアウトされているものを解除する)
audio_output {
type “pulse”
name “MPD PulseAudio Output”
}
また、偶にMPDが音源をコントロールできないエラーを吐くことがあるので、以下のデバイスの権限を変更しておく。
$ sudo chmod 770 /dev/snd -R && sudo chgrp audio /dev/snd -R
ここまで設定できたらMPDを再起動する。
$ sudo /etc/init.d/mpd restart


■USBメモリ上の楽曲ファイルを認識させる場合
RaspberryPiにUSBメモリを刺しこんだ時にオートマウントさせて、USBメモリ上の楽曲をMPDに認識させるために、以下の設定をしておく。
$ sudo apt-get install usbmount
$ sudo ln -s /media/usb0 /var/lib/mpd/music


■NAS上の楽曲ファイルを認識させる場合
NAS上で管理されている楽曲ファイルを認識させる場合、/etc/fstabに記述を追加する。
ここではWindows上から閲覧できるNAS(Samba等)からファイルを参照することを想定している。
$ sudo nano /etc/fstab
//[NASHostName]/[TargetDirectory] /var/lib/mpd/music/[LinkName] cifs codepage=cp932,iocharset=utf8,r,defaults 0 0

※2013/03/27追記
現在の最新版「2013-02-09-wheezy-raspbian」では、mount.cifsのオプション「codepage」の指定ができないため、/etc/fstabのcodepage指定を除去した。
どうやらRaspbianに限らず、Ubuntu等のDebian系Distribution全体で、mount.cifsのオプション「codepage」が使えなくなっているらしい。
「codepage」を指定した場合のエラー内容は以下の通り。

$ sudo mount //[Server]/[TargetDir] /var/lib/mpd/music/[TargetName] -t cifs -o codepage=cp932,iocharset=utf8,r,defaults
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
$ sudo dmesg | tail -n1
[23499.354795] CIFS: Unknown mount option "codepage=cp932"



■RaspberryPiの再起動とMPC
再起動後、MPCから音出しして確認する。
$ sudo reboot
"/var/lib/mpd/music"以下に楽曲ファイルを配置しておくと、MPD側で認識される。
以下のコマンドで、配置された楽曲ファイルを全て演奏する。
$ mpc update
$ mpc ls
$ mpc ls | mpc add
$ mpc play
演奏停止は以下のコマンドで行う。
$ mpc stop
MPCのコマンドについては、エレキジャックの「Music Player Daemon (MPD) を使ってみる」を参照。


MPDの設定はここまで。Android用のMPDクライアントには「MPDroid」を使ってるけど、なかなか便利。
ただ、Android4.2だとMPDへのコネクション切断がうまくいかずに残ってしまうバグがあるようなので、Nexus7では他のアプリを使った方が良さそうだなぁ。
※クライアントの接続情報は以下のコマンドで確認可能
$ netstat -a --programs | grep 6600
RaspberryPiはNICが100Baseと貧弱なので、使いどころが難しいけど、

  • 無線LANアダプタを繋いで無線LANアクセスポイント化
  • CUPSを立ち上げてプリンタサーバ化
  • ウェブカメラを繋いで簡易な監視カメラ化

なんかが面白そうかな。まぁ、また時間ができた時にでも…。


2012年12月30日日曜日

Cuboxでコンテンツフィルタ+キャッシュサーバを構築する。


  • スマートデバイス(Android、iOS両方)でブラウジング中に出てくる広告が超ウザい。
  • スマートデバイスのブラウザで「戻る」ボタンを押しても、キャッシュ再読み込みではなくページの再取得をしてしまう。
  • 宅内の端末が増えてきたので、adblockやFilterProxy等の設定をするのが面倒。


という問題を解消するため、Debian-Squeezeを入れたCuboxにSquidGuard+Squid+Polipoを入れて、宅内LAN用のコンテンツフィルタとキャッシュサーバを立てたので、その時のメモをまとめておく。


■TXキュー長の変更
CuboxのNIC(カードじゃないけど…)は内部でバッファを持っているので、OSのTXキュー長を"0"に設定しておく。
(ちなみにデフォルト値は"1000")
# ifconfig eth0 txqueuelen 0


■Polipoのインストール
外部サーバとの通信高速化のためPolipoを利用する。
キャッシュプロキシには後述のSquidを利用するため、Polipo側のキャッシュは利用しない。
# sudo apt-get install polipo
# nano /etc/polipo/config
うちのconfigはこんな感じ。
とりあえずIPv4にのみ対応させておいたけど、そろそろIPv6にも対応させておいたおいた方がいいかな…。
Debian-Wheezyが出たら(もしくは引っ越し後に)考えよう。
--------------------------------------------------
proxyAddress = "0.0.0.0"
allowedClients = 127.0.0.1, 192.168.1.0/24
chunkHighMark = 819200
objectHighMark = 512
diskCacheRoot = ""
localDocumentRoot = ""
disableIndexing = false
disableServersList = false
dnsQueryIPv6 = no
dnsUseGethostbyname = yes
pmmFirstSize = 524288
pmmSize = 262144
relaxTransparency = maybe
--------------------------------------------------
設定したらPolipoを再起動しておく。
# sudo /etc/init.d/polipo restart


■Squidのインストール
Squidをキャッシュプロキシとして利用する。
PolipoとSquidのどちらを親プロキシにするかは諸説あるが、今回は
クライアント → (SquidGuard) → Squid → Polipo → 外部サーバ
となるよう、Polipoを親プロキシとして設定する。
# apt-get install squid
# cp -p /etc/squid/squid.conf /etc/squid/squid.conf.org
# nano /etc/squid/squid.conf
以下はCuboxをSDカードのみで利用し、メモリキャッシュのみで運用する場合の設定例。
MicrosoftUpdateやニコニコ動画等のページ、cgi等の結果はキャッシュしないようにしている。

--------------------------------------------------
redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
redirect_children 5
redirector_bypass on
acl query urlpath_regex cgi-bin \? \.php$ \.asp$ \.shtml$ \.cfm$ \.cfml$ \.phtml$ \.php3$ \.js \.jsp
acl nocache-domain dstdomain .microsoft.com .nicovideo.jp .smilevideo.jp
always_direct allow query
always_direct allow nocache-domain
no_cache deny query
no_cache deny nocache-domain
acl all src all
(以下、acl関連は省略)
http_port 8080
cache_peer 127.0.0.1 parent 8123 7 no-query no-digest no-netdb-exchange http11 default
hierarchy_stoplist cgi-bin ?
cache_mem 256 MB
cache_dir null /var/tmp
maximum_object_size 20480 KB
access_log none
cache_store_log none
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
negative_ttl 1 minutes
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all
half_closed_clients off
visible_hostname ProxyServer
nonhierarchical_direct off
prefer_direct off
never_direct allow all
tcp_recv_bufsize 65535 bytes
hosts_file /etc/hosts
ipcache_size 4096
forwarded_for off
coredump_dir none
pipeline_prefetch on
--------------------------------------------------


ウチではeSATA接続のSSD上にキャッシュを配置しているため、実際には"cache_mem"をコメントアウトし、以下の設定を有効にしている。
--------------------------------------------------
cache_dir coss [cache_dir]/cache_s  128 block-size=512 max-size=16384  membufs=4
cache_dir coss [cache_dir]/cache_m 1024 block-size=512 max-size=131072 membufs=8
cache_dir aufs [cache_dir]/cache_l 4096 16 64
maximum_object_size 1024 MB
--------------------------------------------------
redirect_programにSquidGuardを指定しているため、サービス再起動等はSquidGuardのインストール後に行う。



■SquidGuardのインストール
コンテンツフィルタとしてSquidGuardを利用する。
# apt-get install squidGuard
# cp -p /etc/squid/squidGuard.conf /etc/squid/squidGuard.conf.org
フィルタ用のブラックリストは用意されていないため、別途取得して展開しておく。以下はその取得例。
# cd /tmp
# wget http://urlblacklist.com/cgi-bin/commercialdownload.pl?type=download&file=bigblacklist
# tar zxvf bigblacklists.tar.gz
# cd blacklists
# cp -Rf * /var/lib/squidguard/db/
# cd /var/lib/squidguard/db
# chown -R proxy:proxy db
フィルタリングしたいブラックリストをSquidGuardに設定する。
# nano /etc/squid/squid.conf
ウチの設定はこんな感じ。
good と local は、自前で用意したホワイトリストとブラックリストを設定している。存在しない場合は設定自体の削除が必要。
usersとdefaultの設定を分ける必要は無いけど、まぁ将来の拡張用ということで。

--------------------------------------------------
dbhome /var/lib/squidguard/db
logdir /var/log/squid
src users {
    ip 192.168.1.0/24
}
dest good {
    domainlist good/domains
    urllist good/urls
}
dest local {
    domainlist local/domains
    urllist local/urls
    expressionlist local/expressions
}
dest antispyware {
    domainlist antispyware/domains
    urllist antispyware/urls
}
dest ads {
    domainlist ads/domains
    urllist ads/urls
}
dest spyware {
    domainlist spyware/domains
}
acl {
    users {
        pass good !local !antispyware !ads !spyware all
        redirect http://[CuboxAddress]/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
    }
    default {
        pass good !local !antispyware !ads !spyware all
        redirect http://[CuboxAddress]/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
    }
}
--------------------------------------------------
ここまで来たら、一旦SquidGuardの設定をチェック。

# squid -f /etc/squid/squid.conf -z
問題が無いようなら、SquidGuardで設定したブラックリスト、ホワイトリストをBerkleyDB化してSquidを再起動する。
# squidGuard -d -C all
# service squid reload
# /etc/init.d/squid restart
あとはクライアント側からCuboxの8080ポートをプロキシに設定すれば設定完了。
とりあえず、Squidのみの状態で一週間、Polipoも入れた状態でさらに一週間使ってるけど、特に問題らしい問題も発生していないので、安定してると言えるかと。

Cuboxの今後の課題(というか、やりたいこと)は…

  • Privoxy+Ziproxyでフィルタリングの強化&高速化
  • IPv6対応
  • 透過プロキシ化
  • DNSキャッシュサーバを構築して高速化
  • L2TP/IPSecのVPNサーバを構築

くらいかなぁ。
RaspberryPiと違って、NICが1000Baseに対応してるのと、AES復号化に使える専用コプロセッサを積んでるのはCuboxの強みだしね。

RaspberryPiは、ひとまずMPDサーバとか、宅内WebAPサーバとして使っていくことにしよう。
…丁度よく、「月刊Stereo」2013年1月号付録のUSB-DAC『LXU-OT2』も確保してあることだし!

【2015/04/11追記】CuboxからRaspberryPi2にキャッシュサーバを移行したため、興味のある方はそちらもご覧ください。
キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(1)